element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = legacy_1.RPTUtil.getAncestor(ruleContext, "table") != null;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_headers_exists.ts":
+/*!**********************************************!*\
+ !*** ./src/v4/rules/table_headers_exists.ts ***!
+ \**********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_headers_exists = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+exports.table_headers_exists = {
+ id: "table_headers_exists",
+ context: "dom:table",
+ refactor: {
+ "RPT_Table_DataHeadingsAria": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_headers_exists.html",
+ "Fail_1": "table_headers_exists.html",
+ "group": "table_headers_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Table has no headers identified",
+ "group": "Data table must identify headers"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // If this is a layout table or there are no rows, the rule does not apply.
+ var rows = ruleContext.rows;
+ if (!legacy_1.RPTUtil.isDataTable(ruleContext) || rows == null || rows.length == 0)
+ return null;
+ var passed = legacy_1.RPTUtil.isTableHeaderInFirstRowOrColumn(ruleContext);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_headers_ref_valid.ts":
+/*!*************************************************!*\
+ !*** ./src/v4/rules/table_headers_ref_valid.ts ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_headers_ref_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+exports.table_headers_ref_valid = {
+ id: "table_headers_ref_valid",
+ context: "dom:td[headers], dom:th[headers]",
+ help: {
+ "en-US": {
+ "Pass_0": "table_headers_ref_valid.html",
+ "Fail_1": "table_headers_ref_valid.html",
+ "Fail_2": "table_headers_ref_valid.html",
+ "Fail_3": "table_headers_ref_valid.html",
+ "Fail_4": "table_headers_ref_valid.html",
+ "group": "table_headers_ref_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",
+ "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself",
+ "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",
+ "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with or a role of \"columnheader\" or \"rowheader\"",
+ "group": "The 'headers' attribute should refer to a valid cell in the same table"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: ["a25f45"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var parentTable = legacy_1.RPTUtil.getAncestor(ruleContext, "table");
+ var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable);
+ // If this is a layout table or a simple table the rule does not apply.
+ if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var doc = ruleContext.ownerDocument;
+ var value = ruleContext.getAttribute("headers");
+ if (!value)
+ return null;
+ var ids = value.split(" ");
+ var invalidHeaderValues = [];
+ var sameNodeHeaderValues = [];
+ var sameTableHeaderValues = [];
+ var invalidElemHeaderValues = [];
+ for (var i = 0; i < ids.length; i++) {
+ var id = ids[i];
+ if (id.trim() === '')
+ continue;
+ var elem = doc.getElementById(id);
+ if (!elem)
+ invalidHeaderValues.push(id);
+ else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext))
+ sameNodeHeaderValues.push(id);
+ else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext))
+ sameTableHeaderValues.push(id);
+ else {
+ var elemName = elem.nodeName.toLowerCase();
+ if (elemName !== 'th') {
+ var roles = legacy_1.RPTUtil.getRoles(elem, true);
+ if (!roles.includes('columnheader') && !roles.includes('rowheader'))
+ invalidElemHeaderValues.push(id);
+ }
+ }
+ }
+ var results = [];
+ if (invalidHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()]));
+ if (sameNodeHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()]));
+ if (sameTableHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()]));
+ if (invalidElemHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()]));
+ if (results.length == 0) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return results;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_headers_related.ts":
+/*!***********************************************!*\
+ !*** ./src/v4/rules/table_headers_related.ts ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_headers_related = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+exports.table_headers_related = {
+ id: "table_headers_related",
+ context: "dom:td, dom:th",
+ refactor: {
+ "Valerie_Table_DataCellRelationships": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_headers_related.html",
+ "Fail_1": "table_headers_related.html",
+ "group": "table_headers_related.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'",
+ "group": "For a complex data table, all and elements must be related via 'header' or 'scope' attributes"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var parentTable = legacy_1.RPTUtil.getAncestor(ruleContext, "table");
+ // If this is a layout table or a simple table the rule does not apply.
+ if (parentTable == null || !legacy_1.RPTUtil.isComplexDataTable(parentTable))
+ return null;
+ // If this table hasn't been preprocessed, process it.
+ if ((0, CacheUtil_1.getCache)(ruleContext, "table_headers_related", null) === null) {
+ // Build a grid that's actually usable (rowspan and colspan elements are duplicated)
+ // This builds a real 2d table array.
+ var grid = [];
+ for (var i = 0; i < parentTable.rows.length; ++i) {
+ var row = parentTable.rows[i];
+ if (!grid[i])
+ grid[i] = [];
+ for (var j = 0; j < row.cells.length; ++j) {
+ var cell = row.cells[j];
+ (0, CacheUtil_1.setCache)(cell, "table_headers_related", i + ":" + j);
+ var width = parseInt(cell.getAttribute("colspan"));
+ if (!width)
+ width = 1;
+ var height = parseInt(cell.getAttribute("rowspan"));
+ if (!height)
+ height = 1;
+ var gX = 0;
+ while (grid[i][gX])
+ gX += 1;
+ for (var k = 0; k < height; ++k) {
+ if (!grid[i + k])
+ grid[i + k] = [];
+ for (var l = 0; l < width; ++l) {
+ grid[i + k][gX + l] = cell;
+ }
+ }
+ }
+ }
+ // Iterate through the table grid and record headers that point to cells and
+ // cells that are pointed to by headers
+ var doc = ruleContext.ownerDocument;
+ var lookup = {};
+ var scopedCols = {};
+ for (var i = 0; i < grid.length; ++i) {
+ var rowScoped = false;
+ for (var j = 0; j < grid[i].length; ++j) {
+ var gridCell = grid[i][j];
+ var gridNodeName = gridCell.nodeName.toLowerCase();
+ if (gridNodeName == "th") {
+ if (gridCell.getAttribute("scope") == "row") {
+ rowScoped = true;
+ // If there's an axis attribute, it must be referred to by headers,
+ // scope is not enough.
+ if (!legacy_1.RPTUtil.attributeNonEmpty(gridCell, "axis"))
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ else if (gridCell.getAttribute("scope") == "col") {
+ scopedCols[j] = true;
+ // If there's an axis attribute, it must be referred to by headers,
+ // scope is not enough.
+ if (!legacy_1.RPTUtil.attributeNonEmpty(gridCell, "axis"))
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ // Headers can refer to other headers
+ if (legacy_1.RPTUtil.attributeNonEmpty(gridCell, "headers")) {
+ var hdrs = gridCell.getAttribute("headers").split(" ");
+ for (var k = 0; k < hdrs.length; ++k) {
+ var headElem = doc.getElementById(hdrs[k].trim());
+ if (headElem && legacy_1.RPTUtil.getAncestor(headElem, "table") == parentTable) {
+ lookup[(0, CacheUtil_1.getCache)(headElem, "table_headers_related", null)] = true;
+ }
+ }
+ }
+ }
+ else if (gridNodeName == "td") {
+ if (rowScoped || scopedCols[j]) {
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(gridCell, "headers")) {
+ var hdrs = gridCell.getAttribute("headers").split(" ");
+ for (var k = 0; k < hdrs.length; ++k) {
+ var headElem = doc.getElementById(hdrs[k].trim());
+ if (headElem && legacy_1.RPTUtil.getAncestor(headElem, "table") == parentTable) {
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ lookup[(0, CacheUtil_1.getCache)(headElem, "table_headers_related", null)] = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ (0, CacheUtil_1.setCache)(parentTable, "table_headers_related", lookup);
+ }
+ var rcInfo = (0, CacheUtil_1.getCache)(ruleContext, "table_headers_related", null);
+ var tInfo = (0, CacheUtil_1.getCache)(parentTable, "table_headers_related", null);
+ var passed = rcInfo !== null && tInfo !== null && rcInfo in tInfo;
+ if (!passed && rcInfo === "0:0" &&
+ legacy_1.RPTUtil.getInnerText(ruleContext).trim().length == 0) {
+ // We don't test if it's the upper-left cell and it's empty
+ return null;
+ }
+ // If the table has no th's, it may just be that this was supposed to be a layout
+ // table, which introduces a lot of noise. In that case, only trigger this error
+ // once per table.
+ if (!passed && parentTable.getElementsByTagName("th").length == 0) {
+ if ((0, CacheUtil_1.getCache)(parentTable, "table_headers_related_TrigOnce", false) === true) {
+ passed = true;
+ }
+ else {
+ (0, CacheUtil_1.setCache)(parentTable, "table_headers_related_TrigOnce", true);
+ }
+ }
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_layout_linearized.ts":
+/*!*************************************************!*\
+ !*** ./src/v4/rules/table_layout_linearized.ts ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_layout_linearized = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.table_layout_linearized = {
+ id: "table_layout_linearized",
+ context: "dom:table",
+ refactor: {
+ "RPT_Table_LayoutTrigger": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_layout_linearized.html",
+ "Potential_1": "table_layout_linearized.html",
+ "group": "table_layout_linearized.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized",
+ "group": "Avoid using tables to format text documents in columns unless the table can be linearized"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = !legacy_1.RPTUtil.isLayoutTable(ruleContext);
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_scope_valid.ts":
+/*!*******************************************!*\
+ !*** ./src/v4/rules/table_scope_valid.ts ***!
+ \*******************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_scope_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+exports.table_scope_valid = {
+ id: "table_scope_valid",
+ context: "dom:td[scope], dom:th[scope]",
+ refactor: {
+ "WCAG20_Table_Scope_Valid": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_scope_valid.html",
+ "Fail_1": "table_scope_valid.html",
+ "Fail_2": "table_scope_valid.html",
+ "group": "table_scope_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Value provided is invalid for the 'scope' attribute",
+ "Fail_2": "The 'scope' attribute should only be used on a element",
+ "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (nodeName === 'td')
+ return (0, IRule_1.RuleFail)("Fail_2");
+ //only continue for 'th'
+ var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase();
+ var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_structure_misuse.ts":
+/*!************************************************!*\
+ !*** ./src/v4/rules/table_structure_misuse.ts ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_structure_misuse = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.table_structure_misuse = {
+ id: "table_structure_misuse",
+ context: "dom:table",
+ refactor: {
+ "WCAG20_Table_Structure": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_structure_misuse.html",
+ "Fail_1": "table_structure_misuse.html",
+ "group": "table_structure_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'",
+ "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // JCH - OUT OF SCOPE hidden in context
+ if (legacy_1.RPTUtil.isDataTable(ruleContext))
+ return null;
+ if (legacy_1.RPTUtil.isNodeInGrid(ruleContext))
+ return null;
+ var errorNodes = [];
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "summary"))
+ errorNodes.push(ruleContext);
+ var captionElems = ruleContext.getElementsByTagName("caption");
+ for (var i = 0; i < captionElems.length; ++i) {
+ if (legacy_1.RPTUtil.getAncestor(captionElems[i], "table") == ruleContext) {
+ // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or
+ // not.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(captionElems[i])) {
+ continue;
+ }
+ // Add the node to the errorNodes
+ errorNodes.push(captionElems[i]);
+ // Since we are not actually making use of theses errorNodes even though they are passed along with
+ // ValidationResult, we do not need to keep looping over and getting every single violating node under
+ // the rule context. This can be a future enhancenment where we actually make use of the error nodes that
+ // are passed along. Adding this break to speed up performance at this point.
+ break; // There is no point to keep adding the error nodes, stop after finding the first one
+ }
+ }
+ var thNodes = ruleContext.getElementsByTagName("th");
+ for (var i = 0; i < thNodes.length; ++i) {
+ if (legacy_1.RPTUtil.getAncestor(thNodes[i], "table") == ruleContext) {
+ // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or
+ // not.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(thNodes[i])) {
+ continue;
+ }
+ // Add the node to the errorNodes
+ errorNodes.push(thNodes[i]);
+ // Since we are not actually making use of theses errorNodes even though they are passed along with
+ // ValidationResult, we do not need to keep looping over and getting every single violating node under
+ // the rule context. This can be a future enhancenment where we actually make use of the error nodes that
+ // are passed along. Adding this break to speed up performance at this point.
+ break; // There is no point to keep adding the error nodes, stop after finding the first one
+ }
+ }
+ var tdNodes = ruleContext.getElementsByTagName("td");
+ for (var i = 0; i < tdNodes.length; ++i) {
+ if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) &&
+ legacy_1.RPTUtil.getAncestor(tdNodes[i], "table") == ruleContext) {
+ // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or
+ // not.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(tdNodes[i])) {
+ continue;
+ }
+ // Add the node to the errorNodes
+ errorNodes.push(tdNodes[i]);
+ // Since we are not actually making use of theses errorNodes even though they are passed along with
+ // ValidationResult, we do not need to keep looping over and getting every single violating node under
+ // the rule context. This can be a future enhancenment where we actually make use of the error nodes that
+ // are passed along. Adding this break to speed up performance at this point.
+ break; // There is no point to keep adding the error nodes, stop after finding the first one
+ }
+ }
+ // Get the node name for the rule context element in this case it will always be table
+ var currentElementToken = ruleContext.nodeName.toLowerCase();
+ // Construct a new array which will contan only the element tag for the violation elements
+ var structuralElementTokens = new Array();
+ // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure
+ // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing.
+ var seen = {};
+ // Loop through all the violating structural elements and extract the element tag to be used as a token
+ for (var i = 0; i < errorNodes.length; i++) {
+ // Get the node name (tag name) for the violating structural element
+ var nodeName = errorNodes[i].nodeName.toLowerCase();
+ // Only need to add the violating element once
+ if (!seen.hasOwnProperty(nodeName)) {
+ // Since we are adding the token as elements and attributes we need to handle
+ // the summary attribute on the ruleContext (table). We only add summary once, same as
+ // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case)
+ if (nodeName == "table" && !seen.hasOwnProperty["summary"]) {
+ // Mark this as a new attribute
+ seen["summary"] = true;
+ // Since this is a new violating element add it to the structural element tokens array
+ structuralElementTokens.push("summary");
+ }
+ else {
+ // Mark this as a new element
+ seen[nodeName] = true;
+ // Since this is a new violating element add it to the structural element tokens array
+ structuralElementTokens.push(nodeName);
+ }
+ }
+ }
+ // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in
+ // the message.
+ var structuralElementTokensStr = structuralElementTokens.join(", ");
+ //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]);
+ if (errorNodes.length == 0) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_summary_redundant.ts":
+/*!*************************************************!*\
+ !*** ./src/v4/rules/table_summary_redundant.ts ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_summary_redundant = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts");
+exports.table_summary_redundant = {
+ id: "table_summary_redundant",
+ context: "dom:table",
+ refactor: {
+ "WCAG20_Table_CapSummRedundant": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_summary_redundant.html",
+ "Fail_1": "table_summary_redundant.html",
+ "group": "table_summary_redundant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The table summary duplicates the caption",
+ "group": "The table summary must not duplicate the caption"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var pofId;
+ var passed = true;
+ var sumStr;
+ if (ruleContext.hasAttribute("summary")) {
+ pofId = 0;
+ sumStr = ruleContext.getAttribute("summary").trim().toLowerCase();
+ }
+ else if (ruleContext.hasAttribute("aria-describedby")) {
+ pofId = 1;
+ var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" ");
+ var summaryNodeConcat = "";
+ for (var i = 0; i < summaryNodeIds.length; i++) {
+ var summaryNodeId = summaryNodeIds[i];
+ if (summaryNodeId) {
+ var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId);
+ if (summaryNode) {
+ summaryNodeConcat += " " + legacy_1.RPTUtil.getInnerText(summaryNode).trim().toLowerCase();
+ }
+ }
+ }
+ sumStr = summaryNodeConcat;
+ }
+ if (!sumStr) {
+ return null;
+ }
+ else {
+ var capElems = ruleContext.getElementsByTagName("caption");
+ if (capElems.length === 0) {
+ return null;
+ }
+ else if (sumStr.length > 0) {
+ var capStr = legacy_1.RPTUtil.getInnerText(capElems[0]).trim().toLowerCase();
+ if (!sumStr.includes(capStr)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_block_heading.ts":
+/*!********************************************!*\
+ !*** ./src/v4/rules/text_block_heading.ts ***!
+ \********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_block_heading = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+exports.text_block_heading = {
+ id: "text_block_heading",
+ context: "dom:p, dom:div, dom:br",
+ refactor: {
+ "RPT_Block_ShouldBeHeading": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "text_block_heading.html",
+ "Potential_1": "text_block_heading.html",
+ "group": "text_block_heading.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check if this text should be marked up as a heading: {0}",
+ "group": "Heading text must use a heading element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ numWords: {
+ value: 10,
+ type: "integer"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var numWords = validateParams.numWords.value;
+ var wordsSeen = 0;
+ var wordStr = [];
+ var emphasizedText = false;
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ var passed = false;
+ while (!passed &&
+ nw.nextNode() &&
+ nw.node !== ruleContext &&
+ nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) &&
+ !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice
+ {
+ var nwName = nw.node.nodeName.toLowerCase();
+ if ((nwName == "b" || nwName == "em" || nwName == "i" ||
+ nwName == "strong" || nwName == "u" || nwName == "font") && !legacy_1.RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ var nextStr = legacy_1.RPTUtil.getInnerText(nw.node);
+ var wc = legacy_1.RPTUtil.wordCount(nextStr);
+ if (wc > 0) {
+ wordStr.push(nextStr);
+ emphasizedText = true;
+ wordsSeen += wc;
+ }
+ passed = wordsSeen > numWords;
+ // Skip this node because it's emphasized
+ nw.bEndTag = true;
+ }
+ else {
+ passed =
+ (nw.node.nodeType == 1 && legacy_1.RPTUtil.attributeNonEmpty(nw.node, "alt") &&
+ (nwName == "applet" || nwName == "embed" || nwName == "img" ||
+ (nwName === "input" && nw.elem().hasAttribute("type") && nw.elem().getAttribute("type") == "image")))
+ || (nwName === "#text" && nw.node.nodeValue.trim().length > 0)
+ // Give them the benefit of the doubt if there's a link
+ || (nwName === "a" && nw.elem().hasAttribute("href") && legacy_1.RPTUtil.attributeNonEmpty(nw.node, "href"));
+ }
+ }
+ if (wordsSeen == 0)
+ passed = true;
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RulePotential)("Potential_1", [wordStr.join(" ")]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_contrast_sufficient.ts":
+/*!**************************************************!*\
+ !*** ./src/v4/rules/text_contrast_sufficient.ts ***!
+ \**************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_contrast_sufficient = void 0;
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var ColorUtil_1 = __webpack_require__(/*! ../../v2/dom/ColorUtil */ "./src/v2/dom/ColorUtil.ts");
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+//import { setCache } from "../util/CacheUtil";
+var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts");
+exports.text_contrast_sufficient = {
+ id: "text_contrast_sufficient",
+ context: "dom:*",
+ refactor: {
+ "IBMA_Color_Contrast_WCAG2AA": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Potential_1": "Potential_same_color"
+ },
+ "IBMA_Color_Contrast_WCAG2AA_PV": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_graphic_background"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "text_contrast_sufficient.html",
+ "Pass_0": "text_contrast_sufficient.html",
+ "Fail_1": "text_contrast_sufficient.html",
+ "Potential_same_color": "text_contrast_sufficient.html",
+ "Potential_graphic_background": "text_contrast_sufficient.html",
+ "Potential_text_shadow": "text_contrast_sufficient.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "The contrast ratio of text with its background must meet WCAG 2.1 AA requirements",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",
+ "Potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG 2.1 AA requirements for minimum contrast",
+ "Potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG 2.1 AA minimum requirements for text of size {1}px and weight of {2}",
+ "Potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG 2.1 AA minimum requirements for text of size {1}px and weight of {2}"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "1.4.3",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ['afw4f7'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // avoid diagnosing elements that are not visible
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) ||
+ (VisUtil_1.VisUtil.hiddenByDefaultElements != null &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements != undefined &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) {
+ return null;
+ }
+ //TODO ? should only consider native disabled, ignore aria-disabled
+ //skip disabled element
+ if (legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return null;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["svg", "script", "meta"]))
+ return null;
+ var doc = ruleContext.ownerDocument;
+ if (!doc) {
+ return null;
+ }
+ var win = doc.defaultView;
+ if (!win) {
+ return null;
+ }
+ // Ensure that this element has children with actual text.
+ var childStr = legacy_1.RPTUtil.getNodeText(ruleContext);
+ if (!legacy_1.RPTUtil.isShadowHostElement(ruleContext) || (legacy_1.RPTUtil.isShadowHostElement(ruleContext) && legacy_1.RPTUtil.getNodeText(ruleContext.shadowRoot) === '')) {
+ if (childStr.trim().length == 0)
+ return null;
+ // ignore if the text does not convey anything in human language
+ /**
+ * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s)
+ * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF
+ * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters
+ * (3) for now not consider unicode special characters that are different in different languages
+ */
+ var regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g;
+ var removed = childStr.trim().replace(regex, '');
+ if (removed.trim().length === 0)
+ return null;
+ }
+ var elem = ruleContext;
+ // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists
+ // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM.
+ if (legacy_1.RPTUtil.isShadowHostElement(ruleContext)) {
+ // if it's direct text of a shadow host
+ if (ruleContext.shadowRoot) {
+ for (var node = ruleContext.firstChild; node; node = node.nextSibling) {
+ if (node.nodeType == 3) {
+ //if multiple texts exist, only need to check one
+ elem = node.assignedSlot;
+ break;
+ }
+ }
+ }
+ if (elem === null)
+ return;
+ }
+ var style = win.getComputedStyle(elem);
+ // JCH clip INFO:
+ // The clip property lets you specify a rectangle to clip an absolutely positioned element.
+ // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped.
+ // Property values:
+ // none This is default. No clipping is done
+ // auto No clipping will be done
+ // shape The only valid value is: rect (top, right, bottom, left)
+ // e.g., clip: rect(10px, 20px, 30px, 40px);
+ // Note: the four values are in the same order as margin/padding
+ // The rect values are positive pixel values, e.g., 10px, etc.
+ // margin-box Uses the margin box as the reference box
+ // border-box Uses the border box as the reference box
+ // padding-box Uses the padding box as the reference box
+ // content-box
+ // fill-box
+ // stroke-box
+ // NOTE: the CSS clip property is deprecated
+ // Also: clip only works if the element is absolutely positioned and can only do rectangles
+ // check if element visible
+ var visible = true;
+ if (style.width !== "0" &&
+ style.height !== "0" &&
+ style.opacity !== "0" &&
+ style.display !== 'none' &&
+ style.visibility !== 'hidden' &&
+ style.overflow !== 'hidden' &&
+ // left and right work with all absolute units
+ (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) &&
+ (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) {
+ visible = true;
+ // console.log("element IS visible");
+ // console.log("CHECK COLOR CONTRAST unless to small");
+ }
+ else {
+ visible = false;
+ // console.log("element NOT visible");
+ }
+ if (visible === false) {
+ // console.log("DO NOT CHECK COLOR CONTRAST");
+ return null;
+ }
+ var clipHeight = -1;
+ if (style.clip !== "auto") {
+ var clipString = style.clip.toString();
+ if (clipString.includes("rect")) {
+ var reBrackets = /\((.*)\)/g;
+ var listOfText = [];
+ var found = reBrackets.exec(clipString);
+ var foundArr = found[1].split(', ');
+ for (var i = 0; i < foundArr.length; i++) {
+ // console.log("foundArr[",i,"] = ",foundArr[i]);
+ listOfText.push(foundArr[i]);
+ }
+ ;
+ }
+ // console.log("listOfText = ",listOfText);
+ clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, ''));
+ clipHeight = Math.abs(clipHeight);
+ }
+ // JCH clip-path INFO:
+ // Excellent article on clip-path: https://ishadeed.com/article/clip-path/
+ // clip-path is a totally different animal with many, many different variations
+ // The goal was for it to not be as limited as clip
+ // The syntax is more complicated (as it does more) and it is different from clip,
+ // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px);
+ // Note: there are no commas
+ // Also, it can take single values to make all sides the same, or 2 values (vert/hori).
+ // or 3 values (top/hori/bottom)
+ // And percentages can works as well as px
+ //
+ // Although there are five different shapes: inset (term used for rectangle), circle,
+ // ellipse, polygon, path - we will only concern ourselves with inset
+ // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box
+ // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px);
+ // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box
+ //
+ // So the key question is what amount of effort do we want to invest into clip-path
+ //
+ // JCH don't do clip-path now
+ var clipPathHeight = -1;
+ // if (style.clipPath !== "auto") {
+ // console.log("style.clipPath = ",style.clipPath);
+ // console.log("style.clipPath.toString = ",style.clipPath.toString());
+ // let clipString = style.clipPath.toString();
+ // if (clipString.includes("inset")) {
+ // var reBrackets = /\((.*)\)/g;
+ // var listOfText = [];
+ // var found = reBrackets.exec(clipString);
+ // var foundArr = found[1].split(' ');
+ // for (let i=0; i= 24 || size >= 18.6 && weight >= 700;
+ var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale);
+ var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient;
+ var textShadow = colorCombo.textShadow;
+ var isDisabled = legacy_1.RPTUtil.isNodeDisabled(elem);
+ if (!isDisabled) {
+ var control = legacy_1.RPTUtil.getControlOfLabel(elem);
+ if (control) {
+ isDisabled = legacy_1.RPTUtil.isNodeDisabled(control);
+ }
+ }
+ if (!isDisabled && nodeName === 'label' && legacy_1.RPTUtil.isDisabledByFirstChildFormElement(elem)) {
+ isDisabled = true;
+ }
+ if (!isDisabled && ruleContext.hasAttribute("id") && legacy_1.RPTUtil.isDisabledByReferringElement(elem)) {
+ isDisabled = true;
+ }
+ /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", {
+ "ratio": ratio,
+ "isLargeScale": isLargeScale,
+ "weight": weight,
+ "size": size,
+ "hasBackground": hasBackground,
+ "isDisabled": isDisabled
+ });*/
+ // If element or parent is disabled, this rule does not apply (but may be 3:1 in future)
+ if (!passed && isDisabled) {
+ passed = true;
+ }
+ if (!passed) {
+ if (hasBackground) {
+ // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image
+ return (0, IRule_1.RulePotential)("Potential_graphic_background", [ratio.toFixed(2), size, weight]);
+ ;
+ }
+ else if (textShadow) {
+ // fire potential since a text with shadow may be still viewable, depending on the shadow efffects
+ return (0, IRule_1.RulePotential)("Potential_text_shadow", [ratio.toFixed(2), size, weight]);
+ ;
+ }
+ else {
+ if (fg.toHex() === bg.toHex()) {
+ return (0, IRule_1.RulePotential)("Potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ }
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_quoted_correctly.ts":
+/*!***********************************************!*\
+ !*** ./src/v4/rules/text_quoted_correctly.ts ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_quoted_correctly = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.text_quoted_correctly = {
+ id: "text_quoted_correctly",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "Pass_0": "text_quoted_correctly.html",
+ "Potential_1": "text_quoted_correctly.html",
+ "group": "text_quoted_correctly.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "If the following text is a quotation, mark it as a or element: {0}",
+ "group": "Quotations should be marked with or elements"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // ignore the check if the node is hidden
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext))
+ return null;
+ // Don't trigger if the element is not in the body
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["body"]) === null)
+ return null;
+ var validateParams = {
+ minWords: {
+ value: 3,
+ type: "integer"
+ }
+ };
+ var minWords = validateParams.minWords.value;
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ var violatedtext = null;
+ // ignore the check for the text of the following elements
+ var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"];
+ while (passed && walkNode) {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName === "#text") {
+ var txtVal = walkNode.nodeValue;
+ // Do the regex tests first - should be fast
+ // Remove apostrophe's
+ txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2");
+ var dblQuotes = txtVal.match(/("[^"]+")/g);
+ var snglQuotes = txtVal.match(/('[^']+')/g);
+ // Walk the parents - only continue testing if we found a quote, but
+ // we're not already marked up
+ // Also skip if we're in a script - there's lots of quotes used in scripts
+ if ((dblQuotes !== null || snglQuotes !== null) &&
+ legacy_1.RPTUtil.getAncestor(walkNode, ignored) === null) {
+ if (dblQuotes != null) {
+ for (var i = 0; passed && i < dblQuotes.length; ++i)
+ passed = legacy_1.RPTUtil.wordCount(dblQuotes[i]) < minWords;
+ }
+ if (snglQuotes != null) {
+ for (var i = 0; passed && i < snglQuotes.length; ++i)
+ passed = legacy_1.RPTUtil.wordCount(snglQuotes[i]) < minWords;
+ }
+ // Remove any linefeed inside the quote
+ // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),"");
+ if (dblQuotes === null) {
+ violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), "");
+ }
+ else if (snglQuotes === null) {
+ violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), "");
+ }
+ else {
+ violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), "");
+ }
+ }
+ }
+ walkNode = walkNode.nextSibling;
+ }
+ //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars
+ if (!passed && violatedtext.length && violatedtext.length > 69) {
+ violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32);
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_sensory_misuse.ts":
+/*!*********************************************!*\
+ !*** ./src/v4/rules/text_sensory_misuse.ts ***!
+ \*********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_sensory_misuse = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.text_sensory_misuse = {
+ id: "text_sensory_misuse",
+ context: "dom:body, dom:body dom:*",
+ refactor: {
+ "RPT_Text_SensoryReference": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "text_sensory_misuse.html",
+ "Potential_1": "text_sensory_misuse.html",
+ "group": "text_sensory_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "If the word(s) '{0}' is part of instructions for using page content, check it is still understandable without this location or shape information",
+ "group": "Instructions must be meaningful without shape or location words"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ sensoryText: {
+ value: ["top-left", "top-right", "bottom-right", "bottom-left",
+ "round", "square", "shape", "rectangle", "triangle",
+ "right", "left", "above", "below", "top", "bottom",
+ "upper", "lower", "corner", "beside"],
+ type: "[string]"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ if (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(ruleContext.nodeName.toLowerCase())) {
+ return null;
+ }
+ // Extract the nodeName of the context node
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // In the case this is a style or link element, skip triggering rule as we do not want to scan
+ // CSS for sensory words, as there can be CSS keys which contain theses sensory text that is matching.
+ if (nodeName === "style" || nodeName === "link") {
+ return (0, IRule_1.RulePass)(1);
+ }
+ var violatedtextArray = null;
+ var violatedtext = null;
+ var sensoryRegex = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "text_sensory_misuse", null);
+ if (sensoryRegex == null) {
+ var sensoryText = validateParams.sensoryText.value;
+ var regexStr = "(" + sensoryText[0];
+ for (var j = 1; j < sensoryText.length; ++j)
+ regexStr += "|" + sensoryText[j];
+ regexStr += ")\\W";
+ sensoryRegex = new RegExp(regexStr, "gi");
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "text_sensory_misuse", sensoryRegex);
+ }
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ var _loop_1 = function () {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName == "#text") {
+ var txtVal = walkNode.nodeValue.trim();
+ if (txtVal.length > 0) {
+ violatedtextArray = txtVal.match(sensoryRegex);
+ if (violatedtextArray != null) {
+ var hash_1 = {}, result_1 = [];
+ var exemptWords_1 = ["right-click", "left-click", "right-clicking", "right-clicks", "left-clicking", "left-clicks"];
+ // Note: split(/[\n\r ]+/) will spread the string into group of words using space,
+ // carriage return or linefeed as separators.
+ var counts = txtVal.split(/[\n\r ]+/).reduce(function (map, word) {
+ var sensoryTextArr = validateParams.sensoryText.value;
+ var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, "");
+ var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, "");
+ for (var counter = 0; counter < sensoryTextArr.length; counter++) {
+ var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]);
+ var b = exemptWords_1.indexOf(lcWordWoPunc);
+ var sensoryWordLen = sensoryTextArr[counter].length;
+ var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a);
+ // If the word does not contains substring of sensoryTextArr[counter]
+ // proceed to the next loop iteration for next sensoryText.
+ if (a < 0) {
+ continue;
+ }
+ var isPuncfollowing = ((charFollowSensoryText == '\-') ||
+ (charFollowSensoryText == '\.') ||
+ (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') ||
+ (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') ||
+ (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') ||
+ (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') ||
+ (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') ||
+ (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]'));
+ var isPuncPreceding = false;
+ if (a > 0) {
+ var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1);
+ isPuncPreceding = ((charPrecedeSensoryText == '\-') ||
+ (charPrecedeSensoryText == '\.') ||
+ (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') ||
+ (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') ||
+ (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') ||
+ (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') ||
+ (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') ||
+ (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]'));
+ }
+ if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true)) && (b < 0)) {
+ passed = false;
+ if (!hash_1.hasOwnProperty(wordWoTrailingPunc)) {
+ hash_1[wordWoTrailingPunc] = true;
+ result_1.push(wordWoTrailingPunc);
+ }
+ counter = sensoryTextArr.length;
+ }
+ }
+ map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1;
+ return map;
+ }, Object.create(null));
+ violatedtext = result_1.join(", ");
+ }
+ }
+ }
+ walkNode = walkNode.nextSibling;
+ };
+ while (passed && walkNode) {
+ _loop_1();
+ }
+ if (!passed) {
+ // Don't trigger if we're not in the body or if we're in a script
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["body", "script"]);
+ passed = (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body");
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_spacing_valid.ts":
+/*!********************************************!*\
+ !*** ./src/v4/rules/text_spacing_valid.ts ***!
+ \********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_spacing_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts");
+exports.text_spacing_valid = {
+ id: "text_spacing_valid",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "text_spacing_valid.html",
+ "group": "text_spacing_valid.html",
+ "fail_letter_spacing_style": "text_spacing_valid.html",
+ "fail_word_spacing_style": "text_spacing_valid.html",
+ "fail_line_height_style": "text_spacing_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "CSS !important is not used in inline style to control letter or word spacing or line height",
+ "group": "CSS !important should not be used in inline style to control letter or word spacing or line height",
+ "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style",
+ "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style",
+ "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style"
+ }
+ },
+ rulesets: [],
+ // rulesets: [{
+ // "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ // "num": ["1.4.12"],
+ // "level": eRulePolicy.VIOLATION,
+ // "toolkitLevel": eToolkitLevel.LEVEL_THREE
+ // }],
+ act: ['9e45ec', '24afc2', '78fd32'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return null;
+ //skip the check if the element is off screen
+ var bounds = context["dom"].bounds;
+ //in case the bounds not available
+ if (!bounds)
+ return null;
+ if (bounds['top'] < 0 || bounds['left'] < 0)
+ return null;
+ //skip no-html element
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, "svg"))
+ return null;
+ // Ensure that this element has children with actual text.
+ var childStr = "";
+ var childNodes = ruleContext.childNodes;
+ for (var i = 0; i < childNodes.length; ++i) {
+ if (childNodes[i].nodeType == 3) {
+ childStr += childNodes[i].nodeValue;
+ }
+ }
+ if (childStr.trim().length == 0)
+ return null;
+ //font size always resolved to 'px'
+ var font_size_style = (0, CSSUtil_1.getComputedStyle)(ruleContext).getPropertyValue('font-size');
+ var font_size = parseFloat(font_size_style);
+ var styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ if (Object.keys(styles).length === 0)
+ return null;
+ //note that CSS unit is required for non-zero values, otherwise it's ignored
+ var ret = [];
+ // matched string: original style, the style value and unit
+ var regex = /(-?[\d.]+)([a-z%]*)/;
+ var word_style = styles['word-spacing'];
+ if (word_style) {
+ if (word_style.startsWith('inherit') || word_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "word-spacing": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ word_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['word-spacing'];
+ }
+ else if (word_style.startsWith('unset')) {
+ word_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("word-spacing") === 'important') {
+ word_style = word_style.substring(0, word_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (word_style === 'initial' || word_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style"));
+ else {
+ var wordSpacing = parseFloat(word_style);
+ if (!isNaN(wordSpacing)) {
+ var parsed = word_style.trim().match(regex);
+ if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels != null && pixels / font_size < 0.16)
+ ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ var letter_style = styles['letter-spacing'];
+ if (letter_style) {
+ if (letter_style.startsWith('inherit') || letter_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "letter-spacing": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ letter_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['letter-spacing'];
+ }
+ else if (letter_style.startsWith('unset')) {
+ letter_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("letter-spacing") === 'important') {
+ letter_style = letter_style.substring(0, letter_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (letter_style === 'initial' || letter_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style"));
+ else {
+ var letterSpacing = parseFloat(letter_style);
+ if (!isNaN(letterSpacing)) {
+ var parsed = letter_style.trim().match(regex);
+ if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels != null && pixels / font_size < 0.12)
+ ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ var line_style = styles['line-height'];
+ var overflow = { "overflow": ['auto', 'scroll'], "overflow-x": ['auto', 'scroll'], "overflow-y": ['auto', 'scroll'] };
+ if (line_style && legacy_1.RPTUtil.getAncestorWithStyles(ruleContext, overflow) === null) {
+ if (line_style.startsWith('inherit') || line_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "line-height": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ line_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['line-height'];
+ }
+ else if (line_style.startsWith('unset')) {
+ line_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("line-height") === 'important') {
+ line_style = line_style.substring(0, line_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (line_style === 'initial' || line_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else {
+ var lineHeight = parseFloat(line_style);
+ if (!isNaN(lineHeight)) {
+ var parsed = line_style.trim().match(regex);
+ if (parsed[2] === '') { //line-height are allowed unitless when the valie is multiple (or fraction) of the font size
+ if (parsed[1] < 1.5)
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ else {
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels != null && pixels / font_size < 1.5)
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ if (ret.length > 0)
+ return ret;
+ return null; //implicable or ignore
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_whitespace_valid.ts":
+/*!***********************************************!*\
+ !*** ./src/v4/rules/text_whitespace_valid.ts ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_whitespace_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+exports.text_whitespace_valid = {
+ id: "text_whitespace_valid",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "text_whitespace_valid.html",
+ "potential_text": "text_whitespace_valid.html",
+ "group": "text_whitespace_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "potential_text": "Space characters should not be used to create space between the letters of a word",
+ "group": "Space characters should not be used to control spacing within a word"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Don't trigger if we're not in the body or if we're in a script
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["body", "script", "code"]);
+ if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body")
+ return null;
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ while (passed && walkNode) {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName == "#text") {
+ var txtVal = walkNode.nodeValue;
+ passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal));
+ }
+ walkNode = walkNode.nextSibling;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("pass");
+ return (0, IRule_1.RulePotential)("potential_text");
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/widget_tabbable_exists.ts":
+/*!************************************************!*\
+ !*** ./src/v4/rules/widget_tabbable_exists.ts ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.widget_tabbable_exists = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.widget_tabbable_exists = {
+ id: "widget_tabbable_exists",
+ context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",
+ refactor: {
+ "IBMA_Focus_Tabbable": {
+ "pass": "pass",
+ "fail_no_tabbable": "fail_no_tabbable"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "widget_tabbable_exists.html",
+ "fail_no_tabbable": "widget_tabbable_exists.html",
+ "group": "widget_tabbable_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element",
+ "group": "Component must have at least one tabbable element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //ignore datalist element check since it will be part of a input element or hidden by default
+ if (nodeName === 'datalist')
+ return null;
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var count = 0;
+ if (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ ++count;
+ }
+ // If node has children, look for tab stops in the children
+ // skip the count if the element requires presentational children only
+ if (count < 1 && !legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) {
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ while (count < 1 && nw.nextNode() && nw.node != ruleContext) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && legacy_1.RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ var passed = count >= 1;
+ return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/widget_tabbable_single.ts":
+/*!************************************************!*\
+ !*** ./src/v4/rules/widget_tabbable_single.ts ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.widget_tabbable_single = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.widget_tabbable_single = {
+ id: "widget_tabbable_single",
+ context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",
+ refactor: {
+ "IBMA_Focus_MultiTab": {
+ "pass": "pass",
+ "fail_multiple_tabbable": "fail_multiple_tabbable"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "widget_tabbable_single.html",
+ "fail_multiple_tabbable": "widget_tabbable_single.html",
+ "group": "widget_tabbable_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element",
+ "group": "Certain components must have no more than one tabbable element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var count = 0;
+ if (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ ++count;
+ }
+ // If node has children, look for tab stops in the children
+ //skip the count if the element requires presentational children only
+ if (count < 2 && !legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) {
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ while (count < 2 && nw.nextNode() && nw.node != ruleContext) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && legacy_1.RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ var passed = count < 2;
+ if (!passed)
+ (0, CacheUtil_1.setCache)(ruleContext, "widget_tabbable_single", "fail_multiple_tabbable");
+ return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_multiple_tabbable", [role]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rulesets.ts":
+/*!****************************!*\
+ !*** ./src/v4/rulesets.ts ***!
+ \****************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a11yRulesets = void 0;
+var IEngine_1 = __webpack_require__(/*! ../v2/api/IEngine */ "./src/v2/api/IEngine.ts");
+// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json
+var SCURLs = __webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json");
+var SCs = [];
+for (var key in SCURLs) {
+ SCs.push(SCURLs[key]);
+}
+var summaries = {
+ "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.",
+ "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.",
+ "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.",
+ "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.",
+ "1.2.4": "Captions are provided for all live audio content in synchronized media.",
+ "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.",
+ "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.",
+ "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.",
+ "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.",
+ "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.",
+ "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.",
+ "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.",
+ "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.",
+ "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.",
+ "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.",
+ "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.",
+ "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.",
+ "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.",
+ "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.",
+ "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.",
+ "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.",
+ "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.",
+ "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.",
+ "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.",
+ "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.",
+ "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.",
+ "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.",
+ "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.",
+ "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.",
+ "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.",
+ "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.",
+ "2.4.6": "Headings and labels describe topic or purpose.",
+ "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.",
+ "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.",
+ "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.",
+ "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.",
+ "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.",
+ "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.",
+ "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.",
+ "3.2.1": "When any component receives focus, it does not initiate a change of context.",
+ "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.",
+ "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.",
+ "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.",
+ "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.",
+ "3.3.2": "Labels or instructions are provided when content requires user input.",
+ "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.",
+ "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.",
+ "4.1.1": "In content implemented using markup languages, elements have complete start and end tags, elements are nested according to their specifications, elements do not contain duplicate attributes, and any IDs are unique, except where the specifications allow these features.",
+ "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.",
+ "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",
+};
+exports.a11yRulesets = [
+ // {
+ // id: "DEBUG",
+ // name: "DEBUG Rules",
+ // category: eRuleCategory.ACCESSIBILITY,
+ // description: "Rules for debugging",
+ // checkpoints: [{
+ // num: "1",
+ // name: "Debug CP 1",
+ // wcagLevel: "A",
+ // summary: "Rules for Debug"
+ // }]
+ // },
+ {
+ id: "EXTENSIONS",
+ name: "Extension Rules",
+ category: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for enabling the browser extensions",
+ type: IEngine_1.eRulesetType.EXTENSION,
+ checkpoints: [{
+ num: "1",
+ name: "Extension CP 1",
+ wcagLevel: "A",
+ summary: "Rules for Extension"
+ }]
+ },
+ {
+ id: "IBM_Accessibility",
+ name: "IBM Accessibility",
+ category: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.1 AA plus additional IBM checklist supplemental requirements.",
+ // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA
+ checkpoints: SCs
+ .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); })
+ .map(function (sc) { return ({
+ num: sc.num,
+ scId: sc.scId,
+ name: sc.handle,
+ wcagLevel: sc.level,
+ summary: summaries[sc.num]
+ }); })
+ },
+ {
+ id: "WCAG_2_1",
+ name: "WCAG 2.1 (A, AA)",
+ category: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.1 AA. This is the current W3C recommendation. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",
+ // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA
+ checkpoints: SCs
+ .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); })
+ .map(function (sc) { return ({
+ num: sc.num,
+ scId: sc.scId,
+ name: sc.handle,
+ wcagLevel: sc.level,
+ summary: summaries[sc.num]
+ }); })
+ },
+ {
+ id: "WCAG_2_0",
+ name: "WCAG 2.0 (A, AA)",
+ category: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.0 AA. Referenced by US Section 508, but not the latest W3C recommendation.",
+ // This ruleset has all 2.0 checkpoints that are A or AA
+ checkpoints: SCs
+ .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); })
+ .map(function (sc) { return ({
+ num: sc.num,
+ scId: sc.scId,
+ name: sc.handle,
+ wcagLevel: sc.level,
+ summary: summaries[sc.num]
+ }); })
+ }
+];
+
+
+/***/ }),
+
+/***/ "./src/v4/util/CSSUtil.ts":
+/*!********************************!*\
+ !*** ./src/v4/util/CSSUtil.ts ***!
+ \********************************/
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getCSSStyle = exports.getFontInPixels = exports.getWeightNumber = exports.isMaterialIconFont = exports.convertValue2Pixels = exports.getPixelsFromStyle = exports.getRotationDegree = exports.getMediaOrientationTransform = exports.getDefinedStyles = exports.getComputedStyle = exports.selectorMatchesElem = void 0;
+function selectorMatchesElem(element, selector) {
+ try {
+ if (selector.trim() === "")
+ return false;
+ if (typeof element.matches === 'function') {
+ return element.matches(selector);
+ }
+ if (typeof element.matchesSelector === 'function') {
+ return element.matchesSelector(selector);
+ }
+ // Native functions not there, fallback
+ var matches = (element.document || element.ownerDocument).querySelectorAll(selector);
+ var i = 0;
+ while (i < matches.length && matches[i] !== element) {
+ ++i;
+ }
+ return i < matches.length;
+ }
+ catch (err) {
+ // Bad selector? Doesn't match then...
+ return false;
+ }
+}
+exports.selectorMatchesElem = selectorMatchesElem;
+/**
+ * Returns the style computed for this element
+ * @param elem
+ */
+function getComputedStyle(elem, pseudoElt) {
+ var doc = elem.ownerDocument;
+ var win = doc.defaultView;
+ return win.getComputedStyle(elem, pseudoElt);
+}
+exports.getComputedStyle = getComputedStyle;
+/**
+ * Returns the style defined for this element
+ *
+ * This differs from the computed style in that the computed style will return
+ * styles defined by the user agent. This will only return styles defined by the
+ * application
+ * if rotation transform is used, the computed style returns the resolved matrix
+ * while the defined style return the transform function(s)
+ * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)'
+ * and the defined style returns 'rotate(2.5deg)'
+ *
+ * @param {HTMLElement} elem
+ * @param {string} [pseudoClass] If specified, will return values that are different
+ * than when the pseudoClass does not match.
+ */
+function getDefinedStyles(elem, pseudoClass) {
+ // console.log("Function: getDefinedStyles");
+ var definedStyles = {};
+ var definedStylePseudo = {};
+ function fillStyle(maps, style) {
+ for (var sIndex = 0; sIndex < style.length; ++sIndex) {
+ if (style[sIndex] === "all" && style[style[sIndex]]) {
+ for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) {
+ var map = maps_1[_i];
+ for (var key in map) {
+ delete map[key];
+ }
+ }
+ break;
+ }
+ else {
+ var key = style[sIndex];
+ for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) {
+ var map = maps_2[_a];
+ var priority = style.getPropertyPriority(key);
+ if (key in map && map[key].endsWith("!important")) {
+ if (priority === 'important' && !map[key].startsWith("inherit") && !map[key].startsWith("unset"))
+ //override !important only if it is also !important
+ map[key] = style[key] + " !important";
+ else
+ //don't override !important if it is not !important
+ continue;
+ }
+ else
+ //create/overide anyway
+ map[key] = style[key] + (priority === 'important' ? " !important" : "");
+ }
+ }
+ }
+ }
+ // Iterate through all of the stylesheets and rules
+ for (var ssIndex = 0; ssIndex < elem.ownerDocument.styleSheets.length; ++ssIndex) {
+ var sheet = elem.ownerDocument.styleSheets[ssIndex];
+ try {
+ if (sheet && sheet.cssRules) {
+ // console.log("Got sheet");
+ for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) {
+ // console.log("Got rule: ", sheet.cssRules[rIndex]);
+ var rule = sheet.cssRules[rIndex];
+ var fullRuleSelector = rule.selectorText;
+ if (fullRuleSelector) {
+ var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/);
+ var hasPseudoClass = !!pseudoMatch;
+ var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector;
+ var selPseudo = hasPseudoClass ? pseudoMatch[2] : "";
+ var samePseudoClass = selPseudo === pseudoClass;
+ if (pseudoClass && pseudoClass === ":focus") {
+ // If this element has focus, remove focus-within from parents
+ selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1");
+ }
+ // Get styles of non-pseudo selectors
+ if (!hasPseudoClass && selectorMatchesElem(elem, selMain)) {
+ fillStyle([definedStyles, definedStylePseudo], rule.style);
+ }
+ if (samePseudoClass && selectorMatchesElem(elem, selMain)) {
+ fillStyle([definedStylePseudo], rule.style);
+ }
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (!err.toString().includes("Cannot access rules") && !err.toString().includes("SecurityError:")) {
+ throw err;
+ }
+ }
+ }
+ // Handled the stylesheets, now handle the element defined styles
+ fillStyle([definedStyles, definedStylePseudo], elem.style);
+ /**
+ * 'initial' sets the style back to default
+ for (const key in definedStyles) {
+ if (definedStyles[key] === "initial") {
+ delete definedStyles[key];
+ }
+ }
+ for (const key in definedStylePseudo) {
+ if (definedStylePseudo[key] === "initial") {
+ delete definedStylePseudo[key];
+ }
+ }
+ */
+ if (!pseudoClass) {
+ // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStyles, null, 2));
+ return definedStyles;
+ }
+ else {
+ for (var key in definedStylePseudo) {
+ if (definedStylePseudo[key] === definedStyles[key]) {
+ delete definedStylePseudo[key];
+ }
+ }
+ // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStylePseudo, null, 2));
+ return definedStylePseudo;
+ }
+}
+exports.getDefinedStyles = getDefinedStyles;
+/**
+ * Returns the media query defined for the document
+ *
+ *
+ * @param {Document} doc
+ */
+function getMediaOrientationTransform(doc) {
+ var orientationTransforms = {};
+ // Iterate through all of the stylesheets and rules
+ for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) {
+ var sheet = doc.styleSheets[ssIndex];
+ try {
+ if (sheet && sheet.cssRules) {
+ for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) {
+ var sheetRule = sheet.cssRules[rIndex];
+ if (CSSRule.MEDIA_RULE === sheetRule.MEDIA_RULE) {
+ var rule = sheetRule;
+ if (rule && rule.media) {
+ var mediaList = rule.media;
+ for (var i = 0; i < mediaList.length; i++) {
+ var elem_transforms = orientationTransforms[mediaList.item(i).toLocaleLowerCase()];
+ if (!elem_transforms)
+ elem_transforms = {};
+ var styleRules = rule.cssRules;
+ for (var i_1 = 0; i_1 < styleRules.length; ++i_1) {
+ if (CSSRule.STYLE_RULE === styleRules[i_1].STYLE_RULE) {
+ var styleRule = styleRules[i_1];
+ var selector = styleRule.selectorText;
+ if (selector) {
+ var transforms = {};
+ var styles = styleRule.style;
+ for (var s = 0; s < styles.length; ++s) {
+ var key = styles[s];
+ if (key.toLocaleLowerCase() === "transform") {
+ if (key === "all" && styles[key]) {
+ delete transforms[key];
+ break;
+ }
+ else {
+ transforms[key] = styles[key];
+ }
+ }
+ }
+ elem_transforms[selector] = transforms;
+ }
+ }
+ }
+ orientationTransforms[mediaList.item(i).toLocaleLowerCase()] = elem_transforms;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (!err.toString().includes("Cannot access rules") && !err.toString().includes("SecurityError:")) {
+ throw err;
+ }
+ }
+ }
+ return orientationTransforms;
+}
+exports.getMediaOrientationTransform = getMediaOrientationTransform;
+/**
+ * convert given rotation transform functions to the degree transformed.
+ * If multiple functions are given, then the functions are applied linearly in the order.
+ * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg),
+ * rotate(2rad) rotate3d(1, 1, 1, 45deg)
+ * @param rotation_transform
+ */
+function getRotationDegree(rotation_transform) {
+ var degree = 0;
+ try {
+ if (!rotation_transform)
+ return degree;
+ // normalize the rotation_transform
+ rotation_transform = rotation_transform.replaceAll(", ", ",");
+ var transform_functions = rotation_transform.split(" ");
+ for (var i = 0; i < transform_functions.length; i++) {
+ var transform_function = transform_functions[i].trim();
+ if (transform_function === '')
+ continue;
+ if (transform_function.startsWith("rotate3d")) {
+ // example: rotate3d(1, 1, 1, 45deg);
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var matrix = transform_function.substring(left + 1, right);
+ var values = void 0;
+ if (matrix)
+ values = matrix.split(",");
+ if (values && values.length === 4) {
+ var rotation = values[3];
+ if (!rotation)
+ continue;
+ rotation = rotation.trim();
+ if (rotation.endsWith("turn")) {
+ var num = rotation.substring(0, rotation.length - 4);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 360;
+ }
+ else if (rotation.endsWith("rad")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 180 / Math.PI;
+ }
+ else if (rotation.endsWith("deg")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree += num;
+ }
+ }
+ }
+ }
+ else if (transform_function.startsWith("rotate") || transform_function.startsWith("rotateZ")) {
+ // example: rotate(45deg);
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var rotation = transform_function.substring(left + 1, right);
+ if (!rotation)
+ continue;
+ rotation = rotation.trim();
+ if (rotation.endsWith("turn")) {
+ var num = rotation.substring(0, rotation.length - 4);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 360;
+ }
+ else if (rotation.endsWith("rad")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 180 / Math.PI;
+ }
+ else if (rotation.endsWith("deg")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree += num;
+ }
+ }
+ }
+ else if (transform_function.startsWith("matrix3d")) {
+ // calculate the three Euler angles
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var matrix = transform_function.substring(left + 1, right);
+ var values = null;
+ if (matrix)
+ values = matrix.split(",");
+ if (values !== null) {
+ var z_angle = Math.atan2(values[4], values[5]);
+ degree += Math.round(Math.round(z_angle * 180 / Math.PI));
+ }
+ }
+ }
+ else if (transform_function.startsWith("matrix")) {
+ // calculate the three Euler angles
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var matrix = transform_function.substring(left + 1, right);
+ var values = null;
+ if (matrix)
+ values = matrix.split(",");
+ if (values !== null) {
+ var z_angle = Math.atan2(values[1], values[0]);
+ degree += Math.round(Math.round(z_angle * 180 / Math.PI));
+ }
+ }
+ }
+ }
+ while (degree >= 360)
+ degree -= 360;
+ }
+ catch (err) {
+ console.log("Cannot retrieve rotation degree: " + err);
+ throw err;
+ }
+ return degree;
+}
+exports.getRotationDegree = getRotationDegree;
+/**
+ * Convert CSS style string values to pixels.
+ *
+ * @param value style value in string, such as 3rem, 230px etc.
+ * @param target element.
+ * @return value in pixels
+ */
+function getPixelsFromStyle(value, elem) {
+ if (!value)
+ return 0;
+ var regex = /(-?[\d.]+)([a-z%]*)/;
+ var parsed = value.trim().match(regex);
+ if (parsed[2] === '' || parsed[1] === 0)
+ //no zero value without unit which is considered as error, so implicable
+ return 0;
+ var pixels = convertValue2Pixels(parsed[2], parsed[1], elem);
+ return pixels === null ? pixels : parseFloat(pixels);
+}
+exports.getPixelsFromStyle = getPixelsFromStyle;
+/**
+ * Convert absolute CSS numerical values to pixels.
+ *
+ * @param unitValue in string
+ * @param target element.
+ * @return value in pixels
+ */
+function convertValue2Pixels(unit, unitValue, elem) {
+ if (unitValue == 0)
+ return 0;
+ var supportedUnits = {
+ // absolute unit
+ 'px': function (value) { return value; },
+ 'cm': function (value) { return value * 37.8; },
+ 'mm': function (value) { return value * 3.78; },
+ 'q': function (value) { return value * 0.95; },
+ 'in': function (value) { return value * 96; },
+ 'pc': function (value) { return value * 16; },
+ 'pt': function (value) { return value * 1.33; },
+ // relative unit
+ 'rem': function (value) { return value * parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue('font-size')); },
+ 'em': function (value) { return value * parseFloat(getComputedStyle(elem).getPropertyValue('font-size')); },
+ 'vw': function (value) { return value / 100 * elem.ownerDocument.defaultView.innerWidth; },
+ 'vh': function (value) { return value / 100 * elem.ownerDocument.defaultView.innerHeight; },
+ '%': function (value) { return value / 100 * parseFloat(getComputedStyle(elem).getPropertyValue('font-size')); }
+ };
+ if (unit in supportedUnits)
+ return supportedUnits[unit](unitValue);
+ return null;
+}
+exports.convertValue2Pixels = convertValue2Pixels;
+/*
+* Returns if the font for visible text of the element is defined by material icons
+*
+* @param {HTMLElement} elem
+*/
+function isMaterialIconFont(elem) {
+ // TODO: check the existence material icons using fetch in node 18+
+ // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time.
+ //list of known material icons and stylesheet link
+ var known_icons = {
+ 'Material Icons': "https://fonts.googleapis.com/icon?family=Material+Icons"
+ };
+ var known_css_classes = {
+ 'material-icons': "https://fonts.googleapis.com/icon?family=Material+Icons"
+ };
+ // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons"
+ var styles = getDefinedStyles(elem);
+ var fontFamily = styles['font-family'];
+ var found = false;
+ // font-family specifies a prioritized list of one or more font family names
+ if (fontFamily && fontFamily.split(",")[0].replace(/['"]+/g, '').trim() in known_icons)
+ found = true;
+ if (!found) {
+ var list = elem.classList;
+ for (var css_class in known_css_classes) {
+ if (list.contains(css_class)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ return false;
+ var passed = false;
+ // check if the stylesheet for the 'Material Icons' exists statically
+ var sheets = elem.ownerDocument.styleSheets;
+ for (var s = 0; s < sheets.length; s++) {
+ if (sheets && sheets.length > 0 && Object.values(known_icons).indexOf(sheets[s].href) > -1) {
+ passed = true;
+ break;
+ }
+ }
+ return passed;
+}
+exports.isMaterialIconFont = isMaterialIconFont;
+function getWeightNumber(styleVal) {
+ var map = {
+ "light": 100,
+ "bold": 700
+ };
+ var retVal = parseInt(styleVal);
+ if (retVal)
+ return retVal;
+ if (styleVal in map)
+ return map[styleVal];
+ return 400;
+}
+exports.getWeightNumber = getWeightNumber;
+function getFontInPixels(styleVal, elem) {
+ var map = {
+ "xx-small": 16,
+ "x-small": 10,
+ "small": 13,
+ "medium": 16,
+ "large": 18,
+ "x-large": 24,
+ "xx-large": 32
+ };
+ var value = parseFloat(styleVal);
+ if (!value) {
+ return map[styleVal];
+ }
+ var units = styleVal.substring(("" + value).length);
+ /**
+ if (units === "" || units === "px") return value;
+ if (units === "em") return value * 16;
+ if (units === "%") return value / 100 * 16;
+ if (units === "pt") return value * 4 / 3;
+ return Math.round(value);
+ */
+ return convertValue2Pixels(units, value, elem);
+}
+exports.getFontInPixels = getFontInPixels;
+function getCSSStyle(element) {
+ var styleText = "";
+ if (element === null)
+ return [];
+ if (element.IBM_CSS_THB)
+ return element.IBM_CSS_THB;
+ var nodeName = element.nodeName.toLowerCase();
+ if (nodeName === "style") {
+ styleText = element.innerText;
+ if (styleText === undefined || styleText.trim() === "")
+ styleText = element.textContent;
+ }
+ else if (element.hasAttribute("style")) {
+ styleText = element.getAttribute("style");
+ }
+ else
+ return [];
+ if (styleText === null || styleText.trim().length === 0)
+ return [];
+ //remove comment blocks
+ var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g;
+ var subst = ' ';
+ styleText = styleText.replace(re, subst);
+ // Find all "key : val;" pairs with various whitespace inbetween
+ var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g;
+ // Find all "selector { csskeyvals } with various whitespace inbetween
+ var rSelectors = /\s*([^{]*){([^}]*)}/g;
+ if (styleText.indexOf("{") === -1) {
+ var keyVals = {};
+ var m = void 0;
+ while ((m = rKeyVals.exec(styleText)) != null) {
+ keyVals[m[1]] = m[2].trim().toLowerCase();
+ }
+ var retVal = [{
+ selector: null,
+ values: keyVals
+ }];
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ }
+ else {
+ var retVal = [];
+ var m = void 0;
+ var m2 = void 0;
+ while ((m = rSelectors.exec(styleText)) != null) {
+ var keyVals = {};
+ var selKey = m[1];
+ var selVal = m[2];
+ while ((m2 = rKeyVals.exec(selVal)) != null) {
+ keyVals[m2[1]] = m2[2].trim().toLowerCase();
+ }
+ retVal.push({
+ selector: selKey,
+ values: keyVals
+ });
+ }
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ }
+}
+exports.getCSSStyle = getCSSStyle;
+
+
+/***/ }),
+
+/***/ "./src/v4/util/CacheUtil.ts":
+/*!**********************************!*\
+ !*** ./src/v4/util/CacheUtil.ts ***!
+ \**********************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.clearCaches = exports.setCache = exports.getCache = void 0;
+var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+/* Return a pointer to the given global variable
+ * with its initial value as given */
+function getCache(cacheSpot, keyName, initValue) {
+ var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot;
+ if (cacheObj.aceCache === undefined) {
+ cacheObj.aceCache = {};
+ }
+ if (cacheObj.aceCache[keyName] === undefined) {
+ cacheObj.aceCache[keyName] = initValue;
+ }
+ return cacheObj.aceCache[keyName];
+}
+exports.getCache = getCache;
+function setCache(cacheSpot, globalName, value) {
+ var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot;
+ if (cacheObj.aceCache === undefined) {
+ cacheObj.aceCache = {};
+ }
+ cacheObj.aceCache[globalName] = value;
+ return value;
+}
+exports.setCache = setCache;
+function clearCaches(cacheRoot) {
+ delete cacheRoot.ownerDocument.aceCache;
+ var nw = new DOMWalker_1.DOMWalker(cacheRoot);
+ do {
+ delete nw.node.aceCache;
+ nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache;
+ } while (nw.nextNode());
+}
+exports.clearCaches = clearCaches;
+
+
+/***/ }),
+
+/***/ "./src/v4/util/CommonUtil.ts":
+/*!***********************************!*\
+ !*** ./src/v4/util/CommonUtil.ts ***!
+ \***********************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.isTableDescendant = exports.getConflictAriaAndHtmlAttributes = exports.getInvalidAriaAttributes = exports.getInvalidRoles = exports.areRolesDefined = void 0;
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts");
+/*
+ * check if any explicit role specified for the element is a valid ARIA role
+ * return: null if no explicit role is defined,
+ * true if the role(s) are defined in ARIA
+ * false if any role is not defined in ARIA
+*/
+function areRolesDefined(roles) {
+ if (!roles || roles.length === 0)
+ return null;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) {
+ var role = roles_1[_i];
+ if (!(role.toLowerCase() in designPatterns))
+ return false;
+ }
+ return true;
+}
+exports.areRolesDefined = areRolesDefined;
+/*
+ * check if any explicit role specified for the element is a valid ARIA role
+ * return: null if no explicit role is defined,
+ * true if the role(s) are defined in ARIA
+ * false if any role is not defined in ARIA
+*/
+function getInvalidRoles(ruleContext) {
+ var domRoles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ if (!domRoles || domRoles.length === 0)
+ return null;
+ // check the 'generic' role first
+ if (domRoles && domRoles.includes('generic'))
+ return ["generic"];
+ // Failing roles
+ var failRoleTokens = [];
+ // Passing roles
+ var passRoleTokens = [];
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ var allowedRoles = legacy_1.RPTUtil.getAllowedAriaRoles(ruleContext, tagProperty);
+ if (!allowedRoles && allowedRoles.length === 0)
+ return domRoles;
+ var invalidRoles = [];
+ if (allowedRoles && allowedRoles.includes('any'))
+ return [];
+ for (var i = 0; i < domRoles.length; i++)
+ if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i]))
+ invalidRoles.push(domRoles[i]);
+ return invalidRoles;
+}
+exports.getInvalidRoles = getInvalidRoles;
+/*
+ * this method first checks explicit roles, if no explicit role, it will check the implicit role
+ * return: null if any explicit role is invalid,
+ * a list of invalid attributes
+ * empty list if all attributes are valid, or no aria attributes are specified
+ */
+function getInvalidAriaAttributes(ruleContext) {
+ var roles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ // for mutiple roles, skip if any role is invalid
+ var defined = areRolesDefined(roles);
+ if (defined !== null && !defined)
+ return null;
+ var attrs = [];
+ if (!roles || roles.length == 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ var aria_attrs = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ // Attributes allowed on this node
+ var allowedAttributes = legacy_1.RPTUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty);
+ if (aria_attrs) {
+ for (var i = 0; i < aria_attrs.length; i++) {
+ var attrName = aria_attrs[i].trim().toLowerCase();
+ if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName))
+ attrs.push(attrName);
+ }
+ }
+ return attrs;
+}
+exports.getInvalidAriaAttributes = getInvalidAriaAttributes;
+/*
+ * get conflict Aria and Html attributes
+ * return: a list of Aria and Html attribute pairs that are conflict
+*/
+function getConflictAriaAndHtmlAttributes(elem) {
+ var ariaAttrs = legacy_1.RPTUtil.getUserDefinedAriaAttributeNameValuePairs(elem);
+ var htmlAttrs = legacy_1.RPTUtil.getUserDefinedHtmlAttributeNameValuePairs(elem);
+ var ret = [];
+ if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) {
+ var _loop_1 = function (i) {
+ var examinedHtmlAtrNames = legacy_1.RPTUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict');
+ if (examinedHtmlAtrNames === null)
+ return "continue";
+ examinedHtmlAtrNames.forEach(function (item) {
+ if (item['result'] === 'Failed') //failed
+ ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] });
+ });
+ };
+ for (var i = 0; i < ariaAttrs.length; i++) {
+ _loop_1(i);
+ }
+ }
+ return ret;
+}
+exports.getConflictAriaAndHtmlAttributes = getConflictAriaAndHtmlAttributes;
+/*
+ * get conflict Aria and Html attributes
+ * return: a list of Aria and Html attribute pairs that are conflict
+*/
+function isTableDescendant(contextHierarchies) {
+ if (!contextHierarchies)
+ return null;
+ return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); });
+}
+exports.isTableDescendant = isTableDescendant;
+
+
+/***/ }),
+
+/***/ "./src/v4/sc-urls.json":
+/*!*****************************!*\
+ !*** ./src/v4/sc-urls.json ***!
+ \*****************************/
+/***/ ((module) => {
+
+module.exports = JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG21/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG21/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG21/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG21/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG21/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG21/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG21/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG21/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG21/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG21/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG21/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG21/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG21/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG21/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG21/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG21/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG21/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG21/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG21/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG21/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG21/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG21/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG21/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG21/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG21/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG21/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG21/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG21/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG21/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG21/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG21/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG21/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG21/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG21/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG21/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG21/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG21/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG21/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG21/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG21/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG21/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG21/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG21/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG21/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG21/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG21/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG21/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG21/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG21/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG21/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG21/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG21/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:WCAG2:pointer-gestures","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG21/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG21/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG21/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG21/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG21/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG21/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG21/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG21/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG21/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG21/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG21/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG21/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG21/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG21/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG21/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG21/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG21/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG21/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG21/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG21/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG21/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG21/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG21/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG21/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG21/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"}}');
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+var exports = __webpack_exports__;
+/*!**********************!*\
+ !*** ./src/index.ts ***!
+ \**********************/
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMWalker = exports.Config = exports.checkDemo = exports.ARIAMapper = exports.Context = exports.Checker = void 0;
+var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts");
+Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } }));
+// import { Simulator } from "./v2/simulator"
+var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts");
+Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } }));
+var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } }));
+var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts");
+Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } }));
+var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } }));
+String.prototype.startsWith = String.prototype.startsWith || function (str) {
+ return this.indexOf(str) === 0;
+};
+String.prototype.includes = String.prototype.includes || function (str) {
+ return this.indexOf(str) !== -1;
+};
+Array.prototype.includes = Array.prototype.includes || function (str) {
+ return this.indexOf(str) !== -1;
+};
+/*
+function simDemo(timeout?: number) {
+ if (!timeout) timeout = 0;
+ setTimeout(function() {
+ let sim = new Simulator();
+ let s = sim.renderItem(document.documentElement);
+ console.group("--- Item View ---");
+ console.log(s);
+ console.groupEnd();
+ console.group("--- Link View ---");
+ s = sim.renderLink(document.documentElement);
+ console.log(s);
+ console.groupEnd();
+ }, timeout);
+}
+*/
+function checkDemo(timeout) {
+ if (!timeout)
+ timeout = 0;
+ var checker = new Checker_1.Checker();
+ setTimeout(function () {
+ checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"])
+ .then(function (report) {
+ console.log(report);
+ var vals = {
+ "FAIL": 0,
+ "POTENTIAL": 1,
+ "MANUAL": 2,
+ "PASS": 3
+ };
+ for (var idx = 0; idx < report.results.length; ++idx) {
+ if (report.results[idx].value[1] === "PASS") {
+ report.results.splice(idx--, 1);
+ }
+ }
+ report.results.sort(function (a, b) {
+ if (a.category != b.category) {
+ return a.category.localeCompare(b.category);
+ }
+ if (a.path["aria"] === b.path["aria"]) {
+ return vals[a.value[1]] - vals[b.value[1]];
+ }
+ return a.path["aria"].localeCompare(b.path["aria"]);
+ });
+ var lastPath = null;
+ var category = null;
+ for (var _i = 0, _a = report.results; _i < _a.length; _i++) {
+ var result = _a[_i];
+ if (category !== result.category) {
+ if (category !== null) {
+ console.groupEnd();
+ console.groupEnd();
+ lastPath = null;
+ }
+ category = result.category;
+ console.group(result.category);
+ }
+ if (result.path["aria"] != lastPath) {
+ if (lastPath !== null) {
+ console.groupEnd();
+ }
+ lastPath = result.path["aria"];
+ if (lastPath === "") {
+ console.group("page");
+ }
+ else {
+ console.group(lastPath);
+ }
+ }
+ console.log(result.value, result.message);
+ }
+ console.groupEnd();
+ console.groupEnd();
+ });
+ }, timeout);
+}
+exports.checkDemo = checkDemo;
+
+})();
+
+ace = __webpack_exports__;
+/******/ })()
+;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQztZQUNyRCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7WUFDaEMsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDdEUseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiw2QkFBNkIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDakUsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztZQUM1QixVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQzFHLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDOUMseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsNkJBQTZCLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDbkQ7UUFDRCxRQUFRLEVBQUU7WUFDTixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxHQUFHLEVBQUU7WUFDRCxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDM0IsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztZQUNoQywwQkFBMEIsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUM5QztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUM3QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDZCQUE2QixFQUFFLENBQUMsZUFBZSxDQUFDO1NBQ25EO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxRQUFRLEVBQUU7WUFDTixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDO1lBQ3pFLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDM0IsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDN0IsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNuQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUMxQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUMxQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztZQUN2SCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDM0IseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDcEMseUJBQXlCLEVBQUUsS0FBSztZQUNoQywwQkFBMEIsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUM5QztLQUNKLEVBQUMscUNBQXFDO0lBRWhDLHlEQUF5QyxHQUk1QztRQUNBLEdBQUcsRUFBRTtZQUNELFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLDZEQUE2RDtnQkFDN0QsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNuTSx5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiw2QkFBNkIsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2FBQ3hEO1lBQ0QsY0FBYyxFQUFFO2dCQUNaLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDekIsdURBQXVEO2dCQUN2RCxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELE1BQU0sRUFBRTtZQUNKLFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLDZEQUE2RDtnQkFDN0QsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxjQUFjLEVBQUU7Z0JBQ1osWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6Qix1REFBdUQ7Z0JBQ3ZELFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7Z0JBQzlCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNULE9BQU87UUFDUCx3Q0FBd0M7UUFDeEMsb0hBQW9IO1FBQ3BILG1HQUFtRztRQUNuRyw2Q0FBNkM7UUFDN0MsWUFBWTtRQUNKLEtBQUssRUFBRTtZQUNILFVBQVUsRUFBRTtnQkFDUixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7Z0JBQ3BDLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxhQUFhLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELFFBQVEsRUFBRTtZQUNOLGtCQUFrQixFQUFFO2dCQUNoQixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QscUJBQXFCLEVBQUU7Z0JBQ25CLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxRQUFRLEVBQUU7WUFDTixvQ0FBb0MsRUFBRTtnQkFDbEMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6Qix1RkFBdUY7Z0JBQ3ZGLFVBQVUsRUFBRSxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQztnQkFDN0QseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7Z0JBQzdCLDZGQUE2RjtnQkFDN0YsVUFBVSxFQUFFLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUM3RCx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDVCxPQUFPO1FBQ1AsNkNBQTZDO1FBQzdDLHdHQUF3RztRQUN4RyxpUUFBaVE7UUFDalEsNkNBQTZDO1FBQzdDLFlBQVk7UUFFSixRQUFRLEVBQUU7WUFDTixvQ0FBb0MsRUFBRTtnQkFDbEMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6Qix1RkFBdUY7Z0JBQ3ZGLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUM3Qyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsNkZBQTZGO2dCQUM3RixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQztnQkFDN0MseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUVKO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsbUJBQW1CLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDckIsK0RBQStEO2dCQUMvRCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDM00seUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELG9CQUFvQixFQUFFO2dCQUNsQixZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQzlCLGdEQUFnRDtnQkFDaEQsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLEtBQUs7Z0JBQ2hDLDBCQUEwQixFQUFFLENBQUMsa0JBQWtCLENBQUM7YUFDbkQ7WUFDRCxpQkFBaUIsRUFBRTtnQkFDZixZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLHVGQUF1RjtnQkFDdkYsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLEtBQUs7Z0JBQ2hDLDBCQUEwQixFQUFFLENBQUMsa0JBQWtCLENBQUM7YUFDbkQ7U0FDSjtRQUNELE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRTtnQkFDTixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNuSyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsNEJBQTRCLEVBQUU7Z0JBQzFCLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsNkVBQTZFO2dCQUM3RSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUM3Qyw2QkFBNkIsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUNsRDtZQUNELCtCQUErQixFQUFFO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLGlGQUFpRjtnQkFDakYsVUFBVSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztnQkFDcEQseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLDZCQUE2QixFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE1BQU0sRUFBRTtnQkFDSixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztnQkFDOUQsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDZCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztnQkFDOUQsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxlQUFlLEVBQUU7Z0JBQ2IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixxRUFBcUU7Z0JBQ3JFLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7Z0JBQ2xGLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDO2FBQ3ZDO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE1BQU0sRUFBRTtnQkFDSixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxDQUFDO2FBQ2hEO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsS0FBSzthQUNuQztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7Z0JBQ3ZKLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO2dCQUM1QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2dCQUNsRix1QkFBdUIsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN2QztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZCLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0IseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLDZCQUE2QixFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDZCQUE2QixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQzthQUNwRTtZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNuSyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsZ0JBQWdCLEVBQUU7Z0JBQ2QsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUMzQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0Qsa0JBQWtCLEVBQUU7Z0JBQ2hCLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbksseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGFBQWEsRUFBRTtnQkFDWCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDckY7WUFDRCxlQUFlLEVBQUU7Z0JBQ2IsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDO2dCQUNuRCx5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDckY7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDZCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQixtRkFBbUY7YUFDdEY7WUFDRCxNQUFNLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxhQUFhLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0QsZUFBZSxFQUFFO2dCQUNiLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxNQUFNLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxtQkFBbUIsRUFBRTtnQkFDakIsOERBQThEO2dCQUM5RCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2YsOERBQThEO2dCQUM5RCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxJQUFJLEVBQUU7WUFDRixvQkFBb0IsRUFBRTtnQkFDbEIsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELHVCQUF1QixFQUFFO2dCQUNyQixZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUN0cUIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUN0cUIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsUUFBUSxFQUFFO1lBQ04sMkJBQTJCLEVBQUU7Z0JBQ3pCLDZGQUE2RjtnQkFDN0YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDZCQUE2QixFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDMUQ7WUFDRCx3QkFBd0IsRUFBRTtnQkFDdEIsZ0dBQWdHO2dCQUNoRyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiw2QkFBNkIsRUFBRSxDQUFDLHNCQUFzQixDQUFDO2FBQzFEO1NBQ0o7UUFDRCxTQUFTLEVBQUU7WUFDUCx5QkFBeUIsRUFBRTtnQkFDdkIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDakU7WUFDRCw0QkFBNEIsRUFBRTtnQkFDMUIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsY0FBYyxFQUFFO2dCQUNaLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELElBQUksRUFBRTtZQUNGLFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxjQUFjLEVBQUU7Z0JBQ1osWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxJQUFJLEVBQUU7WUFDRixtQ0FBbUMsRUFBRTtnQkFDakMsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztnQkFDbkMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxzQ0FBc0MsRUFBRTtnQkFDcEMsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztnQkFDdEMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDckIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxVQUFVLEVBQUU7Z0JBQ1IsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNyQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUVELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxJQUFJO1lBQ2xCLG9CQUFvQjtZQUNwQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztLQUNKLEVBQUMsbURBQW1EO0lBRXJELDRGQUE0RjtJQUM1Rix3R0FBd0c7SUFDeEcsNENBQTRDO0lBQ3JDLHlDQUF5QixHQWEzQjtRQUNELGNBQWMsRUFBRTtZQUNaLFFBQVEsRUFBRTtnQkFDTixrQkFBa0IsRUFBRSxPQUFPO2dCQUMzQixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDL0IsbUJBQW1CLEVBQUUsSUFBSTthQUM1QjtZQUNELFdBQVcsRUFBRTtnQkFDVCxrQkFBa0IsRUFBRSxNQUFNO2dCQUMxQixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDL0IsbUJBQW1CLEVBQUUsSUFBSTthQUM1QjtTQUNKO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFO2dCQUNOLGtCQUFrQixFQUFFLE9BQU87Z0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUNoQyxtQkFBbUIsRUFBRSxJQUFJO2FBQzVCO1lBQ0QsV0FBVyxFQUFFO2dCQUNULGtCQUFrQixFQUFFLE1BQU07Z0JBQzFCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUNoQyxtQkFBbUIsRUFBRSxJQUFJO2FBQzVCO1NBQ0o7UUFDRCxhQUFhLEVBQUU7WUFDWCxRQUFRLEVBQUU7Z0JBQ04sa0JBQWtCLEVBQUUsT0FBTztnQkFDM0Isa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLG1CQUFtQixFQUFFLElBQUk7YUFDNUI7WUFDRCxXQUFXLEVBQUU7Z0JBQ1Qsa0JBQWtCLEVBQUUsTUFBTTtnQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLG1CQUFtQixFQUFFLElBQUk7YUFDNUI7U0FDSjtRQUNELGtCQUFrQixFQUFFO1lBQ2hCLFFBQVEsRUFBRTtnQkFDTixrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QixrQkFBa0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDbkMsbUJBQW1CLEVBQUUsSUFBSTthQUM1QjtTQUNKO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFO2dCQUNOLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLGtCQUFrQixFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUMzQixtQkFBbUIsRUFBRSxJQUFJO2FBQzVCO1lBQ0Qsa0tBQWtLO1NBQ3JLO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFO2dCQUNOLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLGtCQUFrQixFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUMzQixtQkFBbUIsRUFBRSxJQUFJO2FBQzVCO1lBQ0Qsa0tBQWtLO1NBQ3JLO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFO2dCQUNOLGtCQUFrQixFQUFFLE9BQU87Z0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO2dCQUN4RSxtQkFBbUIsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO2FBQ2hEO1lBQ0QsV0FBVyxFQUFFO2dCQUNULGtCQUFrQixFQUFFLE1BQU07Z0JBQzFCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO2dCQUN4RSxtQkFBbUIsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO2FBQzlDO1NBQ0o7UUFDRCxlQUFlLEVBQUU7WUFDYixRQUFRLEVBQUU7Z0JBQ04sa0JBQWtCLEVBQUUsT0FBTztnQkFDM0Isa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQ2hDLG1CQUFtQixFQUFFLElBQUk7YUFDNUI7WUFDRCxXQUFXLEVBQUU7Z0JBQ1Qsa0JBQWtCLEVBQUUsTUFBTTtnQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQ2hDLG1CQUFtQixFQUFFLElBQUk7YUFDNUI7U0FDSjtRQUNELGNBQWMsRUFBRTtZQUNaLFFBQVEsRUFBRTtnQkFDTiwrQ0FBK0M7Z0JBQy9DLGtCQUFrQixFQUFFLE9BQU87Z0JBQzNCLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUMvQixtQkFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQzthQUNqQztZQUNELFdBQVcsRUFBRTtnQkFDVCxnQ0FBZ0M7Z0JBQ2hDLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUMvQixtQkFBbUIsRUFBRSxJQUFJO2FBQzVCO1NBQ0o7UUFDRCxjQUFjLEVBQUU7WUFDWixRQUFRLEVBQUU7Z0JBQ04sK0NBQStDO2dCQUMvQyxrQkFBa0IsRUFBRSxPQUFPO2dCQUMzQixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDL0IsbUJBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUM7YUFDakM7WUFDRCxXQUFXLEVBQUU7Z0JBQ1QsaUNBQWlDO2dCQUNqQyxrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDL0IsbUJBQW1CLEVBQUUsSUFBSTthQUM1QjtTQUNKO1FBQ0QsbUJBQW1CLEVBQUU7WUFDakIsUUFBUSxFQUFFO2dCQUNOLDhDQUE4QztnQkFDOUMsa0JBQWtCLEVBQUUsTUFBTTtnQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQ3BDLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDO2FBQzlCO1NBQ0o7S0FDSjtJQUVNLDBCQUFVLEdBQUcsRUFBRTtJQUMxQixzQkFBQztDQUFBO0FBanJGWSwwQ0FBZTtBQWlyRjNCLENBQUM7QUFFRixJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFFeEIsS0FBSyxJQUFNLFVBQVUsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFO0lBQ3JELElBQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hFLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtRQUNyQixLQUF3QixVQUFVLEVBQVYseUJBQVUsRUFBVix3QkFBVSxFQUFWLElBQVUsRUFBRTtZQUEvQixJQUFNLFNBQVM7WUFDaEIsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUN6QyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2xDO1NBQ0o7S0FDSjtDQUNKO0FBQ0QsZUFBZSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUM7Ozs7Ozs7Ozs7OztBQy90RjVDOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRSx5R0FBb0Q7QUFDcEQsMEdBQXNEO0FBQ3RELHFGQUF5QztBQUN6QyxnSUFBOEQ7QUFDOUQsc0lBQXNFO0FBRXRFLDBGQUEwQztBQUMxQyxtR0FBNkQ7QUFDN0QsMkZBQTZDO0FBSTdDO0lBQWdDLDhCQUFZO0lBQTVDOztJQTI0QkEsQ0FBQztJQTE0Qkcsd0NBQW1CLEdBQW5CLFVBQW9CLElBQVUsRUFBRSxJQUFZO1FBQ3hDLHFEQUFxRDtRQUNyRCxvQ0FBb0M7UUFDcEMseURBQXlEO1FBQ3pELHdCQUF3QjtRQUN4QixRQUFRO1FBQ1IsSUFBSTtRQUNKLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxpQ0FBZSxDQUFDLGNBQWMsSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFDRCw0QkFBTyxHQUFQLFVBQVEsSUFBVTtRQUNkLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELGlDQUFZLEdBQVo7UUFDSSxPQUFPLE1BQU07SUFDakIsQ0FBQztJQUNELGtDQUFhLEdBQWIsVUFBYyxJQUFVO1FBQ3BCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQzdDLElBQU0sTUFBSSxHQUFHLElBQWUsQ0FBQztZQUM3QixLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsTUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQy9DLElBQU0sUUFBUSxHQUFHLE1BQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLElBQU0sTUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksTUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxDQUFDLE1BQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2lCQUNsRDthQUNKO1lBRUQsSUFBSSxhQUFhLEdBQUUsVUFBUyxRQUFlO2dCQUN2QyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLHdCQUF3QixDQUFDO29CQUFFLE9BQU87Z0JBQy9ELEtBQUssSUFBTSxJQUFJLElBQUksVUFBVSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUM5RCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUU7d0JBQ25CLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEUsSUFBSSxPQUFPLEtBQUssSUFBSSxXQUFXLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTs0QkFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxPQUFPLEVBQUUsRUFBRTtnQ0FDNUIsS0FBSyxHQUFJLEtBQWtCLENBQUMsTUFBSSxDQUFDLENBQUM7NkJBQ3JDOzRCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7eUJBQ3hCO3FCQUNKO2lCQUNKO1lBQ0wsQ0FBQztZQUNELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQzlDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsRUFBRTtZQUNqRCxLQUFLLElBQU0sSUFBSSxJQUFJLFVBQVUsQ0FBQyx3QkFBd0IsRUFBRTtnQkFDcEQsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO29CQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUN0QjthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0seUJBQWMsR0FBckIsVUFBc0IsSUFBaUI7UUFDbkMsSUFBTSxHQUFHLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsd0JBQVEsRUFBQyxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDbkQsSUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFO2dCQUNuRCxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdCLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDeEMsSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxLQUFLLEVBQUU7d0JBQ1Asd0JBQVEsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUN4QztpQkFDSjthQUNKO1lBQ0Qsd0JBQVEsRUFBQyxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQ7UUFDRCxPQUFPLHdCQUFRLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8scUNBQWdCLEdBQXhCLFVBQXlCLElBQVU7UUFDL0IsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNFLElBQUksVUFBVSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLElBQUksRUFBRSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFNBQVMsRUFBRSxFQUFFO2dCQUNiLG1CQUFtQixFQUFFLElBQUk7YUFDNUIsQ0FBQztZQUNGLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN2QixnQkFBZ0I7WUFDaEIsS0FBbUIsVUFBZSxFQUFmLG1DQUFlLEVBQWYsNkJBQWUsRUFBZixJQUFlLEVBQUU7Z0JBQS9CLElBQU0sSUFBSTtnQkFDWCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDZixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUM5QixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNO2dCQUNsQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsR0FBQyxHQUFHLEdBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQztnQkFDaEUsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLG1CQUFtQjthQUN0RCxDQUFDLENBQUM7WUFDSCxPQUFPLGFBQWEsQ0FBQztTQUN4QjthQUFNO1lBQ0gsSUFBSSxJQUFJLEdBQUcsSUFBbUIsQ0FBQztZQUMvQixJQUFJLGFBQWEsR0FPWix3QkFBUSxFQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNoQiw2RkFBNkY7Z0JBRTdGLDZDQUE2QztnQkFDN0MsSUFBSSxRQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFFBQU0sRUFBRTtvQkFDVCxRQUFNLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFnQixDQUFDO2lCQUN6RDtnQkFDRCxPQUFPLFFBQU0sSUFBSSxRQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtvQkFDcEMsUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBZ0IsQ0FBQztpQkFDekQ7Z0JBQ0QsSUFBSSxlQUFlLEdBQUcsUUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEYsSUFBSSxFQUFFLEVBQUU7b0JBQ1IsUUFBUSxFQUFFLEVBQUU7b0JBQ1osU0FBUyxFQUFFLEVBQUU7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztnQkFDRixPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO29CQUM5RCxRQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFNLENBQUMsSUFBSSxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxRQUFNLENBQWdCLENBQUM7b0JBQzdGLGVBQWUsR0FBRyxRQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM5RCxVQUFVLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFEO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxRQUFRLEdBYVI7b0JBQ0EsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsRUFBRTtvQkFDOUQsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDOUIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTTtvQkFDbEMsUUFBUSxFQUFFLEVBQUU7b0JBQ1osU0FBUyxFQUFFLEVBQUU7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUI7Z0JBRUQseURBQXlEO2dCQUN6RCxJQUFJLHVCQUF1QixHQUFHLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO2dCQUM5RCxJQUFJLHVCQUF1QixFQUFFO29CQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztpQkFDMUI7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUI7MkJBQ3RELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4RDtnQkFFRCxnQkFBZ0I7Z0JBQ2hCLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7b0JBQzFCLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNyRixRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUMsR0FBRyxHQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUMsR0FBRyxHQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFDLEdBQUcsQ0FBQztpQkFDekc7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO2lCQUMzQztnQkFFRCxnQkFBZ0I7Z0JBQ2hCLGFBQWEsR0FBRyxFQUFFO2dCQUNsQixLQUFtQixVQUFlLEVBQWYsbUNBQWUsRUFBZiw2QkFBZSxFQUFmLElBQWUsRUFBRTtvQkFBL0IsSUFBTSxJQUFJO29CQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCO2dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLHdCQUFRLEVBQUMsSUFBSSxFQUFFLDhCQUE4QixFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQ2pFO1lBQ0QsT0FBTyxhQUFhLENBQUM7U0FDeEI7SUFDTCxDQUFDO0lBRUQsMEJBQUssR0FBTCxVQUFNLElBQVU7UUFDWixVQUFVLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixTQUFTLEVBQUUsRUFBRTthQUNoQixDQUFDLENBQUM7UUFDSCwwQkFBMEI7UUFDMUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksSUFBSSxDQUFDO1FBQ1QsT0FBTyxJQUFJLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUFBLENBQUM7UUFDRiwyREFBMkQ7UUFDM0QsSUFBSSxVQUFVLEdBQUcsSUFBSSx1QkFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0QsR0FBRztZQUNDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFDO1NBQ0osUUFBUSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUU7SUFDcEMsQ0FBQztJQUVELDhCQUFTLEdBQVQsVUFBVSxJQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3hCLEtBQUssSUFBSSxHQUFHLEdBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFO1lBQ3JELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEY7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxrQ0FBYSxHQUFiLFVBQWMsSUFBVTtRQUNwQiwrQ0FBK0M7UUFDL0MsSUFBSSxhQUFhLEdBQUcsRUFBRTtRQUN0QiwwQkFBMEI7UUFDMUIsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDMUMsQ0FBQztJQUVELCtCQUFVLEdBQVYsVUFBVyxJQUFVO1FBQ2pCLElBQUksTUFBTSxHQUFrQixFQUFFLENBQUM7UUFDL0IsS0FBa0IsVUFBcUIsRUFBckIsU0FBSSxDQUFDLGdCQUFnQixFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO1lBQXBDLElBQU0sR0FBRztZQUNWLHlCQUF5QjtZQUN6QixtQkFBbUI7WUFDbkIsZ0RBQWdEO1lBQ2hELGtDQUFrQztZQUNsQyx1QkFBdUI7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQy9ELElBQUksUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFNLENBQUMsQ0FBQyxDQUFDLHdCQUFRLEVBQUMsUUFBcUIsRUFBRSx5QkFBeUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hHO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQW1IYSxzQkFBVyxHQUF6QixVQUEwQixHQUFTO1FBQy9CLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1FBQy9CLE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRWEsMEJBQWUsR0FBN0IsVUFBOEIsTUFBYyxFQUFFLEdBQVMsRUFBRSxrQkFBMkIsRUFBRSxZQUFxQjtRQUN2Ryw2RUFBNkU7UUFDN0UsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxvQkFBb0I7WUFBRSxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDbEUsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQzVDLElBQUksWUFBWSxJQUFJLGtCQUFrQjtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFFLDRDQUE0QyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNqRjtRQUVELElBQU0sSUFBSSxHQUFHLEdBQWMsQ0FBQztRQUM1Qiw2Q0FBNkM7UUFDN0MsSUFBSSx3QkFBUSxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRSx3QkFBUSxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxHQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLG1KQUFtSjtRQUVuSixrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMscUJBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEQsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQzdELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakUsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLEtBQWtCLFVBQVUsRUFBVix5QkFBVSxFQUFWLHdCQUFVLEVBQVYsSUFBVSxFQUFFO2dCQUF6QixJQUFNLEdBQUc7Z0JBQ1YsSUFBTSxPQUFPLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLE9BQU8sRUFBRTtvQkFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM1QjthQUNKO1lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixLQUFtQixVQUFVLEVBQVYseUJBQVUsRUFBVix3QkFBVSxFQUFWLElBQVUsRUFBRTtvQkFBMUIsSUFBTSxNQUFJO29CQUNYLFdBQVcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDeEU7Z0JBQ0QsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDN0I7U0FDSjtRQUVELCtHQUErRztRQUMvRyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUU7WUFDMUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEYsNkVBQTZFO2dCQUM3RSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQ3RDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDakQ7YUFDSjtZQUNELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDNUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELDhGQUE4RjtRQUM5RixJQUFNLElBQUksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksaUJBQWlCLEdBQUc7WUFDcEIsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUztZQUMxQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZO1NBQ3JELENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEYsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUM1RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDakQ7U0FDSjtRQUVELE9BQU87UUFDUCxJQUFJLElBQUksS0FBSyxjQUFjLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3RyxPQUFPLGlCQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNuRTtZQUVELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6RixJQUFJLEtBQUssRUFBRTtvQkFDUCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO3dCQUMzRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzVEO3lCQUFNO3dCQUNILE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQztxQkFDNUI7aUJBQ0o7YUFDSjtZQUNELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVLEVBQUU7Z0JBQzNDLElBQWMsR0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBQztvQkFDdkMsSUFBSSxNQUFNLEdBQWEsR0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDcEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDO2lCQUMzQjtxQkFBSTtvQkFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQzFEO2FBRUo7U0FFSjtRQUVELE1BQU07UUFDTixJQUFJLENBQUMsWUFBWSxJQUFJLGtCQUFrQixDQUFDLElBQUksaUJBQWlCLEVBQUU7WUFDM0QsOERBQThEO1lBQzlELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDcEIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sRUFBRTtvQkFDekMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQzt3QkFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNILFlBQVksR0FBRyxLQUFLLENBQUM7aUJBQ3hCO2FBQ0o7WUFFRCxzRkFBc0Y7WUFDdEYsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUNuQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFO29CQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNuRCxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzlDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7NEJBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNsRSxJQUFJLElBQUksS0FBSyxRQUFROzRCQUFFLE9BQU8sUUFBUSxDQUFDO3dCQUN2QyxJQUFJLElBQUksS0FBSyxPQUFPOzRCQUFFLE9BQU8sT0FBTyxDQUFDO3FCQUN4QztpQkFDSjtxQkFBTTtvQkFDSCxZQUFZLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjthQUNKO1lBRUQsZ0hBQWdIO1lBQ2hILElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7b0JBQzVDLElBQUksUUFBUSxHQUFHLHVCQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLFFBQVEsRUFBRTt3QkFDVixPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ3JFO2lCQUNKO2FBQ0o7WUFFRCx5RUFBeUU7WUFDekUsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckUsK0RBQStEO2dCQUMvRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BGLHlFQUF5RTtnQkFDekUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2xGLDRFQUE0RTthQUMvRTtTQUNKO1FBRUQsVUFBVTtRQUNWLElBQUksWUFBWSxJQUFJLGlDQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLGtCQUFrQixFQUFFO1lBQzdFLHFEQUFxRDtZQUNyRCxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDckIsc0ZBQXNGO1lBQ3RGLHlGQUF5RjtZQUN6RixzRUFBc0U7WUFDdEUsd0ZBQXdGO1lBQ3hGLDJEQUEyRDtZQUMzRCx3RkFBd0Y7WUFDeEYseURBQXlEO1lBQ3pELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQixNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUVoRixJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO2dCQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEQsV0FBVyxJQUFJLE1BQU0sQ0FBQzthQUN6QjtZQUNELGtEQUFrRDtZQUNsRCw0Q0FBNEM7WUFDNUMsNEZBQTRGO1lBQzVGLGdDQUFnQztZQUNoQywrQ0FBK0M7WUFDL0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtnQkFDeEMseUNBQXlDO2dCQUN6QyxJQUFJLENBQUUsSUFBd0IsQ0FBQyxhQUFhLEVBQUUsSUFBSyxJQUF3QixDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3RHLElBQUksU0FBUyxHQUFHLGdCQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDOUQsV0FBVyxJQUFLLEdBQUcsR0FBRyxTQUFTLENBQUM7aUJBQ3ZDO3FCQUFNO29CQUNILHFDQUFxQztvQkFDckMsS0FBd0IsVUFBeUMsRUFBekMsS0FBQyxJQUF3QixDQUFDLGFBQWEsRUFBRSxFQUF6QyxjQUF5QyxFQUF6QyxJQUF5QyxFQUFFO3dCQUE5RCxJQUFNLFNBQVM7d0JBQ2hCLElBQUksZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMvRixXQUFXLElBQUksR0FBRyxHQUFHLGdCQUFnQixDQUFDO3FCQUN6QztpQkFDSjthQUNKO2lCQUFNO2dCQUNILElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ2hDLE9BQU8sU0FBUyxFQUFFO29CQUNkLElBQUksZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMvRixXQUFXLElBQUksR0FBRyxHQUFHLGdCQUFnQixDQUFDO29CQUN0QyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztpQkFDckM7YUFDSjtZQUVELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJO2dCQUNBLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQ2pGO1lBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRTtZQUVkLElBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7Z0JBQzNCLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxXQUFXLElBQUksS0FBSyxDQUFDO2FBQ3hCO1lBQ0QscUNBQXFDO1lBQ3JDLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLFdBQVcsQ0FBQzthQUN0QjtTQUNKO1FBRUQsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxFQUFFO1lBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsT0FBTyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7YUFDL0M7U0FDSjtRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FxQk87SUFFVyxxQkFBVSxHQUF4QixVQUF5QixJQUFXO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsb0JBQW9CLEVBQUU7WUFDMUMsT0FBTyxNQUFNLENBQUM7U0FDakI7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFNLElBQUksR0FBRyxJQUFlLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksT0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsS0FBbUIsVUFBSyxFQUFMLGlCQUFLLEVBQUwsbUJBQUssRUFBTCxJQUFLLEVBQUU7Z0JBQXJCLElBQU0sSUFBSTtnQkFDWCxJQUFJLElBQUksS0FBSyxjQUFjLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtvQkFDNUMscUVBQXFFO29CQUNyRSxJQUFJLENBQUMsZ0JBQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzVCLE9BQU8sSUFBSSxDQUFDO3FCQUNmO2lCQUNKO3FCQUFNLElBQUksSUFBSSxJQUFJLGlDQUFlLENBQUMsY0FBYyxFQUFFO29CQUMvQyxPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1NBQ0o7UUFDRCx1Q0FBdUM7UUFDdkMsSUFBTSxLQUFLLEdBQUcsZ0JBQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQTlYRCw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ25CLElBQUk7SUFFSix5RUFBeUU7SUFDM0QsbUNBQXdCLEdBQStEO1FBQ2pHLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxVQUFVLENBQUMsV0FBVztTQUNqQztRQUNDLFVBQVUsRUFBRTtZQUNWLHdGQUF3RjtZQUN4Riw0Q0FBNEM7WUFDNUMsaUJBQWlCLEVBQUUsY0FBSTtnQkFDbkIsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JFLE9BQU8sRUFBRSxHQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7MkJBQ2pDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDdkY7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKO1FBQ0MsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLEdBQUc7U0FDZjtRQUNDLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxHQUFHO1NBQ2Y7UUFDQyxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsR0FBRztTQUNmO1FBQ0MsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLEdBQUc7U0FDZjtRQUNDLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxHQUFHO1NBQ2Y7UUFDQyxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsR0FBRztTQUNmO1FBQ0MsT0FBTyxFQUFFO1lBQ1AsdUZBQXVGO1lBQ3ZGLGdGQUFnRjtZQUNoRix1RkFBdUY7WUFDdkYsY0FBYztZQUNkLFNBQVMsRUFBRSxjQUFJO2dCQUNYLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPLEVBQUU7b0JBQ25GLE9BQU8sRUFBRSxHQUFFLElBQXlCLENBQUMsT0FBTyxDQUFDO2lCQUNoRDtnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsaUZBQWlGO1lBQ2pGLGdDQUFnQzs7WUFDOUIsU0FBUyxFQUFFLGNBQUksSUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUseUVBQXlFO1lBQ3pFLGtDQUFrQzs7WUFDaEMsVUFBVSxFQUFFLGNBQUksSUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsc0ZBQXNGO1lBQ3RGLHlGQUF5RjtZQUN6Riw4QkFBOEI7O1lBQzVCLE1BQU0sRUFBRSxjQUFJLElBQU0sT0FBTyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0MsUUFBUSxFQUFFO1lBQ1IsaUJBQWlCLEVBQUUsT0FBTztTQUM3QjtRQUNDLElBQUksRUFBRTtZQUNKLGdEQUFnRDtZQUNoRCxTQUFTLEVBQUUsY0FBSTtnQkFDWCxJQUFJLE1BQU0sR0FBRyxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN6QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLEVBQUUsR0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxpREFBaUQ7O1lBQy9DLFVBQVUsRUFBRSxjQUFJO2dCQUNkLElBQUksTUFBTSxHQUFHLGlCQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN6QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDWixLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDbkMsSUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwQixJQUFJLGlCQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDekUsT0FBTyxFQUFFLEdBQUMsR0FBRyxDQUFDO3FCQUNqQjtvQkFDRCxFQUFFLEdBQUcsQ0FBQztpQkFDVDtnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1NBQ0o7UUFDQyxVQUFVLEVBQUU7WUFDVixvRUFBb0U7WUFDcEUsb0NBQW9DO1lBQ3BDLFNBQVMsRUFBRSxjQUFJLElBQUksU0FBRSxHQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO21CQUM5QyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUMsRUFEL0QsQ0FDK0Q7U0FDckY7UUFDQyxRQUFRLEVBQUU7WUFDUiw2RUFBNkU7WUFDN0UsVUFBVSxFQUFFLGNBQUksSUFBSSxTQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7bUJBQ2hELENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxFQUFFLENBQUMsQ0FBQyxFQURoRSxDQUNnRTtTQUN2RjtRQUNDLFVBQVUsRUFBRTtZQUNWLFVBQVUsRUFBRSxjQUFJLElBQUksV0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQS9CLENBQStCO1lBQ2pELFVBQVUsRUFBRSxjQUFJLElBQUksVUFBRyxFQUFILENBQUc7WUFDdkIsVUFBVSxFQUFFLGNBQUksSUFBSSxXQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUExQixDQUEwQjtTQUNuRDtLQUVKO0lBQ2EsbUNBQXdCLEdBQWdDO1FBQ2xFLE1BQU0sRUFBRSxjQUFJLElBQUksV0FBSSxDQUFDLFNBQVMsRUFBZCxDQUFjO0tBQ2pDO0lBRWMsNEJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBMGhCekMsaUJBQUM7Q0FBQSxDQTM0QitCLDJCQUFZLEdBMjRCM0M7QUEzNEJZLGdDQUFVOzs7Ozs7Ozs7Ozs7QUM1QnZCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSxzSUFBc0U7QUFDdEUsMkZBQTZDO0FBQzdDLDBGQUEwQztBQUUxQzs7OztHQUlHO0FBQ0g7SUFLSSxvQkFBWSxPQUFjLEVBQUUsSUFBZSxFQUFFLElBQVk7UUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsMkJBQU0sR0FBTjtRQUNJLElBQUssSUFBWSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3RDthQUFNO1lBQ0gsbURBQW1EO1lBQ25ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDO1NBQ3hDO0lBQ0wsQ0FBQztJQUVELDZCQUFRLEdBQVI7UUFDSSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsR0FBRztZQUNDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsa0lBQWtJO1lBQ2xJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNmLElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxJQUEwQixDQUFDO2dCQUNsRCxJQUFJLFdBQVcsR0FBSSxJQUFJLENBQUMsSUFBb0IsQ0FBQztnQkFDN0MsSUFBSSxXQUFXLEdBQUksSUFBSSxDQUFDLElBQXdCO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVE7dUJBQzdDLHFCQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQzt1QkFDbkMsVUFBVSxDQUFDLGVBQWU7dUJBQzFCLFVBQVUsQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUNqRDtvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDO29CQUN0RCxJQUFJLENBQUMsSUFBWSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7aUJBQ2xEO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1Qjt1QkFDcEQscUJBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO3VCQUNwQyxXQUFXLENBQUMsVUFBVTt1QkFDdEIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQ3hDO29CQUNJLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUM7dUJBQzVCLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTTt1QkFDN0MsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdDO29CQUNJLDRGQUE0RjtvQkFDNUYsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFDLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLElBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQztxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUN4SSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNwQztxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSyxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsRUFBRTtvQkFDckMsSUFBSSxTQUFTLEdBQUksSUFBSSxDQUFDLElBQVksQ0FBQyxTQUFTLENBQUM7b0JBQzdDLElBQUksYUFBYSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztvQkFDbkQsT0FBUSxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsQ0FBQztvQkFDcEMsT0FBUSxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsQ0FBQztvQkFDcEMsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sRUFBRTt3QkFDbEQsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3BELElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLElBQVksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO3dCQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztxQkFDeEI7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUN2QjtpQkFDSjtxQkFBTSxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxFQUFFO29CQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3JCLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ3BCO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQzdCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQTBCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUN4RyxJQUFJLE1BQU0sR0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQTBCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsSUFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzVFLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzt5QkFDeEI7NkJBQU07NEJBQ0gsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsSUFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDeEUsSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQzNCLFdBQVc7Z0NBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQ0FDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7NkJBQ3ZCO2lDQUFNO2dDQUNILFlBQVk7Z0NBQ1osSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs2QkFDeEI7eUJBQ0o7cUJBQ0o7b0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0osUUFDRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDO2VBQzdILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLElBQUksQ0FBQyxJQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUM7ZUFDdkYsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBbUIsQ0FBQyxDQUFDLEVBQ3JHO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDZCQUFRLEdBQVI7UUFDSSxHQUFHO1lBQ0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxJQUEwQixDQUFDO2dCQUNsRCxJQUFJLFdBQVcsR0FBSSxJQUFJLENBQUMsSUFBb0IsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7dUJBQ25DLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQ3BELHFCQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzt1QkFDcEMsV0FBVyxDQUFDLFVBQVU7dUJBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUN2QztvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDL0csSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDbkM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7aUJBQ3hCO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2YsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2lCQUN2QjtxQkFBTSxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxFQUFFO29CQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0osUUFDRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUM7ZUFDNUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUssSUFBSSxDQUFDLElBQWdCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUM1RjtRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTCxpQkFBQztBQUFELENBQUM7QUEzS1ksZ0NBQVU7Ozs7Ozs7Ozs7OztBQ3pCdkI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBSS9FO0lBQUE7SUE2QkEsQ0FBQztJQTVCaUIsZ0NBQW1CLEdBQWpDLFVBQWtDLGdCQUFzQztRQUNwRSxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUMxQyw2Q0FBNkM7WUFDN0MsS0FBSyxJQUFJLEdBQUcsR0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUN6RCxJQUFNLElBQUksR0FBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBb0IsQ0FBQztnQkFDN0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUM7dUJBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUTt1QkFDeEMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLGNBQWMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxFQUNwRztvQkFDSSxPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRWEsb0JBQU8sR0FBckIsVUFBc0IsZ0JBQXNDO1FBQ3hELElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQzFDLDZDQUE2QztZQUM3QyxLQUFLLElBQUksR0FBRyxHQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQ3pELElBQU0sSUFBSSxHQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFvQixDQUFDO2dCQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFO29CQUNqRSxPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0wsbUJBQUM7QUFBRCxDQUFDO0FBN0JZLG9DQUFZOzs7Ozs7Ozs7Ozs7QUNsQnpCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUkvRTtJQUFBO0lBd0JBLENBQUM7SUF2QmlCLDZCQUFnQixHQUE5QixVQUErQixJQUFVO1FBQ3JDLElBQUksQ0FBQyxHQUFVLElBQUksQ0FBQztRQUNwQixPQUFNLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFDO1lBQ3JDLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQUU7Z0JBQ25CLE9BQU8sQ0FBcUIsQ0FBQzthQUNoQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFYSxvQkFBTyxHQUFyQixVQUFzQixJQUFVLEVBQUUsRUFBVTtRQUN4QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVhLHdCQUFXLEdBQXpCLFVBQTBCLFdBQWlDLEVBQUUsUUFBZ0I7UUFDekUsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFJLElBQUksV0FBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQXRCLENBQXNCLENBQUMsQ0FBQztRQUN4RSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFFYSxnQ0FBbUIsR0FBakMsVUFBa0MsV0FBaUMsRUFBRSxJQUFZO1FBQzdFLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBSSxJQUFJLFdBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFsQixDQUFrQixDQUFDLENBQUM7UUFDckUsT0FBTyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBQ0wsbUJBQUM7QUFBRCxDQUFDO0FBeEJZLG9DQUFZOzs7Ozs7Ozs7Ozs7QUNsQnpCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSwwRkFBMEY7QUFDMUYsSUFBTSxpQkFBaUIsR0FBRztJQUMxQixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3bUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3gxSCxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN2lFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDNXpELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3p4QixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzNqQixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3hrRSxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUNucUMsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUNsbEMsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3gxQixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDMzVILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3pqRSxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDdjFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDMytGLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMvaUMsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMvbkUsQ0FBRSxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25XLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDMzlCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdwRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeHFHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeHlCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25qQixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUNoM0MsQ0FBRSxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ241RCxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMxOEMsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFD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LEVBQUUsU0FBUztRQUN6QixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsU0FBUztRQUNyQixhQUFhLEVBQUUsU0FBUztRQUN4QixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixPQUFPLEVBQUUsU0FBUztRQUNsQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixlQUFlLEVBQUUsU0FBUztRQUMxQixlQUFlLEVBQUUsU0FBUztRQUMxQixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixZQUFZLEVBQUUsU0FBUztRQUN2QixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLLEVBQUUsU0FBUztRQUNoQixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixhQUFhLEVBQUUsU0FBUztRQUN4QixRQUFRLEVBQUUsU0FBUztRQUNuQixZQUFZLEVBQUUsU0FBUztRQUN2QixVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUUsU0FBUztRQUNuQixRQUFRLEVBQUUsU0FBUztRQUNuQixTQUFTLEVBQUUsU0FBUztRQUNwQixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixhQUFhLEVBQUUsU0FBUztRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixRQUFRLEVBQUUsU0FBUztRQUNuQixX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RUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDN0M7WUFDRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUFFc0MsOEJBQVMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXBpL0lFbmdpbmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQURlZmluaXRpb25zLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3kudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9Db21tb25NYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vRW5naW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb25maWcvQ29uZmlnLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vQ29sb3JVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL1Zpc1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL3N0eWxlL1N0eWxlTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSVJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2NoZWNrZXIvQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90YXJnZXRfd2FybmluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90ZXh0X3B1cnBvc2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FwcGxldF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyZWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9jb25mbGljdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Jhbm5lcl9zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY2hpbGRfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY2hpbGRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudF9pbl9sYW5kbWFyay50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9kZXNjZW5kYW50X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9ncmFwaGljX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2hpZGRlbl9ub250YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9pZF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaW1nX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX21haW5fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX21haW5fbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9wYXJlbnRfcmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yZWdpb25fbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcm9sZV9hbGxvd2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JvbGVfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfc2VtYW50aWNzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3dpZGdldF9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXNjaWlhcnRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxpbmtfY3NzX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxpbmtfZWxlbV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibG9ja3F1b3RlX2NpdGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jYW52YXNfY29udGVudF9kZXNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NhcHRpb25fdHJhY2tfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9kZXNpZ25fdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGVidWdfcGF0aHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2RldGVjdG9yX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kaXJfYXR0cmlidXRlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2FjY2Vzc2tleV91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfaWRfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2xhbmdfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1iZWRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1iZWRfbm9lbWJlZF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vtb3RpY29uc19hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lcnJvcl9tZXNzYWdlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGFiZWxfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmlndXJlX2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9mb250X2NvbG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ludGVyYWN0aW9uX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfc3JjX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfbWFya3VwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9sYW5nX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9za2lwbmF2X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZW1hcF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2JhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbnVsbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19pc21hcF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19sb25nZGVzY19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfZmllbGRzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9hZnRlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYmVmb3JlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X29uY2hhbmdlX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX25hbWVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X2NoaWxkcmVuX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X21hcmt1cF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3Rfc3RydWN0dXJlX3Byb3Blci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWFycXVlZV9lbGVtX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfYnJpZWYudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2xpdmVfY2FwdGlvbmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV90cmFja19hdmFpbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVmcmVzaF9kZWxheS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV92aWV3cG9ydF96b29tYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbm9lbWJlZF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvb2JqZWN0X3RleHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfc2VsZWN0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2VsZWN0X29wdGlvbnNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9jb2xvcl9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2ZvY3VzX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9ob3Zlcl9wZXJzaXN0ZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV92aWV3cG9ydF9yZXNpemFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2FyaWFfZGVzY2VuZGFudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2NhcHRpb25fZW1wdHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2NhcHRpb25fbmVzdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19yZWZfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVsYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfbGF5b3V0X2xpbmVhcml6ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3Njb3BlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9ibG9ja19oZWFkaW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfcXVvdGVkX2NvcnJlY3RseS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9zZW5zb3J5X21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9zcGFjaW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3doaXRlc3BhY2VfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3dpZGdldF90YWJiYWJsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3dpZGdldF90YWJiYWJsZV9zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzZXRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NTU1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ2FjaGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NvbW1vblV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FjZS8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi9JTWFwcGVyXCI7XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ29uZmlkZW5jZSB7XG4gICAgUEFTUyA9IFwiUEFTU1wiLFxuICAgIEZBSUwgPSBcIkZBSUxcIixcbiAgICBQT1RFTlRJQUwgPSBcIlBPVEVOVElBTFwiLFxuICAgIE1BTlVBTCA9IFwiTUFOVUFMXCJcbn1cblxuZXhwb3J0IGVudW0gZVJ1bGVQb2xpY3kge1xuICAgIFZJT0xBVElPTiA9IFwiVklPTEFUSU9OXCIsXG4gICAgUkVDT01NRU5EQVRJT04gPSBcIlJFQ09NTUVOREFUSU9OXCIsXG4gICAgSU5GT1JNQVRJT04gPSBcIklORk9STUFUSU9OXCJcbn1cblxuZXhwb3J0IGVudW0gZVRvb2xraXRMZXZlbCB7XG4gICAgTEVWRUxfT05FID0gXCIxXCIsXG4gICAgTEVWRUxfVFdPID0gXCIyXCIsXG4gICAgTEVWRUxfVEhSRUUgPSBcIjNcIixcbiAgICBMRVZFTF9GT1VSID0gXCI0XCJcbn1cblxuZXhwb3J0IGVudW0gZVJ1bGVDYXRlZ29yeSB7XG4gICAgQUNDRVNTSUJJTElUWSA9IFwiQWNjZXNzaWJpbGl0eVwiLFxuICAgIERFU0lHTiA9IFwiRGVzaWduXCIsXG4gICAgT1RIRVIgPSBcIk90aGVyXCJcbn1cblxuZXhwb3J0IGVudW0gZVJ1bGVzZXRUeXBlIHtcbiAgICBERUZBVUxUID0gXCJkZWZhdWx0XCIsXG4gICAgRVhURU5TSU9OID0gXCJleHRlbnNpb25cIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBhc3MocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVJlbmRlcihyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IDAsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBSdWxlRmFpbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5GQUlMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUG90ZW50aWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBPVEVOVElBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZU1hbnVhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5NQU5VQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVsZVJlc3VsdCA9IHtcbiAgICB2YWx1ZTogW2VSdWxlUG9saWN5LCBlUnVsZUNvbmZpZGVuY2VdLFxuICAgIHJlYXNvbklkPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIG1lc3NhZ2VBcmdzPzogc3RyaW5nW10sXG4gICAgYXBpQXJncz86IGFueVtdXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVEZXRhaWxzID0gUnVsZVJlc3VsdCAmIHtcbiAgICBydWxlSWQ6IHN0cmluZyxcblxuICAgIG5vZGU6IE5vZGUsXG4gICAgLy8gbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk/OiBlUnVsZUNhdGVnb3J5LFxuICAgIHBhdGg6IHsgW25zOiBzdHJpbmddIDogc3RyaW5nIH0sXG5cbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBib3VuZHM/OiB7XG4gICAgICAgIHRvcDogbnVtYmVyLFxuICAgICAgICBsZWZ0OiBudW1iZXIsXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXG4gICAgICAgIGhlaWdodDogbnVtYmVyXG4gICAgfSxcbiAgICBzbmlwcGV0OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUnVsZUNvbnRleHRIaWVyYXJjaHkgPSB7IFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0W10gfTtcblxuZXhwb3J0IHR5cGUgUnVsZUNvbnRleHQgPSB7XG4gICAgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRcbn1cblxuZXhwb3J0IHR5cGUgUnVsZSA9IHtcbiAgICAvLyBVbmlxdWUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoaXMgcnVsZSAoc2hvdWxkIGJlIGh1bWFuIHVuZGVyc3RhbmRhYmxlKVxuICAgIC8vIE5MUyBjb2RlcyBhbmQgaGVscCBzb3VyY2VzIHdpbGwgYmUgYmFzZWQgb2ZmIG9mIHRoaXMgaWRcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLy8gU2VlIHNyYy92Mi9jb21tb24vQ29udGV4dC50cyBmb3IgdmFsaWQgY29udGV4dHNcbiAgICBjb250ZXh0OiBzdHJpbmc7XG5cbiAgICAvLyBBcnJheSBvZiBydWxlcyB0aGF0IG11c3QgcGFzcyB0byBhbGxvdyB0aGlzIHZhbGlkYXRlIHRvIHJ1biAtIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcHJvcGVydHlcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXVxuICAgIHByZXJlcXM/OiBzdHJpbmdbXVxuXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpID0+IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W11cblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cblxuZXhwb3J0IHR5cGUgUmVwb3J0ID0ge1xuICAgIHJlc3VsdHM6IFJ1bGVEZXRhaWxzW10sXG4gICAgbnVtRXhlY3V0ZWQ6IG51bWJlcixcbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIC8vIFRoaXMgbWF5IGJlIHVuZGVmaW5lZCBmb3IgYSBmaWx0ZXJlZCByZXBvcnRcbiAgICB0b3RhbFRpbWU/OiBudW1iZXIsXG4gICAgbmxzPzoge1xuICAgICAgICBbcnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBObHNNYXAgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW11cbn1cblxuZXhwb3J0IHR5cGUgSGVscE1hcCA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbmdpbmUge1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYSBzY2FuIG9uIGEgZG9jdW1lbnQgb3Igc3VidHJlZVxuICAgICAqIEBwYXJhbSBydWxlc2V0SWRzIEFycmF5IG9mIHJ1bGVzZXQgaWRzIG9mIHJ1bGVzZXRzIHRvIHVzZSBmb3IgdGhpcyBzY2FuXG4gICAgICogQHBhcmFtIHJvb3QgRG9jdW1lbnQgb3Igc3VidHJlZSB0byBzY2FuXG4gICAgICovXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KSA6IFByb21pc2U8UmVwb3J0PjtcblxuICAgIGVuYWJsZVJ1bGVzKHJ1bGVJZHM6IHN0cmluZ1tdKTtcblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlO1xuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdO1xuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmc7XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICBhZGRSdWxlcyhydWxlOiBSdWxlW10pO1xuXG4gICAgYWRkUnVsZShydWxlOiBSdWxlKTtcblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCk7XG5cbiAgICBhZGRIZWxwTWFwKG1hcDogTmxzTWFwKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qZ2xvYmFsIE9wZW5BamF4Ki9cbi8vIGFsbCByZWZlcmVuY2VzIHRvIFdBSS1BUklBIHNwZWNpZmljYXRpb24gaXMgdGhlIFdBSS1BUklBIDEuMlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi9cblxuZXhwb3J0IGludGVyZmFjZSBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IHtcbiAgICBpbXBsaWNpdFJvbGU6IHN0cmluZ1tdLFxuICAgIHZhbGlkUm9sZXM6IHN0cmluZ1tdLFxuICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGJvb2xlYW4sXG4gICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgXG4gICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSxcbiAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlcz86IHN0cmluZ1tdLCAvL3JvbGVzLCBvdGhlciB0aGFuIGltcGxpY2l0IGFuZCB2YWxpZCByb2xlcywgd2hvc2UgYXR0cmlidXRlcyBhcmUgYWxzbyBhbGxvd2VkXG4gICAgLy8gYSBmZXcgZWxlbWVudHMgKHN1Y2ggYXMgZGF0YWxpc3QsIGh0bWwsIGNhcHRpb24pIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCByb2xlIGJ1dCBkaXNhbGxvdyBzb21lIG9yIGFsbCBhdHRyaWJ1dGVzIGFsbG93ZWQgZm9yIHRoZSByb2xlLlxuICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU/OiBib29sZWFuLFxuICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZT86IHN0cmluZ1tdICAvL3NvbWUgZWxlbWVudHMgKHZhcixhYmJyIGV0Yy4pIGhhdmUgbm8gaW1wbGljaXQgcm9sZSBidXQgbmFtaW5nIHByb2hpYml0ZWQgICBcbn1cblxuZXhwb3J0IGNsYXNzIEFSSUFEZWZpbml0aW9ucyB7XG4gICAgc3RhdGljIG5hbWVGcm9tQ29udGVudChyb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBhcnJheSBvZiBXQUktQVJJQSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzXG4gICAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNnbG9iYWxfc3RhdGVzXG4gICAgICovXG4gICAgc3RhdGljIGdsb2JhbFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtYXRvbWljXCIsIFwiYXJpYS1idXN5XCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtY3VycmVudFwiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWhpZGRlblwiLCBcImFyaWEta2V5c2hvcnRjdXRzXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtbGl2ZVwiLCBcImFyaWEtb3duc1wiLCBcImFyaWEtcmVsZXZhbnRcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjIsIHdpbGwgaW5kaWNhdGUgZGVwcmVjYXRpb24gaW4gaW5kaXZpZHVhbCByb2xlXG4gICAgICAgICwgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXG4gICAgXTtcblxuICAgIC8vIGRlcHJlY2F0ZWQgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdkaXJlY3RvcnknXG4gICAgXTtcblxuICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjEgZm9yIGFsbCB0aGUgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWRyb3BlZmZlY3QnXG4gICAgXTtcbiAgICBcbiAgICAvKlxuICAgICAqIFhTRCBkYXRhIHR5cGVzIGZvciBhbGwgV0FJLUFSSUEgcHJvcGVydGllc1xuICAgICAqIGFsb25nIHdpdGggdmFsaWQgdmFsdWVzIHdoZW4gdGhlIGRhdGEgdHlwZSBpcyBOTVRPS0VOXG4gICAgICogV0FJLUFSSUEgcHJvcGVydGllcyBkYXRhIHR5cGVzIGV4cGxhbmVkOlxuICAgICAqICB0eXBlOiBVc2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHZhbHVlcyBhbGxvd2VkIGZvciB0aGUgV0FJLUFSSUEgcHJvcGVydHlcbiAgICAgKiAgdmFsdWVzOiBVc2VkIHRvIGlkZW50aWZ5IHNwZWNpZmljIHZhbHVlcyBvZiBhbiBXQUktQVJJQSBwcm9wZXJ0eSB3aGVuIHR5cGUgaXMgbm10b2tlblxuICAgICAqICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogVXNlZCB0byBpZGVudGlmeSBpZiB0aGUgV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgcmVmZXJlbmNpbmcgaGlkZGVuIElEXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRydWU6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IGRvZXMgbm90IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZmFsc2UsIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgc3RhdGljIHByb3BlcnR5RGF0YVR5cGVzIDogeyBcbiAgICAgICAgW3Byb3A6IHN0cmluZ10gOiB7IFxuICAgICAgICAgICAgdHlwZTogc3RyaW5nLCBcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHZhbHVlcz86IHN0cmluZ1tdIFxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJpbmxpbmVcIiwgXCJsaXN0XCIsIFwiYm90aFwiLCBcIm5vbmVcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIHRvIGhhbmRsZSB2YWx1ZSBlbXB0eVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYnVzeVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGluZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJwYWdlXCIsIFwic3RlcFwiLCBcImxvY2F0aW9uXCIsIFwiZGF0ZVwiLCBcInRpbWVcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiY29weVwiLCBcIm1vdmVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiLCBcInBvcHVwXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXJyb3JtZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1mbG93dG9cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWVudVwiLCBcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInNwZWxsaW5nXCIsIFwiZ3JhbW1hclwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1rZXlzaG9ydGN1dHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxldmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxpdmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcIm9mZlwiLCBcInBvbGl0ZVwiLCBcImFzc2VydGl2ZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbW9kYWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWxldmFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiLCBcImFsbFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3djb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNldHNpemVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc29ydFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYXNjZW5kaW5nXCIsIFwiZGVzY2VuZGluZ1wiLCBcIm90aGVyXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWV0ZXh0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogZGVzaWduIHBhdHRlcm5zIGZvciBjb25jcmV0ZSBXQUktQVJJQSByb2xlc1xuICAgICAqIGxlZ2l0aW1hdGUga2V5cyBmb3IgZWFjaCByb2xlIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGNvbnRhaW5lcjogYXBwcm9wcmlhdGUgY29udGFpbmVyKHMpIGZvciB0aGF0IHJvbGVcbiAgICAgKiAtIHByb3BzOiBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZSAoaW4gYWRkaXRpb24gdG8gdGhlIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgbGlzdGVkIGFib3ZlKVxuICAgICAqIC0gcmVxUHJvcHM6IHJlcXVpcmVkIHN0YXRlcyBvciBwcm9wZXJ0aWVzIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJlcUNoaWxkcmVuOiByZXF1aXJlZCBjaGlsZHJlbiBmb3IgdGhpcyByb2xlXG4gICAgICogLSBodG1sRXF1aXY6IEhUTUwgZXF1aXZhbGVudCBmb3IgdGhpcyByb2xlXG4gICAgICogLSByb2xlVHlwZTogb25lIG9mIHdpZGdldCwgc3RydWN0dXJlLCBsYW5kbWFyaywgbGl2ZVJlZ2lvbiwgd2luZG93IChhcyBzZWVuIGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI3JvbGVzX2NhdGVnb3JpemF0aW9uKVxuICAgICAqIC0gbmFtZVJlcXVpcmVkOiBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHJlcXVpcmVkIGZvciBhIHdpZGdldCAoc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBuYW1lRnJvbTogZGV0ZXJtaW5lcyBob3cgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIChhdXRob3Igb3IgY29udGVudCAtIHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gZGVwcmVjYXRlZDogaWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJvbGUgaXMgZGVwcmVjYXRlZCwgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbHRlcm5hdGl2ZSByb2xlKHMpXG4gICAgICovXG4gICAgc3RhdGljIGRlc2lnblBhdHRlcm5zIDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgY29udGFpbmVyOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogc3RyaW5nLFxuICAgICAgICAgICAgcm9sZVR5cGU/OiBzdHJpbmcsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgbmFtZUZyb20/OiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW4/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYWxlcnRkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFwcGxpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWV4cGFuZGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLCAvLyBvciBjYW4gYmUgXCJ3aWRnZXRcIlxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJhbm5lclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJibG9ja3F1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXByZXNzZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImJ1dHRvbiB8IGlucHV0W0B0eXBlPSdidXR0b24nXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImZpZ3VyZVwiLCBcImdyaWRcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0ZFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nY2hlY2tib3gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb2x1bW5oZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J2NvbCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbWJvYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCJdLCAvLyBhcmlhLWNvbnRyb2xzIGlzbid0IGFjdHVhbGx5IHJlcXVpcmVkIHdoZW4gYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbXBsZW1lbnRhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29udGVudGluZm9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVmaW5pdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFmdGVyd29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iYWNrbGlua1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmlibGlvZW50cnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJsaVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2dyYXBoeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9yZWZcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNoYXB0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jb3ZlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW1nXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNyZWRpdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWRlZGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpbG9ndWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXJyYXRhXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZm9vdG5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZm9yZXdvcmRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NyZWZcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWluZGV4XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWludHJvZHVjdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VicmVha1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiXSwgLy8gYXJpYS1kaXNhYmxlZCwgYXJpYS12YWx1ZW1heCwgYXJpYS12YWx1ZW1pbiwgYXJpYS12YWx1ZXRleHQgYXJlIHZhbGlkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIGFyaWEtdmFsdWVub3cgaXMgcmVxdWlyZWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLCAvLyBvciB3aWRnZXQgaWYgZm9jdXNhYmxlXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXByZWZhY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJvbG9ndWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1xbmFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtc3VidGl0bGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jdW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJlbXBoYXNpc1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZlZWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZpZ3VyZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZm9ybVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZm9ybVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ2VuZXJpY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZGl2IHwgc3BhblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyYXBoaWNzLWRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtb2JqZWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiY29udGVudHNcIiwgXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtc3ltYm9sXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncmlkY2VsbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXJyb3JtZXNzYWdlXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIiwgXCJhcmlhLWludmFsaWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0ZFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcImdyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJoZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtbGV2ZWxcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJoMSB8IGgyIHwgaDMgfCBoNCB8IGg1IHwgaDZcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImltZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW1nXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImluc2VydGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJvbCB8IHVsXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJvcHRpb25cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0aXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJxdWVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWF0aFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1yYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJuYXZpZ2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vbmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbGlzdGJveFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIFwiYXJpYS1zZWxlY3RlZFwiIGhhcyBhIGRlZmF1bHRcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwYXJhZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcmVzZW50YXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInByb2dyZXNzYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdyYWRpbyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJhZGlvZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJlZ2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwicm93Z3JvdXBcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImNlbGxcIiwgXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0clwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGJvZHkgfCB0Zm9vdCB8IHRoZWFkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93aGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdyb3cnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VhcmNoYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nc2VhcmNoJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VwYXJhdG9yXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdXBlcnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN3aXRjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInRhYmxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJ0YWJcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFicGFuZWxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRlcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRmblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRleHRib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSd0ZXh0J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbHRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIC8vIEFSSUEgMS4yIGhhcyB0aGlzIGFzIG5hbWVSZXF1aXJlZDogdHJ1ZSwgYnV0IEFSSUEgMS4zIHJlbW92ZWQgaXQgYmVjYXVzZSBpdCBtYWtlcyBubyBzZW5zZSB0byByZXF1aXJlIGEgbmFtZSBvbiBhIHRvb2x0aXAuXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwidHJlZWl0ZW1cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jaGVja2VkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICB9IC8vIGVuZCBkZXNpZ25QYXR0ZXJuc1xuXG4gICAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLW90aGVyLmh0bWwjZGlzYWJsZWQtZWxlbWVudHNcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZERpc2FibGVkID0gW1wiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZmllbGRzZXRcIl07IC8vIGFsc28gZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZFJlcXVpcmVkID0gW1wic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07IC8vIHJlbW92ZSAnaW5wdXQnIGFuZCBhZGQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudCwgYmVjdWFzZSByZXF1aXJlZCBpcyBub3Qgc3VwcG9ydGVkIG9uIGlucHV0QHR5cGU9XCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiaGlkZGVuXCIgb3IgYW55IGJ1dHRvbiB0eXBlc1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZWFkT25seSA9IFtcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY2F1c2UgcmVhZG9ubHkgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJmaWxlXCIsIGhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcblxuXG4gICAgLyogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYXJpYS8jZG9jY29uZm9ybWFuY2VcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBvZiB0aGUgdGFncyByZWxhdGVkIHRvIHJvbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFncyBjb250YWlucyB0aG9zZSB0YWdzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGNvbnNpZGVyYXRpb25zXG4gICAgICAgICovXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXTogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYWJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJtYWluXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhc2lkZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvb3Rub3RlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy10aXBcIiwgXCJmZWVkXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXVkaW9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmFzZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZGlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJkb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYm9keVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS1oaWRkZW4nXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2FudmFzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydjYXB0aW9uJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2l0ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvZGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImNvbGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFsaXN0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkZWxldGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRmblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRlcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGlhbG9nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRkaWFsb2dcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgXCJkbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImR0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImxpc3RpdGVtXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJlbWJlZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWVsZHNldFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9ybVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZvcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImhlYWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg1XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDZcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1wYWdlYnJlYWtcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImh0bWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkb2N1bWVudFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImluc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImluc2VydGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJrYmRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxhYmVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGVnZW5kXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWFpblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtYXRoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1ldGVyXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogWydhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nXSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibmF2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1pbmRleFwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy10b2NcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInRhYmxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vc2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0Z3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wib3B0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1zZWxlY3RlZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm91dHB1dFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0YXR1c1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicGFyYWdyYXBoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInBpY3R1cmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInByZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIl0gXG4gICAgICAgIH0sXG4gICAgICAgIFwicVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicnBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJ0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJydWJ5XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzYW1wXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzY3JpcHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydzZWFyY2gnXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFsnc2VhcmNoJywgJ2Zvcm0nLCAnZ3JvdXAnLCAnbm9uZScsICdwcmVzZW50YXRpb24nLCAncmVnaW9uJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2xvdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbWFsbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNwYW5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0cm9uZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdWJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3VwZXJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ZnXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sIC8vIGFzIGRlZmluZWQgYnkgU1ZHIEFBTVxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGVtcGxhdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Zm9vdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRpbWVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidHJhY2tcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2YXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInZpZGVvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIndiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddIDogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgICAgICB9IHwgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYVwiOiB7XG4gICAgICAgICAgICBcIndpdGgtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub24tZW1wdHkgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiZG9jLWJhY2tsaW5rXCIsIFwiZG9jLWJpYmxpb3JlZlwiLCBcImRvYy1nbG9zc3JlZlwiLCBcImRvYy1ub3RlcmVmXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZD10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyZWFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBocmVmIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiYXV0b25vbW91cyBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlIG5vIGNvcnJlc3BvbmRpbmcgcm9sZS5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiYW55IHJvbGVcIiwgXCJubyByb2xlIE90aGVyd2lzZVwiXSxcbi8vICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuLy8gICAgICAgIH0sXG4gICAgICAgIFwiZGl2XCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZGxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1maWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9vdGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbnRlbnRpbmZvXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlICdnZW5lcmljJy5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiZm9ybS1yZWxhdGVkIHJvbGVzOiBidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInJhZGlvZ3JvdXBcIiwgXCJzZWFyY2hib3hcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwic3dpdGNoXCIsIFwidGV4dGJveFwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJiYW5uZXJcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtYWx0LXRleHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlIGhhcyB0ZXh0IChpcyBub3QgZW1wdHkpXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtY292ZXJcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJzY3JvbGxiYXJcIiwgXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aC1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlIGlzIGVtcHR5XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltZy13aXRob3V0LWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGFsdCBhdHRyaWJ1dGUsIGFyaWEtbGFiZWwsIG9yIGFyaWEtbGFiZWxsZWRieSBhcmUgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW49dHJ1ZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9ZW1haWwgYW5kIG5vIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhpZGRlblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJudW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtcmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYW5nZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVzZXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZWFyY2hib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdWJtaXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY29tYm9ib3hcIiwgXCJzZWFyY2hib3hcIiwgXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGFzcG9wdXBcIl0gIC8vIGNvdmVyZWQgaW4gYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImxpXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnbGlzdGl0ZW0nXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2xpc3RpdGVtJ10sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1uYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1uYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZGlhbG9nXCIsIFwiZG9jLWFic3RyYWN0XCIsIFwiZG9jLWFja25vd2xlZGdtZW50c1wiLCBcImRvYy1hZnRlcndvcmRcIiwgXCJkb2MtYXBwZW5kaXhcIiwgXCJkb2MtYmlibGlvZ3JhcGh5XCIsIFwiZG9jLWNoYXB0ZXJcIiwgXCJkb2MtY29sb3Bob25cIiwgXCJkb2MtY29uY2x1c2lvblwiLCBcImRvYy1jcmVkaXRcIiwgXCJkb2MtY3JlZGl0c1wiLCBcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWVuZG5vdGVzXCIsIFwiZG9jLWVwaWdyYXBoXCIsIFwiZG9jLWVwaWxvZ3VlXCIsIFwiZG9jLWVycmF0YVwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvcmV3b3JkXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLWluZGV4XCIsIFwiZG9jLWludHJvZHVjdGlvblwiLCBcImRvYy1ub3RpY2VcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtcGFydFwiLCBcImRvYy1wcmVmYWNlXCIsIFwiZG9jLXByb2xvZ3VlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy1xbmFcIiwgXCJkb2MtdG9jXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwiZ3JvdXBcIiwgXCJsb2dcIiwgXCJtYWluXCIsIFwibWFycXVlZVwiLCBcIm5hdmlnYXRpb25cIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiLCBcInN0YXR1c1wiLCBcInRhYnBhbmVsXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWxlY3RcIjoge1xuICAgICAgICAgICAgXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggYSBtdWx0aXBsZSBhdHRyaWJ1dGUgb3IgYSBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiOiB7XG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIG5vIG11bHRpcGxlIGF0dHJpYnV0ZSBhbmQgbm8gc2l6ZSBhdHRyaWJ1dGUgaGF2aW5nIHZhbHVlIGdyZWF0ZXIgdGhhbiAxXCJcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3Rib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInN1bW1hcnlcIjoge1xuICAgICAgICAgICAgXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Ym9keVwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZFwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRoXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlLWdyaWQtdHJlZWdyaWQtcm93LXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2hlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidHJcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImRlZmF1bHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIlwiLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9XG4gICAgfSAvLyBlbmQgb2YgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NcblxuICAgIC8vIG1hcCBhcmlhIGF0dHJpYnV0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgYXR0cmlidXRlLCBhcHBseSB0byBhbnkgZWxlbWVudCBhcHBsaWNhYmxlXG4gICAgLy8gbm90ZSB0aGlzIG1hcHBpbmcgaXMgZm9yIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIHNhbWUgZWxlbWVudCB3aXRob3V0IGNoZWNraW5nIHRoZSBwYXJlbnQgdHJlZS5cbiAgICAvLyByZWZlciB0byBodHRwczovL3czYy5naXRodWIuaW8vaHRtbC1hcmlhL1xuICAgIHN0YXRpYyByZWxhdGVkQXJpYUh0bWxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIFthcmlhQXR0cjogc3RyaW5nXSA6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc/OiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgIH0gPSAge1xuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNoZWNrZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJkaXNhYmxlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInBsYWNlaG9sZGVyXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1heFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL292ZXJsYXAgY2FzZSBjb3ZlcmVkIGluIHRoZSByb2xlIGRlZmluaXRpb246IEF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1heCBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1heCBhdHRyaWJ1dGUuIFVzZSB0aGUgbWF4IGF0dHJpYnV0ZSBpbnN0ZWFkLiBcbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1pblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLy8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjpBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtaW4gb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtaW4gYXR0cmlidXRlLiBVc2UgdGhlIG1pbiBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJmYWxzZVwiLCBcImZhbHNlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwidHJ1ZVwiLCBcInRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgICAgIFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHNcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJWQUxVRVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJWQUxVRVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiB7ICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHMgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGNvbmZsaWN0XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImF1dG9jb21wbGV0ZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJvblwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICBcbiAgICB9XG5cbiAgICBzdGF0aWMgY29udGFpbmVycyA9IFtdXG59O1xuXG5sZXQgY29udGFpbmVyQXJyYXkgPSBbXTtcblxuZm9yIChjb25zdCByb2xlRGVzaWduIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykge1xuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZURlc2lnbl0uY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXJzICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJBcnJheS5pbmRleE9mKGNvbnRhaW5lcikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJBcnJheS5wdXNoKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5BUklBRGVmaW5pdGlvbnMuY29udGFpbmVycyA9IGNvbnRhaW5lckFycmF5O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IEFSSUFXYWxrZXIgfSBmcm9tIFwiLi9BUklBV2Fsa2VyXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgQVJJQU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgY2hpbGRyZW5DYW5IYXZlUm9sZShub2RlOiBOb2RlLCByb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiAhKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5wcmVzZW50YXRpb25hbENoaWxkcmVuKTtcbiAgICB9XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUobm9kZSk7XG4gICAgICAgIHJldHVybiByb2xlO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYXJpYVwiXG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxlbGVtLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmZvID0gZWxlbS5hdHRyaWJ1dGVzW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGF0dHJJbmZvLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiYXJpYS1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW25hbWUuc3Vic3RyaW5nKDUpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhcHBseUF0dHJSb2xlPSBmdW5jdGlvbihub2RlTmFtZTpzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShub2RlTmFtZSBpbiBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9ycykpIHJldHVybjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGF0dHIgaW4gcmV0VmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnNbbm9kZU5hbWVdW2F0dHJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSBcInVuZGVmaW5lZFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgTm9kZUNhbGMpKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBseUF0dHJSb2xlKFwiZ2xvYmFsXCIpO1xuICAgICAgICAgICAgYXBwbHlBdHRyUm9sZShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9ycykge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9yc1thdHRyXShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPSBcInVuZGVmaW5lZFwiICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFyaWFPd25lZEJ5KGVsZW06IEhUTUxFbGVtZW50KSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pO1xuICAgICAgICBpZiAoIWdldENhY2hlKGRvYywgXCJBUklBTWFwcGVyOjpwcmVjYWxjT3duZWRcIiwgZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25zdCBvd25lcnMgPSBkb2MucXVlcnlTZWxlY3RvckFsbChcIlthcmlhLW93bnNdXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaU93bmVyID0gMDsgaU93bmVyIDwgb3duZXJzLmxlbmd0aDsgKytpT3duZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvd25lciA9IG93bmVyc1tpT3duZXJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bklkcyA9IG93bmVyLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaUlkPTA7IGlJZCA8IG93bklkcy5sZW5ndGg7ICsraUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkID0gZG9jLmdldEVsZW1lbnRCeUlkKG93bklkc1tpSWRdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJBUklBTWFwcGVyOjpwcmVjYWxjT3duZWRcIiwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldENhY2hlKGVsZW0sIFwiYXJpYS1vd25lZFwiLCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSB0aGlzLmdldE5vZGVIaWVyYXJjaHkoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkpO1xuICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXTtcbiAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goe1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMobm9kZSksXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBwYXJlbnRJbmZvLnJvbGVQYXRoK1wiL1wiKyh0aGlzLmdldFJvbGUobm9kZSkgfHwgXCJub25lXCIpLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgfT4gPSBnZXRDYWNoZShlbGVtLCBcIkFSSUFNYXBwZXI6OmdldE5vZGVIaWVyYXJjaHlcIiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoIW5vZGVIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVsZW1lbnQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldCAtIGJ1dCA6OnJlc2V0IHByb2Nlc3NlcyB0aGVtIGFsbCBpbiB0aGUgcmlnaHQgb3JkZXJcblxuICAgICAgICAgICAgICAgIC8vIEdldCBkZXRhaWxzIGFib3V0IHRoZSBjb3JyZWN0IHBhcmVudCBmaXJzdFxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudEluZm8ucm9sZSA9PT0gXCJub25lXCIgfHwgcGFyZW50SW5mby5yb2xlID09PSBcIi9ub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShwYXJlbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCBub2RlIGluZm9cbiAgICAgICAgICAgICAgICBsZXQgbm9kZUluZm8gOiB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICByb2xlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICB9ID0ge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBlbGVtLm5vZGVUeXBlID09PSAxID8gdGhpcy5nZXRBdHRyaWJ1dGVzKGVsZW0pOiB7fSwgICBcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhlbGVtKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBlbGVtLFxuICAgICAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUoZWxlbSkgfHwgXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRqdXN0IHJvbGUgaWYgd2UncmUgd2l0aGluIGEgcHJlc2VudGF0aW9uYWwgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgbGV0IHByZXNlbnRhdGlvbmFsQ29udGFpbmVyID0gIXBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZTtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uYWxDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgPSBwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmNoaWxkcmVuQ2FuSGF2ZVJvbGUoZWxlbSwgbm9kZUluZm8ucm9sZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwYXRoc1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSA9IChwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrbm9kZUluZm8ucm9sZStcIltcIitwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXStcIl1cIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChub2RlSW5mbyk7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG5vZGVIaWVyYXJjaHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIaWVyYXJjaHk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG4gICAgICAgIC8vIEdldCB0byB0aGUgdG9wbW9zdCBub2RlXG4gICAgICAgIGxldCBnb29kTm9kZSA9IG5vZGU7XG4gICAgICAgIGxldCBuZXh0O1xuICAgICAgICB3aGlsZSAobmV4dCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGdvb2ROb2RlKSkge1xuICAgICAgICAgICAgZ29vZE5vZGUgPSBuZXh0O1xuICAgICAgICB9O1xuICAgICAgICAvLyBXYWxrIHRoZSB0cmVlIGFuZCBzZXQgdGhlIGhpZXJhcmNoaWVzIGluIHRoZSByaWdodCBvcmRlclxuICAgICAgICBsZXQgYXJpYVdhbGtlciA9IG5ldyBBUklBV2Fsa2VyKGdvb2ROb2RlLCBmYWxzZSwgZ29vZE5vZGUpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYXJpYVdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXROb2RlSGllcmFyY2h5KGFyaWFXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGFyaWFXYWxrZXIubmV4dE5vZGUoKSk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaGllcmFyY2h5UmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZVswXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlID0gdGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGFuIGVsZW1lbnQsIG5vIHNwZWNpYWwgaGFuZGxpbmdcbiAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAvLyBEZXRlcm1pbmUgb3VyIG5vZGUgaW5mb1xuICAgICAgICBub2RlSGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KG5vZGUpO1xuICAgICAgICBsZXQgbm9kZUluZm8gPSBub2RlSGllcmFyY2h5W25vZGVIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChub2RlSW5mby5yb2xlKTtcbiAgICAgICAgaWYgKG5vZGVJbmZvLnJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucHVzaChub2RlSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBub2RlSGllcmFyY2h5O1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IHBhcmVudCA/IGdldENhY2hlKHBhcmVudCBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXROb2RlSW5mb1wiLCBbXSkgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgLy8vL1xuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jbWFwcGluZy1odG1sLXRvLWFjY2Vzc2liaWxpdHktYXBpc1xuICAgIHB1YmxpYyBzdGF0aWMgZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFtub2RlTmFtZTpzdHJpbmddOiB7IFthdHRyOnN0cmluZ106IHN0cmluZyB8IEVsZW1DYWxjIH19ID0ge1xuICAgICAgICBcImdsb2JhbFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogQVJJQU1hcHBlci5jb21wdXRlTmFtZVxuICAgICAgICB9XG4gICAgICAgICwgXCJkYXRhbGlzdFwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGRhdGFsaXN0J3Mgc2VsZWN0aW9uIG1vZGVsIGFsbG93cyBtdWx0aXBsZSBvcHRpb24gZWxlbWVudHMgdG8gYmVcbiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGF0IGEgdGltZSwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwibXVsdGlzZWxlY3RhYmxlXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0W2xpc3Q9J1wiK2lkK1wiJ11cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwiXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwiaDFcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjFcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoMlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiMlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImgzXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIzXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDRcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjRcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNVwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg2XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI2XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgLy8gLSB0eXBlPVwiY2hlY2tib3hcIiBzdGF0ZSBzZXQgdG8gXCJtaXhlZFwiIGlmIHRoZSBlbGVtZW50J3MgaW5kZXRlcm1pbmF0ZSBJREwgYXR0cmlidXRlIFxuICAgICAgICAgICAgLy8gaXMgdHJ1ZSwgb3IgXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIHN0YXRlIHNldCB0byBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZS4gXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiB7IFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiY2hlY2tib3hcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHJlZmxlY3RpbmcgbnVtYmVyIG9mIHR5cGU9cmFkaW8gaW5wdXQgZWxlbWVudHMgXG4gICAgICAgICAgICAvLyB3aXRoaW4gdGhlIHJhZGlvIGJ1dHRvbiBncm91cFxuICAgICAgICAgICAgLCBcInNldHNpemVcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHZhbHVlIHJlZmxlY3RpbmcgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXAuXCJcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICAgICAgLy8gaW5wdXQgKHR5cGUgYXR0cmlidXRlIGluIHRoZSBUZXh0LCBTZWFyY2gsIFRlbGVwaG9uZSwgVVJMLCBvciBFLW1haWwgc3RhdGVzIHdpdGggYSBcbiAgICAgICAgICAgIC8vIHN1Z2dlc3Rpb25zIHNvdXJjZSBlbGVtZW50KSBjb21ib2JveCByb2xlLCB3aXRoIHRoZSBhcmlhLW93bnMgcHJvcGVydHkgc2V0IHRvIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyB2YWx1ZSBhcyB0aGUgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICwgXCJvd25zXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImtleWdlblwiOiB7XG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwibGlcIjoge1xuICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGxpIGVsZW1lbnRzIHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICBcInNldHNpemVcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pO1xuICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbGlzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXJsaXMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcIm9sIGxpLCB1bCBsaSwgbWVudSBsaVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisobGlzLmxlbmd0aC1vdGhlcmxpcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9zaXRpb24gb2YgbGkgZWxlbWVudCB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgLCBcInBvc2luc2V0XCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW0sIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKVxuICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbGlzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGxpcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gbGlzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgRE9NVXRpbC5nZXRBbmNlc3RvcihsaSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrbnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrbnVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgLy8gdHlwZSA9IGNoZWNrYm94IG9yIHJhZGlvLCBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGNoZWNrZWQgYXR0cmlidXRlIFxuICAgICAgICAgICAgLy8gaXMgcHJlc2VudCwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwiY2hlY2tlZFwiOiBlbGVtID0+IFwiXCIrISEoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKT09XCJcIikpXG4gICAgICAgIH1cbiAgICAgICAgLCBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBzZWxlY3RlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAgICAgICAgICAgIFwic2VsZWN0ZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIikgXG4gICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJwcm9ncmVzc1wiOiB7XG4gICAgICAgICAgICBcInZhbHVlbWF4XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJtYXhcIikgfHwgXCIxXCJcbiAgICAgICAgICAgICwgXCJ2YWx1ZW1pblwiOiBlbGVtID0+IFwiMFwiXG4gICAgICAgICAgICAsIFwidmFsdWVub3dcIjogZWxlbSA9PiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFthdHRyOnN0cmluZ106IE5vZGVDYWxjIH0gPSB7XG4gICAgICAgIFwibmFtZVwiOiBub2RlID0+IG5vZGUubm9kZVZhbHVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZU5hbWUoY3VyOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgICsrQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZDtcbiAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lSGVscCh3YWxrSWQ6IG51bWJlciwgY3VyOiBOb2RlLCBsYWJlbGxlZGJ5VHJhdmVyc2U6IGJvb2xlYW4sIHdhbGtUcmF2ZXJzZTogYm9vbGVhbikgOiBzdHJpbmcge1xuICAgICAgICAvLyAyZy4gTm9uZSBvZiB0aGUgb3RoZXIgY29udGVudCBhcHBsaWVzIHRvIHRleHQgbm9kZXMsIHNvIGp1c3QgZG8gdGhpcyBmaXJzdFxuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSByZXR1cm4gY3VyLm5vZGVWYWx1ZTtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMTEpIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKFwiQ2FuIG9ubHkgY29tcHV0ZSBuYW1lIG9uIEVsZW1lbnQgYW5kIFRleHQgXCIgKyBjdXIubm9kZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGN1ciBhcyBFbGVtZW50O1xuICAgICAgICAvLyBXZSd2ZSBiZWVuIGhlcmUgYmVmb3JlIC0gcHJldmVudCByZWN1cnNpb25cbiAgICAgICAgaWYgKGdldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBudWxsKSA9PT0gXCJcIit3YWxrSWQpIHJldHVybiBcIlwiO1xuICAgICAgICBzZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgXCJcIit3YWxrSWQpO1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jaW5wdXQtdHlwZS10ZXh0LWlucHV0LXR5cGUtcGFzc3dvcmQtaW5wdXQtdHlwZS1zZWFyY2gtaW5wdXQtdHlwZS10ZWwtaW5wdXQtdHlwZS11cmwtYW5kLXRleHRhcmVhLWVsZW1lbnRcblxuICAgICAgICAvLyAyYS4gT25seSBzaG93IGhpZGRlbiBjb250ZW50IGlmIGl0J3MgcmVmZXJlbmNlZCBieSBhIGxhYmVsbGVkYnlcbiAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIURPTVdhbGtlci5pc05vZGVWaXNpYmxlKGN1cikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmIuIGNvbGxlY3QgdmFsaWQgaWQgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsbGVkYnkgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgdmFsaWRFbGVtcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbGFiZWxsZWRieSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChjdXIsIHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRFbGVtcy5wdXNoKHJlZkVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWxpZEVsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiB2YWxpZEVsZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBlbGVtLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZC50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSBub2RlVG9Sb2xlIGNhbGxzIGJhY2sgaGVyZSBmb3IgZm9ybSBhbmQgc2VjdGlvbiwgd2UgbmVlZCBzcGVjaWFsIGNhc2luZyBoZXJlIHRvIGhhbmRsZSB0aG9zZSB0d28gY2FzZXNcbiAgICAgICAgaWYgKFtcInNlY3Rpb25cIiwgXCJmb3JtXCJdLmluY2x1ZGVzKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmMuIElmIGxhYmVsIG9yIHdhbGssIGFuZCB0aGlzIGlzIGEgY29udHJvbCwgc2tpcCB0byB0aGUgdmFsdWUsIG90aGVyd2lzZSBwcm92aWRlIHRoZSBsYWJlbFxuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKGN1cik7XG4gICAgICAgIGxldCBpc0VtYmVkZGVkQ29udHJvbCA9IFtcbiAgICAgICAgICAgIFwidGV4dGJveFwiLCBcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwibGlzdGJveFwiLCBcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJcbiAgICAgICAgXS5pbmNsdWRlcyhyb2xlKTtcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlIHx8ICFpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmQuIFxuICAgICAgICBpZiAocm9sZSAhPT0gXCJwcmVzZW50YXRpb25cIiAmJiByb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgaWYgKChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiB8fCBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIpICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKGVsZW0uZ2V0QXR0cmlidXRlKFwiYWx0XCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikrXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgbGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBsYWJlbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmaWVsZHNldFwiKSB7XG4gICAgICAgICAgICAgICAgaWYoICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIikpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVnZW5kID0gKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJlLlxuICAgICAgICBpZiAoKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpICYmIGlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSB0ZXh0Ym94LCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGV4dGJveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGJ1dHRvbiwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBidXR0b24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wiYnV0dG9uXCIsIFwic3VibWl0XCIsIFwicmVzZXRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN1Ym1pdFwiKSByZXR1cm4gXCJTdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlc2V0XCIpIHJldHVybiBcIlJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGNvbWJvYm94IG9yIGxpc3Rib3gsIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY2hvc2VuIG9wdGlvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIHJhbmdlIChlLmcuLCBhIHNwaW5idXR0b24gb3Igc2xpZGVyKTpcbiAgICAgICAgICAgIGlmIChbXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXJpYS12YWx1ZXRleHQgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgYXJpYS12YWx1ZW5vdyBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIik7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogT3RoZXJ3aXNlLCB1c2UgdGhlIHZhbHVlIGFzIHNwZWNpZmllZCBieSBhIGhvc3QgbGFuZ3VhZ2UgYXR0cmlidXRlLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmYuIDJoLlxuICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IEFSSUFEZWZpbml0aW9ucy5uYW1lRnJvbUNvbnRlbnQocm9sZSkgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSB7XG4gICAgICAgICAgICAvLyAyZmkuIFNldCB0aGUgYWNjdW11bGF0ZWQgdGV4dCB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAgICAgICAgbGV0IGFjY3VtdWxhdGVkID0gXCJcIjtcbiAgICAgICAgICAgIC8vIDJmaWkuIENoZWNrIGZvciBDU1MgZ2VuZXJhdGVkIHRleHR1YWwgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbm9kZSBhbmQgXG4gICAgICAgICAgICAvLyBpbmNsdWRlIGl0IGluIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LiBUaGUgQ1NTIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIFxuICAgICAgICAgICAgLy8gY2FuIHByb3ZpZGUgdGV4dHVhbCBjb250ZW50IGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBjb250ZW50IG1vZGVsLlxuICAgICAgICAgICAgLy8gICBGb3IgOmJlZm9yZSBwc2V1ZG8gZWxlbWVudHMsIFVzZXIgYWdlbnRzIE1VU1QgcHJlcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IFxuICAgICAgICAgICAgLy8gICAgIGEgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgRm9yIDphZnRlciBwc2V1ZG8gZWxlbWVudHMsIFVzZXIgYWdlbnRzIE1VU1QgYXBwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBcbiAgICAgICAgICAgIC8vICAgICBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG51bGw7XG4gICAgICAgICAgICBiZWZvcmUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYmVmb3JlXCIpLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gYmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpaWkuIEZvciBlYWNoIGNoaWxkIG5vZGUgb2YgdGhlIGN1cnJlbnQgbm9kZTpcbiAgICAgICAgICAgIC8vICAgU2V0IHRoZSBjdXJyZW50IG5vZGUgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAvLyAgIENvbXB1dGUgdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGN1cnJlbnQgbm9kZSBiZWdpbm5pbmcgd2l0aCBzdGVwIDIuIFNldCB0aGUgcmVzdWx0IFxuICAgICAgICAgICAgLy8gICAgIHRvIHRoYXQgdGV4dCBhbHRlcm5hdGl2ZS5cbiAgICAgICAgICAgIC8vICAgQXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGFjY3VtdWxhdGVkIHRleHQuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNMT1RcIikge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gYXNzaWduZWROb2RlLCBjaGVjayBpdHMgb3duIHRleHQgXG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSB8fCAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyVGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJUZXh0ICYmIGlubmVyVGV4dCAhPT0gbnVsbCAmJiBpbm5lclRleHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSAgXCIgXCIgKyBpbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgYXNzaWduZWQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzbG90Q2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIG5leHRDaGlsZENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB3YWxrQ2hpbGQgPSBlbGVtLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgd2Fsa0NoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIG5leHRDaGlsZENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZCA9IHdhbGtDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhZnRlciA9IG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImFmdGVyXCIpLmNvbnRlbnQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gYWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZml2LiBSZXR1cm4gdGhlIGFjY3VtdWxhdGVkIHRleHQuXG4gICAgICAgICAgICBhY2N1bXVsYXRlZCA9IGFjY3VtdWxhdGVkLnJlcGxhY2UoL1xccysvZyxcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGVkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmkuIE90aGVyd2lzZSwgaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgYSBUb29sdGlwIGF0dHJpYnV0ZSwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHRpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGl0bGUudGV4dENvbnRlbnQgfHwgdGl0bGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4vKiAgICAgICAgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkrXCInXVwiKS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgaWQpLnRleHRDb250ZW50ICsgXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYW1lID0gbmFtZS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSovXG5cbiAgICBwdWJsaWMgc3RhdGljIG5vZGVUb1JvbGUobm9kZSA6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBcInRleHRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIHJldHVybiAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgfVxuICAgIC8qKlxuICAgIHB1YmxpYyBzdGF0aWMgZWxlbVRvSW1wbGljaXRSb2xlKGVsZW0gOiBFbGVtZW50KSB7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIShub2RlTmFtZSBpbiBBUklBTWFwcGVyLmVsZW1Ub1JvbGVNYXApKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvUm9sZU1hcFtub2RlTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvbGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGUoZWxlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIGhhc1BhcmVudFJvbGUoZWxlbWVudCwgcm9sZSkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAvLyBJZiBsaW5rIGlzIGluIGEgbWVudSwgaXQncyBhIG1lbnVpdGVtXG4gICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBpbnB1dFRvUm9sZU1hcCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGhhc0xpc3QgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJsaXN0XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAgICAgICAgIGxldCBpZFJlZiA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRSZWYgJiYgaWRSZWYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRleHRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNMaXN0KGVsZW1lbnQpID8gXCJjb21ib2JveFwiIDogXCJ0ZXh0Ym94XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImltYWdlXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCI6IFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwicmFkaW9cIjogXCJyYWRpb1wiLFxuICAgICAgICAgICAgXCJlbWFpbFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInNlYXJjaFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc0xpc3QoZWxlbWVudCkgPyBcImNvbWJvYm94XCIgOiBcInNlYXJjaGJveFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGVsXCI6IHRleHRTdWdnZXN0aW9ucyxcbiAgICAgICAgICAgIFwidGV4dFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInVybFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcIm51bWJlclwiOiBcInNwaW5idXR0b25cIixcbiAgICAgICAgICAgIFwicmFuZ2VcIjogXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwicmVzZXRcIjogXCJidXR0b25cIixcbiAgICAgICAgICAgIFwic3VibWl0XCI6IFwiYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnB1dFRvUm9sZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZVR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZVR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShlVHlwZSBpbiBBUklBTWFwcGVyLmlucHV0VG9Sb2xlTWFwKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLmlucHV0VG9Sb2xlTWFwW2VUeXBlXTtcbiAgICAgICAgaWYgKHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9sZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9sZShlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgXG4gICAgcHJpdmF0ZSBzdGF0aWMgZWxlbVRvUm9sZU1hcCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25pbmdSb290cyA9IHtcbiAgICAgICAgICAgIFwiYmxvY2txdW90ZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJib2R5XCI6IHRydWUsXG4gICAgICAgICAgICBcImRldGFpbHNcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZGlhbG9nXCI6IHRydWUsXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IHRydWUsXG4gICAgICAgICAgICBcImZpZ3VyZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJ0ZFwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzZWN0aW9uaW5nQ29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYXJ0aWNsZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJhc2lkZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJuYXZcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwic2VjdGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtYWluXCI6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHNlY3Rpb25pbmdSb2xlID0ge1xuICAgICAgICAgICAgXCJhcnRpY2xlXCI6IHRydWUsXG4gICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibmF2aWdhdGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgXCJyZWdpb25cIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWFpblwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBpbnB1dFRvUm9sZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmlucHV0VG9Sb2xlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcImFcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0IGRvZXNuJ3QgcmVwcmVzZW50IGEgaHlwZXJsaW5rLCAnZ2VuZXJpYycgcm9sZVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJsaW5rXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IHJlcHJlc2VudCBhIGh5cGVybGluaywgbm8gY29ycmVzcG9uZGluZyByb2xlXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImxpbmtcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImFydGljbGVcIjogXCJhcnRpY2xlXCIsXG4gICAgICAgICAgICBcImFzaWRlXCI6IFwiY29tcGxlbWVudGFyeVwiLFxuICAgICAgICAgICAgXCJidXR0b25cIjogXCJidXR0b25cIixcbiAgICAgICAgICAgIFwiZGF0YWxpc3RcIjogXCJsaXN0Ym94XCIsXG4gICAgICAgICAgICBcImRkXCI6IFwiZGVmaW5pdGlvblwiLFxuICAgICAgICAgICAgXCJkZXRhaWxzXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZGZuXCI6IFwidGVybVwiLFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogXCJkaWFsb2dcIixcbiAgICAgICAgICAgIFwiZHRcIjogXCJ0ZXJtXCIsXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZmlndXJlXCI6IFwiZmlndXJlXCIsXG4gICAgICAgICAgICBcImZvb3RlclwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIC8vIElmIG5lYXJlc3Qgc2VjdGlvbmluZ1Jvb3Qgb3Igc2VjdGlvbmluZ0NvbnRlbnQgaXMgYm9keVxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gKHBhcmVudC5ub2RlVHlwZSA9PT0gMSAmJiAocGFyZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKSB8fCBcIlwiXG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbmluZ1Jvb3RzW25vZGVOYW1lXSB8fCBzZWN0aW9uaW5nQ29udGVudFtub2RlTmFtZV0gfHwgc2VjdGlvbmluZ1JvbGVbcm9sZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobm9kZU5hbWUgPT09IFwiYm9keVwiKSA/IFwiY29udGVudGluZm9cIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JtXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApID8gXCJmb3JtXCIgOiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRPRE8gXCJmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRcIlxuICAgICAgICAgICAgXCJoMVwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDJcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoNFwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDVcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImg2XCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoZWFkZXJcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZWFyZXN0IHNlY3Rpb25pbmdSb290IG9yIHNlY3Rpb25pbmdDb250ZW50IGlzIGJvZHlcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSAocGFyZW50Lm5vZGVUeXBlID09PSAxICYmIChwYXJlbnQgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInJvbGVcIikpIHx8IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25pbmdSb290c1tub2RlTmFtZV0gfHwgc2VjdGlvbmluZ0NvbnRlbnRbbm9kZU5hbWVdIHx8IHNlY3Rpb25pbmdSb2xlW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSBcImJvZHlcIikgPyBcImJhbm5lclwiIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhyXCI6IFwic2VwYXJhdG9yXCIsXG4gICAgICAgICAgICBcImh0bWxcIjogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJpbWdcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFsdFwiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiaW1nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW5wdXRcIjogaW5wdXRUb1JvbGUsXG4gICAgICAgICAgICBcImtleWdlblwiOiBcImxpc3Rib3hcIiwgLy8gZGVwcmVjYXRlZCwgYnV0IGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgICAgICAgICAgXCJsaVwiOiBcImxpc3RpdGVtXCIsXG4gICAgICAgICAgICBcIm1haW5cIjogXCJtYWluXCIsXG4gICAgICAgICAgICBcIm1hdGhcIjogXCJtYXRoXCIsXG4gICAgICAgICAgICBcIm1lbnVcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICBcIm5hdlwiOiBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgIFwib2xcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICBcIm91dHB1dFwiOiBcInN0YXR1c1wiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc1wiOiBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgICAgICBcInNlY3Rpb25cIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUgJiYgbmFtZS50cmltKCkubGVuZ3RoID4gMCkgPyBcInJlZ2lvblwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIikgfHwgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJzaXplXCIpICYmIHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic2l6ZVwiKSkgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29tYm9ib3hcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdW1tYXJ5XCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN2Z1wiOiBcImdyYXBoaWNzLWRvY3VtZW50XCIsXG4gICAgICAgICAgICBcInRhYmxlXCI6IFwidGFibGVcIixcbiAgICAgICAgICAgIFwidGJvZHlcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRhYmxlXCIgfHwgcm9sZSA9PT0gXCJncmlkXCIgfHwgcm9sZSA9PT0gXCJ0cmVlZ3JpZFwiKSByZXR1cm4gXCJyb3dncm91cFwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJ0ZFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGFibGVcIikgcmV0dXJuIFwiY2VsbFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJncmlkXCIgfHwgcm9sZSA9PT0gXCJ0cmVlZ3JpZFwiKSByZXR1cm4gXCJncmlkY2VsbFwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRoXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgIT09IFwidGFibGVcIiAmJiByb2xlICE9PSBcImdyaWRcIiAmJiByb2xlICE9PSBcInRyZWVncmlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyBcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIEVhc2llc3QgYW5zd2VyIGlzIGlmIHNjb3BlIGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNjb3BlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcInJvd1wiIHx8IHNjb3BlID09PSAncm93Z3JvdXAnKSByZXR1cm4gXCJyb3doZWFkZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZSA9PT0gXCJjb2xcIiB8fCBzY29wZSA9PT0gJ2NvbGdyb3VwJykgcmV0dXJuIFwiY29sdW1uaGVhZGVyXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpYmxpbmdzID0gZWxlbWVudCA9PiBbLi4uZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIobm9kZT0+bm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUgIT0gXCJUSFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmdzID09PSBudWxsIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbHVtbmhlYWRlclwiOyBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gXCJyb3doZWFkZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGZvb3RcIjogXCJyb3dncm91cFwiLFxuICAgICAgICAgICAgXCJ0aGVhZFwiOiBcInJvd2dyb3VwXCIsXG4gICAgICAgICAgICBcInRyXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0YWJsZVwiIHx8IHJvbGUgPT09IFwiZ3JpZFwiIHx8IHJvbGUgPT09IFwidHJlZWdyaWRcIikgcmV0dXJuIFwicm93XCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidWxcIjogXCJsaXN0XCJcbiAgICAgICAgfVxuICAgIH0pKClcbiAgICovXG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuXG4vKipcbiAqIFdhbGtzIGluIGFuIEFSSUEgb3JkZXJcbiAqIFxuICogU2VlIGFsc28gLi4vZG9tL0RPTVdhbGtlclxuICovXG5leHBvcnQgY2xhc3MgQVJJQVdhbGtlciB7XG4gICAgcm9vdCA6IE5vZGU7XG4gICAgbm9kZSA6IE5vZGU7XG4gICAgYkVuZFRhZzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4sIHJvb3Q/IDogTm9kZSkge1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYkVuZFRhZyA9IChiRW5kID09IHVuZGVmaW5lZCA/IGZhbHNlIDogYkVuZCA9PSB0cnVlKTtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubm9kZS5ub2RlTmFtZSwgdGhpcy5iRW5kVGFnP1wiRU5EXCI6XCJTVEFSVFwiLCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBhbnkpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETzogbmVlZCB0byBjb25zaWRlIGl0cyBvd24gY29udGVudCwgYSBzbG90IG1heSBoYXZlIGl0cyBvd24gY29udGVudCBvciBhc3NpZ25lZCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggPSBuZXh0U2xvdEluZGV4OyAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBPd25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25JZHMgPSAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIHx8ICEodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG93bklkcy5pbmRleE9mKCh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBvd25JZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTsgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbaWR4KzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLylcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgIHx8IChza2lwT3duZWQgJiYgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICEhQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeSh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcmV2Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpICYmIHRoaXMubm9kZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBBbmNlc3RvclV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2h5OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRleHRIaWVyYXJjaHkgJiYgY29udGV4dEhpZXJhcmNoeS5kb20pIHtcbiAgICAgICAgICAgIC8vIFNraXAgY3VycmVudCBub2RlIGJlY2F1c2Ugd2Ugd2FudCBhbmNlc3RyeVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PWNvbnRleHRIaWVyYXJjaHkuZG9tLmxlbmd0aC0yOyBpZHggPj0gMDsgLS1pZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gKGNvbnRleHRIaWVyYXJjaHkuZG9tW2lkeF0ubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcInByZXNlbnRhdGlvblwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGcmFtZShjb250ZXh0SGllcmFyY2h5OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRleHRIaWVyYXJjaHkgJiYgY29udGV4dEhpZXJhcmNoeS5kb20pIHtcbiAgICAgICAgICAgIC8vIFNraXAgY3VycmVudCBub2RlIGJlY2F1c2Ugd2Ugd2FudCBhbmNlc3RyeVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PWNvbnRleHRIaWVyYXJjaHkuZG9tLmxlbmd0aC0yOyBpZHggPj0gMDsgLS1pZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gKGNvbnRleHRIaWVyYXJjaHkuZG9tW2lkeF0ubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEZyYWdtZW50VXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRPd25lckZyYWdtZW50KG5vZGU6IE5vZGUpIDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHtcbiAgICAgICAgbGV0IG4gOiBOb2RlID0gbm9kZTtcbiAgICAgICAgd2hpbGUobi5wYXJlbnROb2RlICYmIChuID0gbi5wYXJlbnROb2RlKSl7XG4gICAgICAgICAgICBpZiAobi5ub2RlVHlwZSA9PT0gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeUlkKG5vZGU6IE5vZGUsIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3duZXJGcmFnbWVudChub2RlKS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIGVsZW1OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBoaWVyYXJjaGllc1tcImRvbVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IGVsZW1OYW1lKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzWzBdLm5vZGUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCByb2xlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBoaWVyYXJjaGllc1tcImFyaWFcIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSByb2xlKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzWzBdLm5vZGUgfHwgbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIxLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBGcm9tIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeS9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnlcbmNvbnN0IHZhbGlkUHJpbWFyeUxhbmdzID0gWyAvLyBcInFhYS4ucXR6XCIsXG5bIFwiYWFcIixcImFiXCIsXCJhZVwiLFwiYWZcIixcImFrXCIsXCJhbVwiLFwiYW5cIixcImFyXCIsXCJhc1wiLFwiYXZcIixcImF5XCIsXCJhelwiLFwiYWFhXCIsXCJhYWJcIixcImFhY1wiLFwiYWFkXCIsXCJhYWVcIixcImFhZlwiLFwiYWFnXCIsXCJhYWhcIixcImFhaVwiLFwiYWFrXCIsXCJhYWxcIixcImFhbVwiLFwiYWFuXCIsXCJhYW9cIixcImFhcFwiLFwiYWFxXCIsXCJhYXNcIixcImFhdFwiLFwiYWF1XCIsXCJhYXZcIixcImFhd1wiLFwiYWF4XCIsXCJhYXpcIixcImFiYVwiLFwiYWJiXCIsXCJhYmNcIixcImFiZFwiLFwiYWJlXCIsXCJhYmZcIixcImFiZ1wiLFwiYWJoXCIsXCJhYmlcIixcImFialwiLFwiYWJsXCIsXCJhYm1cIixcImFiblwiLFwiYWJvXCIsXCJhYnBcIixcImFicVwiLFwiYWJyXCIsXCJhYnNcIixcImFidFwiLFwiYWJ1XCIsXCJhYnZcIixcImFid1wiLFwiYWJ4XCIsXCJhYnlcIixcImFielwiLFwiYWNhXCIsXCJhY2JcIixcImFjZFwiLFwiYWNlXCIsXCJhY2ZcIixcImFjaFwiLFwiYWNpXCIsXCJhY2tcIixcImFjbFwiLFwiYWNtXCIsXCJhY25cIixcImFjcFwiLFwiYWNxXCIsXCJhY3JcIixcImFjc1wiLFwiYWN0XCIsXCJhY3VcIixcImFjdlwiLFwiYWN3XCIsXCJhY3hcIixcImFjeVwiLFwiYWN6XCIsXCJhZGFcIixcImFkYlwiLFwiYWRkXCIsXCJhZGVcIixcImFkZlwiLFwiYWRnXCIsXCJhZGhcIixcImFkaVwiLFwiYWRqXCIsXCJhZGxcIixcImFkblwiLFwiYWRvXCIsXCJhZHBcIixcImFkcVwiLFwiYWRyXCIsXCJhZHNcIixcImFkdFwiLFwiYWR1XCIsXCJhZHdcIixcImFkeFwiLFwiYWR5XCIsXCJhZHpcIixcImFlYVwiLFwiYWViXCIsXCJhZWNcIixcImFlZFwiLFwiYWVlXCIsXCJhZWtcIixcImFlbFwiLFwiYWVtXCIsXCJhZW5cIixcImFlcVwiLFwiYWVyXCIsXCJhZXNcIixcImFldVwiLFwiYWV3XCIsXCJhZXlcIixcImFlelwiLFwiYWZhXCIsXCJhZmJcIixcImFmZFwiLFwiYWZlXCIsXCJhZmdcIixcImFmaFwiLFwiYWZpXCIsXCJhZmtcIixcImFmblwiLFwiYWZvXCIsXCJhZnBcIixcImFmc1wiLFwiYWZ0XCIsXCJhZnVcIixcImFmelwiLFwiYWdhXCIsXCJhZ2JcIixcImFnY1wiLFwiYWdkXCIsXCJhZ2VcIixcImFnZlwiLFwiYWdnXCIsXCJhZ2hcIixcImFnaVwiLFwiYWdqXCIsXCJhZ2tcIixcImFnbFwiLFwiYWdtXCIsXCJhZ25cIixcImFnb1wiLFwiYWdwXCIsXCJhZ3FcIixcImFnclwiLFwiYWdzXCIsXCJhZ3RcIixcImFndVwiLFwiYWd2XCIsXCJhZ3dcIixcImFneFwiLFwiYWd5XCIsXCJhZ3pcIixcImFoYVwiLFwiYWhiXCIsXCJhaGdcIixcImFoaFwiLFwiYWhpXCIsXCJhaGtcIixcImFobFwiLFwiYWhtXCIsXCJhaG5cIixcImFob1wiLFwiYWhwXCIsXCJhaHJcIixcImFoc1wiLFwiYWh0XCIsXCJhaWFcIixcImFpYlwiLFwiYWljXCIsXCJhaWRcIixcImFpZVwiLFwiYWlmXCIsXCJhaWdcIixcImFpaFwiLFwiYWlpXCIsXCJhaWpcIixcImFpa1wiLFwiYWlsXCIsXCJhaW1cIixcImFpblwiLFwiYWlvXCIsXCJhaXBcIixcImFpcVwiLFwiYWlyXCIsXCJhaXNcIixcImFpdFwiLFwiYWl3XCIsXCJhaXhcIixcImFpeVwiLFwiYWphXCIsXCJhamdcIixcImFqaVwiLFwiYWpuXCIsXCJhanBcIixcImFqdFwiLFwiYWp1XCIsXCJhandcIixcImFqelwiLFwiYWtiXCIsXCJha2NcIixcImFrZFwiLFwiYWtlXCIsXCJha2ZcIixcImFrZ1wiLFwiYWtoXCIsXCJha2lcIixcImFralwiLFwiYWtrXCIsXCJha2xcIixcImFrbVwiLFwiYWtvXCIsXCJha3BcIixcImFrcVwiLFwiYWtyXCIsXCJha3NcIixcImFrdFwiLFwiYWt1XCIsXCJha3ZcIixcImFrd1wiLFwiYWt4XCIsXCJha3lcIixcImFrelwiLFwiYWxhXCIsXCJhbGNcIixcImFsZFwiLFwiYWxlXCIsXCJhbGZcIixcImFsZ1wiLFwiYWxoXCIsXCJhbGlcIixcImFsalwiLFwiYWxrXCIsXCJhbGxcIixcImFsbVwiLFwiYWxuXCIsXCJhbG9cIixcImFscFwiLFwiYWxxXCIsXCJhbHJcIixcImFsc1wiLFwiYWx0XCIsXCJhbHVcIixcImFsdlwiLFwiYWx3XCIsXCJhbHhcIixcImFseVwiLFwiYWx6XCIsXCJhbWFcIixcImFtYlwiLFwiYW1jXCIsXCJhbWVcIixcImFtZlwiLFwiYW1nXCIsXCJhbWlcIixcImFtalwiLFwiYW1rXCIsXCJhbWxcIixcImFtbVwiLFwiYW1uXCIsXCJhbW9cIixcImFtcFwiLFwiYW1xXCIsXCJhbXJcIixcImFtc1wiLFwiYW10XCIsXCJhbXVcIixcImFtdlwiLFwiYW13XCIsXCJhbXhcIixcImFteVwiLFwiYW16XCIsXCJhbmFcIixcImFuYlwiLFwiYW5jXCIsXCJhbmRcIixcImFuZVwiLFwiYW5mXCIsXCJhbmdcIixcImFuaFwiLFwiYW5pXCIsXCJhbmpcIixcImFua1wiLFwiYW5sXCIsXCJhbm1cIixcImFublwiLFwiYW5vXCIsXCJhbnBcIixcImFucVwiLFwiYW5yXCIsXCJhbnNcIixcImFudFwiLFwiYW51XCIsXCJhbnZcIixcImFud1wiLFwiYW54XCIsXCJhbnlcIixcImFuelwiLFwiYW9hXCIsXCJhb2JcIixcImFvY1wiLFwiYW9kXCIsXCJhb2VcIixcImFvZlwiLFwiYW9nXCIsXCJhb2hcIixcImFvaVwiLFwiYW9qXCIsXCJhb2tcIixcImFvbFwiLFwiYW9tXCIsXCJhb25cIixcImFvclwiLFwiYW9zXCIsXCJhb3RcIixcImFvdVwiLFwiYW94XCIsXCJhb3pcIixcImFwYVwiLFwiYXBiXCIsXCJhcGNcIixcImFwZFwiLFwiYXBlXCIsXCJhcGZcIixcImFwZ1wiLFwiYXBoXCIsXCJhcGlcIixcImFwalwiLFwiYXBrXCIsXCJhcGxcIixcImFwbVwiLFwiYXBuXCIsXCJhcG9cIixcImFwcFwiLFwiYXBxXCIsXCJhcHJcIixcImFwc1wiLFwiYXB0XCIsXCJhcHVcIixcImFwdlwiLFwiYXB3XCIsXCJhcHhcIixcImFweVwiLFwiYXB6XCIsXCJhcWFcIixcImFxY1wiLFwiYXFkXCIsXCJhcWdcIixcImFxa1wiLFwiYXFsXCIsXCJhcW1cIixcImFxblwiLFwiYXFwXCIsXCJhcXJcIixcImFxdFwiLFwiYXF6XCIsXCJhcmJcIixcImFyY1wiLFwiYXJkXCIsXCJhcmVcIixcImFyaFwiLFwiYXJpXCIsXCJhcmpcIixcImFya1wiLFwiYXJsXCIsXCJhcm5cIixcImFyb1wiLFwiYXJwXCIsXCJhcnFcIixcImFyclwiLFwiYXJzXCIsXCJhcnRcIixcImFydVwiLFwiYXJ2XCIsXCJhcndcIixcImFyeFwiLFwiYXJ5XCIsXCJhcnpcIixcImFzYVwiLFwiYXNiXCIsXCJhc2NcIixcImFzZFwiLFwiYXNlXCIsXCJhc2ZcIixcImFzZ1wiLFwiYXNoXCIsXCJhc2lcIixcImFzalwiLFwiYXNrXCIsXCJhc2xcIixcImFzblwiLFwiYXNvXCIsXCJhc3BcIixcImFzcVwiLFwiYXNyXCIsXCJhc3NcIixcImFzdFwiLFwiYXN1XCIsXCJhc3ZcIixcImFzd1wiLFwiYXN4XCIsXCJhc3lcIixcImFzelwiLFwiYXRhXCIsXCJhdGJcIixcImF0Y1wiLFwiYXRkXCIsXCJhdGVcIixcImF0Z1wiLFwiYXRoXCIsXCJhdGlcIixcImF0alwiLFwiYXRrXCIsXCJhdGxcIixcImF0bVwiLFwiYXRuXCIsXCJhdG9cIixcImF0cFwiLFwiYXRxXCIsXCJhdHJcIixcImF0c1wiLFwiYXR0XCIsXCJhdHVcIixcImF0dlwiLFwiYXR3XCIsXCJhdHhcIixcImF0eVwiLFwiYXR6XCIsXCJhdWFcIixcImF1YlwiLFwiYXVjXCIsXCJhdWRcIixcImF1ZVwiLFwiYXVmXCIsXCJhdWdcIixcImF1aFwiLFwiYXVpXCIsXCJhdWpcIixcImF1a1wiLFwiYXVsXCIsXCJhdW1cIixcImF1blwiLFwiYXVvXCIsXCJhdXBcIixcImF1cVwiLFwiYXVyXCIsXCJhdXNcIixcImF1dFwiLFwiYXV1XCIsXCJhdXdcIixcImF1eFwiLFwiYXV5XCIsXCJhdXpcIixcImF2YlwiLFwiYXZkXCIsXCJhdmlcIixcImF2a1wiLFwiYXZsXCIsXCJhdm1cIixcImF2blwiLFwiYXZvXCIsXCJhdnNcIixcImF2dFwiLFwiYXZ1XCIsXCJhdnZcIixcImF3YVwiLFwiYXdiXCIsXCJhd2NcIixcImF3ZFwiLFwiYXdlXCIsXCJhd2dcIixcImF3aFwiLFwiYXdpXCIsXCJhd2tcIixcImF3bVwiLFwiYXduXCIsXCJhd29cIixcImF3clwiLFwiYXdzXCIsXCJhd3RcIixcImF3dVwiLFwiYXd2XCIsXCJhd3dcIixcImF3eFwiLFwiYXd5XCIsXCJheGJcIixcImF4ZVwiLFwiYXhnXCIsXCJheGtcIixcImF4bFwiLFwiYXhtXCIsXCJheHhcIixcImF5YVwiLFwiYXliXCIsXCJheWNcIixcImF5ZFwiLFwiYXllXCIsXCJheWdcIixcImF5aFwiLFwiYXlpXCIsXCJheWtcIixcImF5bFwiLFwiYXluXCIsXCJheW9cIixcImF5cFwiLFwiYXlxXCIsXCJheXJcIixcImF5c1wiLFwiYXl0XCIsXCJheXVcIixcImF5eFwiLFwiYXl5XCIsXCJheXpcIixcImF6YVwiLFwiYXpiXCIsXCJhemNcIixcImF6ZFwiLFwiYXpnXCIsXCJhempcIixcImF6bVwiLFwiYXpuXCIsXCJhem9cIixcImF6dFwiLFwiYXp6XCJdXG4sWyBcImJhXCIsXCJiZVwiLFwiYmdcIixcImJoXCIsXCJiaVwiLFwiYm1cIixcImJuXCIsXCJib1wiLFwiYnJcIixcImJzXCIsXCJiYWFcIixcImJhYlwiLFwiYmFjXCIsXCJiYWRcIixcImJhZVwiLFwiYmFmXCIsXCJiYWdcIixcImJhaFwiLFwiYmFpXCIsXCJiYWpcIixcImJhbFwiLFwiYmFuXCIsXCJiYW9cIixcImJhcFwiLFwiYmFyXCIsXCJiYXNcIixcImJhdFwiLFwiYmF1XCIsXCJiYXZcIixcImJhd1wiLFwiYmF4XCIsXCJiYXlcIixcImJhelwiLFwiYmJhXCIsXCJiYmJcIixcImJiY1wiLFwiYmJkXCIsXCJiYmVcIixcImJiZlwiLFwiYmJnXCIsXCJiYmhcIixcImJiaVwiLFwiYmJqXCIsXCJiYmtcIixcImJibFwiLFwiYmJtXCIsXCJiYm5cIixcImJib1wiLFwiYmJwXCIsXCJiYnFcIixcImJiclwiLFwiYmJzXCIsXCJiYnRcIixcImJidVwiLFwiYmJ2XCIsXCJiYndcIixcImJieFwiLFwiYmJ5XCIsXCJiYnpcIixcImJjYVwiLFwiYmNiXCIsXCJiY2NcIixcImJjZFwiLFwiYmNlXCIsXCJiY2ZcIixcImJjZ1wiLFwiYmNoXCIsXCJiY2lcIixcImJjalwiLFwiYmNrXCIsXCJiY2xcIixcImJjbVwiLFwiYmNuXCIsXCJiY29cIixcImJjcFwiLFwiYmNxXCIsXCJiY3JcIixcImJjc1wiLFwiYmN0XCIsXCJiY3VcIixcImJjdlwiLFwiYmN3XCIsXCJiY3lcIixcImJjelwiLFwiYmRhXCIsXCJiZGJcIixcImJkY1wiLFwiYmRkXCIsXCJiZGVcIixcImJkZlwiLFwiYmRnXCIsXCJiZGhcIixcImJkaVwiLFwiYmRqXCIsXCJiZGtcIixcImJkbFwiLFwiYmRtXCIsXCJiZG5cIixcImJkb1wiLFwiYmRwXCIsXCJiZHFcIixcImJkclwiLFwiYmRzXCIsXCJiZHRcIixcImJkdVwiLFwiYmR2XCIsXCJiZHdcIixcImJkeFwiLFwiYmR5XCIsXCJiZHpcIixcImJlYVwiLFwiYmViXCIsXCJiZWNcIixcImJlZFwiLFwiYmVlXCIsXCJiZWZcIixcImJlZ1wiLFwiYmVoXCIsXCJiZWlcIixcImJlalwiLFwiYmVrXCIsXCJiZW1cIixcImJlb1wiLFwiYmVwXCIsXCJiZXFcIixcImJlclwiLFwiYmVzXCIsXCJiZXRcIixcImJldVwiLFwiYmV2XCIsXCJiZXdcIixcImJleFwiLFwiYmV5XCIsXCJiZXpcIixcImJmYVwiLFwiYmZiXCIsXCJiZmNcIixcImJmZFwiLFwiYmZlXCIsXCJiZmZcIixcImJmZ1wiLFwiYmZoXCIsXCJiZmlcIixcImJmalwiLFwiYmZrXCIsXCJiZmxcIixcImJmbVwiLFwiYmZuXCIsXCJiZm9cIixcImJmcFwiLFwiYmZxXCIsXCJiZnJcIixcImJmc1wiLFwiYmZ0XCIsXCJiZnVcIixcImJmd1wiLFwiYmZ4XCIsXCJiZnlcIixcImJmelwiLFwiYmdhXCIsXCJiZ2JcIixcImJnY1wiLFwiYmdkXCIsXCJiZ2VcIixcImJnZlwiLFwiYmdnXCIsXCJiZ2lcIixcImJnalwiLFwiYmdrXCIsXCJiZ2xcIixcImJnbVwiLFwiYmduXCIsXCJiZ29cIixcImJncFwiLFwiYmdxXCIsXCJiZ3JcIixcImJnc1wiLFwiYmd0XCIsXCJiZ3VcIixcImJndlwiLFwiYmd3XCIsXCJiZ3hcIixcImJneVwiLFwiYmd6XCIsXCJiaGFcIixcImJoYlwiLFwiYmhjXCIsXCJiaGRcIixcImJoZVwiLFwiYmhmXCIsXCJiaGdcIixcImJoaFwiLFwiYmhpXCIsXCJiaGpcIixcImJoa1wiLFwiYmhsXCIsXCJiaG1cIixcImJoblwiLFwiYmhvXCIsXCJiaHBcIixcImJocVwiLFwiYmhyXCIsXCJiaHNcIixcImJodFwiLFwiYmh1XCIsXCJiaHZcIixcImJod1wiLFwiYmh4XCIsXCJiaHlcIixcImJoelwiLFwiYmlhXCIsXCJiaWJcIixcImJpY1wiLFwiYmlkXCIsXCJiaWVcIixcImJpZlwiLFwiYmlnXCIsXCJiaWpcIixcImJpa1wiLFwiYmlsXCIsXCJiaW1cIixcImJpblwiLFwiYmlvXCIsXCJiaXBcIixcImJpcVwiLFwiYmlyXCIsXCJiaXRcIixcImJpdVwiLFwiYml2XCIsXCJiaXdcIixcImJpeFwiLFwiYml5XCIsXCJiaXpcIixcImJqYVwiLFwiYmpiXCIsXCJiamNcIixcImJqZFwiLFwiYmplXCIsXCJiamZcIixcImJqZ1wiLFwiYmpoXCIsXCJiamlcIixcImJqalwiLFwiYmprXCIsXCJiamxcIixcImJqbVwiLFwiYmpuXCIsXCJiam9cIixcImJqcFwiLFwiYmpxXCIsXCJianJcIixcImJqc1wiLFwiYmp0XCIsXCJianVcIixcImJqdlwiLFwiYmp3XCIsXCJianhcIixcImJqeVwiLFwiYmp6XCIsXCJia2FcIixcImJrYlwiLFwiYmtjXCIsXCJia2RcIixcImJrZlwiLFwiYmtnXCIsXCJia2hcIixcImJraVwiLFwiYmtqXCIsXCJia2tcIixcImJrbFwiLFwiYmttXCIsXCJia25cIixcImJrb1wiLFwiYmtwXCIsXCJia3FcIixcImJrclwiLFwiYmtzXCIsXCJia3RcIixcImJrdVwiLFwiYmt2XCIsXCJia3dcIixcImJreFwiLFwiYmt5XCIsXCJia3pcIixcImJsYVwiLFwiYmxiXCIsXCJibGNcIixcImJsZFwiLFwiYmxlXCIsXCJibGZcIixcImJsZ1wiLFwiYmxoXCIsXCJibGlcIixcImJsalwiLFwiYmxrXCIsXCJibGxcIixcImJsbVwiLFwiYmxuXCIsXCJibG9cIixcImJscFwiLFwiYmxxXCIsXCJibHJcIixcImJsc1wiLFwiYmx0XCIsXCJibHZcIixcImJsd1wiLFwiYmx4XCIsXCJibHlcIixcImJselwiLFwiYm1hXCIsXCJibWJcIixcImJtY1wiLFwiYm1kXCIsXCJibWVcIixcImJtZlwiLFwiYm1nXCIsXCJibWhcIixcImJtaVwiLFwiYm1qXCIsXCJibWtcIixcImJtbFwiLFwiYm1tXCIsXCJibW5cIixcImJtb1wiLFwiYm1wXCIsXCJibXFcIixcImJtclwiLFwiYm1zXCIsXCJibXRcIixcImJtdVwiLFwiYm12XCIsXCJibXdcIixcImJteFwiLFwiYm15XCIsXCJibXpcIixcImJuYVwiLFwiYm5iXCIsXCJibmNcIixcImJuZFwiLFwiYm5lXCIsXCJibmZcIixcImJuZ1wiLFwiYm5pXCIsXCJibmpcIixcImJua1wiLFwiYm5sXCIsXCJibm1cIixcImJublwiLFwiYm5vXCIsXCJibnBcIixcImJucVwiLFwiYm5yXCIsXCJibnNcIixcImJudFwiLFwiYm51XCIsXCJibnZcIixcImJud1wiLFwiYm54XCIsXCJibnlcIixcImJuelwiLFwiYm9hXCIsXCJib2JcIixcImJvZVwiLFwiYm9mXCIsXCJib2dcIixcImJvaFwiLFwiYm9pXCIsXCJib2pcIixcImJva1wiLFwiYm9sXCIsXCJib21cIixcImJvblwiLFwiYm9vXCIsXCJib3BcIixcImJvcVwiLFwiYm9yXCIsXCJib3RcIixcImJvdVwiLFwiYm92XCIsXCJib3dcIixcImJveFwiLFwiYm95XCIsXCJib3pcIixcImJwYVwiLFwiYnBiXCIsXCJicGRcIixcImJwZVwiLFwiYnBnXCIsXCJicGhcIixcImJwaVwiLFwiYnBqXCIsXCJicGtcIixcImJwbFwiLFwiYnBtXCIsXCJicG5cIixcImJwb1wiLFwiYnBwXCIsXCJicHFcIixcImJwclwiLFwiYnBzXCIsXCJicHRcIixcImJwdVwiLFwiYnB2XCIsXCJicHdcIixcImJweFwiLFwiYnB5XCIsXCJicHpcIixcImJxYVwiLFwiYnFiXCIsXCJicWNcIixcImJxZFwiLFwiYnFmXCIsXCJicWdcIixcImJxaFwiLFwiYnFpXCIsXCJicWpcIixcImJxa1wiLFwiYnFsXCIsXCJicW1cIixcImJxblwiLFwiYnFvXCIsXCJicXBcIixcImJxcVwiLFwiYnFyXCIsXCJicXNcIixcImJxdFwiLFwiYnF1XCIsXCJicXZcIixcImJxd1wiLFwiYnF4XCIsXCJicXlcIixcImJxelwiLFwiYnJhXCIsXCJicmJcIixcImJyY1wiLFwiYnJkXCIsXCJicmZcIixcImJyZ1wiLFwiYnJoXCIsXCJicmlcIixcImJyalwiLFwiYnJrXCIsXCJicmxcIixcImJybVwiLFwiYnJuXCIsXCJicm9cIixcImJycFwiLFwiYnJxXCIsXCJicnJcIixcImJyc1wiLFwiYnJ0XCIsXCJicnVcIixcImJydlwiLFwiYnJ3XCIsXCJicnhcIixcImJyeVwiLFwiYnJ6XCIsXCJic2FcIixcImJzYlwiLFwiYnNjXCIsXCJic2VcIixcImJzZlwiLFwiYnNnXCIsXCJic2hcIixcImJzaVwiLFwiYnNqXCIsXCJic2tcIixcImJzbFwiLFwiYnNtXCIsXCJic25cIixcImJzb1wiLFwiYnNwXCIsXCJic3FcIixcImJzclwiLFwiYnNzXCIsXCJic3RcIixcImJzdVwiLFwiYnN2XCIsXCJic3dcIixcImJzeFwiLFwiYnN5XCIsXCJidGFcIixcImJ0YlwiLFwiYnRjXCIsXCJidGRcIixcImJ0ZVwiLFwiYnRmXCIsXCJidGdcIixcImJ0aFwiLFwiYnRpXCIsXCJidGpcIixcImJ0a1wiLFwiYnRsXCIsXCJidG1cIixcImJ0blwiLFwiYnRvXCIsXCJidHBcIixcImJ0cVwiLFwiYnRyXCIsXCJidHNcIixcImJ0dFwiLFwiYnR1XCIsXCJidHZcIixcImJ0d1wiLFwiYnR4XCIsXCJidHlcIixcImJ0elwiLFwiYnVhXCIsXCJidWJcIixcImJ1Y1wiLFwiYnVkXCIsXCJidWVcIixcImJ1ZlwiLFwiYnVnXCIsXCJidWhcIixcImJ1aVwiLFwiYnVqXCIsXCJidWtcIixcImJ1bVwiLFwiYnVuXCIsXCJidW9cIixcImJ1cFwiLFwiYnVxXCIsXCJidXNcIixcImJ1dFwiLFwiYnV1XCIsXCJidXZcIixcImJ1d1wiLFwiYnV4XCIsXCJidXlcIixcImJ1elwiLFwiYnZhXCIsXCJidmJcIixcImJ2Y1wiLFwiYnZkXCIsXCJidmVcIixcImJ2ZlwiLFwiYnZnXCIsXCJidmhcIixcImJ2aVwiLFwiYnZqXCIsXCJidmtcIixcImJ2bFwiLFwiYnZtXCIsXCJidm5cIixcImJ2b1wiLFwiYnZwXCIsXCJidnFcIixcImJ2clwiLFwiYnZ0XCIsXCJidnVcIixcImJ2dlwiLFwiYnZ3XCIsXCJidnhcIixcImJ2eVwiLFwiYnZ6XCIsXCJid2FcIixcImJ3YlwiLFwiYndjXCIsXCJid2RcIixcImJ3ZVwiLFwiYndmXCIsXCJid2dcIixcImJ3aFwiLFwiYndpXCIsXCJid2pcIixcImJ3a1wiLFwiYndsXCIsXCJid21cIixcImJ3blwiLFwiYndvXCIsXCJid3BcIixcImJ3cVwiLFwiYndyXCIsXCJid3NcIixcImJ3dFwiLFwiYnd1XCIsXCJid3dcIixcImJ3eFwiLFwiYnd5XCIsXCJid3pcIixcImJ4YVwiLFwiYnhiXCIsXCJieGNcIixcImJ4ZFwiLFwiYnhlXCIsXCJieGZcIixcImJ4Z1wiLFwiYnhoXCIsXCJieGlcIixcImJ4alwiLFwiYnhrXCIsXCJieGxcIixcImJ4bVwiLFwiYnhuXCIsXCJieG9cIixcImJ4cFwiLFwiYnhxXCIsXCJieHJcIixcImJ4c1wiLFwiYnh1XCIsXCJieHZcIixcImJ4d1wiLFwiYnh4XCIsXCJieHpcIixcImJ5YVwiLFwiYnliXCIsXCJieWNcIixcImJ5ZFwiLFwiYnllXCIsXCJieWZcIixcImJ5Z1wiLFwiYnloXCIsXCJieWlcIixcImJ5alwiLFwiYnlrXCIsXCJieWxcIixcImJ5bVwiLFwiYnluXCIsXCJieW9cIixcImJ5cFwiLFwiYnlxXCIsXCJieXJcIixcImJ5c1wiLFwiYnl0XCIsXCJieXZcIixcImJ5d1wiLFwiYnl4XCIsXCJieXlcIixcImJ5elwiLFwiYnphXCIsXCJiemJcIixcImJ6Y1wiLFwiYnpkXCIsXCJiemVcIixcImJ6ZlwiLFwiYnpnXCIsXCJiemhcIixcImJ6aVwiLFwiYnpqXCIsXCJiemtcIixcImJ6bFwiLFwiYnptXCIsXCJiem5cIixcImJ6b1wiLFwiYnpwXCIsXCJienFcIixcImJ6clwiLFwiYnpzXCIsXCJienRcIixcImJ6dVwiLFwiYnp2XCIsXCJiendcIixcImJ6eFwiLFwiYnp5XCIsXCJienpcIl1cbixbIFwiY2FcIixcImNlXCIsXCJjaFwiLFwiY29cIixcImNyXCIsXCJjc1wiLFwiY3VcIixcImN2XCIsXCJjeVwiLFwiY2FhXCIsXCJjYWJcIixcImNhY1wiLFwiY2FkXCIsXCJjYWVcIixcImNhZlwiLFwiY2FnXCIsXCJjYWhcIixcImNhaVwiLFwiY2FqXCIsXCJjYWtcIixcImNhbFwiLFwiY2FtXCIsXCJjYW5cIixcImNhb1wiLFwiY2FwXCIsXCJjYXFcIixcImNhclwiLFwiY2FzXCIsXCJjYXVcIixcImNhdlwiLFwiY2F3XCIsXCJjYXhcIixcImNheVwiLFwiY2F6XCIsXCJjYmFcIixcImNiYlwiLFwiY2JjXCIsXCJjYmRcIixcImNiZVwiLFwiY2JnXCIsXCJjYmhcIixcImNiaVwiLFwiY2JqXCIsXCJjYmtcIixcImNibFwiLFwiY2JuXCIsXCJjYm9cIixcImNicVwiLFwiY2JyXCIsXCJjYnNcIixcImNidFwiLFwiY2J1XCIsXCJjYnZcIixcImNid1wiLFwiY2J5XCIsXCJjY2FcIixcImNjY1wiLFwiY2NkXCIsXCJjY2VcIixcImNjZ1wiLFwiY2NoXCIsXCJjY2pcIixcImNjbFwiLFwiY2NtXCIsXCJjY25cIixcImNjb1wiLFwiY2NwXCIsXCJjY3FcIixcImNjclwiLFwiY2NzXCIsXCJjZGFcIixcImNkY1wiLFwiY2RkXCIsXCJjZGVcIixcImNkZlwiLFwiY2RnXCIsXCJjZGhcIixcImNkaVwiLFwiY2RqXCIsXCJjZG1cIixcImNkblwiLFwiY2RvXCIsXCJjZHJcIixcImNkc1wiLFwiY2R5XCIsXCJjZHpcIixcImNlYVwiLFwiY2ViXCIsXCJjZWdcIixcImNla1wiLFwiY2VsXCIsXCJjZW5cIixcImNldFwiLFwiY2V5XCIsXCJjZmFcIixcImNmZFwiLFwiY2ZnXCIsXCJjZm1cIixcImNnYVwiLFwiY2djXCIsXCJjZ2dcIixcImNna1wiLFwiY2hiXCIsXCJjaGNcIixcImNoZFwiLFwiY2hmXCIsXCJjaGdcIixcImNoaFwiLFwiY2hqXCIsXCJjaGtcIixcImNobFwiLFwiY2htXCIsXCJjaG5cIixcImNob1wiLFwiY2hwXCIsXCJjaHFcIixcImNoclwiLFwiY2h0XCIsXCJjaHdcIixcImNoeFwiLFwiY2h5XCIsXCJjaHpcIixcImNpYVwiLFwiY2liXCIsXCJjaWNcIixcImNpZFwiLFwiY2llXCIsXCJjaWhcIixcImNpa1wiLFwiY2ltXCIsXCJjaW5cIixcImNpcFwiLFwiY2lyXCIsXCJjaXdcIixcImNpeVwiLFwiY2phXCIsXCJjamVcIixcImNqaFwiLFwiY2ppXCIsXCJjamtcIixcImNqbVwiLFwiY2puXCIsXCJjam9cIixcImNqcFwiLFwiY2pyXCIsXCJjanNcIixcImNqdlwiLFwiY2p5XCIsXCJja2FcIixcImNrYlwiLFwiY2toXCIsXCJja2xcIixcImNrbVwiLFwiY2tuXCIsXCJja29cIixcImNrcVwiLFwiY2tyXCIsXCJja3NcIixcImNrdFwiLFwiY2t1XCIsXCJja3ZcIixcImNreFwiLFwiY2t5XCIsXCJja3pcIixcImNsYVwiLFwiY2xjXCIsXCJjbGRcIixcImNsZVwiLFwiY2xoXCIsXCJjbGlcIixcImNsalwiLFwiY2xrXCIsXCJjbGxcIixcImNsbVwiLFwiY2xvXCIsXCJjbHRcIixcImNsdVwiLFwiY2x3XCIsXCJjbHlcIixcImNtYVwiLFwiY21jXCIsXCJjbWVcIixcImNtZ1wiLFwiY21pXCIsXCJjbWtcIixcImNtbFwiLFwiY21tXCIsXCJjbW5cIixcImNtb1wiLFwiY21yXCIsXCJjbXNcIixcImNtdFwiLFwiY25hXCIsXCJjbmJcIixcImNuY1wiLFwiY25nXCIsXCJjbmhcIixcImNuaVwiLFwiY25rXCIsXCJjbmxcIixcImNub1wiLFwiY25wXCIsXCJjbnJcIixcImNuc1wiLFwiY250XCIsXCJjbnVcIixcImNud1wiLFwiY254XCIsXCJjb2FcIixcImNvYlwiLFwiY29jXCIsXCJjb2RcIixcImNvZVwiLFwiY29mXCIsXCJjb2dcIixcImNvaFwiLFwiY29qXCIsXCJjb2tcIixcImNvbFwiLFwiY29tXCIsXCJjb25cIixcImNvb1wiLFwiY29wXCIsXCJjb3FcIixcImNvdFwiLFwiY291XCIsXCJjb3ZcIixcImNvd1wiLFwiY294XCIsXCJjb3lcIixcImNvelwiLFwiY3BhXCIsXCJjcGJcIixcImNwY1wiLFwiY3BlXCIsXCJjcGZcIixcImNwZ1wiLFwiY3BpXCIsXCJjcG5cIixcImNwb1wiLFwiY3BwXCIsXCJjcHNcIixcImNwdVwiLFwiY3B4XCIsXCJjcHlcIixcImNxZFwiLFwiY3F1XCIsXCJjcmFcIixcImNyYlwiLFwiY3JjXCIsXCJjcmRcIixcImNyZlwiLFwiY3JnXCIsXCJjcmhcIixcImNyaVwiLFwiY3JqXCIsXCJjcmtcIixcImNybFwiLFwiY3JtXCIsXCJjcm5cIixcImNyb1wiLFwiY3JwXCIsXCJjcnFcIixcImNyclwiLFwiY3JzXCIsXCJjcnRcIixcImNydlwiLFwiY3J3XCIsXCJjcnhcIixcImNyeVwiLFwiY3J6XCIsXCJjc2FcIixcImNzYlwiLFwiY3NjXCIsXCJjc2RcIixcImNzZVwiLFwiY3NmXCIsXCJjc2dcIixcImNzaFwiLFwiY3NpXCIsXCJjc2pcIixcImNza1wiLFwiY3NsXCIsXCJjc21cIixcImNzblwiLFwiY3NvXCIsXCJjc3BcIixcImNzcVwiLFwiY3NyXCIsXCJjc3NcIixcImNzdFwiLFwiY3N1XCIsXCJjc3ZcIixcImNzd1wiLFwiY3N4XCIsXCJjc3lcIixcImNzelwiLFwiY3RhXCIsXCJjdGNcIixcImN0ZFwiLFwiY3RlXCIsXCJjdGdcIixcImN0aFwiLFwiY3RsXCIsXCJjdG1cIixcImN0blwiLFwiY3RvXCIsXCJjdHBcIixcImN0c1wiLFwiY3R0XCIsXCJjdHVcIixcImN0eVwiLFwiY3R6XCIsXCJjdWFcIixcImN1YlwiLFwiY3VjXCIsXCJjdWdcIixcImN1aFwiLFwiY3VpXCIsXCJjdWpcIixcImN1a1wiLFwiY3VsXCIsXCJjdW1cIixcImN1b1wiLFwiY3VwXCIsXCJjdXFcIixcImN1clwiLFwiY3VzXCIsXCJjdXRcIixcImN1dVwiLFwiY3V2XCIsXCJjdXdcIixcImN1eFwiLFwiY3V5XCIsXCJjdmdcIixcImN2blwiLFwiY3dhXCIsXCJjd2JcIixcImN3ZFwiLFwiY3dlXCIsXCJjd2dcIixcImN3dFwiLFwiY3lhXCIsXCJjeWJcIixcImN5b1wiLFwiY3poXCIsXCJjemtcIixcImN6blwiLFwiY3pvXCIsXCJjenRcIl1cbixbIFwiZGFcIixcImRlXCIsXCJkdlwiLFwiZHpcIixcImRhYVwiLFwiZGFjXCIsXCJkYWRcIixcImRhZVwiLFwiZGFmXCIsXCJkYWdcIixcImRhaFwiLFwiZGFpXCIsXCJkYWpcIixcImRha1wiLFwiZGFsXCIsXCJkYW1cIixcImRhb1wiLFwiZGFwXCIsXCJkYXFcIixcImRhclwiLFwiZGFzXCIsXCJkYXVcIixcImRhdlwiLFwiZGF3XCIsXCJkYXhcIixcImRheVwiLFwiZGF6XCIsXCJkYmFcIixcImRiYlwiLFwiZGJkXCIsXCJkYmVcIixcImRiZlwiLFwiZGJnXCIsXCJkYmlcIixcImRialwiLFwiZGJsXCIsXCJkYm1cIixcImRiblwiLFwiZGJvXCIsXCJkYnBcIixcImRicVwiLFwiZGJyXCIsXCJkYnRcIixcImRidVwiLFwiZGJ2XCIsXCJkYndcIixcImRieVwiLFwiZGNjXCIsXCJkY3JcIixcImRkYVwiLFwiZGRkXCIsXCJkZGVcIixcImRkZ1wiLFwiZGRpXCIsXCJkZGpcIixcImRkblwiLFwiZGRvXCIsXCJkZHJcIixcImRkc1wiLFwiZGR3XCIsXCJkZWNcIixcImRlZFwiLFwiZGVlXCIsXCJkZWZcIixcImRlZ1wiLFwiZGVoXCIsXCJkZWlcIixcImRla1wiLFwiZGVsXCIsXCJkZW1cIixcImRlblwiLFwiZGVwXCIsXCJkZXFcIixcImRlclwiLFwiZGVzXCIsXCJkZXZcIixcImRlelwiLFwiZGdhXCIsXCJkZ2JcIixcImRnY1wiLFwiZGdkXCIsXCJkZ2VcIixcImRnZ1wiLFwiZGdoXCIsXCJkZ2lcIixcImRna1wiLFwiZGdsXCIsXCJkZ25cIixcImRnb1wiLFwiZGdyXCIsXCJkZ3NcIixcImRndFwiLFwiZGd1XCIsXCJkZ3dcIixcImRneFwiLFwiZGd6XCIsXCJkaGFcIixcImRoZFwiLFwiZGhnXCIsXCJkaGlcIixcImRobFwiLFwiZGhtXCIsXCJkaG5cIixcImRob1wiLFwiZGhyXCIsXCJkaHNcIixcImRodVwiLFwiZGh2XCIsXCJkaHdcIixcImRoeFwiLFwiZGlhXCIsXCJkaWJcIixcImRpY1wiLFwiZGlkXCIsXCJkaWZcIixcImRpZ1wiLFwiZGloXCIsXCJkaWlcIixcImRpalwiLFwiZGlrXCIsXCJkaWxcIixcImRpbVwiLFwiZGluXCIsXCJkaW9cIixcImRpcFwiLFwiZGlxXCIsXCJkaXJcIixcImRpc1wiLFwiZGl0XCIsXCJkaXVcIixcImRpd1wiLFwiZGl4XCIsXCJkaXlcIixcImRpelwiLFwiZGphXCIsXCJkamJcIixcImRqY1wiLFwiZGpkXCIsXCJkamVcIixcImRqZlwiLFwiZGppXCIsXCJkampcIixcImRqa1wiLFwiZGpsXCIsXCJkam1cIixcImRqblwiLFwiZGpvXCIsXCJkanJcIixcImRqdVwiLFwiZGp3XCIsXCJka2FcIixcImRrZ1wiLFwiZGtrXCIsXCJka2xcIixcImRrclwiLFwiZGtzXCIsXCJka3hcIixcImRsZ1wiLFwiZGxrXCIsXCJkbG1cIixcImRsblwiLFwiZG1hXCIsXCJkbWJcIixcImRtY1wiLFwiZG1kXCIsXCJkbWVcIixcImRtZlwiLFwiZG1nXCIsXCJkbWtcIixcImRtbFwiLFwiZG1tXCIsXCJkbW5cIixcImRtb1wiLFwiZG1yXCIsXCJkbXNcIixcImRtdVwiLFwiZG12XCIsXCJkbXdcIixcImRteFwiLFwiZG15XCIsXCJkbmFcIixcImRuZFwiLFwiZG5lXCIsXCJkbmdcIixcImRuaVwiLFwiZG5qXCIsXCJkbmtcIixcImRublwiLFwiZG5vXCIsXCJkbnJcIixcImRudFwiLFwiZG51XCIsXCJkbnZcIixcImRud1wiLFwiZG55XCIsXCJkb2FcIixcImRvYlwiLFwiZG9jXCIsXCJkb2VcIixcImRvZlwiLFwiZG9oXCIsXCJkb2lcIixcImRva1wiLFwiZG9sXCIsXCJkb25cIixcImRvb1wiLFwiZG9wXCIsXCJkb3FcIixcImRvclwiLFwiZG9zXCIsXCJkb3RcIixcImRvdlwiLFwiZG93XCIsXCJkb3hcIixcImRveVwiLFwiZG96XCIsXCJkcHBcIixcImRyYVwiLFwiZHJiXCIsXCJkcmNcIixcImRyZFwiLFwiZHJlXCIsXCJkcmdcIixcImRyaFwiLFwiZHJpXCIsXCJkcmxcIixcImRyblwiLFwiZHJvXCIsXCJkcnFcIixcImRyclwiLFwiZHJzXCIsXCJkcnRcIixcImRydVwiLFwiZHJ3XCIsXCJkcnlcIixcImRzYlwiLFwiZHNlXCIsXCJkc2hcIixcImRzaVwiLFwiZHNsXCIsXCJkc25cIixcImRzb1wiLFwiZHNxXCIsXCJkdGFcIixcImR0YlwiLFwiZHRkXCIsXCJkdGhcIixcImR0aVwiLFwiZHRrXCIsXCJkdG1cIixcImR0blwiLFwiZHRvXCIsXCJkdHBcIixcImR0clwiLFwiZHRzXCIsXCJkdHRcIixcImR0dVwiLFwiZHR5XCIsXCJkdWFcIixcImR1YlwiLFwiZHVjXCIsXCJkdWRcIixcImR1ZVwiLFwiZHVmXCIsXCJkdWdcIixcImR1aFwiLFwiZHVpXCIsXCJkdWpcIixcImR1a1wiLFwiZHVsXCIsXCJkdW1cIixcImR1blwiLFwiZHVvXCIsXCJkdXBcIixcImR1cVwiLFwiZHVyXCIsXCJkdXNcIixcImR1dVwiLFwiZHV2XCIsXCJkdXdcIixcImR1eFwiLFwiZHV5XCIsXCJkdXpcIixcImR2YVwiLFwiZHdhXCIsXCJkd2tcIixcImR3bFwiLFwiZHdyXCIsXCJkd3NcIixcImR3dVwiLFwiZHd3XCIsXCJkd3lcIixcImR3elwiLFwiZHlhXCIsXCJkeWJcIixcImR5ZFwiLFwiZHlnXCIsXCJkeWlcIixcImR5bVwiLFwiZHluXCIsXCJkeW9cIixcImR5dVwiLFwiZHl5XCIsXCJkemFcIixcImR6ZFwiLFwiZHplXCIsXCJkemdcIixcImR6bFwiLFwiZHpuXCJdXG4sWyBcImVlXCIsXCJlbFwiLFwiZW5cIixcImVvXCIsXCJlc1wiLFwiZXRcIixcImV1XCIsXCJlYWFcIixcImViY1wiLFwiZWJnXCIsXCJlYmtcIixcImVib1wiLFwiZWJyXCIsXCJlYnVcIixcImVjclwiLFwiZWNzXCIsXCJlY3lcIixcImVlZVwiLFwiZWZhXCIsXCJlZmVcIixcImVmaVwiLFwiZWdhXCIsXCJlZ2xcIixcImVnb1wiLFwiZWd4XCIsXCJlZ3lcIixcImVoc1wiLFwiZWh1XCIsXCJlaXBcIixcImVpdFwiLFwiZWl2XCIsXCJlamFcIixcImVrYVwiLFwiZWtjXCIsXCJla2VcIixcImVrZ1wiLFwiZWtpXCIsXCJla2tcIixcImVrbFwiLFwiZWttXCIsXCJla29cIixcImVrcFwiLFwiZWtyXCIsXCJla3lcIixcImVsZVwiLFwiZWxoXCIsXCJlbGlcIixcImVsa1wiLFwiZWxtXCIsXCJlbG9cIixcImVscFwiLFwiZWx1XCIsXCJlbHhcIixcImVtYVwiLFwiZW1iXCIsXCJlbWVcIixcImVtZ1wiLFwiZW1pXCIsXCJlbWtcIixcImVtbVwiLFwiZW1uXCIsXCJlbW9cIixcImVtcFwiLFwiZW1xXCIsXCJlbXNcIixcImVtdVwiLFwiZW13XCIsXCJlbXhcIixcImVteVwiLFwiZW16XCIsXCJlbmFcIixcImVuYlwiLFwiZW5jXCIsXCJlbmRcIixcImVuZlwiLFwiZW5oXCIsXCJlbmxcIixcImVubVwiLFwiZW5uXCIsXCJlbm9cIixcImVucVwiLFwiZW5yXCIsXCJlbnVcIixcImVudlwiLFwiZW53XCIsXCJlbnhcIixcImVvdFwiLFwiZXBpXCIsXCJlcmFcIixcImVyZ1wiLFwiZXJoXCIsXCJlcmlcIixcImVya1wiLFwiZXJvXCIsXCJlcnJcIixcImVyc1wiLFwiZXJ0XCIsXCJlcndcIixcImVzZVwiLFwiZXNnXCIsXCJlc2hcIixcImVzaVwiLFwiZXNrXCIsXCJlc2xcIixcImVzbVwiLFwiZXNuXCIsXCJlc29cIixcImVzcVwiLFwiZXNzXCIsXCJlc3VcIixcImVzeFwiLFwiZXN5XCIsXCJldGJcIixcImV0Y1wiLFwiZXRoXCIsXCJldG5cIixcImV0b1wiLFwiZXRyXCIsXCJldHNcIixcImV0dFwiLFwiZXR1XCIsXCJldHhcIixcImV0elwiLFwiZXVxXCIsXCJldmVcIixcImV2aFwiLFwiZXZuXCIsXCJld29cIixcImV4dFwiLFwiZXlhXCIsXCJleW9cIixcImV6YVwiLFwiZXplXCJdXG4sWyBcImZhXCIsXCJmZlwiLFwiZmlcIixcImZqXCIsXCJmb1wiLFwiZnJcIixcImZ5XCIsXCJmYWFcIixcImZhYlwiLFwiZmFkXCIsXCJmYWZcIixcImZhZ1wiLFwiZmFoXCIsXCJmYWlcIixcImZhalwiLFwiZmFrXCIsXCJmYWxcIixcImZhbVwiLFwiZmFuXCIsXCJmYXBcIixcImZhclwiLFwiZmF0XCIsXCJmYXVcIixcImZheFwiLFwiZmF5XCIsXCJmYXpcIixcImZibFwiLFwiZmNzXCIsXCJmZXJcIixcImZmaVwiLFwiZmZtXCIsXCJmZ3JcIixcImZpYVwiLFwiZmllXCIsXCJmaWZcIixcImZpbFwiLFwiZmlwXCIsXCJmaXJcIixcImZpdFwiLFwiZml1XCIsXCJmaXdcIixcImZra1wiLFwiZmt2XCIsXCJmbGFcIixcImZsaFwiLFwiZmxpXCIsXCJmbGxcIixcImZsblwiLFwiZmxyXCIsXCJmbHlcIixcImZtcFwiLFwiZm11XCIsXCJmbmJcIixcImZuZ1wiLFwiZm5pXCIsXCJmb2RcIixcImZvaVwiLFwiZm9tXCIsXCJmb25cIixcImZvclwiLFwiZm9zXCIsXCJmb3hcIixcImZwZVwiLFwiZnFzXCIsXCJmcmNcIixcImZyZFwiLFwiZnJrXCIsXCJmcm1cIixcImZyb1wiLFwiZnJwXCIsXCJmcnFcIixcImZyclwiLFwiZnJzXCIsXCJmcnRcIixcImZzZVwiLFwiZnNsXCIsXCJmc3NcIixcImZ1YlwiLFwiZnVjXCIsXCJmdWRcIixcImZ1ZVwiLFwiZnVmXCIsXCJmdWhcIixcImZ1aVwiLFwiZnVqXCIsXCJmdW1cIixcImZ1blwiLFwiZnVxXCIsXCJmdXJcIixcImZ1dFwiLFwiZnV1XCIsXCJmdXZcIixcImZ1eVwiLFwiZnZyXCIsXCJmd2FcIixcImZ3ZVwiXVxuLFsgXCJnYVwiLFwiZ2RcIixcImdsXCIsXCJnblwiLFwiZ3VcIixcImd2XCIsXCJnYWFcIixcImdhYlwiLFwiZ2FjXCIsXCJnYWRcIixcImdhZVwiLFwiZ2FmXCIsXCJnYWdcIixcImdhaFwiLFwiZ2FpXCIsXCJnYWpcIixcImdha1wiLFwiZ2FsXCIsXCJnYW1cIixcImdhblwiLFwiZ2FvXCIsXCJnYXBcIixcImdhcVwiLFwiZ2FyXCIsXCJnYXNcIixcImdhdFwiLFwiZ2F1XCIsXCJnYXZcIixcImdhd1wiLFwiZ2F4XCIsXCJnYXlcIixcImdhelwiLFwiZ2JhXCIsXCJnYmJcIixcImdiY1wiLFwiZ2JkXCIsXCJnYmVcIixcImdiZlwiLFwiZ2JnXCIsXCJnYmhcIixcImdiaVwiLFwiZ2JqXCIsXCJnYmtcIixcImdibFwiLFwiZ2JtXCIsXCJnYm5cIixcImdib1wiLFwiZ2JwXCIsXCJnYnFcIixcImdiclwiLFwiZ2JzXCIsXCJnYnVcIixcImdidlwiLFwiZ2J3XCIsXCJnYnhcIixcImdieVwiLFwiZ2J6XCIsXCJnY2NcIixcImdjZFwiLFwiZ2NlXCIsXCJnY2ZcIixcImdjbFwiLFwiZ2NuXCIsXCJnY3JcIixcImdjdFwiLFwiZ2RhXCIsXCJnZGJcIixcImdkY1wiLFwiZ2RkXCIsXCJnZGVcIixcImdkZlwiLFwiZ2RnXCIsXCJnZGhcIixcImdkaVwiLFwiZ2RqXCIsXCJnZGtcIixcImdkbFwiLFwiZ2RtXCIsXCJnZG5cIixcImdkb1wiLFwiZ2RxXCIsXCJnZHJcIixcImdkc1wiLFwiZ2R0XCIsXCJnZHVcIixcImdkeFwiLFwiZ2VhXCIsXCJnZWJcIixcImdlY1wiLFwiZ2VkXCIsXCJnZWZcIixcImdlZ1wiLFwiZ2VoXCIsXCJnZWlcIixcImdlalwiLFwiZ2VrXCIsXCJnZWxcIixcImdlbVwiLFwiZ2VxXCIsXCJnZXNcIixcImdldlwiLFwiZ2V3XCIsXCJnZXhcIixcImdleVwiLFwiZ2V6XCIsXCJnZmtcIixcImdmdFwiLFwiZ2Z4XCIsXCJnZ2FcIixcImdnYlwiLFwiZ2dkXCIsXCJnZ2VcIixcImdnZ1wiLFwiZ2drXCIsXCJnZ2xcIixcImdnblwiLFwiZ2dvXCIsXCJnZ3JcIixcImdndFwiLFwiZ2d1XCIsXCJnZ3dcIixcImdoYVwiLFwiZ2hjXCIsXCJnaGVcIixcImdoaFwiLFwiZ2hrXCIsXCJnaGxcIixcImdoblwiLFwiZ2hvXCIsXCJnaHJcIixcImdoc1wiLFwiZ2h0XCIsXCJnaWFcIixcImdpYlwiLFwiZ2ljXCIsXCJnaWRcIixcImdpZVwiLFwiZ2lnXCIsXCJnaWhcIixcImdpaVwiLFwiZ2lsXCIsXCJnaW1cIixcImdpblwiLFwiZ2lvXCIsXCJnaXBcIixcImdpcVwiLFwiZ2lyXCIsXCJnaXNcIixcImdpdFwiLFwiZ2l1XCIsXCJnaXdcIixcImdpeFwiLFwiZ2l5XCIsXCJnaXpcIixcImdqaVwiLFwiZ2prXCIsXCJnam1cIixcImdqblwiLFwiZ2pyXCIsXCJnanVcIixcImdrYVwiLFwiZ2tkXCIsXCJna2VcIixcImdrblwiLFwiZ2tvXCIsXCJna3BcIixcImdrdVwiLFwiZ2xiXCIsXCJnbGNcIixcImdsZFwiLFwiZ2xoXCIsXCJnbGlcIixcImdsalwiLFwiZ2xrXCIsXCJnbGxcIixcImdsb1wiLFwiZ2xyXCIsXCJnbHVcIixcImdsd1wiLFwiZ2x5XCIsXCJnbWFcIixcImdtYlwiLFwiZ21kXCIsXCJnbWVcIixcImdtZ1wiLFwiZ21oXCIsXCJnbWxcIixcImdtbVwiLFwiZ21uXCIsXCJnbXFcIixcImdtclwiLFwiZ211XCIsXCJnbXZcIixcImdtd1wiLFwiZ214XCIsXCJnbXlcIixcImdtelwiLFwiZ25hXCIsXCJnbmJcIixcImduY1wiLFwiZ25kXCIsXCJnbmVcIixcImduZ1wiLFwiZ25oXCIsXCJnbmlcIixcImdualwiLFwiZ25rXCIsXCJnbmxcIixcImdubVwiLFwiZ25uXCIsXCJnbm9cIixcImducVwiLFwiZ25yXCIsXCJnbnRcIixcImdudVwiLFwiZ253XCIsXCJnbnpcIixcImdvYVwiLFwiZ29iXCIsXCJnb2NcIixcImdvZFwiLFwiZ29lXCIsXCJnb2ZcIixcImdvZ1wiLFwiZ29oXCIsXCJnb2lcIixcImdvalwiLFwiZ29rXCIsXCJnb2xcIixcImdvbVwiLFwiZ29uXCIsXCJnb29cIixcImdvcFwiLFwiZ29xXCIsXCJnb3JcIixcImdvc1wiLFwiZ290XCIsXCJnb3VcIixcImdvd1wiLFwiZ294XCIsXCJnb3lcIixcImdvelwiLFwiZ3BhXCIsXCJncGVcIixcImdwblwiLFwiZ3FhXCIsXCJncWlcIixcImdxblwiLFwiZ3FyXCIsXCJncXVcIixcImdyYVwiLFwiZ3JiXCIsXCJncmNcIixcImdyZFwiLFwiZ3JnXCIsXCJncmhcIixcImdyaVwiLFwiZ3JqXCIsXCJncmtcIixcImdybVwiLFwiZ3JvXCIsXCJncnFcIixcImdyclwiLFwiZ3JzXCIsXCJncnRcIixcImdydVwiLFwiZ3J2XCIsXCJncndcIixcImdyeFwiLFwiZ3J5XCIsXCJncnpcIixcImdzZVwiLFwiZ3NnXCIsXCJnc2xcIixcImdzbVwiLFwiZ3NuXCIsXCJnc29cIixcImdzcFwiLFwiZ3NzXCIsXCJnc3dcIixcImd0YVwiLFwiZ3RpXCIsXCJndHVcIixcImd1YVwiLFwiZ3ViXCIsXCJndWNcIixcImd1ZFwiLFwiZ3VlXCIsXCJndWZcIixcImd1Z1wiLFwiZ3VoXCIsXCJndWlcIixcImd1a1wiLFwiZ3VsXCIsXCJndW1cIixcImd1blwiLFwiZ3VvXCIsXCJndXBcIixcImd1cVwiLFwiZ3VyXCIsXCJndXNcIixcImd1dFwiLFwiZ3V1XCIsXCJndXZcIixcImd1d1wiLFwiZ3V4XCIsXCJndXpcIixcImd2YVwiLFwiZ3ZjXCIsXCJndmVcIixcImd2ZlwiLFwiZ3ZqXCIsXCJndmxcIixcImd2bVwiLFwiZ3ZuXCIsXCJndm9cIixcImd2cFwiLFwiZ3ZyXCIsXCJndnNcIixcImd2eVwiLFwiZ3dhXCIsXCJnd2JcIixcImd3Y1wiLFwiZ3dkXCIsXCJnd2VcIixcImd3ZlwiLFwiZ3dnXCIsXCJnd2lcIixcImd3alwiLFwiZ3dtXCIsXCJnd25cIixcImd3clwiLFwiZ3d0XCIsXCJnd3VcIixcImd3d1wiLFwiZ3d4XCIsXCJneHhcIixcImd5YVwiLFwiZ3liXCIsXCJneWRcIixcImd5ZVwiLFwiZ3lmXCIsXCJneWdcIixcImd5aVwiLFwiZ3lsXCIsXCJneW1cIixcImd5blwiLFwiZ3lvXCIsXCJneXJcIixcImd5eVwiLFwiZ3l6XCIsXCJnemFcIixcImd6aVwiLFwiZ3puXCJdXG4sWyBcImhhXCIsXCJoZVwiLFwiaGlcIixcImhvXCIsXCJoclwiLFwiaHRcIixcImh1XCIsXCJoeVwiLFwiaHpcIixcImhhYVwiLFwiaGFiXCIsXCJoYWNcIixcImhhZFwiLFwiaGFlXCIsXCJoYWZcIixcImhhZ1wiLFwiaGFoXCIsXCJoYWlcIixcImhhalwiLFwiaGFrXCIsXCJoYWxcIixcImhhbVwiLFwiaGFuXCIsXCJoYW9cIixcImhhcFwiLFwiaGFxXCIsXCJoYXJcIixcImhhc1wiLFwiaGF2XCIsXCJoYXdcIixcImhheFwiLFwiaGF5XCIsXCJoYXpcIixcImhiYVwiLFwiaGJiXCIsXCJoYm5cIixcImhib1wiLFwiaGJ1XCIsXCJoY2FcIixcImhjaFwiLFwiaGRuXCIsXCJoZHNcIixcImhkeVwiLFwiaGVhXCIsXCJoZWRcIixcImhlZ1wiLFwiaGVoXCIsXCJoZWlcIixcImhlbVwiLFwiaGdtXCIsXCJoZ3dcIixcImhoaVwiLFwiaGhyXCIsXCJoaHlcIixcImhpYVwiLFwiaGliXCIsXCJoaWRcIixcImhpZlwiLFwiaGlnXCIsXCJoaWhcIixcImhpaVwiLFwiaGlqXCIsXCJoaWtcIixcImhpbFwiLFwiaGltXCIsXCJoaW9cIixcImhpclwiLFwiaGl0XCIsXCJoaXdcIixcImhpeFwiLFwiaGppXCIsXCJoa2FcIixcImhrZVwiLFwiaGtoXCIsXCJoa2tcIixcImhrblwiLFwiaGtzXCIsXCJobGFcIixcImhsYlwiLFwiaGxkXCIsXCJobGVcIixcImhsdFwiLFwiaGx1XCIsXCJobWFcIixcImhtYlwiLFwiaG1jXCIsXCJobWRcIixcImhtZVwiLFwiaG1mXCIsXCJobWdcIixcImhtaFwiLFwiaG1pXCIsXCJobWpcIixcImhta1wiLFwiaG1sXCIsXCJobW1cIixcImhtblwiLFwiaG1wXCIsXCJobXFcIixcImhtclwiLFwiaG1zXCIsXCJobXRcIixcImhtdVwiLFwiaG12XCIsXCJobXdcIixcImhteFwiLFwiaG15XCIsXCJobXpcIixcImhuYVwiLFwiaG5kXCIsXCJobmVcIixcImhuZ1wiLFwiaG5oXCIsXCJobmlcIixcImhualwiLFwiaG5uXCIsXCJobm9cIixcImhuc1wiLFwiaG51XCIsXCJob2FcIixcImhvYlwiLFwiaG9jXCIsXCJob2RcIixcImhvZVwiLFwiaG9oXCIsXCJob2lcIixcImhvalwiLFwiaG9rXCIsXCJob2xcIixcImhvbVwiLFwiaG9vXCIsXCJob3BcIixcImhvclwiLFwiaG9zXCIsXCJob3RcIixcImhvdlwiLFwiaG93XCIsXCJob3lcIixcImhvelwiLFwiaHBvXCIsXCJocHNcIixcImhyYVwiLFwiaHJjXCIsXCJocmVcIixcImhya1wiLFwiaHJtXCIsXCJocm9cIixcImhycFwiLFwiaHJyXCIsXCJocnRcIixcImhydVwiLFwiaHJ3XCIsXCJocnhcIixcImhyelwiLFwiaHNiXCIsXCJoc2hcIixcImhzbFwiLFwiaHNuXCIsXCJoc3NcIixcImh0aVwiLFwiaHRvXCIsXCJodHNcIixcImh0dVwiLFwiaHR4XCIsXCJodWJcIixcImh1Y1wiLFwiaHVkXCIsXCJodWVcIixcImh1ZlwiLFwiaHVnXCIsXCJodWhcIixcImh1aVwiLFwiaHVqXCIsXCJodWtcIixcImh1bFwiLFwiaHVtXCIsXCJodW9cIixcImh1cFwiLFwiaHVxXCIsXCJodXJcIixcImh1c1wiLFwiaHV0XCIsXCJodXVcIixcImh1dlwiLFwiaHV3XCIsXCJodXhcIixcImh1eVwiLFwiaHV6XCIsXCJodmNcIixcImh2ZVwiLFwiaHZrXCIsXCJodm5cIixcImh2dlwiLFwiaHdhXCIsXCJod2NcIixcImh3b1wiLFwiaHlhXCIsXCJoeXdcIixcImh5eFwiXVxuLFsgXCJpYVwiLFwiaWRcIixcImllXCIsXCJpZ1wiLFwiaWlcIixcImlrXCIsXCJpblwiLFwiaW9cIixcImlzXCIsXCJpdFwiLFwiaXVcIixcIml3XCIsXCJpYWlcIixcImlhblwiLFwiaWFwXCIsXCJpYXJcIixcImliYVwiLFwiaWJiXCIsXCJpYmRcIixcImliZVwiLFwiaWJnXCIsXCJpYmhcIixcImliaVwiLFwiaWJsXCIsXCJpYm1cIixcImliblwiLFwiaWJyXCIsXCJpYnVcIixcImlieVwiLFwiaWNhXCIsXCJpY2hcIixcImljbFwiLFwiaWNyXCIsXCJpZGFcIixcImlkYlwiLFwiaWRjXCIsXCJpZGRcIixcImlkZVwiLFwiaWRpXCIsXCJpZHJcIixcImlkc1wiLFwiaWR0XCIsXCJpZHVcIixcImlmYVwiLFwiaWZiXCIsXCJpZmVcIixcImlmZlwiLFwiaWZrXCIsXCJpZm1cIixcImlmdVwiLFwiaWZ5XCIsXCJpZ2JcIixcImlnZVwiLFwiaWdnXCIsXCJpZ2xcIixcImlnbVwiLFwiaWduXCIsXCJpZ29cIixcImlnc1wiLFwiaWd3XCIsXCJpaGJcIixcImloaVwiLFwiaWhwXCIsXCJpaHdcIixcImlpblwiLFwiaWlyXCIsXCJpamNcIixcImlqZVwiLFwiaWpqXCIsXCJpam5cIixcImlqb1wiLFwiaWpzXCIsXCJpa2VcIixcImlraVwiLFwiaWtrXCIsXCJpa2xcIixcImlrb1wiLFwiaWtwXCIsXCJpa3JcIixcImlrc1wiLFwiaWt0XCIsXCJpa3ZcIixcImlrd1wiLFwiaWt4XCIsXCJpa3pcIixcImlsYVwiLFwiaWxiXCIsXCJpbGdcIixcImlsaVwiLFwiaWxrXCIsXCJpbGxcIixcImlsbVwiLFwiaWxvXCIsXCJpbHBcIixcImlsc1wiLFwiaWx1XCIsXCJpbHZcIixcImlsd1wiLFwiaW1hXCIsXCJpbWVcIixcImltaVwiLFwiaW1sXCIsXCJpbW5cIixcImltb1wiLFwiaW1yXCIsXCJpbXNcIixcImlteVwiLFwiaW5iXCIsXCJpbmNcIixcImluZVwiLFwiaW5nXCIsXCJpbmhcIixcImlualwiLFwiaW5sXCIsXCJpbm1cIixcImlublwiLFwiaW5vXCIsXCJpbnBcIixcImluc1wiLFwiaW50XCIsXCJpbnpcIixcImlvclwiLFwiaW91XCIsXCJpb3dcIixcImlwaVwiLFwiaXBvXCIsXCJpcXVcIixcImlxd1wiLFwiaXJhXCIsXCJpcmVcIixcImlyaFwiLFwiaXJpXCIsXCJpcmtcIixcImlyblwiLFwiaXJvXCIsXCJpcnJcIixcImlydVwiLFwiaXJ4XCIsXCJpcnlcIixcImlzYVwiLFwiaXNjXCIsXCJpc2RcIixcImlzZVwiLFwiaXNnXCIsXCJpc2hcIixcImlzaVwiLFwiaXNrXCIsXCJpc21cIixcImlzblwiLFwiaXNvXCIsXCJpc3JcIixcImlzdFwiLFwiaXN1XCIsXCJpdGJcIixcIml0Y1wiLFwiaXRkXCIsXCJpdGVcIixcIml0aVwiLFwiaXRrXCIsXCJpdGxcIixcIml0bVwiLFwiaXRvXCIsXCJpdHJcIixcIml0c1wiLFwiaXR0XCIsXCJpdHZcIixcIml0d1wiLFwiaXR4XCIsXCJpdHlcIixcIml0elwiLFwiaXVtXCIsXCJpdmJcIixcIml2dlwiLFwiaXdrXCIsXCJpd21cIixcIml3b1wiLFwiaXdzXCIsXCJpeGNcIixcIml4bFwiLFwiaXlhXCIsXCJpeW9cIixcIml5eFwiLFwiaXpoXCIsXCJpemlcIixcIml6clwiLFwiaXp6XCJdXG4sWyBcImphXCIsXCJqaVwiLFwianZcIixcImp3XCIsXCJqYWFcIixcImphYlwiLFwiamFjXCIsXCJqYWRcIixcImphZVwiLFwiamFmXCIsXCJqYWhcIixcImphalwiLFwiamFrXCIsXCJqYWxcIixcImphbVwiLFwiamFuXCIsXCJqYW9cIixcImphcVwiLFwiamFyXCIsXCJqYXNcIixcImphdFwiLFwiamF1XCIsXCJqYXhcIixcImpheVwiLFwiamF6XCIsXCJqYmVcIixcImpiaVwiLFwiamJqXCIsXCJqYmtcIixcImpibVwiLFwiamJuXCIsXCJqYm9cIixcImpiclwiLFwiamJ0XCIsXCJqYnVcIixcImpid1wiLFwiamNzXCIsXCJqY3RcIixcImpkYVwiLFwiamRnXCIsXCJqZHRcIixcImplYlwiLFwiamVlXCIsXCJqZWdcIixcImplaFwiLFwiamVpXCIsXCJqZWtcIixcImplbFwiLFwiamVuXCIsXCJqZXJcIixcImpldFwiLFwiamV1XCIsXCJqZ2JcIixcImpnZVwiLFwiamdrXCIsXCJqZ29cIixcImpoaVwiLFwiamhzXCIsXCJqaWFcIixcImppYlwiLFwiamljXCIsXCJqaWRcIixcImppZVwiLFwiamlnXCIsXCJqaWhcIixcImppaVwiLFwiamlsXCIsXCJqaW1cIixcImppb1wiLFwiamlxXCIsXCJqaXRcIixcImppdVwiLFwiaml2XCIsXCJqaXlcIixcImpqZVwiLFwiampyXCIsXCJqa2FcIixcImprbVwiLFwiamtvXCIsXCJqa3BcIixcImprclwiLFwiamtzXCIsXCJqa3VcIixcImpsZVwiLFwiamxzXCIsXCJqbWFcIixcImptYlwiLFwiam1jXCIsXCJqbWRcIixcImptaVwiLFwiam1sXCIsXCJqbW5cIixcImptclwiLFwiam1zXCIsXCJqbXdcIixcImpteFwiLFwiam5hXCIsXCJqbmRcIixcImpuZ1wiLFwiam5pXCIsXCJqbmpcIixcImpubFwiLFwiam5zXCIsXCJqb2JcIixcImpvZFwiLFwiam9nXCIsXCJqb3JcIixcImpvc1wiLFwiam93XCIsXCJqcGFcIixcImpwclwiLFwianB4XCIsXCJqcXJcIixcImpyYVwiLFwianJiXCIsXCJqcnJcIixcImpydFwiLFwianJ1XCIsXCJqc2xcIixcImp1YVwiLFwianViXCIsXCJqdWNcIixcImp1ZFwiLFwianVoXCIsXCJqdWlcIixcImp1a1wiLFwianVsXCIsXCJqdW1cIixcImp1blwiLFwianVvXCIsXCJqdXBcIixcImp1clwiLFwianVzXCIsXCJqdXRcIixcImp1dVwiLFwianV3XCIsXCJqdXlcIixcImp2ZFwiLFwianZuXCIsXCJqd2lcIixcImp5YVwiLFwianllXCIsXCJqeXlcIl1cbixbIFwia2FcIixcImtnXCIsXCJraVwiLFwia2pcIixcImtrXCIsXCJrbFwiLFwia21cIixcImtuXCIsXCJrb1wiLFwia3JcIixcImtzXCIsXCJrdVwiLFwia3ZcIixcImt3XCIsXCJreVwiLFwia2FhXCIsXCJrYWJcIixcImthY1wiLFwia2FkXCIsXCJrYWVcIixcImthZlwiLFwia2FnXCIsXCJrYWhcIixcImthaVwiLFwia2FqXCIsXCJrYWtcIixcImthbVwiLFwia2FvXCIsXCJrYXBcIixcImthcVwiLFwia2FyXCIsXCJrYXZcIixcImthd1wiLFwia2F4XCIsXCJrYXlcIixcImtiYVwiLFwia2JiXCIsXCJrYmNcIixcImtiZFwiLFwia2JlXCIsXCJrYmZcIixcImtiZ1wiLFwia2JoXCIsXCJrYmlcIixcImtialwiLFwia2JrXCIsXCJrYmxcIixcImtibVwiLFwia2JuXCIsXCJrYm9cIixcImticFwiLFwia2JxXCIsXCJrYnJcIixcImtic1wiLFwia2J0XCIsXCJrYnVcIixcImtidlwiLFwia2J3XCIsXCJrYnhcIixcImtieVwiLFwia2J6XCIsXCJrY2FcIixcImtjYlwiLFwia2NjXCIsXCJrY2RcIixcImtjZVwiLFwia2NmXCIsXCJrY2dcIixcImtjaFwiLFwia2NpXCIsXCJrY2pcIixcImtja1wiLFwia2NsXCIsXCJrY21cIixcImtjblwiLFwia2NvXCIsXCJrY3BcIixcImtjcVwiLFwia2NyXCIsXCJrY3NcIixcImtjdFwiLFwia2N1XCIsXCJrY3ZcIixcImtjd1wiLFwia2N4XCIsXCJrY3lcIixcImtjelwiLFwia2RhXCIsXCJrZGNcIixcImtkZFwiLFwia2RlXCIsXCJrZGZcIixcImtkZ1wiLFwia2RoXCIsXCJrZGlcIixcImtkalwiLFwia2RrXCIsXCJrZGxcIixcImtkbVwiLFwia2RuXCIsXCJrZG9cIixcImtkcFwiLFwia2RxXCIsXCJrZHJcIixcImtkdFwiLFwia2R1XCIsXCJrZHZcIixcImtkd1wiLFwia2R4XCIsXCJrZHlcIixcImtkelwiLFwia2VhXCIsXCJrZWJcIixcImtlY1wiLFwia2VkXCIsXCJrZWVcIixcImtlZlwiLFwia2VnXCIsXCJrZWhcIixcImtlaVwiLFwia2VqXCIsXCJrZWtcIixcImtlbFwiLFwia2VtXCIsXCJrZW5cIixcImtlb1wiLFwia2VwXCIsXCJrZXFcIixcImtlclwiLFwia2VzXCIsXCJrZXRcIixcImtldVwiLFwia2V2XCIsXCJrZXdcIixcImtleFwiLFwia2V5XCIsXCJrZXpcIixcImtmYVwiLFwia2ZiXCIsXCJrZmNcIixcImtmZFwiLFwia2ZlXCIsXCJrZmZcIixcImtmZ1wiLFwia2ZoXCIsXCJrZmlcIixcImtmalwiLFwia2ZrXCIsXCJrZmxcIixcImtmbVwiLFwia2ZuXCIsXCJrZm9cIixcImtmcFwiLFwia2ZxXCIsXCJrZnJcIixcImtmc1wiLFwia2Z0XCIsXCJrZnVcIixcImtmdlwiLFwia2Z3XCIsXCJrZnhcIixcImtmeVwiLFwia2Z6XCIsXCJrZ2FcIixcImtnYlwiLFwia2djXCIsXCJrZ2RcIixcImtnZVwiLFwia2dmXCIsXCJrZ2dcIixcImtnaFwiLFwia2dpXCIsXCJrZ2pcIixcImtna1wiLFwia2dsXCIsXCJrZ21cIixcImtnblwiLFwia2dvXCIsXCJrZ3BcIixcImtncVwiLFwia2dyXCIsXCJrZ3NcIixcImtndFwiLFwia2d1XCIsXCJrZ3ZcIixcImtnd1wiLFwia2d4XCIsXCJrZ3lcIixcImtoYVwiLFwibHlnXCIsXCJraGJcIixcImtoY1wiLFwia2hkXCIsXCJraGVcIixcImtoZlwiLFwia2hnXCIsXCJraGhcIixcImtoaVwiLFwia2hqXCIsXCJraGtcIixcImtobFwiLFwia2huXCIsXCJraG9cIixcImtocFwiLFwia2hxXCIsXCJraHJcIixcImtoc1wiLFwia2h0XCIsXCJraHVcIixcImtodlwiLFwia2h3XCIsXCJraHhcIixcImtoeVwiLFwia2h6XCIsXCJraWFcIixcImtpYlwiLFwia2ljXCIsXCJraWRcIixcImtpZVwiLFwia2lmXCIsXCJraWdcIixcImtpaFwiLFwia2lpXCIsXCJraWpcIixcImtpbFwiLFwia2ltXCIsXCJraW9cIixcImtpcFwiLFwia2lxXCIsXCJraXNcIixcImtpdFwiLFwia2l1XCIsXCJraXZcIixcImtpd1wiLFwia2l4XCIsXCJraXlcIixcImtpelwiLFwia2phXCIsXCJramJcIixcImtqY1wiLFwia2pkXCIsXCJramVcIixcImtqZlwiLFwia2pnXCIsXCJramhcIixcImtqaVwiLFwia2pqXCIsXCJramtcIixcImtqbFwiLFwia2ptXCIsXCJram5cIixcImtqb1wiLFwia2pwXCIsXCJranFcIixcImtqclwiLFwia2pzXCIsXCJranRcIixcImtqdVwiLFwia2p2XCIsXCJranhcIixcImtqeVwiLFwia2p6XCIsXCJra2FcIixcImtrYlwiLFwia2tjXCIsXCJra2RcIixcImtrZVwiLFwia2tmXCIsXCJra2dcIixcImtraFwiLFwia2tpXCIsXCJra2pcIixcImtra1wiLFwia2tsXCIsXCJra21cIixcImtrblwiLFwia2tvXCIsXCJra3BcIixcImtrcVwiLFwia2tyXCIsXCJra3NcIixcImtrdFwiLFwia2t1XCIsXCJra3ZcIixcImtrd1wiLFwia2t4XCIsXCJra3lcIixcImtrelwiLFwia2xhXCIsXCJrbGJcIixcImtsY1wiLFwia2xkXCIsXCJrbGVcIixcImtsZlwiLFwia2xnXCIsXCJrbGhcIixcImtsaVwiLFwia2xqXCIsXCJrbGtcIixcImtsbFwiLFwia2xtXCIsXCJrbG5cIixcImtsb1wiLFwia2xwXCIsXCJrbHFcIixcImtsclwiLFwia2xzXCIsXCJrbHRcIixcImtsdVwiLFwia2x2XCIsXCJrbHdcIixcImtseFwiLFwia2x5XCIsXCJrbHpcIixcImttYVwiLFwia21iXCIsXCJrbWNcIixcImttZFwiLFwia21lXCIsXCJrbWZcIixcImttZ1wiLFwia21oXCIsXCJrbWlcIixcImttalwiLFwia21rXCIsXCJrbWxcIixcImttbVwiLFwia21uXCIsXCJrbW9cIixcImttcFwiLFwia21xXCIsXCJrbXJcIixcImttc1wiLFwia210XCIsXCJrbXVcIixcImttdlwiLFwia213XCIsXCJrbXhcIixcImtteVwiLFwia216XCIsXCJrbmFcIixcImtuYlwiLFwia25jXCIsXCJrbmRcIixcImtuZVwiLFwia25mXCIsXCJrbmdcIixcImtuaVwiLFwia25qXCIsXCJrbmtcIixcImtubFwiLFwia25tXCIsXCJrbm5cIixcImtub1wiLFwia25wXCIsXCJrbnFcIixcImtuclwiLFwia25zXCIsXCJrbnRcIixcImtudVwiLFwia252XCIsXCJrbndcIixcImtueFwiLFwia255XCIsXCJrbnpcIixcImtvYVwiLFwia29jXCIsXCJrb2RcIixcImtvZVwiLFwia29mXCIsXCJrb2dcIixcImtvaFwiLFwia29pXCIsXCJrb2pcIixcImtva1wiLFwia29sXCIsXCJrb29cIixcImtvcFwiLFwia29xXCIsXCJrb3NcIixcImtvdFwiLFwia291XCIsXCJrb3ZcIixcImtvd1wiLFwia294XCIsXCJrb3lcIixcImtvelwiLFwia3BhXCIsXCJrcGJcIixcImtwY1wiLFwia3BkXCIsXCJrcGVcIixcImtwZlwiLFwia3BnXCIsXCJrcGhcIixcImtwaVwiLFwia3BqXCIsXCJrcGtcIixcImtwbFwiLFwia3BtXCIsXCJrcG5cIixcImtwb1wiLFwia3BwXCIsXCJrcHFcIixcImtwclwiLFwia3BzXCIsXCJrcHRcIixcImtwdVwiLFwia3B2XCIsXCJrcHdcIixcImtweFwiLFwia3B5XCIsXCJrcHpcIixcImtxYVwiLFwia3FiXCIsXCJrcWNcIixcImtxZFwiLFwia3FlXCIsXCJrcWZcIixcImtxZ1wiLFwia3FoXCIsXCJrcWlcIixcImtxalwiLFwia3FrXCIsXCJrcWxcIixcImtxbVwiLFwia3FuXCIsXCJrcW9cIixcImtxcFwiLFwia3FxXCIsXCJrcXJcIixcImtxc1wiLFwia3F0XCIsXCJrcXVcIixcImtxdlwiLFwia3F3XCIsXCJrcXhcIixcImtxeVwiLFwia3F6XCIsXCJrcmFcIixcImtyYlwiLFwia3JjXCIsXCJrcmRcIixcImtyZVwiLFwia3JmXCIsXCJrcmhcIixcImtyaVwiLFwia3JqXCIsXCJrcmtcIixcImtybFwiLFwia3JtXCIsXCJrcm5cIixcImtyb1wiLFwia3JwXCIsXCJrcnJcIixcImtyc1wiLFwia3J0XCIsXCJrcnVcIixcImtydlwiLFwia3J3XCIsXCJrcnhcIixcImtyeVwiLFwia3J6XCIsXCJrc2FcIixcImtzYlwiLFwia3NjXCIsXCJrc2RcIixcImtzZVwiLFwia3NmXCIsXCJrc2dcIixcImtzaFwiLFwia3NpXCIsXCJrc2pcIixcImtza1wiLFwia3NsXCIsXCJrc21cIixcImtzblwiLFwia3NvXCIsXCJrc3BcIixcImtzcVwiLFwia3NyXCIsXCJrc3NcIixcImtzdFwiLFwia3N1XCIsXCJrc3ZcIixcImtzd1wiLFwia3N4XCIsXCJrc3lcIixcImtzelwiLFwia3RhXCIsXCJrdGJcIixcImt0Y1wiLFwia3RkXCIsXCJrdGVcIixcImt0ZlwiLFwia3RnXCIsXCJrdGhcIixcImt0aVwiLFwia3RqXCIsXCJrdGtcIixcImt0bFwiLFwia3RtXCIsXCJrdG5cIixcImt0b1wiLFwia3RwXCIsXCJrdHFcIixcImt0clwiLFwia3RzXCIsXCJrdHRcIixcImt0dVwiLFwia3R2XCIsXCJrdHdcIixcImt0eFwiLFwia3R5XCIsXCJrdHpcIixcImt1YlwiLFwia3VjXCIsXCJrdWRcIixcImt1ZVwiLFwia3VmXCIsXCJrdWdcIixcImt1aFwiLFwia3VpXCIsXCJrdWpcIixcImt1a1wiLFwia3VsXCIsXCJrdW1cIixcImt1blwiLFwia3VvXCIsXCJrdXBcIixcImt1cVwiLFwia3VzXCIsXCJrdXRcIixcImt1dVwiLFwia3V2XCIsXCJrdXdcIixcImt1eFwiLFwia3V5XCIsXCJrdXpcIixcImt2YVwiLFwia3ZiXCIsXCJrdmNcIixcImt2ZFwiLFwia3ZlXCIsXCJrdmZcIixcImt2Z1wiLFwia3ZoXCIsXCJrdmlcIixcImt2alwiLFwia3ZrXCIsXCJrdmxcIixcImt2bVwiLFwia3ZuXCIsXCJrdm9cIixcImt2cFwiLFwia3ZxXCIsXCJrdnJcIixcImt2c1wiLFwia3Z0XCIsXCJrdnVcIixcImt2dlwiLFwia3Z3XCIsXCJrdnhcIixcImt2eVwiLFwia3Z6XCIsXCJrd2FcIixcImt3YlwiLFwia3djXCIsXCJrd2RcIixcImt3ZVwiLFwia3dmXCIsXCJrd2dcIixcImt3aFwiLFwia3dpXCIsXCJrd2pcIixcImt3a1wiLFwia3dsXCIsXCJrd21cIixcImt3blwiLFwia3dvXCIsXCJrd3BcIixcImt3cVwiLFwia3dyXCIsXCJrd3NcIixcImt3dFwiLFwia3d1XCIsXCJrd3ZcIixcImt3d1wiLFwia3d4XCIsXCJrd3lcIixcImt3elwiLFwia3hhXCIsXCJreGJcIixcImt4Y1wiLFwia3hkXCIsXCJreGVcIixcImt4ZlwiLFwia3hoXCIsXCJreGlcIixcImt4alwiLFwia3hrXCIsXCJreGxcIixcImt4bVwiLFwia3huXCIsXCJreG9cIixcImt4cFwiLFwia3hxXCIsXCJreHJcIixcImt4c1wiLFwia3h0XCIsXCJreHVcIixcImt4dlwiLFwia3h3XCIsXCJreHhcIixcImt4eVwiLFwia3h6XCIsXCJreWFcIixcImt5YlwiLFwia3ljXCIsXCJreWRcIixcImt5ZVwiLFwia3lmXCIsXCJreWdcIixcImt5aFwiLFwia3lpXCIsXCJreWpcIixcImt5a1wiLFwia3lsXCIsXCJreW1cIixcImt5blwiLFwia3lvXCIsXCJreXBcIixcImt5cVwiLFwia3lyXCIsXCJreXNcIixcImt5dFwiLFwia3l1XCIsXCJreXZcIixcImt5d1wiLFwia3l4XCIsXCJreXlcIixcImt5elwiLFwia3phXCIsXCJremJcIixcImt6Y1wiLFwia3pkXCIsXCJremVcIixcImt6ZlwiLFwia3pnXCIsXCJremhcIixcImt6aVwiLFwia3pqXCIsXCJremtcIixcImt6bFwiLFwia3ptXCIsXCJrem5cIixcImt6b1wiLFwia3pwXCIsXCJrenFcIixcImt6clwiLFwia3pzXCIsXCJrenRcIixcImt6dVwiLFwia3p2XCIsXCJrendcIixcImt6eFwiLFwia3p5XCIsXCJrenpcIl1cbixbIFwibGFcIixcImxiXCIsXCJsZ1wiLFwibGlcIixcImxuXCIsXCJsb1wiLFwibHRcIixcImx1XCIsXCJsdlwiLFwibGFhXCIsXCJsYWJcIixcImxhY1wiLFwibGFkXCIsXCJsYWVcIixcImxhZlwiLFwibGFnXCIsXCJsYWhcIixcImxhaVwiLFwibGFqXCIsXCJsYWtcIixcImxhbFwiLFwibGFtXCIsXCJsYW5cIixcImxhcFwiLFwibGFxXCIsXCJsYXJcIixcImxhc1wiLFwibGF1XCIsXCJsYXdcIixcImxheFwiLFwibGF5XCIsXCJsYXpcIixcImxiYVwiLFwibGJiXCIsXCJsYmNcIixcImxiZVwiLFwibGJmXCIsXCJsYmdcIixcImxiaVwiLFwibGJqXCIsXCJsYmtcIixcImxibFwiLFwibGJtXCIsXCJsYm5cIixcImxib1wiLFwibGJxXCIsXCJsYnJcIixcImxic1wiLFwibGJ0XCIsXCJsYnVcIixcImxidlwiLFwibGJ3XCIsXCJsYnhcIixcImxieVwiLFwibGJ6XCIsXCJsY2NcIixcImxjZFwiLFwibGNlXCIsXCJsY2ZcIixcImxjaFwiLFwibGNsXCIsXCJsY21cIixcImxjcFwiLFwibGNxXCIsXCJsY3NcIixcImxkYVwiLFwibGRiXCIsXCJsZGRcIixcImxkZ1wiLFwibGRoXCIsXCJsZGlcIixcImxkalwiLFwibGRrXCIsXCJsZGxcIixcImxkbVwiLFwibGRuXCIsXCJsZG9cIixcImxkcFwiLFwibGRxXCIsXCJsZWFcIixcImxlYlwiLFwibGVjXCIsXCJsZWRcIixcImxlZVwiLFwibGVmXCIsXCJsZWdcIixcImxlaFwiLFwibGVpXCIsXCJsZWpcIixcImxla1wiLFwibGVsXCIsXCJsZW1cIixcImxlblwiLFwibGVvXCIsXCJsZXBcIixcImxlcVwiLFwibGVyXCIsXCJsZXNcIixcImxldFwiLFwibGV1XCIsXCJsZXZcIixcImxld1wiLFwibGV4XCIsXCJsZXlcIixcImxlelwiLFwibGZhXCIsXCJsZm5cIixcImxnYVwiLFwibGdiXCIsXCJsZ2dcIixcImxnaFwiLFwibGdpXCIsXCJsZ2tcIixcImxnbFwiLFwibGdtXCIsXCJsZ25cIixcImxncVwiLFwibGdyXCIsXCJsZ3RcIixcImxndVwiLFwibGd6XCIsXCJsaGFcIixcImxoaFwiLFwibGhpXCIsXCJsaGxcIixcImxobVwiLFwibGhuXCIsXCJsaHBcIixcImxoc1wiLFwibGh0XCIsXCJsaHVcIixcImxpYVwiLFwibGliXCIsXCJsaWNcIixcImxpZFwiLFwibGllXCIsXCJsaWZcIixcImxpZ1wiLFwibGloXCIsXCJsaWlcIixcImxpalwiLFwibGlrXCIsXCJsaWxcIixcImxpb1wiLFwibGlwXCIsXCJsaXFcIixcImxpclwiLFwibGlzXCIsXCJsaXVcIixcImxpdlwiLFwibGl3XCIsXCJsaXhcIixcImxpeVwiLFwibGl6XCIsXCJsamFcIixcImxqZVwiLFwibGppXCIsXCJsamxcIixcImxqcFwiLFwibGp3XCIsXCJsanhcIixcImxrYVwiLFwibGtiXCIsXCJsa2NcIixcImxrZFwiLFwibGtlXCIsXCJsa2hcIixcImxraVwiLFwibGtqXCIsXCJsa2xcIixcImxrbVwiLFwibGtuXCIsXCJsa29cIixcImxrclwiLFwibGtzXCIsXCJsa3RcIixcImxrdVwiLFwibGt5XCIsXCJsbGFcIixcImxsYlwiLFwibGxjXCIsXCJsbGRcIixcImxsZVwiLFwibGxmXCIsXCJsbGdcIixcImxsaFwiLFwibGxpXCIsXCJsbGpcIixcImxsa1wiLFwibGxsXCIsXCJsbG1cIixcImxsblwiLFwibGxvXCIsXCJsbHBcIixcImxscVwiLFwibGxzXCIsXCJsbHVcIixcImxseFwiLFwibG1hXCIsXCJsbWJcIixcImxtY1wiLFwibG1kXCIsXCJsbWVcIixcImxtZlwiLFwibG1nXCIsXCJsbWhcIixcImxtaVwiLFwibG1qXCIsXCJsbWtcIixcImxtbFwiLFwibG1tXCIsXCJsbW5cIixcImxtb1wiLFwibG1wXCIsXCJsbXFcIixcImxtclwiLFwibG11XCIsXCJsbXZcIixcImxtd1wiLFwibG14XCIsXCJsbXlcIixcImxtelwiLFwibG5hXCIsXCJsbmJcIixcImxuZFwiLFwibG5nXCIsXCJsbmhcIixcImxuaVwiLFwibG5qXCIsXCJsbmxcIixcImxubVwiLFwibG5uXCIsXCJsbm9cIixcImxuc1wiLFwibG51XCIsXCJsbndcIixcImxuelwiLFwibG9hXCIsXCJsb2JcIixcImxvY1wiLFwibG9lXCIsXCJsb2ZcIixcImxvZ1wiLFwibG9oXCIsXCJsb2lcIixcImxvalwiLFwibG9rXCIsXCJsb2xcIixcImxvbVwiLFwibG9uXCIsXCJsb29cIixcImxvcFwiLFwibG9xXCIsXCJsb3JcIixcImxvc1wiLFwibG90XCIsXCJsb3VcIixcImxvdlwiLFwibG93XCIsXCJsb3hcIixcImxveVwiLFwibG96XCIsXCJscGFcIixcImxwZVwiLFwibHBuXCIsXCJscG9cIixcImxweFwiLFwibHJhXCIsXCJscmNcIixcImxyZVwiLFwibHJnXCIsXCJscmlcIixcImxya1wiLFwibHJsXCIsXCJscm1cIixcImxyblwiLFwibHJvXCIsXCJscnJcIixcImxydFwiLFwibHJ2XCIsXCJscnpcIixcImxzYVwiLFwibHNiXCIsXCJsc2RcIixcImxzZVwiLFwibHNnXCIsXCJsc2hcIixcImxzaVwiLFwibHNsXCIsXCJsc21cIixcImxzblwiLFwibHNvXCIsXCJsc3BcIixcImxzclwiLFwibHNzXCIsXCJsc3RcIixcImxzdlwiLFwibHN5XCIsXCJsdGNcIixcImx0Z1wiLFwibHRoXCIsXCJsdGlcIixcImx0blwiLFwibHRvXCIsXCJsdHNcIixcImx0dVwiLFwibHVhXCIsXCJsdWNcIixcImx1ZFwiLFwibHVlXCIsXCJsdWZcIixcImx1aVwiLFwibHVqXCIsXCJsdWtcIixcImx1bFwiLFwibHVtXCIsXCJsdW5cIixcImx1b1wiLFwibHVwXCIsXCJsdXFcIixcImx1clwiLFwibHVzXCIsXCJsdXRcIixcImx1dVwiLFwibHV2XCIsXCJsdXdcIixcImx1eVwiLFwibHV6XCIsXCJsdmFcIixcImx2aVwiLFwibHZrXCIsXCJsdnNcIixcImx2dVwiLFwibHdhXCIsXCJsd2VcIixcImx3Z1wiLFwibHdoXCIsXCJsd2xcIixcImx3bVwiLFwibHdvXCIsXCJsd3NcIixcImx3dFwiLFwibHd1XCIsXCJsd3dcIixcImx4bVwiLFwibHlhXCIsXCJseWdcIixcImx5blwiLFwibHpoXCIsXCJsemxcIixcImx6blwiLFwibHp6XCJdXG4sWyBcIm1nXCIsXCJtaFwiLFwibWlcIixcIm1rXCIsXCJtbFwiLFwibW5cIixcIm1vXCIsXCJtclwiLFwibXNcIixcIm10XCIsXCJteVwiLFwibWFhXCIsXCJtYWJcIixcIm1hZFwiLFwibWFlXCIsXCJtYWZcIixcIm1hZ1wiLFwibWFpXCIsXCJtYWpcIixcIm1ha1wiLFwibWFtXCIsXCJtYW5cIixcIm1hcFwiLFwibWFxXCIsXCJtYXNcIixcIm1hdFwiLFwibWF1XCIsXCJtYXZcIixcIm1hd1wiLFwibWF4XCIsXCJtYXpcIixcIm1iYVwiLFwibWJiXCIsXCJtYmNcIixcIm1iZFwiLFwibWJlXCIsXCJtYmZcIixcIm1iaFwiLFwibWJpXCIsXCJtYmpcIixcIm1ia1wiLFwibWJsXCIsXCJtYm1cIixcIm1iblwiLFwibWJvXCIsXCJtYnBcIixcIm1icVwiLFwibWJyXCIsXCJtYnNcIixcIm1idFwiLFwibWJ1XCIsXCJtYnZcIixcIm1id1wiLFwibWJ4XCIsXCJtYnlcIixcIm1ielwiLFwibWNhXCIsXCJtY2JcIixcIm1jY1wiLFwibWNkXCIsXCJtY2VcIixcIm1jZlwiLFwibWNnXCIsXCJtY2hcIixcIm1jaVwiLFwibWNqXCIsXCJtY2tcIixcIm1jbFwiLFwibWNtXCIsXCJtY25cIixcIm1jb1wiLFwibWNwXCIsXCJtY3FcIixcIm1jclwiLFwibWNzXCIsXCJtY3RcIixcIm1jdVwiLFwibWN2XCIsXCJtY3dcIixcIm1jeFwiLFwibWN5XCIsXCJtY3pcIixcIm1kYVwiLFwibWRiXCIsXCJtZGNcIixcIm1kZFwiLFwibWRlXCIsXCJtZGZcIixcIm1kZ1wiLFwibWRoXCIsXCJtZGlcIixcIm1kalwiLFwibWRrXCIsXCJtZGxcIixcIm1kbVwiLFwibWRuXCIsXCJtZHBcIixcIm1kcVwiLFwibWRyXCIsXCJtZHNcIixcIm1kdFwiLFwibWR1XCIsXCJtZHZcIixcIm1kd1wiLFwibWR4XCIsXCJtZHlcIixcIm1kelwiLFwibWVhXCIsXCJtZWJcIixcIm1lY1wiLFwibWVkXCIsXCJtZWVcIixcIm1lZlwiLFwibWVnXCIsXCJtZWhcIixcIm1laVwiLFwibWVqXCIsXCJtZWtcIixcIm1lbFwiLFwibWVtXCIsXCJtZW5cIixcIm1lb1wiLFwibWVwXCIsXCJtZXFcIixcIm1lclwiLFwibWVzXCIsXCJtZXRcIixcIm1ldVwiLFwibWV2XCIsXCJtZXdcIixcIm1leVwiLFwibWV6XCIsXCJtZmFcIixcIm1mYlwiLFwibWZjXCIsXCJtZmRcIixcIm1mZVwiLFwibWZmXCIsXCJtZmdcIixcIm1maFwiLFwibWZpXCIsXCJtZmpcIixcIm1ma1wiLFwibWZsXCIsXCJtZm1cIixcIm1mblwiLFwibWZvXCIsXCJtZnBcIixcIm1mcVwiLFwibWZyXCIsXCJtZnNcIixcIm1mdFwiLFwibWZ1XCIsXCJtZnZcIixcIm1md1wiLFwibWZ4XCIsXCJtZnlcIixcIm1melwiLFwibWdhXCIsXCJtZ2JcIixcIm1nY1wiLFwibWdkXCIsXCJtZ2VcIixcIm1nZlwiLFwibWdnXCIsXCJtZ2hcIixcIm1naVwiLFwibWdqXCIsXCJtZ2tcIixcIm1nbFwiLFwibWdtXCIsXCJtZ25cIixcIm1nb1wiLFwibWdwXCIsXCJtZ3FcIixcIm1nclwiLFwibWdzXCIsXCJtZ3RcIixcIm1ndVwiLFwibWd2XCIsXCJtZ3dcIixcIm1neFwiLFwibWd5XCIsXCJtZ3pcIixcIm1oYVwiLFwibWhiXCIsXCJtaGNcIixcIm1oZFwiLFwibWhlXCIsXCJtaGZcIixcIm1oZ1wiLFwibWhoXCIsXCJtaGlcIixcIm1oalwiLFwibWhrXCIsXCJtaGxcIixcIm1obVwiLFwibWhuXCIsXCJtaG9cIixcIm1ocFwiLFwibWhxXCIsXCJtaHJcIixcIm1oc1wiLFwibWh0XCIsXCJtaHVcIixcIm1od1wiLFwibWh4XCIsXCJtaHlcIixcIm1oelwiLFwibWlhXCIsXCJtaWJcIixcIm1pY1wiLFwibWlkXCIsXCJtaWVcIixcIm1pZlwiLFwibWlnXCIsXCJtaWhcIixcIm1paVwiLFwibWlqXCIsXCJtaWtcIixcIm1pbFwiLFwibWltXCIsXCJtaW5cIixcIm1pb1wiLFwibWlwXCIsXCJtaXFcIixcIm1pclwiLFwibWlzXCIsXCJtaXRcIixcIm1pdVwiLFwibWl3XCIsXCJtaXhcIixcIm1peVwiLFwibWl6XCIsXCJtamFcIixcIm1qYlwiLFwibWpjXCIsXCJtamRcIixcIm1qZVwiLFwibWpnXCIsXCJtamhcIixcIm1qaVwiLFwibWpqXCIsXCJtamtcIixcIm1qbFwiLFwibWptXCIsXCJtam5cIixcIm1qb1wiLFwibWpwXCIsXCJtanFcIixcIm1qclwiLFwibWpzXCIsXCJtanRcIixcIm1qdVwiLFwibWp2XCIsXCJtandcIixcIm1qeFwiLFwibWp5XCIsXCJtanpcIixcIm1rYVwiLFwibWtiXCIsXCJta2NcIixcIm1rZVwiLFwibWtmXCIsXCJta2dcIixcIm1raFwiLFwibWtpXCIsXCJta2pcIixcIm1ra1wiLFwibWtsXCIsXCJta21cIixcIm1rblwiLFwibWtvXCIsXCJta3BcIixcIm1rcVwiLFwibWtyXCIsXCJta3NcIixcIm1rdFwiLFwibWt1XCIsXCJta3ZcIixcIm1rd1wiLFwibWt4XCIsXCJta3lcIixcIm1relwiLFwibWxhXCIsXCJtbGJcIixcIm1sY1wiLFwibWxkXCIsXCJtbGVcIixcIm1sZlwiLFwibWxoXCIsXCJtbGlcIixcIm1salwiLFwibWxrXCIsXCJtbGxcIixcIm1sbVwiLFwibWxuXCIsXCJtbG9cIixcIm1scFwiLFwibWxxXCIsXCJtbHJcIixcIm1sc1wiLFwibWx1XCIsXCJtbHZcIixcIm1sd1wiLFwibWx4XCIsXCJtbHpcIixcIm1tYVwiLFwibW1iXCIsXCJtbWNcIixcIm1tZFwiLFwibW1lXCIsXCJtbWZcIixcIm1tZ1wiLFwibW1oXCIsXCJtbWlcIixcIm1talwiLFwibW1rXCIsXCJtbWxcIixcIm1tbVwiLFwibW1uXCIsXCJtbW9cIixcIm1tcFwiLFwibW1xXCIsXCJtbXJcIixcIm1tdFwiLFwibW11XCIsXCJtbXZcIixcIm1td1wiLFwibW14XCIsXCJtbXlcIixcIm1telwiLFwibW5hXCIsXCJtbmJcIixcIm1uY1wiLFwibW5kXCIsXCJtbmVcIixcIm1uZlwiLFwibW5nXCIsXCJtbmhcIixcIm1uaVwiLFwibW5qXCIsXCJtbmtcIixcIm1ubFwiLFwibW5tXCIsXCJtbm5cIixcIm1ub1wiLFwibW5wXCIsXCJtbnFcIixcIm1uclwiLFwibW5zXCIsXCJtbnRcIixcIm1udVwiLFwibW52XCIsXCJtbndcIixcIm1ueFwiLFwibW55XCIsXCJtbnpcIixcIm1vYVwiLFwibW9jXCIsXCJtb2RcIixcIm1vZVwiLFwibW9mXCIsXCJtb2dcIixcIm1vaFwiLFwibW9pXCIsXCJtb2pcIixcIm1va1wiLFwibW9tXCIsXCJtb29cIixcIm1vcFwiLFwibW9xXCIsXCJtb3JcIixcIm1vc1wiLFwibW90XCIsXCJtb3VcIixcIm1vdlwiLFwibW93XCIsXCJtb3hcIixcIm1veVwiLFwibW96XCIsXCJtcGFcIixcIm1wYlwiLFwibXBjXCIsXCJtcGRcIixcIm1wZVwiLFwibXBnXCIsXCJtcGhcIixcIm1waVwiLFwibXBqXCIsXCJtcGtcIixcIm1wbFwiLFwibXBtXCIsXCJtcG5cIixcIm1wb1wiLFwibXBwXCIsXCJtcHFcIixcIm1wclwiLFwibXBzXCIsXCJtcHRcIixcIm1wdVwiLFwibXB2XCIsXCJtcHdcIixcIm1weFwiLFwibXB5XCIsXCJtcHpcIixcIm1xYVwiLFwibXFiXCIsXCJtcWNcIixcIm1xZVwiLFwibXFmXCIsXCJtcWdcIixcIm1xaFwiLFwibXFpXCIsXCJtcWpcIixcIm1xa1wiLFwibXFsXCIsXCJtcW1cIixcIm1xblwiLFwibXFvXCIsXCJtcXBcIixcIm1xcVwiLFwibXFyXCIsXCJtcXNcIixcIm1xdFwiLFwibXF1XCIsXCJtcXZcIixcIm1xd1wiLFwibXF4XCIsXCJtcXlcIixcIm1xelwiLFwibXJhXCIsXCJtcmJcIixcIm1yY1wiLFwibXJkXCIsXCJtcmVcIixcIm1yZlwiLFwibXJnXCIsXCJtcmhcIixcIm1yalwiLFwibXJrXCIsXCJtcmxcIixcIm1ybVwiLFwibXJuXCIsXCJtcm9cIixcIm1ycFwiLFwibXJxXCIsXCJtcnJcIixcIm1yc1wiLFwibXJ0XCIsXCJtcnVcIixcIm1ydlwiLFwibXJ3XCIsXCJtcnhcIixcIm1yeVwiLFwibXJ6XCIsXCJtc2JcIixcIm1zY1wiLFwibXNkXCIsXCJtc2VcIixcIm1zZlwiLFwibXNnXCIsXCJtc2hcIixcIm1zaVwiLFwibXNqXCIsXCJtc2tcIixcIm1zbFwiLFwibXNtXCIsXCJtc25cIixcIm1zb1wiLFwibXNwXCIsXCJtc3FcIixcIm1zclwiLFwibXNzXCIsXCJtc3RcIixcIm1zdVwiLFwibXN2XCIsXCJtc3dcIixcIm1zeFwiLFwibXN5XCIsXCJtc3pcIixcIm10YVwiLFwibXRiXCIsXCJtdGNcIixcIm10ZFwiLFwibXRlXCIsXCJtdGZcIixcIm10Z1wiLFwibXRoXCIsXCJtdGlcIixcIm10alwiLFwibXRrXCIsXCJtdGxcIixcIm10bVwiLFwibXRuXCIsXCJtdG9cIixcIm10cFwiLFwibXRxXCIsXCJtdHJcIixcIm10c1wiLFwibXR0XCIsXCJtdHVcIixcIm10dlwiLFwibXR3XCIsXCJtdHhcIixcIm10eVwiLFwibXVhXCIsXCJtdWJcIixcIm11Y1wiLFwibXVkXCIsXCJtdWVcIixcIm11Z1wiLFwibXVoXCIsXCJtdWlcIixcIm11alwiLFwibXVrXCIsXCJtdWxcIixcIm11bVwiLFwibXVuXCIsXCJtdW9cIixcIm11cFwiLFwibXVxXCIsXCJtdXJcIixcIm11c1wiLFwibXV0XCIsXCJtdXVcIixcIm11dlwiLFwibXV4XCIsXCJtdXlcIixcIm11elwiLFwibXZhXCIsXCJtdmJcIixcIm12ZFwiLFwibXZlXCIsXCJtdmZcIixcIm12Z1wiLFwibXZoXCIsXCJtdmlcIixcIm12a1wiLFwibXZsXCIsXCJtdm1cIixcIm12blwiLFwibXZvXCIsXCJtdnBcIixcIm12cVwiLFwibXZyXCIsXCJtdnNcIixcIm12dFwiLFwibXZ1XCIsXCJtdnZcIixcIm12d1wiLFwibXZ4XCIsXCJtdnlcIixcIm12elwiLFwibXdhXCIsXCJtd2JcIixcIm13Y1wiLFwibXdkXCIsXCJtd2VcIixcIm13ZlwiLFwibXdnXCIsXCJtd2hcIixcIm13aVwiLFwibXdqXCIsXCJtd2tcIixcIm13bFwiLFwibXdtXCIsXCJtd25cIixcIm13b1wiLFwibXdwXCIsXCJtd3FcIixcIm13clwiLFwibXdzXCIsXCJtd3RcIixcIm13dVwiLFwibXd2XCIsXCJtd3dcIixcIm13eFwiLFwibXd5XCIsXCJtd3pcIixcIm14YVwiLFwibXhiXCIsXCJteGNcIixcIm14ZFwiLFwibXhlXCIsXCJteGZcIixcIm14Z1wiLFwibXhoXCIsXCJteGlcIixcIm14alwiLFwibXhrXCIsXCJteGxcIixcIm14bVwiLFwibXhuXCIsXCJteG9cIixcIm14cFwiLFwibXhxXCIsXCJteHJcIixcIm14c1wiLFwibXh0XCIsXCJteHVcIixcIm14dlwiLFwibXh3XCIsXCJteHhcIixcIm14eVwiLFwibXh6XCIsXCJteWJcIixcIm15Y1wiLFwibXlkXCIsXCJteWVcIixcIm15ZlwiLFwibXlnXCIsXCJteWhcIixcIm15aVwiLFwibXlqXCIsXCJteWtcIixcIm15bFwiLFwibXltXCIsXCJteW5cIixcIm15b1wiLFwibXlwXCIsXCJteXFcIixcIm15clwiLFwibXlzXCIsXCJteXRcIixcIm15dVwiLFwibXl2XCIsXCJteXdcIixcIm15eFwiLFwibXl5XCIsXCJteXpcIixcIm16YVwiLFwibXpiXCIsXCJtemNcIixcIm16ZFwiLFwibXplXCIsXCJtemdcIixcIm16aFwiLFwibXppXCIsXCJtempcIixcIm16a1wiLFwibXpsXCIsXCJtem1cIixcIm16blwiLFwibXpvXCIsXCJtenBcIixcIm16cVwiLFwibXpyXCIsXCJtenNcIixcIm16dFwiLFwibXp1XCIsXCJtenZcIixcIm16d1wiLFwibXp4XCIsXCJtenlcIixcIm16elwiXVxuLFsgXCJuYVwiLFwibmJcIixcIm5kXCIsXCJuZVwiLFwibmdcIixcIm5sXCIsXCJublwiLFwibm9cIixcIm5yXCIsXCJudlwiLFwibnlcIixcIm5hYVwiLFwibmFiXCIsXCJuYWNcIixcIm5hZFwiLFwibmFlXCIsXCJuYWZcIixcIm5hZ1wiLFwibmFoXCIsXCJuYWlcIixcIm5halwiLFwibmFrXCIsXCJuYWxcIixcIm5hbVwiLFwibmFuXCIsXCJuYW9cIixcIm5hcFwiLFwibmFxXCIsXCJuYXJcIixcIm5hc1wiLFwibmF0XCIsXCJuYXdcIixcIm5heFwiLFwibmF5XCIsXCJuYXpcIixcIm5iYVwiLFwibmJiXCIsXCJuYmNcIixcIm5iZFwiLFwibmJlXCIsXCJuYmZcIixcIm5iZ1wiLFwibmJoXCIsXCJuYmlcIixcIm5ialwiLFwibmJrXCIsXCJuYm1cIixcIm5iblwiLFwibmJvXCIsXCJuYnBcIixcIm5icVwiLFwibmJyXCIsXCJuYnNcIixcIm5idFwiLFwibmJ1XCIsXCJuYnZcIixcIm5id1wiLFwibmJ4XCIsXCJuYnlcIixcIm5jYVwiLFwibmNiXCIsXCJuY2NcIixcIm5jZFwiLFwibmNlXCIsXCJuY2ZcIixcIm5jZ1wiLFwibmNoXCIsXCJuY2lcIixcIm5jalwiLFwibmNrXCIsXCJuY2xcIixcIm5jbVwiLFwibmNuXCIsXCJuY29cIixcIm5jcFwiLFwibmNxXCIsXCJuY3JcIixcIm5jc1wiLFwibmN0XCIsXCJuY3VcIixcIm5jeFwiLFwibmN6XCIsXCJuZGFcIixcIm5kYlwiLFwibmRjXCIsXCJuZGRcIixcIm5kZlwiLFwibmRnXCIsXCJuZGhcIixcIm5kaVwiLFwibmRqXCIsXCJuZGtcIixcIm5kbFwiLFwibmRtXCIsXCJuZG5cIixcIm5kcFwiLFwibmRxXCIsXCJuZHJcIixcIm5kc1wiLFwibmR0XCIsXCJuZHVcIixcIm5kdlwiLFwibmR3XCIsXCJuZHhcIixcIm5keVwiLFwibmR6XCIsXCJuZWFcIixcIm5lYlwiLFwibmVjXCIsXCJuZWRcIixcIm5lZVwiLFwibmVmXCIsXCJuZWdcIixcIm5laFwiLFwibmVpXCIsXCJuZWpcIixcIm5la1wiLFwibmVtXCIsXCJuZW5cIixcIm5lb1wiLFwibmVxXCIsXCJuZXJcIixcIm5lc1wiLFwibmV0XCIsXCJuZXVcIixcIm5ldlwiLFwibmV3XCIsXCJuZXhcIixcIm5leVwiLFwibmV6XCIsXCJuZmFcIixcIm5mZFwiLFwibmZsXCIsXCJuZnJcIixcIm5mdVwiLFwibmdhXCIsXCJuZ2JcIixcIm5nY1wiLFwibmdkXCIsXCJuZ2VcIixcIm5nZlwiLFwibmdnXCIsXCJuZ2hcIixcIm5naVwiLFwibmdqXCIsXCJuZ2tcIixcIm5nbFwiLFwibmdtXCIsXCJuZ25cIixcIm5nb1wiLFwibmdwXCIsXCJuZ3FcIixcIm5nclwiLFwibmdzXCIsXCJuZ3RcIixcIm5ndVwiLFwibmd2XCIsXCJuZ3dcIixcIm5neFwiLFwibmd5XCIsXCJuZ3pcIixcIm5oYVwiLFwibmhiXCIsXCJuaGNcIixcIm5oZFwiLFwibmhlXCIsXCJuaGZcIixcIm5oZ1wiLFwibmhoXCIsXCJuaGlcIixcIm5oa1wiLFwibmhtXCIsXCJuaG5cIixcIm5ob1wiLFwibmhwXCIsXCJuaHFcIixcIm5oclwiLFwibmh0XCIsXCJuaHVcIixcIm5odlwiLFwibmh3XCIsXCJuaHhcIixcIm5oeVwiLFwibmh6XCIsXCJuaWFcIixcIm5pYlwiLFwibmljXCIsXCJuaWRcIixcIm5pZVwiLFwibmlmXCIsXCJuaWdcIixcIm5paFwiLFwibmlpXCIsXCJuaWpcIixcIm5pa1wiLFwibmlsXCIsXCJuaW1cIixcIm5pblwiLFwibmlvXCIsXCJuaXFcIixcIm5pclwiLFwibmlzXCIsXCJuaXRcIixcIm5pdVwiLFwibml2XCIsXCJuaXdcIixcIm5peFwiLFwibml5XCIsXCJuaXpcIixcIm5qYVwiLFwibmpiXCIsXCJuamRcIixcIm5qaFwiLFwibmppXCIsXCJuampcIixcIm5qbFwiLFwibmptXCIsXCJuam5cIixcIm5qb1wiLFwibmpyXCIsXCJuanNcIixcIm5qdFwiLFwibmp1XCIsXCJuanhcIixcIm5qeVwiLFwibmp6XCIsXCJua2FcIixcIm5rYlwiLFwibmtjXCIsXCJua2RcIixcIm5rZVwiLFwibmtmXCIsXCJua2dcIixcIm5raFwiLFwibmtpXCIsXCJua2pcIixcIm5ra1wiLFwibmttXCIsXCJua25cIixcIm5rb1wiLFwibmtwXCIsXCJua3FcIixcIm5rclwiLFwibmtzXCIsXCJua3RcIixcIm5rdVwiLFwibmt2XCIsXCJua3dcIixcIm5reFwiLFwibmt6XCIsXCJubGFcIixcIm5sY1wiLFwibmxlXCIsXCJubGdcIixcIm5saVwiLFwibmxqXCIsXCJubGtcIixcIm5sbFwiLFwibmxtXCIsXCJubG5cIixcIm5sb1wiLFwibmxxXCIsXCJubHJcIixcIm5sdVwiLFwibmx2XCIsXCJubHdcIixcIm5seFwiLFwibmx5XCIsXCJubHpcIixcIm5tYVwiLFwibm1iXCIsXCJubWNcIixcIm5tZFwiLFwibm1lXCIsXCJubWZcIixcIm5tZ1wiLFwibm1oXCIsXCJubWlcIixcIm5talwiLFwibm1rXCIsXCJubWxcIixcIm5tbVwiLFwibm1uXCIsXCJubW9cIixcIm5tcFwiLFwibm1xXCIsXCJubXJcIixcIm5tc1wiLFwibm10XCIsXCJubXVcIixcIm5tdlwiLFwibm13XCIsXCJubXhcIixcIm5teVwiLFwibm16XCIsXCJubmFcIixcIm5uYlwiLFwibm5jXCIsXCJubmRcIixcIm5uZVwiLFwibm5mXCIsXCJubmdcIixcIm5uaFwiLFwibm5pXCIsXCJubmpcIixcIm5ua1wiLFwibm5sXCIsXCJubm1cIixcIm5ublwiLFwibm5wXCIsXCJubnFcIixcIm5uclwiLFwibm5zXCIsXCJubnRcIixcIm5udVwiLFwibm52XCIsXCJubndcIixcIm5ueFwiLFwibm55XCIsXCJubnpcIixcIm5vYVwiLFwibm9jXCIsXCJub2RcIixcIm5vZVwiLFwibm9mXCIsXCJub2dcIixcIm5vaFwiLFwibm9pXCIsXCJub2pcIixcIm5va1wiLFwibm9sXCIsXCJub21cIixcIm5vblwiLFwibm9vXCIsXCJub3BcIixcIm5vcVwiLFwibm9zXCIsXCJub3RcIixcIm5vdVwiLFwibm92XCIsXCJub3dcIixcIm5veVwiLFwibm96XCIsXCJucGFcIixcIm5wYlwiLFwibnBnXCIsXCJucGhcIixcIm5waVwiLFwibnBsXCIsXCJucG5cIixcIm5wb1wiLFwibnBzXCIsXCJucHVcIixcIm5weFwiLFwibnB5XCIsXCJucWdcIixcIm5xa1wiLFwibnFsXCIsXCJucW1cIixcIm5xblwiLFwibnFvXCIsXCJucXFcIixcIm5xdFwiLFwibnF5XCIsXCJucmFcIixcIm5yYlwiLFwibnJjXCIsXCJucmVcIixcIm5yZlwiLFwibnJnXCIsXCJucmlcIixcIm5ya1wiLFwibnJsXCIsXCJucm1cIixcIm5yblwiLFwibnJwXCIsXCJucnJcIixcIm5ydFwiLFwibnJ1XCIsXCJucnhcIixcIm5yelwiLFwibnNhXCIsXCJuc2JcIixcIm5zY1wiLFwibnNkXCIsXCJuc2VcIixcIm5zZlwiLFwibnNnXCIsXCJuc2hcIixcIm5zaVwiLFwibnNrXCIsXCJuc2xcIixcIm5zbVwiLFwibnNuXCIsXCJuc29cIixcIm5zcFwiLFwibnNxXCIsXCJuc3JcIixcIm5zc1wiLFwibnN0XCIsXCJuc3VcIixcIm5zdlwiLFwibnN3XCIsXCJuc3hcIixcIm5zeVwiLFwibnN6XCIsXCJudGRcIixcIm50ZVwiLFwibnRnXCIsXCJudGlcIixcIm50alwiLFwibnRrXCIsXCJudG1cIixcIm50b1wiLFwibnRwXCIsXCJudHJcIixcIm50c1wiLFwibnR1XCIsXCJudHdcIixcIm50eFwiLFwibnR5XCIsXCJudHpcIixcIm51YVwiLFwibnViXCIsXCJudWNcIixcIm51ZFwiLFwibnVlXCIsXCJudWZcIixcIm51Z1wiLFwibnVoXCIsXCJudWlcIixcIm51alwiLFwibnVrXCIsXCJudWxcIixcIm51bVwiLFwibnVuXCIsXCJudW9cIixcIm51cFwiLFwibnVxXCIsXCJudXJcIixcIm51c1wiLFwibnV0XCIsXCJudXVcIixcIm51dlwiLFwibnV3XCIsXCJudXhcIixcIm51eVwiLFwibnV6XCIsXCJudmhcIixcIm52bVwiLFwibnZvXCIsXCJud2FcIixcIm53YlwiLFwibndjXCIsXCJud2VcIixcIm53Z1wiLFwibndpXCIsXCJud21cIixcIm53b1wiLFwibndyXCIsXCJud3hcIixcIm53eVwiLFwibnhhXCIsXCJueGRcIixcIm54ZVwiLFwibnhnXCIsXCJueGlcIixcIm54a1wiLFwibnhsXCIsXCJueG1cIixcIm54blwiLFwibnhvXCIsXCJueHFcIixcIm54clwiLFwibnh1XCIsXCJueHhcIixcIm55YlwiLFwibnljXCIsXCJueWRcIixcIm55ZVwiLFwibnlmXCIsXCJueWdcIixcIm55aFwiLFwibnlpXCIsXCJueWpcIixcIm55a1wiLFwibnlsXCIsXCJueW1cIixcIm55blwiLFwibnlvXCIsXCJueXBcIixcIm55cVwiLFwibnlyXCIsXCJueXNcIixcIm55dFwiLFwibnl1XCIsXCJueXZcIixcIm55d1wiLFwibnl4XCIsXCJueXlcIixcIm56YVwiLFwibnpiXCIsXCJuemRcIixcIm56aVwiLFwibnprXCIsXCJuem1cIixcIm56c1wiLFwibnp1XCIsXCJuenlcIixcIm56elwiXVxuLFsgXCJvY1wiLFwib2pcIixcIm9tXCIsXCJvclwiLFwib3NcIixcIm9hYVwiLFwib2FjXCIsXCJvYXJcIixcIm9hdlwiLFwib2JpXCIsXCJvYmtcIixcIm9ibFwiLFwib2JtXCIsXCJvYm9cIixcIm9iclwiLFwib2J0XCIsXCJvYnVcIixcIm9jYVwiLFwib2NoXCIsXCJvY21cIixcIm9jb1wiLFwib2N1XCIsXCJvZGFcIixcIm9ka1wiLFwib2R0XCIsXCJvZHVcIixcIm9mb1wiLFwib2ZzXCIsXCJvZnVcIixcIm9nYlwiLFwib2djXCIsXCJvZ2VcIixcIm9nZ1wiLFwib2dvXCIsXCJvZ3VcIixcIm9odFwiLFwib2h1XCIsXCJvaWFcIixcIm9pblwiLFwib2piXCIsXCJvamNcIixcIm9qZ1wiLFwib2pwXCIsXCJvanNcIixcIm9qdlwiLFwib2p3XCIsXCJva2FcIixcIm9rYlwiLFwib2tjXCIsXCJva2RcIixcIm9rZVwiLFwib2tnXCIsXCJva2hcIixcIm9raVwiLFwib2tqXCIsXCJva2tcIixcIm9rbFwiLFwib2ttXCIsXCJva25cIixcIm9rb1wiLFwib2tyXCIsXCJva3NcIixcIm9rdVwiLFwib2t2XCIsXCJva3hcIixcIm9relwiLFwib2xhXCIsXCJvbGRcIixcIm9sZVwiLFwib2xrXCIsXCJvbG1cIixcIm9sb1wiLFwib2xyXCIsXCJvbHRcIixcIm9sdVwiLFwib21hXCIsXCJvbWJcIixcIm9tY1wiLFwib21lXCIsXCJvbWdcIixcIm9taVwiLFwib21rXCIsXCJvbWxcIixcIm9tblwiLFwib21vXCIsXCJvbXBcIixcIm9tcVwiLFwib21yXCIsXCJvbXRcIixcIm9tdVwiLFwib212XCIsXCJvbXdcIixcIm9teFwiLFwib215XCIsXCJvbmFcIixcIm9uYlwiLFwib25lXCIsXCJvbmdcIixcIm9uaVwiLFwib25qXCIsXCJvbmtcIixcIm9ublwiLFwib25vXCIsXCJvbnBcIixcIm9uclwiLFwib25zXCIsXCJvbnRcIixcIm9udVwiLFwib253XCIsXCJvbnhcIixcIm9vZFwiLFwib29nXCIsXCJvb25cIixcIm9vclwiLFwib29zXCIsXCJvcGFcIixcIm9wa1wiLFwib3BtXCIsXCJvcG9cIixcIm9wdFwiLFwib3B5XCIsXCJvcmFcIixcIm9yY1wiLFwib3JlXCIsXCJvcmdcIixcIm9yaFwiLFwib3JuXCIsXCJvcm9cIixcIm9yclwiLFwib3JzXCIsXCJvcnRcIixcIm9ydVwiLFwib3J2XCIsXCJvcndcIixcIm9yeFwiLFwib3J5XCIsXCJvcnpcIixcIm9zYVwiLFwib3NjXCIsXCJvc2lcIixcIm9zblwiLFwib3NvXCIsXCJvc3BcIixcIm9zdFwiLFwib3N1XCIsXCJvc3hcIixcIm90YVwiLFwib3RiXCIsXCJvdGRcIixcIm90ZVwiLFwib3RpXCIsXCJvdGtcIixcIm90bFwiLFwib3RtXCIsXCJvdG5cIixcIm90b1wiLFwib3RxXCIsXCJvdHJcIixcIm90c1wiLFwib3R0XCIsXCJvdHVcIixcIm90d1wiLFwib3R4XCIsXCJvdHlcIixcIm90elwiLFwib3VhXCIsXCJvdWJcIixcIm91ZVwiLFwib3VpXCIsXCJvdW1cIixcIm91blwiLFwib3ZkXCIsXCJvd2lcIixcIm93bFwiLFwib3liXCIsXCJveWRcIixcIm95bVwiLFwib3l5XCIsXCJvem1cIl1cbixbIFwicGFcIixcInBpXCIsXCJwbFwiLFwicHNcIixcInB0XCIsXCJwYWFcIixcInBhYlwiLFwicGFjXCIsXCJwYWRcIixcInBhZVwiLFwicGFmXCIsXCJwYWdcIixcInBhaFwiLFwicGFpXCIsXCJwYWtcIixcInBhbFwiLFwicGFtXCIsXCJwYW9cIixcInBhcFwiLFwicGFxXCIsXCJwYXJcIixcInBhc1wiLFwicGF0XCIsXCJwYXVcIixcInBhdlwiLFwicGF3XCIsXCJwYXhcIixcInBheVwiLFwicGF6XCIsXCJwYmJcIixcInBiY1wiLFwicGJlXCIsXCJwYmZcIixcInBiZ1wiLFwicGJoXCIsXCJwYmlcIixcInBibFwiLFwicGJtXCIsXCJwYm5cIixcInBib1wiLFwicGJwXCIsXCJwYnJcIixcInBic1wiLFwicGJ0XCIsXCJwYnVcIixcInBidlwiLFwicGJ5XCIsXCJwYnpcIixcInBjYVwiLFwicGNiXCIsXCJwY2NcIixcInBjZFwiLFwicGNlXCIsXCJwY2ZcIixcInBjZ1wiLFwicGNoXCIsXCJwY2lcIixcInBjalwiLFwicGNrXCIsXCJwY2xcIixcInBjbVwiLFwicGNuXCIsXCJwY3BcIixcInBjclwiLFwicGN3XCIsXCJwZGFcIixcInBkY1wiLFwicGRpXCIsXCJwZG5cIixcInBkb1wiLFwicGR0XCIsXCJwZHVcIixcInBlYVwiLFwicGViXCIsXCJwZWRcIixcInBlZVwiLFwicGVmXCIsXCJwZWdcIixcInBlaFwiLFwicGVpXCIsXCJwZWpcIixcInBla1wiLFwicGVsXCIsXCJwZW1cIixcInBlb1wiLFwicGVwXCIsXCJwZXFcIixcInBlc1wiLFwicGV2XCIsXCJwZXhcIixcInBleVwiLFwicGV6XCIsXCJwZmFcIixcInBmZVwiLFwicGZsXCIsXCJwZ2FcIixcInBnZFwiLFwicGdnXCIsXCJwZ2lcIixcInBna1wiLFwicGdsXCIsXCJwZ25cIixcInBnc1wiLFwicGd1XCIsXCJwZ3lcIixcInBnelwiLFwicGhhXCIsXCJwaGRcIixcInBoZ1wiLFwicGhoXCIsXCJwaGlcIixcInBoa1wiLFwicGhsXCIsXCJwaG1cIixcInBoblwiLFwicGhvXCIsXCJwaHFcIixcInBoclwiLFwicGh0XCIsXCJwaHVcIixcInBodlwiLFwicGh3XCIsXCJwaWFcIixcInBpYlwiLFwicGljXCIsXCJwaWRcIixcInBpZVwiLFwicGlmXCIsXCJwaWdcIixcInBpaFwiLFwicGlpXCIsXCJwaWpcIixcInBpbFwiLFwicGltXCIsXCJwaW5cIixcInBpb1wiLFwicGlwXCIsXCJwaXJcIixcInBpc1wiLFwicGl0XCIsXCJwaXVcIixcInBpdlwiLFwicGl3XCIsXCJwaXhcIixcInBpeVwiLFwicGl6XCIsXCJwanRcIixcInBrYVwiLFwicGtiXCIsXCJwa2NcIixcInBrZ1wiLFwicGtoXCIsXCJwa25cIixcInBrb1wiLFwicGtwXCIsXCJwa3JcIixcInBrc1wiLFwicGt0XCIsXCJwa3VcIixcInBsYVwiLFwicGxiXCIsXCJwbGNcIixcInBsZFwiLFwicGxlXCIsXCJwbGZcIixcInBsZ1wiLFwicGxoXCIsXCJwbGpcIixcInBsa1wiLFwicGxsXCIsXCJwbG5cIixcInBsb1wiLFwicGxwXCIsXCJwbHFcIixcInBsclwiLFwicGxzXCIsXCJwbHRcIixcInBsdVwiLFwicGx2XCIsXCJwbHdcIixcInBseVwiLFwicGx6XCIsXCJwbWFcIixcInBtYlwiLFwicG1jXCIsXCJwbWRcIixcInBtZVwiLFwicG1mXCIsXCJwbWhcIixcInBtaVwiLFwicG1qXCIsXCJwbWtcIixcInBtbFwiLFwicG1tXCIsXCJwbW5cIixcInBtb1wiLFwicG1xXCIsXCJwbXJcIixcInBtc1wiLFwicG10XCIsXCJwbXVcIixcInBtd1wiLFwicG14XCIsXCJwbXlcIixcInBtelwiLFwicG5hXCIsXCJwbmJcIixcInBuY1wiLFwicG5kXCIsXCJwbmVcIixcInBuZ1wiLFwicG5oXCIsXCJwbmlcIixcInBualwiLFwicG5rXCIsXCJwbmxcIixcInBubVwiLFwicG5uXCIsXCJwbm9cIixcInBucFwiLFwicG5xXCIsXCJwbnJcIixcInBuc1wiLFwicG50XCIsXCJwbnVcIixcInBudlwiLFwicG53XCIsXCJwbnhcIixcInBueVwiLFwicG56XCIsXCJwb2NcIixcInBvZFwiLFwicG9lXCIsXCJwb2ZcIixcInBvZ1wiLFwicG9oXCIsXCJwb2lcIixcInBva1wiLFwicG9tXCIsXCJwb25cIixcInBvb1wiLFwicG9wXCIsXCJwb3FcIixcInBvc1wiLFwicG90XCIsXCJwb3ZcIixcInBvd1wiLFwicG94XCIsXCJwb3lcIixcInBvelwiLFwicHBhXCIsXCJwcGVcIixcInBwaVwiLFwicHBrXCIsXCJwcGxcIixcInBwbVwiLFwicHBuXCIsXCJwcG9cIixcInBwcFwiLFwicHBxXCIsXCJwcHJcIixcInBwc1wiLFwicHB0XCIsXCJwcHVcIixcInBxYVwiLFwicHFlXCIsXCJwcW1cIixcInBxd1wiLFwicHJhXCIsXCJwcmJcIixcInByY1wiLFwicHJkXCIsXCJwcmVcIixcInByZlwiLFwicHJnXCIsXCJwcmhcIixcInByaVwiLFwicHJrXCIsXCJwcmxcIixcInBybVwiLFwicHJuXCIsXCJwcm9cIixcInBycFwiLFwicHJxXCIsXCJwcnJcIixcInByc1wiLFwicHJ0XCIsXCJwcnVcIixcInByd1wiLFwicHJ4XCIsXCJwcnlcIixcInByelwiLFwicHNhXCIsXCJwc2NcIixcInBzZFwiLFwicHNlXCIsXCJwc2dcIixcInBzaFwiLFwicHNpXCIsXCJwc2xcIixcInBzbVwiLFwicHNuXCIsXCJwc29cIixcInBzcFwiLFwicHNxXCIsXCJwc3JcIixcInBzc1wiLFwicHN0XCIsXCJwc3VcIixcInBzd1wiLFwicHN5XCIsXCJwdGFcIixcInB0aFwiLFwicHRpXCIsXCJwdG5cIixcInB0b1wiLFwicHRwXCIsXCJwdHFcIixcInB0clwiLFwicHR0XCIsXCJwdHVcIixcInB0dlwiLFwicHR3XCIsXCJwdHlcIixcInB1YVwiLFwicHViXCIsXCJwdWNcIixcInB1ZFwiLFwicHVlXCIsXCJwdWZcIixcInB1Z1wiLFwicHVpXCIsXCJwdWpcIixcInB1a1wiLFwicHVtXCIsXCJwdW9cIixcInB1cFwiLFwicHVxXCIsXCJwdXJcIixcInB1dFwiLFwicHV1XCIsXCJwdXdcIixcInB1eFwiLFwicHV5XCIsXCJwdXpcIixcInB3YVwiLFwicHdiXCIsXCJwd2dcIixcInB3aVwiLFwicHdtXCIsXCJwd25cIixcInB3b1wiLFwicHdyXCIsXCJwd3dcIixcInB4bVwiLFwicHllXCIsXCJweW1cIixcInB5blwiLFwicHlzXCIsXCJweXVcIixcInB5eFwiLFwicHl5XCIsXCJwem5cIl1cbixbIFwicXVcIixcInF1YVwiLFwicXViXCIsXCJxdWNcIixcInF1ZFwiLFwicXVmXCIsXCJxdWdcIixcInF1aFwiLFwicXVpXCIsXCJxdWtcIixcInF1bFwiLFwicXVtXCIsXCJxdW5cIixcInF1cFwiLFwicXVxXCIsXCJxdXJcIixcInF1c1wiLFwicXV2XCIsXCJxdXdcIixcInF1eFwiLFwicXV5XCIsXCJxdXpcIixcInF2YVwiLFwicXZjXCIsXCJxdmVcIixcInF2aFwiLFwicXZpXCIsXCJxdmpcIixcInF2bFwiLFwicXZtXCIsXCJxdm5cIixcInF2b1wiLFwicXZwXCIsXCJxdnNcIixcInF2d1wiLFwicXZ5XCIsXCJxdnpcIixcInF3YVwiLFwicXdjXCIsXCJxd2VcIixcInF3aFwiLFwicXdtXCIsXCJxd3NcIixcInF3dFwiLFwicXhhXCIsXCJxeGNcIixcInF4aFwiLFwicXhsXCIsXCJxeG5cIixcInF4b1wiLFwicXhwXCIsXCJxeHFcIixcInF4clwiLFwicXhzXCIsXCJxeHRcIixcInF4dVwiLFwicXh3XCIsXCJxeWFcIixcInF5cFwiXVxuLFsgXCJybVwiLFwicm5cIixcInJvXCIsXCJydVwiLFwicndcIixcInJhYVwiLFwicmFiXCIsXCJyYWNcIixcInJhZFwiLFwicmFmXCIsXCJyYWdcIixcInJhaFwiLFwicmFpXCIsXCJyYWpcIixcInJha1wiLFwicmFsXCIsXCJyYW1cIixcInJhblwiLFwicmFvXCIsXCJyYXBcIixcInJhcVwiLFwicmFyXCIsXCJyYXNcIixcInJhdFwiLFwicmF1XCIsXCJyYXZcIixcInJhd1wiLFwicmF4XCIsXCJyYXlcIixcInJhelwiLFwicmJiXCIsXCJyYmtcIixcInJibFwiLFwicmJwXCIsXCJyY2ZcIixcInJkYlwiLFwicmVhXCIsXCJyZWJcIixcInJlZVwiLFwicmVnXCIsXCJyZWlcIixcInJlalwiLFwicmVsXCIsXCJyZW1cIixcInJlblwiLFwicmVyXCIsXCJyZXNcIixcInJldFwiLFwicmV5XCIsXCJyZ2FcIixcInJnZVwiLFwicmdrXCIsXCJyZ25cIixcInJnclwiLFwicmdzXCIsXCJyZ3VcIixcInJoZ1wiLFwicmhwXCIsXCJyaWFcIixcInJpZVwiLFwicmlmXCIsXCJyaWxcIixcInJpbVwiLFwicmluXCIsXCJyaXJcIixcInJpdFwiLFwicml1XCIsXCJyamdcIixcInJqaVwiLFwicmpzXCIsXCJya2FcIixcInJrYlwiLFwicmtoXCIsXCJya2lcIixcInJrbVwiLFwicmt0XCIsXCJya3dcIixcInJtYVwiLFwicm1iXCIsXCJybWNcIixcInJtZFwiLFwicm1lXCIsXCJybWZcIixcInJtZ1wiLFwicm1oXCIsXCJybWlcIixcInJta1wiLFwicm1sXCIsXCJybW1cIixcInJtblwiLFwicm1vXCIsXCJybXBcIixcInJtcVwiLFwicm1yXCIsXCJybXNcIixcInJtdFwiLFwicm11XCIsXCJybXZcIixcInJtd1wiLFwicm14XCIsXCJybXlcIixcInJtelwiLFwicm5hXCIsXCJybmRcIixcInJuZ1wiLFwicm5sXCIsXCJybm5cIixcInJucFwiLFwicm5yXCIsXCJybndcIixcInJvYVwiLFwicm9iXCIsXCJyb2NcIixcInJvZFwiLFwicm9lXCIsXCJyb2ZcIixcInJvZ1wiLFwicm9sXCIsXCJyb21cIixcInJvb1wiLFwicm9wXCIsXCJyb3JcIixcInJvdVwiLFwicm93XCIsXCJycG5cIixcInJwdFwiLFwicnJpXCIsXCJycm9cIixcInJydFwiLFwicnNiXCIsXCJyc2lcIixcInJzbFwiLFwicnNtXCIsXCJydGNcIixcInJ0aFwiLFwicnRtXCIsXCJydHNcIixcInJ0d1wiLFwicnViXCIsXCJydWNcIixcInJ1ZVwiLFwicnVmXCIsXCJydWdcIixcInJ1aFwiLFwicnVpXCIsXCJydWtcIixcInJ1b1wiLFwicnVwXCIsXCJydXFcIixcInJ1dFwiLFwicnV1XCIsXCJydXlcIixcInJ1elwiLFwicndhXCIsXCJyd2tcIixcInJ3bFwiLFwicndtXCIsXCJyd29cIixcInJ3clwiLFwicnhkXCIsXCJyeHdcIixcInJ5blwiLFwicnlzXCIsXCJyeXVcIixcInJ6aFwiXVxuLFsgXCJzYVwiLFwic2NcIixcInNkXCIsXCJzZVwiLFwic2dcIixcInNoXCIsXCJzaVwiLFwic2tcIixcInNsXCIsXCJzbVwiLFwic25cIixcInNvXCIsXCJzcVwiLFwic3JcIixcInNzXCIsXCJzdFwiLFwic3VcIixcInN2XCIsXCJzd1wiLFwic2FhXCIsXCJzYWJcIixcInNhY1wiLFwic2FkXCIsXCJzYWVcIixcInNhZlwiLFwic2FoXCIsXCJzYWlcIixcInNhalwiLFwic2FrXCIsXCJzYWxcIixcInNhbVwiLFwic2FvXCIsXCJzYXBcIixcInNhcVwiLFwic2FyXCIsXCJzYXNcIixcInNhdFwiLFwic2F1XCIsXCJzYXZcIixcInNhd1wiLFwic2F4XCIsXCJzYXlcIixcInNhelwiLFwic2JhXCIsXCJzYmJcIixcInNiY1wiLFwic2JkXCIsXCJzYmVcIixcInNiZlwiLFwic2JnXCIsXCJzYmhcIixcInNiaVwiLFwic2JqXCIsXCJzYmtcIixcInNibFwiLFwic2JtXCIsXCJzYm5cIixcInNib1wiLFwic2JwXCIsXCJzYnFcIixcInNiclwiLFwic2JzXCIsXCJzYnRcIixcInNidVwiLFwic2J2XCIsXCJzYndcIixcInNieFwiLFwic2J5XCIsXCJzYnpcIixcInNjYVwiLFwic2NiXCIsXCJzY2VcIixcInNjZlwiLFwic2NnXCIsXCJzY2hcIixcInNjaVwiLFwic2NrXCIsXCJzY2xcIixcInNjblwiLFwic2NvXCIsXCJzY3BcIixcInNjcVwiLFwic2NzXCIsXCJzY3RcIixcInNjdVwiLFwic2N2XCIsXCJzY3dcIixcInNjeFwiLFwic2RhXCIsXCJzZGJcIixcInNkY1wiLFwic2RlXCIsXCJzZGZcIixcInNkZ1wiLFwic2RoXCIsXCJzZGpcIixcInNka1wiLFwic2RsXCIsXCJzZG1cIixcInNkblwiLFwic2RvXCIsXCJzZHBcIixcInNkcVwiLFwic2RyXCIsXCJzZHNcIixcInNkdFwiLFwic2R1XCIsXCJzZHZcIixcInNkeFwiLFwic2R6XCIsXCJzZWFcIixcInNlYlwiLFwic2VjXCIsXCJzZWRcIixcInNlZVwiLFwic2VmXCIsXCJzZWdcIixcInNlaFwiLFwic2VpXCIsXCJzZWpcIixcInNla1wiLFwic2VsXCIsXCJzZW1cIixcInNlblwiLFwic2VvXCIsXCJzZXBcIixcInNlcVwiLFwic2VyXCIsXCJzZXNcIixcInNldFwiLFwic2V1XCIsXCJzZXZcIixcInNld1wiLFwic2V5XCIsXCJzZXpcIixcInNmYlwiLFwic2ZlXCIsXCJzZm1cIixcInNmc1wiLFwic2Z3XCIsXCJzZ2FcIixcInNnYlwiLFwic2djXCIsXCJzZ2RcIixcInNnZVwiLFwic2dnXCIsXCJzZ2hcIixcInNnaVwiLFwic2dqXCIsXCJzZ2tcIixcInNnbFwiLFwic2dtXCIsXCJzZ25cIixcInNnb1wiLFwic2dwXCIsXCJzZ3JcIixcInNnc1wiLFwic2d0XCIsXCJzZ3VcIixcInNnd1wiLFwic2d4XCIsXCJzZ3lcIixcInNnelwiLFwic2hhXCIsXCJzaGJcIixcInNoY1wiLFwic2hkXCIsXCJzaGVcIixcInNoZ1wiLFwic2hoXCIsXCJzaGlcIixcInNoalwiLFwic2hrXCIsXCJzaGxcIixcInNobVwiLFwic2huXCIsXCJzaG9cIixcInNocFwiLFwic2hxXCIsXCJzaHJcIixcInNoc1wiLFwic2h0XCIsXCJzaHVcIixcInNodlwiLFwic2h3XCIsXCJzaHhcIixcInNoeVwiLFwic2h6XCIsXCJzaWFcIixcInNpYlwiLFwic2lkXCIsXCJzaWVcIixcInNpZlwiLFwic2lnXCIsXCJzaWhcIixcInNpaVwiLFwic2lqXCIsXCJzaWtcIixcInNpbFwiLFwic2ltXCIsXCJzaW9cIixcInNpcFwiLFwic2lxXCIsXCJzaXJcIixcInNpc1wiLFwic2l0XCIsXCJzaXVcIixcInNpdlwiLFwic2l3XCIsXCJzaXhcIixcInNpeVwiLFwic2l6XCIsXCJzamFcIixcInNqYlwiLFwic2pkXCIsXCJzamVcIixcInNqZ1wiLFwic2prXCIsXCJzamxcIixcInNqbVwiLFwic2puXCIsXCJzam9cIixcInNqcFwiLFwic2pyXCIsXCJzanNcIixcInNqdFwiLFwic2p1XCIsXCJzandcIixcInNrYVwiLFwic2tiXCIsXCJza2NcIixcInNrZFwiLFwic2tlXCIsXCJza2ZcIixcInNrZ1wiLFwic2toXCIsXCJza2lcIixcInNralwiLFwic2trXCIsXCJza21cIixcInNrblwiLFwic2tvXCIsXCJza3BcIixcInNrcVwiLFwic2tyXCIsXCJza3NcIixcInNrdFwiLFwic2t1XCIsXCJza3ZcIixcInNrd1wiLFwic2t4XCIsXCJza3lcIixcInNrelwiLFwic2xhXCIsXCJzbGNcIixcInNsZFwiLFwic2xlXCIsXCJzbGZcIixcInNsZ1wiLFwic2xoXCIsXCJzbGlcIixcInNsalwiLFwic2xsXCIsXCJzbG1cIixcInNsblwiLFwic2xwXCIsXCJzbHFcIixcInNsclwiLFwic2xzXCIsXCJzbHRcIixcInNsdVwiLFwic2x3XCIsXCJzbHhcIixcInNseVwiLFwic2x6XCIsXCJzbWFcIixcInNtYlwiLFwic21jXCIsXCJzbWRcIixcInNtZlwiLFwic21nXCIsXCJzbWhcIixcInNtaVwiLFwic21qXCIsXCJzbWtcIixcInNtbFwiLFwic21tXCIsXCJzbW5cIixcInNtcFwiLFwic21xXCIsXCJzbXJcIixcInNtc1wiLFwic210XCIsXCJzbXVcIixcInNtdlwiLFwic213XCIsXCJzbXhcIixcInNteVwiLFwic216XCIsXCJzbmJcIixcInNuY1wiLFwic25lXCIsXCJzbmZcIixcInNuZ1wiLFwic25oXCIsXCJzbmlcIixcInNualwiLFwic25rXCIsXCJzbmxcIixcInNubVwiLFwic25uXCIsXCJzbm9cIixcInNucFwiLFwic25xXCIsXCJzbnJcIixcInNuc1wiLFwic251XCIsXCJzbnZcIixcInNud1wiLFwic254XCIsXCJzbnlcIixcInNuelwiLFwic29hXCIsXCJzb2JcIixcInNvY1wiLFwic29kXCIsXCJzb2VcIixcInNvZ1wiLFwic29oXCIsXCJzb2lcIixcInNvalwiLFwic29rXCIsXCJzb2xcIixcInNvblwiLFwic29vXCIsXCJzb3BcIixcInNvcVwiLFwic29yXCIsXCJzb3NcIixcInNvdVwiLFwic292XCIsXCJzb3dcIixcInNveFwiLFwic295XCIsXCJzb3pcIixcInNwYlwiLFwic3BjXCIsXCJzcGRcIixcInNwZVwiLFwic3BnXCIsXCJzcGlcIixcInNwa1wiLFwic3BsXCIsXCJzcG1cIixcInNwblwiLFwic3BvXCIsXCJzcHBcIixcInNwcVwiLFwic3ByXCIsXCJzcHNcIixcInNwdFwiLFwic3B1XCIsXCJzcHZcIixcInNweFwiLFwic3B5XCIsXCJzcWFcIixcInNxaFwiLFwic3FqXCIsXCJzcWtcIixcInNxbVwiLFwic3FuXCIsXCJzcW9cIixcInNxcVwiLFwic3FyXCIsXCJzcXNcIixcInNxdFwiLFwic3F1XCIsXCJzcXhcIixcInNyYVwiLFwic3JiXCIsXCJzcmNcIixcInNyZVwiLFwic3JmXCIsXCJzcmdcIixcInNyaFwiLFwic3JpXCIsXCJzcmtcIixcInNybFwiLFwic3JtXCIsXCJzcm5cIixcInNyb1wiLFwic3JxXCIsXCJzcnJcIixcInNyc1wiLFwic3J0XCIsXCJzcnVcIixcInNydlwiLFwic3J3XCIsXCJzcnhcIixcInNyeVwiLFwic3J6XCIsXCJzc2FcIixcInNzYlwiLFwic3NjXCIsXCJzc2RcIixcInNzZVwiLFwic3NmXCIsXCJzc2dcIixcInNzaFwiLFwic3NpXCIsXCJzc2pcIixcInNza1wiLFwic3NsXCIsXCJzc21cIixcInNzblwiLFwic3NvXCIsXCJzc3BcIixcInNzcVwiLFwic3NyXCIsXCJzc3NcIixcInNzdFwiLFwic3N1XCIsXCJzc3ZcIixcInNzeFwiLFwic3N5XCIsXCJzc3pcIixcInN0YVwiLFwic3RiXCIsXCJzdGRcIixcInN0ZVwiLFwic3RmXCIsXCJzdGdcIixcInN0aFwiLFwic3RpXCIsXCJzdGpcIixcInN0a1wiLFwic3RsXCIsXCJzdG1cIixcInN0blwiLFwic3RvXCIsXCJzdHBcIixcInN0cVwiLFwic3RyXCIsXCJzdHNcIixcInN0dFwiLFwic3R1XCIsXCJzdHZcIixcInN0d1wiLFwic3R5XCIsXCJzdWFcIixcInN1YlwiLFwic3VjXCIsXCJzdWVcIixcInN1Z1wiLFwic3VpXCIsXCJzdWpcIixcInN1a1wiLFwic3VsXCIsXCJzdW1cIixcInN1b1wiLFwic3VxXCIsXCJzdXJcIixcInN1c1wiLFwic3V0XCIsXCJzdXZcIixcInN1d1wiLFwic3V4XCIsXCJzdXlcIixcInN1elwiLFwic3ZhXCIsXCJzdmJcIixcInN2Y1wiLFwic3ZlXCIsXCJzdmtcIixcInN2bVwiLFwic3ZyXCIsXCJzdnNcIixcInN2eFwiLFwic3diXCIsXCJzd2NcIixcInN3ZlwiLFwic3dnXCIsXCJzd2hcIixcInN3aVwiLFwic3dqXCIsXCJzd2tcIixcInN3bFwiLFwic3dtXCIsXCJzd25cIixcInN3b1wiLFwic3dwXCIsXCJzd3FcIixcInN3clwiLFwic3dzXCIsXCJzd3RcIixcInN3dVwiLFwic3d2XCIsXCJzd3dcIixcInN3eFwiLFwic3d5XCIsXCJzeGJcIixcInN4Y1wiLFwic3hlXCIsXCJzeGdcIixcInN4a1wiLFwic3hsXCIsXCJzeG1cIixcInN4blwiLFwic3hvXCIsXCJzeHJcIixcInN4c1wiLFwic3h1XCIsXCJzeHdcIixcInN5YVwiLFwic3liXCIsXCJzeWNcIixcInN5ZFwiLFwic3lpXCIsXCJzeWtcIixcInN5bFwiLFwic3ltXCIsXCJzeW5cIixcInN5b1wiLFwic3lyXCIsXCJzeXNcIixcInN5d1wiLFwic3l4XCIsXCJzeXlcIixcInN6YVwiLFwic3piXCIsXCJzemNcIixcInN6ZFwiLFwic3plXCIsXCJzemdcIixcInN6bFwiLFwic3puXCIsXCJzenBcIixcInN6c1wiLFwic3p2XCIsXCJzendcIixcInN6eVwiXVxuLFsgXCJ0YVwiLFwidGVcIixcInRnXCIsXCJ0aFwiLFwidGlcIixcInRrXCIsXCJ0bFwiLFwidG5cIixcInRvXCIsXCJ0clwiLFwidHNcIixcInR0XCIsXCJ0d1wiLFwidHlcIixcInRhYVwiLFwidGFiXCIsXCJ0YWNcIixcInRhZFwiLFwidGFlXCIsXCJ0YWZcIixcInRhZ1wiLFwidGFpXCIsXCJ0YWpcIixcInRha1wiLFwidGFsXCIsXCJ0YW5cIixcInRhb1wiLFwidGFwXCIsXCJ0YXFcIixcInRhclwiLFwidGFzXCIsXCJ0YXVcIixcInRhdlwiLFwidGF3XCIsXCJ0YXhcIixcInRheVwiLFwidGF6XCIsXCJ0YmFcIixcInRiYlwiLFwidGJjXCIsXCJ0YmRcIixcInRiZVwiLFwidGJmXCIsXCJ0YmdcIixcInRiaFwiLFwidGJpXCIsXCJ0YmpcIixcInRia1wiLFwidGJsXCIsXCJ0Ym1cIixcInRiblwiLFwidGJvXCIsXCJ0YnBcIixcInRicVwiLFwidGJyXCIsXCJ0YnNcIixcInRidFwiLFwidGJ1XCIsXCJ0YnZcIixcInRid1wiLFwidGJ4XCIsXCJ0YnlcIixcInRielwiLFwidGNhXCIsXCJ0Y2JcIixcInRjY1wiLFwidGNkXCIsXCJ0Y2VcIixcInRjZlwiLFwidGNnXCIsXCJ0Y2hcIixcInRjaVwiLFwidGNrXCIsXCJ0Y2xcIixcInRjbVwiLFwidGNuXCIsXCJ0Y29cIixcInRjcFwiLFwidGNxXCIsXCJ0Y3NcIixcInRjdFwiLFwidGN1XCIsXCJ0Y3dcIixcInRjeFwiLFwidGN5XCIsXCJ0Y3pcIixcInRkYVwiLFwidGRiXCIsXCJ0ZGNcIixcInRkZFwiLFwidGRlXCIsXCJ0ZGZcIixcInRkZ1wiLFwidGRoXCIsXCJ0ZGlcIixcInRkalwiLFwidGRrXCIsXCJ0ZGxcIixcInRkbVwiLFwidGRuXCIsXCJ0ZG9cIixcInRkcVwiLFwidGRyXCIsXCJ0ZHNcIixcInRkdFwiLFwidGR1XCIsXCJ0ZHZcIixcInRkeFwiLFwidGR5XCIsXCJ0ZWFcIixcInRlYlwiLFwidGVjXCIsXCJ0ZWRcIixcInRlZVwiLFwidGVmXCIsXCJ0ZWdcIixcInRlaFwiLFwidGVpXCIsXCJ0ZWtcIixcInRlbVwiLFwidGVuXCIsXCJ0ZW9cIixcInRlcFwiLFwidGVxXCIsXCJ0ZXJcIixcInRlc1wiLFwidGV0XCIsXCJ0ZXVcIixcInRldlwiLFwidGV3XCIsXCJ0ZXhcIixcInRleVwiLFwidGV6XCIsXCJ0ZmlcIixcInRmblwiLFwidGZvXCIsXCJ0ZnJcIixcInRmdFwiLFwidGdhXCIsXCJ0Z2JcIixcInRnY1wiLFwidGdkXCIsXCJ0Z2VcIixcInRnZlwiLFwidGdnXCIsXCJ0Z2hcIixcInRnaVwiLFwidGdqXCIsXCJ0Z25cIixcInRnb1wiLFwidGdwXCIsXCJ0Z3FcIixcInRnclwiLFwidGdzXCIsXCJ0Z3RcIixcInRndVwiLFwidGd2XCIsXCJ0Z3dcIixcInRneFwiLFwidGd5XCIsXCJ0Z3pcIixcInRoY1wiLFwidGhkXCIsXCJ0aGVcIixcInRoZlwiLFwidGhoXCIsXCJ0aGlcIixcInRoa1wiLFwidGhsXCIsXCJ0aG1cIixcInRoblwiLFwidGhwXCIsXCJ0aHFcIixcInRoclwiLFwidGhzXCIsXCJ0aHRcIixcInRodVwiLFwidGh2XCIsXCJ0aHdcIixcInRoeFwiLFwidGh5XCIsXCJ0aHpcIixcInRpYVwiLFwidGljXCIsXCJ0aWRcIixcInRpZVwiLFwidGlmXCIsXCJ0aWdcIixcInRpaFwiLFwidGlpXCIsXCJ0aWpcIixcInRpa1wiLFwidGlsXCIsXCJ0aW1cIixcInRpblwiLFwidGlvXCIsXCJ0aXBcIixcInRpcVwiLFwidGlzXCIsXCJ0aXRcIixcInRpdVwiLFwidGl2XCIsXCJ0aXdcIixcInRpeFwiLFwidGl5XCIsXCJ0aXpcIixcInRqYVwiLFwidGpnXCIsXCJ0amlcIixcInRqalwiLFwidGpsXCIsXCJ0am1cIixcInRqblwiLFwidGpvXCIsXCJ0anBcIixcInRqc1wiLFwidGp1XCIsXCJ0andcIixcInRrYVwiLFwidGtiXCIsXCJ0a2RcIixcInRrZVwiLFwidGtmXCIsXCJ0a2dcIixcInRra1wiLFwidGtsXCIsXCJ0a21cIixcInRrblwiLFwidGtwXCIsXCJ0a3FcIixcInRrclwiLFwidGtzXCIsXCJ0a3RcIixcInRrdVwiLFwidGt2XCIsXCJ0a3dcIixcInRreFwiLFwidGt6XCIsXCJ0bGFcIixcInRsYlwiLFwidGxjXCIsXCJ0bGRcIixcInRsZlwiLFwidGxnXCIsXCJ0bGhcIixcInRsaVwiLFwidGxqXCIsXCJ0bGtcIixcInRsbFwiLFwidGxtXCIsXCJ0bG5cIixcInRsb1wiLFwidGxwXCIsXCJ0bHFcIixcInRsclwiLFwidGxzXCIsXCJ0bHRcIixcInRsdVwiLFwidGx2XCIsXCJ0bHdcIixcInRseFwiLFwidGx5XCIsXCJ0bWFcIixcInRtYlwiLFwidG1jXCIsXCJ0bWRcIixcInRtZVwiLFwidG1mXCIsXCJ0bWdcIixcInRtaFwiLFwidG1pXCIsXCJ0bWpcIixcInRta1wiLFwidG1sXCIsXCJ0bW1cIixcInRtblwiLFwidG1vXCIsXCJ0bXBcIixcInRtcVwiLFwidG1yXCIsXCJ0bXNcIixcInRtdFwiLFwidG11XCIsXCJ0bXZcIixcInRtd1wiLFwidG15XCIsXCJ0bXpcIixcInRuYVwiLFwidG5iXCIsXCJ0bmNcIixcInRuZFwiLFwidG5lXCIsXCJ0bmZcIixcInRuZ1wiLFwidG5oXCIsXCJ0bmlcIixcInRua1wiLFwidG5sXCIsXCJ0bm1cIixcInRublwiLFwidG5vXCIsXCJ0bnBcIixcInRucVwiLFwidG5yXCIsXCJ0bnNcIixcInRudFwiLFwidG51XCIsXCJ0bnZcIixcInRud1wiLFwidG54XCIsXCJ0bnlcIixcInRuelwiLFwidG9iXCIsXCJ0b2NcIixcInRvZFwiLFwidG9lXCIsXCJ0b2ZcIixcInRvZ1wiLFwidG9oXCIsXCJ0b2lcIixcInRvalwiLFwidG9sXCIsXCJ0b21cIixcInRvb1wiLFwidG9wXCIsXCJ0b3FcIixcInRvclwiLFwidG9zXCIsXCJ0b3VcIixcInRvdlwiLFwidG93XCIsXCJ0b3hcIixcInRveVwiLFwidG96XCIsXCJ0cGFcIixcInRwY1wiLFwidHBlXCIsXCJ0cGZcIixcInRwZ1wiLFwidHBpXCIsXCJ0cGpcIixcInRwa1wiLFwidHBsXCIsXCJ0cG1cIixcInRwblwiLFwidHBvXCIsXCJ0cHBcIixcInRwcVwiLFwidHByXCIsXCJ0cHRcIixcInRwdVwiLFwidHB2XCIsXCJ0cHdcIixcInRweFwiLFwidHB5XCIsXCJ0cHpcIixcInRxYlwiLFwidHFsXCIsXCJ0cW1cIixcInRxblwiLFwidHFvXCIsXCJ0cXBcIixcInRxcVwiLFwidHFyXCIsXCJ0cXRcIixcInRxdVwiLFwidHF3XCIsXCJ0cmFcIixcInRyYlwiLFwidHJjXCIsXCJ0cmRcIixcInRyZVwiLFwidHJmXCIsXCJ0cmdcIixcInRyaFwiLFwidHJpXCIsXCJ0cmpcIixcInRya1wiLFwidHJsXCIsXCJ0cm1cIixcInRyblwiLFwidHJvXCIsXCJ0cnBcIixcInRycVwiLFwidHJyXCIsXCJ0cnNcIixcInRydFwiLFwidHJ1XCIsXCJ0cnZcIixcInRyd1wiLFwidHJ4XCIsXCJ0cnlcIixcInRyelwiLFwidHNhXCIsXCJ0c2JcIixcInRzY1wiLFwidHNkXCIsXCJ0c2VcIixcInRzZlwiLFwidHNnXCIsXCJ0c2hcIixcInRzaVwiLFwidHNqXCIsXCJ0c2tcIixcInRzbFwiLFwidHNtXCIsXCJ0c3BcIixcInRzcVwiLFwidHNyXCIsXCJ0c3NcIixcInRzdFwiLFwidHN1XCIsXCJ0c3ZcIixcInRzd1wiLFwidHN4XCIsXCJ0c3lcIixcInRzelwiLFwidHRhXCIsXCJ0dGJcIixcInR0Y1wiLFwidHRkXCIsXCJ0dGVcIixcInR0ZlwiLFwidHRnXCIsXCJ0dGhcIixcInR0aVwiLFwidHRqXCIsXCJ0dGtcIixcInR0bFwiLFwidHRtXCIsXCJ0dG5cIixcInR0b1wiLFwidHRwXCIsXCJ0dHFcIixcInR0clwiLFwidHRzXCIsXCJ0dHRcIixcInR0dVwiLFwidHR2XCIsXCJ0dHdcIixcInR0eVwiLFwidHR6XCIsXCJ0dWFcIixcInR1YlwiLFwidHVjXCIsXCJ0dWRcIixcInR1ZVwiLFwidHVmXCIsXCJ0dWdcIixcInR1aFwiLFwidHVpXCIsXCJ0dWpcIixcInR1bFwiLFwidHVtXCIsXCJ0dW5cIixcInR1b1wiLFwidHVwXCIsXCJ0dXFcIixcInR1c1wiLFwidHV0XCIsXCJ0dXVcIixcInR1dlwiLFwidHV3XCIsXCJ0dXhcIixcInR1eVwiLFwidHV6XCIsXCJ0dmFcIixcInR2ZFwiLFwidHZlXCIsXCJ0dmtcIixcInR2bFwiLFwidHZtXCIsXCJ0dm5cIixcInR2b1wiLFwidHZzXCIsXCJ0dnRcIixcInR2dVwiLFwidHZ3XCIsXCJ0dnhcIixcInR2eVwiLFwidHdhXCIsXCJ0d2JcIixcInR3Y1wiLFwidHdkXCIsXCJ0d2VcIixcInR3ZlwiLFwidHdnXCIsXCJ0d2hcIixcInR3bFwiLFwidHdtXCIsXCJ0d25cIixcInR3b1wiLFwidHdwXCIsXCJ0d3FcIixcInR3clwiLFwidHd0XCIsXCJ0d3VcIixcInR3d1wiLFwidHd4XCIsXCJ0d3lcIixcInR4YVwiLFwidHhiXCIsXCJ0eGNcIixcInR4ZVwiLFwidHhnXCIsXCJ0eGhcIixcInR4aVwiLFwidHhqXCIsXCJ0eG1cIixcInR4blwiLFwidHhvXCIsXCJ0eHFcIixcInR4clwiLFwidHhzXCIsXCJ0eHRcIixcInR4dVwiLFwidHh4XCIsXCJ0eHlcIixcInR5YVwiLFwidHllXCIsXCJ0eWhcIixcInR5aVwiLFwidHlqXCIsXCJ0eWxcIixcInR5blwiLFwidHlwXCIsXCJ0eXJcIixcInR5c1wiLFwidHl0XCIsXCJ0eXVcIixcInR5dlwiLFwidHl4XCIsXCJ0eXlcIixcInR5elwiLFwidHphXCIsXCJ0emhcIixcInR6alwiLFwidHpsXCIsXCJ0em1cIixcInR6blwiLFwidHpvXCIsXCJ0enhcIl1cbixbIFwidWdcIixcInVrXCIsXCJ1clwiLFwidXpcIixcInVhbVwiLFwidWFuXCIsXCJ1YXJcIixcInViYVwiLFwidWJpXCIsXCJ1YmxcIixcInViclwiLFwidWJ1XCIsXCJ1YnlcIixcInVkYVwiLFwidWRlXCIsXCJ1ZGdcIixcInVkaVwiLFwidWRqXCIsXCJ1ZGxcIixcInVkbVwiLFwidWR1XCIsXCJ1ZXNcIixcInVmaVwiLFwidWdhXCIsXCJ1Z2JcIixcInVnZVwiLFwidWduXCIsXCJ1Z29cIixcInVneVwiLFwidWhhXCIsXCJ1aG5cIixcInVpc1wiLFwidWl2XCIsXCJ1amlcIixcInVrYVwiLFwidWtnXCIsXCJ1a2hcIixcInVraVwiLFwidWtrXCIsXCJ1a2xcIixcInVrcFwiLFwidWtxXCIsXCJ1a3NcIixcInVrdVwiLFwidWt2XCIsXCJ1a3dcIixcInVreVwiLFwidWxhXCIsXCJ1bGJcIixcInVsY1wiLFwidWxlXCIsXCJ1bGZcIixcInVsaVwiLFwidWxrXCIsXCJ1bGxcIixcInVsbVwiLFwidWxuXCIsXCJ1bHVcIixcInVsd1wiLFwidW1hXCIsXCJ1bWJcIixcInVtY1wiLFwidW1kXCIsXCJ1bWdcIixcInVtaVwiLFwidW1tXCIsXCJ1bW5cIixcInVtb1wiLFwidW1wXCIsXCJ1bXJcIixcInVtc1wiLFwidW11XCIsXCJ1bmFcIixcInVuZFwiLFwidW5lXCIsXCJ1bmdcIixcInVuaVwiLFwidW5rXCIsXCJ1bm1cIixcInVublwiLFwidW5wXCIsXCJ1bnJcIixcInVudVwiLFwidW54XCIsXCJ1bnpcIixcInVva1wiLFwidXBpXCIsXCJ1cHZcIixcInVyYVwiLFwidXJiXCIsXCJ1cmNcIixcInVyZVwiLFwidXJmXCIsXCJ1cmdcIixcInVyaFwiLFwidXJpXCIsXCJ1cmpcIixcInVya1wiLFwidXJsXCIsXCJ1cm1cIixcInVyblwiLFwidXJvXCIsXCJ1cnBcIixcInVyclwiLFwidXJ0XCIsXCJ1cnVcIixcInVydlwiLFwidXJ3XCIsXCJ1cnhcIixcInVyeVwiLFwidXJ6XCIsXCJ1c2FcIixcInVzaFwiLFwidXNpXCIsXCJ1c2tcIixcInVzcFwiLFwidXNzXCIsXCJ1c3VcIixcInV0YVwiLFwidXRlXCIsXCJ1dGhcIixcInV0cFwiLFwidXRyXCIsXCJ1dHVcIixcInV1bVwiLFwidXVuXCIsXCJ1dXJcIixcInV1dVwiLFwidXZlXCIsXCJ1dmhcIixcInV2bFwiLFwidXdhXCIsXCJ1eWFcIixcInV6blwiLFwidXpzXCJdXG4sWyBcInZlXCIsXCJ2aVwiLFwidm9cIixcInZhYVwiLFwidmFlXCIsXCJ2YWZcIixcInZhZ1wiLFwidmFoXCIsXCJ2YWlcIixcInZhalwiLFwidmFsXCIsXCJ2YW1cIixcInZhblwiLFwidmFvXCIsXCJ2YXBcIixcInZhclwiLFwidmFzXCIsXCJ2YXVcIixcInZhdlwiLFwidmF5XCIsXCJ2YmJcIixcInZia1wiLFwidmVjXCIsXCJ2ZWRcIixcInZlbFwiLFwidmVtXCIsXCJ2ZW9cIixcInZlcFwiLFwidmVyXCIsXCJ2Z3JcIixcInZndFwiLFwidmljXCIsXCJ2aWRcIixcInZpZlwiLFwidmlnXCIsXCJ2aWxcIixcInZpblwiLFwidmlzXCIsXCJ2aXRcIixcInZpdlwiLFwidmthXCIsXCJ2a2lcIixcInZralwiLFwidmtrXCIsXCJ2a2xcIixcInZrbVwiLFwidmtuXCIsXCJ2a29cIixcInZrcFwiLFwidmt0XCIsXCJ2a3VcIixcInZrelwiLFwidmxwXCIsXCJ2bHNcIixcInZtYVwiLFwidm1iXCIsXCJ2bWNcIixcInZtZFwiLFwidm1lXCIsXCJ2bWZcIixcInZtZ1wiLFwidm1oXCIsXCJ2bWlcIixcInZtalwiLFwidm1rXCIsXCJ2bWxcIixcInZtbVwiLFwidm1wXCIsXCJ2bXFcIixcInZtclwiLFwidm1zXCIsXCJ2bXVcIixcInZtdlwiLFwidm13XCIsXCJ2bXhcIixcInZteVwiLFwidm16XCIsXCJ2bmtcIixcInZubVwiLFwidm5wXCIsXCJ2b3JcIixcInZvdFwiLFwidnJhXCIsXCJ2cm9cIixcInZyc1wiLFwidnJ0XCIsXCJ2c2lcIixcInZzbFwiLFwidnN2XCIsXCJ2dG9cIixcInZ1bVwiLFwidnVuXCIsXCJ2dXRcIixcInZ3YVwiXVxuLFsgXCJ3YVwiLFwid29cIixcIndhYVwiLFwid2FiXCIsXCJ3YWNcIixcIndhZFwiLFwid2FlXCIsXCJ3YWZcIixcIndhZ1wiLFwid2FoXCIsXCJ3YWlcIixcIndhalwiLFwid2FrXCIsXCJ3YWxcIixcIndhbVwiLFwid2FuXCIsXCJ3YW9cIixcIndhcFwiLFwid2FxXCIsXCJ3YXJcIixcIndhc1wiLFwid2F0XCIsXCJ3YXVcIixcIndhdlwiLFwid2F3XCIsXCJ3YXhcIixcIndheVwiLFwid2F6XCIsXCJ3YmFcIixcIndiYlwiLFwid2JlXCIsXCJ3YmZcIixcIndiaFwiLFwid2JpXCIsXCJ3YmpcIixcIndia1wiLFwid2JsXCIsXCJ3Ym1cIixcIndicFwiLFwid2JxXCIsXCJ3YnJcIixcIndic1wiLFwid2J0XCIsXCJ3YnZcIixcIndid1wiLFwid2NhXCIsXCJ3Y2lcIixcIndkZFwiLFwid2RnXCIsXCJ3ZGpcIixcIndka1wiLFwid2R1XCIsXCJ3ZHlcIixcIndlYVwiLFwid2VjXCIsXCJ3ZWRcIixcIndlZ1wiLFwid2VoXCIsXCJ3ZWlcIixcIndlbVwiLFwid2VuXCIsXCJ3ZW9cIixcIndlcFwiLFwid2VyXCIsXCJ3ZXNcIixcIndldFwiLFwid2V1XCIsXCJ3ZXdcIixcIndmZ1wiLFwid2dhXCIsXCJ3Z2JcIixcIndnZ1wiLFwid2dpXCIsXCJ3Z29cIixcIndndVwiLFwid2d3XCIsXCJ3Z3lcIixcIndoYVwiLFwid2hnXCIsXCJ3aGtcIixcIndodVwiLFwid2liXCIsXCJ3aWNcIixcIndpZVwiLFwid2lmXCIsXCJ3aWdcIixcIndpaFwiLFwid2lpXCIsXCJ3aWpcIixcIndpa1wiLFwid2lsXCIsXCJ3aW1cIixcIndpblwiLFwid2lyXCIsXCJ3aXRcIixcIndpdVwiLFwid2l2XCIsXCJ3aXdcIixcIndpeVwiLFwid2phXCIsXCJ3amlcIixcIndrYVwiLFwid2tiXCIsXCJ3a2RcIixcIndrbFwiLFwid2tyXCIsXCJ3a3VcIixcIndrd1wiLFwid2t5XCIsXCJ3bGFcIixcIndsY1wiLFwid2xlXCIsXCJ3bGdcIixcIndsaFwiLFwid2xpXCIsXCJ3bGtcIixcIndsbFwiLFwid2xtXCIsXCJ3bG9cIixcIndsclwiLFwid2xzXCIsXCJ3bHVcIixcIndsdlwiLFwid2x3XCIsXCJ3bHhcIixcIndseVwiLFwid21hXCIsXCJ3bWJcIixcIndtY1wiLFwid21kXCIsXCJ3bWVcIixcIndtZ1wiLFwid21oXCIsXCJ3bWlcIixcIndtbVwiLFwid21uXCIsXCJ3bW9cIixcIndtc1wiLFwid210XCIsXCJ3bXdcIixcIndteFwiLFwid25iXCIsXCJ3bmNcIixcInduZFwiLFwid25lXCIsXCJ3bmdcIixcInduaVwiLFwid25rXCIsXCJ3bm1cIixcIndublwiLFwid25vXCIsXCJ3bnBcIixcIndudVwiLFwid253XCIsXCJ3bnlcIixcIndvYVwiLFwid29iXCIsXCJ3b2NcIixcIndvZFwiLFwid29lXCIsXCJ3b2ZcIixcIndvZ1wiLFwid29pXCIsXCJ3b2tcIixcIndvbVwiLFwid29uXCIsXCJ3b29cIixcIndvclwiLFwid29zXCIsXCJ3b3dcIixcIndveVwiLFwid3BjXCIsXCJ3cmFcIixcIndyYlwiLFwid3JkXCIsXCJ3cmdcIixcIndyaFwiLFwid3JpXCIsXCJ3cmtcIixcIndybFwiLFwid3JtXCIsXCJ3cm5cIixcIndyb1wiLFwid3JwXCIsXCJ3cnJcIixcIndyc1wiLFwid3J1XCIsXCJ3cnZcIixcIndyd1wiLFwid3J4XCIsXCJ3cnlcIixcIndyelwiLFwid3NhXCIsXCJ3c2dcIixcIndzaVwiLFwid3NrXCIsXCJ3c3JcIixcIndzc1wiLFwid3N1XCIsXCJ3c3ZcIixcInd0ZlwiLFwid3RoXCIsXCJ3dGlcIixcInd0a1wiLFwid3RtXCIsXCJ3dHdcIixcInd1YVwiLFwid3ViXCIsXCJ3dWRcIixcInd1aFwiLFwid3VsXCIsXCJ3dW1cIixcInd1blwiLFwid3VyXCIsXCJ3dXRcIixcInd1dVwiLFwid3V2XCIsXCJ3dXhcIixcInd1eVwiLFwid3dhXCIsXCJ3d2JcIixcInd3b1wiLFwid3dyXCIsXCJ3d3dcIixcInd4YVwiLFwid3h3XCIsXCJ3eWFcIixcInd5YlwiLFwid3lpXCIsXCJ3eW1cIixcInd5clwiLFwid3l5XCJdXG4sWyBcInhoXCIsXCJ4YWFcIixcInhhYlwiLFwieGFjXCIsXCJ4YWRcIixcInhhZVwiLFwieGFnXCIsXCJ4YWlcIixcInhhalwiLFwieGFrXCIsXCJ4YWxcIixcInhhbVwiLFwieGFuXCIsXCJ4YW9cIixcInhhcFwiLFwieGFxXCIsXCJ4YXJcIixcInhhc1wiLFwieGF0XCIsXCJ4YXVcIixcInhhdlwiLFwieGF3XCIsXCJ4YXlcIixcInhiYVwiLFwieGJiXCIsXCJ4YmNcIixcInhiZFwiLFwieGJlXCIsXCJ4YmdcIixcInhiaVwiLFwieGJqXCIsXCJ4Ym1cIixcInhiblwiLFwieGJvXCIsXCJ4YnBcIixcInhiclwiLFwieGJ3XCIsXCJ4YnhcIixcInhieVwiLFwieGNiXCIsXCJ4Y2NcIixcInhjZVwiLFwieGNnXCIsXCJ4Y2hcIixcInhjbFwiLFwieGNtXCIsXCJ4Y25cIixcInhjb1wiLFwieGNyXCIsXCJ4Y3RcIixcInhjdVwiLFwieGN2XCIsXCJ4Y3dcIixcInhjeVwiLFwieGRhXCIsXCJ4ZGNcIixcInhka1wiLFwieGRtXCIsXCJ4ZG9cIixcInhkeVwiLFwieGViXCIsXCJ4ZWRcIixcInhlZ1wiLFwieGVsXCIsXCJ4ZW1cIixcInhlcFwiLFwieGVyXCIsXCJ4ZXNcIixcInhldFwiLFwieGV1XCIsXCJ4ZmFcIixcInhnYVwiLFwieGdiXCIsXCJ4Z2RcIixcInhnZlwiLFwieGdnXCIsXCJ4Z2lcIixcInhnbFwiLFwieGdtXCIsXCJ4Z25cIixcInhnclwiLFwieGd1XCIsXCJ4Z3dcIixcInhoYVwiLFwieGhjXCIsXCJ4aGRcIixcInhoZVwiLFwieGhyXCIsXCJ4aHRcIixcInhodVwiLFwieGh2XCIsXCJ4aWFcIixcInhpYlwiLFwieGlpXCIsXCJ4aWxcIixcInhpblwiLFwieGlwXCIsXCJ4aXJcIixcInhpc1wiLFwieGl2XCIsXCJ4aXlcIixcInhqYlwiLFwieGp0XCIsXCJ4a2FcIixcInhrYlwiLFwieGtjXCIsXCJ4a2RcIixcInhrZVwiLFwieGtmXCIsXCJ4a2dcIixcInhraFwiLFwieGtpXCIsXCJ4a2pcIixcInhra1wiLFwieGtsXCIsXCJ4a25cIixcInhrb1wiLFwieGtwXCIsXCJ4a3FcIixcInhrclwiLFwieGtzXCIsXCJ4a3RcIixcInhrdVwiLFwieGt2XCIsXCJ4a3dcIixcInhreFwiLFwieGt5XCIsXCJ4a3pcIixcInhsYVwiLFwieGxiXCIsXCJ4bGNcIixcInhsZFwiLFwieGxlXCIsXCJ4bGdcIixcInhsaVwiLFwieGxuXCIsXCJ4bG9cIixcInhscFwiLFwieGxzXCIsXCJ4bHVcIixcInhseVwiLFwieG1hXCIsXCJ4bWJcIixcInhtY1wiLFwieG1kXCIsXCJ4bWVcIixcInhtZlwiLFwieG1nXCIsXCJ4bWhcIixcInhtalwiLFwieG1rXCIsXCJ4bWxcIixcInhtbVwiLFwieG1uXCIsXCJ4bW9cIixcInhtcFwiLFwieG1xXCIsXCJ4bXJcIixcInhtc1wiLFwieG10XCIsXCJ4bXVcIixcInhtdlwiLFwieG13XCIsXCJ4bXhcIixcInhteVwiLFwieG16XCIsXCJ4bmFcIixcInhuYlwiLFwieG5kXCIsXCJ4bmdcIixcInhuaFwiLFwieG5pXCIsXCJ4bmpcIixcInhua1wiLFwieG5tXCIsXCJ4bm5cIixcInhub1wiLFwieG5xXCIsXCJ4bnJcIixcInhuc1wiLFwieG50XCIsXCJ4bnVcIixcInhueVwiLFwieG56XCIsXCJ4b2NcIixcInhvZFwiLFwieG9nXCIsXCJ4b2lcIixcInhva1wiLFwieG9tXCIsXCJ4b25cIixcInhvb1wiLFwieG9wXCIsXCJ4b3JcIixcInhvd1wiLFwieHBhXCIsXCJ4cGJcIixcInhwY1wiLFwieHBkXCIsXCJ4cGVcIixcInhwZlwiLFwieHBnXCIsXCJ4cGhcIixcInhwaVwiLFwieHBqXCIsXCJ4cGtcIixcInhwbFwiLFwieHBtXCIsXCJ4cG5cIixcInhwb1wiLFwieHBwXCIsXCJ4cHFcIixcInhwclwiLFwieHBzXCIsXCJ4cHRcIixcInhwdVwiLFwieHB2XCIsXCJ4cHdcIixcInhweFwiLFwieHB5XCIsXCJ4cHpcIixcInhxYVwiLFwieHF0XCIsXCJ4cmFcIixcInhyYlwiLFwieHJkXCIsXCJ4cmVcIixcInhyZ1wiLFwieHJpXCIsXCJ4cm1cIixcInhyblwiLFwieHJxXCIsXCJ4cnJcIixcInhydFwiLFwieHJ1XCIsXCJ4cndcIixcInhzYVwiLFwieHNiXCIsXCJ4c2NcIixcInhzZFwiLFwieHNlXCIsXCJ4c2hcIixcInhzaVwiLFwieHNqXCIsXCJ4c2xcIixcInhzbVwiLFwieHNuXCIsXCJ4c29cIixcInhzcFwiLFwieHNxXCIsXCJ4c3JcIixcInhzc1wiLFwieHN1XCIsXCJ4c3ZcIixcInhzeVwiLFwieHRhXCIsXCJ4dGJcIixcInh0Y1wiLFwieHRkXCIsXCJ4dGVcIixcInh0Z1wiLFwieHRoXCIsXCJ4dGlcIixcInh0alwiLFwieHRsXCIsXCJ4dG1cIixcInh0blwiLFwieHRvXCIsXCJ4dHBcIixcInh0cVwiLFwieHRyXCIsXCJ4dHNcIixcInh0dFwiLFwieHR1XCIsXCJ4dHZcIixcInh0d1wiLFwieHR5XCIsXCJ4dHpcIixcInh1YVwiLFwieHViXCIsXCJ4dWRcIixcInh1Z1wiLFwieHVqXCIsXCJ4dWxcIixcInh1bVwiLFwieHVuXCIsXCJ4dW9cIixcInh1cFwiLFwieHVyXCIsXCJ4dXRcIixcInh1dVwiLFwieHZlXCIsXCJ4dmlcIixcInh2blwiLFwieHZvXCIsXCJ4dnNcIixcInh3YVwiLFwieHdjXCIsXCJ4d2RcIixcInh3ZVwiLFwieHdnXCIsXCJ4d2pcIixcInh3a1wiLFwieHdsXCIsXCJ4d29cIixcInh3clwiLFwieHd0XCIsXCJ4d3dcIixcInh4YlwiLFwieHhrXCIsXCJ4eG1cIixcInh4clwiLFwieHh0XCIsXCJ4eWFcIixcInh5YlwiLFwieHlqXCIsXCJ4eWtcIixcInh5bFwiLFwieHl0XCIsXCJ4eXlcIixcInh6aFwiLFwieHptXCIsXCJ4enBcIl1cbixbIFwieWlcIixcInlvXCIsXCJ5YWFcIixcInlhYlwiLFwieWFjXCIsXCJ5YWRcIixcInlhZVwiLFwieWFmXCIsXCJ5YWdcIixcInlhaFwiLFwieWFpXCIsXCJ5YWpcIixcInlha1wiLFwieWFsXCIsXCJ5YW1cIixcInlhblwiLFwieWFvXCIsXCJ5YXBcIixcInlhcVwiLFwieWFyXCIsXCJ5YXNcIixcInlhdFwiLFwieWF1XCIsXCJ5YXZcIixcInlhd1wiLFwieWF4XCIsXCJ5YXlcIixcInlhelwiLFwieWJhXCIsXCJ5YmJcIixcInliZFwiLFwieWJlXCIsXCJ5YmhcIixcInliaVwiLFwieWJqXCIsXCJ5YmtcIixcInlibFwiLFwieWJtXCIsXCJ5Ym5cIixcInlib1wiLFwieWJ4XCIsXCJ5YnlcIixcInljaFwiLFwieWNsXCIsXCJ5Y25cIixcInljcFwiLFwieWRhXCIsXCJ5ZGRcIixcInlkZVwiLFwieWRnXCIsXCJ5ZGtcIixcInlkc1wiLFwieWVhXCIsXCJ5ZWNcIixcInllZVwiLFwieWVpXCIsXCJ5ZWpcIixcInllbFwiLFwieWVuXCIsXCJ5ZXJcIixcInllc1wiLFwieWV0XCIsXCJ5ZXVcIixcInlldlwiLFwieWV5XCIsXCJ5Z2FcIixcInlnaVwiLFwieWdsXCIsXCJ5Z21cIixcInlncFwiLFwieWdyXCIsXCJ5Z3NcIixcInlndVwiLFwieWd3XCIsXCJ5aGFcIixcInloZFwiLFwieWhsXCIsXCJ5aHNcIixcInlpYVwiLFwieWlmXCIsXCJ5aWdcIixcInlpaFwiLFwieWlpXCIsXCJ5aWpcIixcInlpa1wiLFwieWlsXCIsXCJ5aW1cIixcInlpblwiLFwieWlwXCIsXCJ5aXFcIixcInlpclwiLFwieWlzXCIsXCJ5aXRcIixcInlpdVwiLFwieWl2XCIsXCJ5aXhcIixcInlpeVwiLFwieWl6XCIsXCJ5a2FcIixcInlrZ1wiLFwieWtpXCIsXCJ5a2tcIixcInlrbFwiLFwieWttXCIsXCJ5a25cIixcInlrb1wiLFwieWtyXCIsXCJ5a3RcIixcInlrdVwiLFwieWt5XCIsXCJ5bGFcIixcInlsYlwiLFwieWxlXCIsXCJ5bGdcIixcInlsaVwiLFwieWxsXCIsXCJ5bG1cIixcInlsblwiLFwieWxvXCIsXCJ5bHJcIixcInlsdVwiLFwieWx5XCIsXCJ5bWFcIixcInltYlwiLFwieW1jXCIsXCJ5bWRcIixcInltZVwiLFwieW1nXCIsXCJ5bWhcIixcInltaVwiLFwieW1rXCIsXCJ5bWxcIixcInltbVwiLFwieW1uXCIsXCJ5bW9cIixcInltcFwiLFwieW1xXCIsXCJ5bXJcIixcInltc1wiLFwieW10XCIsXCJ5bXhcIixcInltelwiLFwieW5hXCIsXCJ5bmRcIixcInluZVwiLFwieW5nXCIsXCJ5bmhcIixcInlua1wiLFwieW5sXCIsXCJ5bm5cIixcInlub1wiLFwieW5xXCIsXCJ5bnNcIixcInludVwiLFwieW9iXCIsXCJ5b2dcIixcInlvaVwiLFwieW9rXCIsXCJ5b2xcIixcInlvbVwiLFwieW9uXCIsXCJ5b3NcIixcInlvdFwiLFwieW94XCIsXCJ5b3lcIixcInlwYVwiLFwieXBiXCIsXCJ5cGdcIixcInlwaFwiLFwieXBrXCIsXCJ5cG1cIixcInlwblwiLFwieXBvXCIsXCJ5cHBcIixcInlwelwiLFwieXJhXCIsXCJ5cmJcIixcInlyZVwiLFwieXJpXCIsXCJ5cmtcIixcInlybFwiLFwieXJtXCIsXCJ5cm5cIixcInlyb1wiLFwieXJzXCIsXCJ5cndcIixcInlyeVwiLFwieXNjXCIsXCJ5c2RcIixcInlzZ1wiLFwieXNsXCIsXCJ5c21cIixcInlzblwiLFwieXNvXCIsXCJ5c3BcIixcInlzclwiLFwieXNzXCIsXCJ5c3lcIixcInl0YVwiLFwieXRsXCIsXCJ5dHBcIixcInl0d1wiLFwieXR5XCIsXCJ5dWFcIixcInl1YlwiLFwieXVjXCIsXCJ5dWRcIixcInl1ZVwiLFwieXVmXCIsXCJ5dWdcIixcInl1aVwiLFwieXVqXCIsXCJ5dWtcIixcInl1bFwiLFwieXVtXCIsXCJ5dW5cIixcInl1cFwiLFwieXVxXCIsXCJ5dXJcIixcInl1dFwiLFwieXV1XCIsXCJ5dXdcIixcInl1eFwiLFwieXV5XCIsXCJ5dXpcIixcInl2YVwiLFwieXZ0XCIsXCJ5d2FcIixcInl3Z1wiLFwieXdsXCIsXCJ5d25cIixcInl3cVwiLFwieXdyXCIsXCJ5d3RcIixcInl3dVwiLFwieXd3XCIsXCJ5eGFcIixcInl4Z1wiLFwieXhsXCIsXCJ5eG1cIixcInl4dVwiLFwieXh5XCIsXCJ5eXJcIixcInl5dVwiLFwieXl6XCIsXCJ5emdcIixcInl6a1wiXVxuLFsgXCJ6YVwiLFwiemhcIixcInp1XCIsXCJ6YWFcIixcInphYlwiLFwiemFjXCIsXCJ6YWRcIixcInphZVwiLFwiemFmXCIsXCJ6YWdcIixcInphaFwiLFwiemFpXCIsXCJ6YWpcIixcInpha1wiLFwiemFsXCIsXCJ6YW1cIixcInphb1wiLFwiemFwXCIsXCJ6YXFcIixcInphclwiLFwiemFzXCIsXCJ6YXRcIixcInphdVwiLFwiemF2XCIsXCJ6YXdcIixcInpheFwiLFwiemF5XCIsXCJ6YXpcIixcInpiYVwiLFwiemJjXCIsXCJ6YmVcIixcInpibFwiLFwiemJ0XCIsXCJ6YnVcIixcInpid1wiLFwiemNhXCIsXCJ6Y2hcIixcInpkalwiLFwiemVhXCIsXCJ6ZWdcIixcInplaFwiLFwiemVuXCIsXCJ6Z2FcIixcInpnYlwiLFwiemdoXCIsXCJ6Z21cIixcInpnblwiLFwiemdyXCIsXCJ6aGJcIixcInpoZFwiLFwiemhpXCIsXCJ6aG5cIixcInpod1wiLFwiemh4XCIsXCJ6aWFcIixcInppYlwiLFwiemlrXCIsXCJ6aWxcIixcInppbVwiLFwiemluXCIsXCJ6aXJcIixcInppd1wiLFwieml6XCIsXCJ6a2FcIixcInprYlwiLFwiemtkXCIsXCJ6a2dcIixcInpraFwiLFwiemtrXCIsXCJ6a25cIixcInprb1wiLFwiemtwXCIsXCJ6a3JcIixcInprdFwiLFwiemt1XCIsXCJ6a3ZcIixcInprelwiLFwiemxhXCIsXCJ6bGVcIixcInpsalwiLFwiemxtXCIsXCJ6bG5cIixcInpscVwiLFwiemxzXCIsXCJ6bHdcIixcInptYVwiLFwiem1iXCIsXCJ6bWNcIixcInptZFwiLFwiem1lXCIsXCJ6bWZcIixcInptZ1wiLFwiem1oXCIsXCJ6bWlcIixcInptalwiLFwiem1rXCIsXCJ6bWxcIixcInptbVwiLFwiem1uXCIsXCJ6bW9cIixcInptcFwiLFwiem1xXCIsXCJ6bXJcIixcInptc1wiLFwiem10XCIsXCJ6bXVcIixcInptdlwiLFwiem13XCIsXCJ6bXhcIixcInpteVwiLFwiem16XCIsXCJ6bmFcIixcInpuZFwiLFwiem5lXCIsXCJ6bmdcIixcInpua1wiLFwiem5zXCIsXCJ6b2NcIixcInpvaFwiLFwiem9tXCIsXCJ6b29cIixcInpvcVwiLFwiem9yXCIsXCJ6b3NcIixcInpwYVwiLFwienBiXCIsXCJ6cGNcIixcInpwZFwiLFwienBlXCIsXCJ6cGZcIixcInpwZ1wiLFwienBoXCIsXCJ6cGlcIixcInpwalwiLFwienBrXCIsXCJ6cGxcIixcInpwbVwiLFwienBuXCIsXCJ6cG9cIixcInpwcFwiLFwienBxXCIsXCJ6cHJcIixcInpwc1wiLFwienB0XCIsXCJ6cHVcIixcInpwdlwiLFwienB3XCIsXCJ6cHhcIixcInpweVwiLFwienB6XCIsXCJ6cWVcIixcInpyYVwiLFwienJnXCIsXCJ6cm5cIixcInpyb1wiLFwienJwXCIsXCJ6cnNcIixcInpzYVwiLFwienNrXCIsXCJ6c2xcIixcInpzbVwiLFwienNyXCIsXCJ6c3VcIixcInp0ZVwiLFwienRnXCIsXCJ6dGxcIixcInp0bVwiLFwienRuXCIsXCJ6dHBcIixcInp0cVwiLFwienRzXCIsXCJ6dHRcIixcInp0dVwiLFwienR4XCIsXCJ6dHlcIixcInp1YVwiLFwienVoXCIsXCJ6dW1cIixcInp1blwiLFwienV5XCIsXCJ6d2FcIixcInp4eFwiLFwienliXCIsXCJ6eWdcIixcInp5alwiLFwienluXCIsXCJ6eXBcIixcInp6YVwiLFwienpqXCJdXG5dO1xuXG5cbmV4cG9ydCBjbGFzcyBMYW5nVXRpbCB7XG5cbiAgICAvKiBEZXRlcm1pbmUgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgQkNQIDQ3IHN0cmluZyAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNCY3A0NyhsYW5nU3RyOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvXigoW2EtekEtWl17MiwzfSgtW2EtekEtWl0oLVthLXpBLVpdezN9KXswLDJ9KT98W2EtekEtWl17NH18W2EtekEtWl17NSw4fSkoLVthLXpBLVpdezR9KT8oLShbYS16QS1aXXsyfXxbMC05XXszfSkpPygtKFswLTlhLXpBLVpdezUsOH18WzAtOV1bYS16QS1aXXszfSkpKigtWzAtOWEtd3ktekEtV1ktWl0oLVthLXpBLVowLTldezIsOH0pKykqKC14KC1bYS16QS1aMC05XXsxLDh9KSspP3x4KC1bYS16QS1aMC05XXsxLDh9KSt8KGVuLUdCLW9lZHxpLWFtaXxpLWJubnxpLWRlZmF1bHR8aS1lbm9jaGlhbnxpLWhha3xpLWtsaW5nb258aS1sdXh8aS1taW5nb3xpLW5hdmFqb3xpLXB3bnxpLXRhb3xpLXRheXxpLXRzdXxzZ24tQkUtRlJ8c2duLUJFLU5MfHNnbi1DSC1ERXxhcnQtbG9qYmFufGNlbC1nYXVsaXNofG5vLWJva3xuby1ueW58emgtZ3VveXV8emgtaGFra2F8emgtbWlufHpoLW1pbi1uYW58emgteGlhbmcpKSQvLnRlc3QobGFuZ1N0cilcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5ID0gbGFuZ1N0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocHJpbWFyeS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkgPSBwcmltYXJ5LnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJpbWFyeS5tYXRjaCgvW2Etel17MiwzfS8pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gcWFhLi5xdHpcbiAgICAgICAgaWYgKHByaW1hcnkubGVuZ3RoID09PSAzIFxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQXQoMCkgPT09IFwicVwiXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpIDw9IDExNlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA8PSAxMjIpIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRQcmltYXJ5TGFuZ3NbcHJpbWFyeS5jaGFyQ29kZUF0KDApLTk3XS5pbmNsdWRlcyhwcmltYXJ5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1hdGNoUHJpbWFyeUxhbmcobGFuZzE6IHN0cmluZywgbGFuZzI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeTEgPSBsYW5nMTtcbiAgICAgICAgaWYgKHByaW1hcnkxLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeTEgPSBwcmltYXJ5MS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJpbWFyeTIgPSBsYW5nMjtcbiAgICAgICAgaWYgKHByaW1hcnkyLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeTIgPSBwcmltYXJ5Mi5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJpbWFyeTEudG9Mb3dlckNhc2UoKSA9PT0gcHJpbWFyeTIudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucywgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCB9IGZyb20gXCIuLi8uLi8uLi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi8uLi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi8uLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcyB9IGZyb20gXCIuLi8uLi8uLi8uLi92NC91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNsYXNzIFJQVFV0aWwge1xuXG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUoZWxlLCBhdHRyTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jaW50cm9zdGF0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb21ib2JveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJsaXN0Ym94XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaXN0Ym94XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsb2dcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnVcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnViYXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNlcGFyYXRvclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgLy8gTm90IHN1cmUgaG93IHRvIGVuY29kZSBtaW4vbWF4IChvciBub3cgaW4gMS4yIC0gXCJoYXMgbm8gdmFsdWVcIilcbiAgICAgICAgICAgIC8vXCJhcmlhLXZhbHVlbm93XCI6IFwiMFwiIFRPRE86IGF0IHJpc2s6IG1heWJlIGRlbGV0ZSBhZnRlciBBUklBIDEuMiByZWFjaGVzIHByb3Bvc2VkIHJlY1xuICAgICAgICAgICAgLy8gUHJvYmFibHkganVzdCBkZWxldGUgc3BpbmJ1dHRvbiBmcm9tIHRoaXMgbGlzdCBjb21wbGV0ZWx5IGFuZCBsZXQgdXNlciBhZ2VudHMgaGFuZGxlIFwiZGVmYXVsdHNcIlxuICAgICAgICB9LFxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgICAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogXCJmYWxzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcInRyZWVcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jYXJpYS1hdG9taWNcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cyA9IHtcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogXCJub25lXCIsXG4gICAgICAgIFwiYXJpYS1idXN5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1saXZlXCI6IFwib2ZmXCIsXG4gICAgICAgIFwiYXJpYS1tb2RhbFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtcmVhZG9ubHlcIjogXCJmYWxzZVwiLFxuICAgICAgICAvL1wiYXJpYS1yZWxldmFudFwiOiBcImFkZGl0aW9ucyB0ZXh0XCIsIFRPRE86IGFyZSBtdWx0aXBsZSB2YWx1ZXMgc3VwcG9ydGVkP1xuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtc29ydFwiOiBcIm5vbmVcIlxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2h0bWwtYXR0cmlidXRlLXN0YXRlLWFuZC1wcm9wZXJ0eS1tYXBwaW5nc1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3MgPSB7XG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJmb3JtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiICsgZS5oYXNBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWVudWl0ZW1cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiICsgZS5oYXNBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcImluZGV0ZXJtaW5hdGVcIikpIHJldHVybiBcIm1peGVkXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgXCJidXR0b25cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWVsZHNldFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0Z3JvdXBcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHtcbiAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcIm9wZW5cIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRpYWxvZ1wiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcIm9wZW5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiB7XG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpKSByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZSBuYW1lIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMoZWxlbSkge1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGFyaWEgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJpYUF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgaHRtbCBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBodG1sIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGh0bWxBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOyBcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goe25hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgaW1wbGljaXQgYXJpYSBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUsIGFuIGlucHV0IHdpdGggY2hlY2tlZCBpcyBlcXVpdmFsZW50IHRvIGFyaWEtY2hlY2tlZD1cInRydWVcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBpdCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgIGxldCByZXRWYWwgPSBlbGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmIHJldFZhbC50cmltKCkgPT09IFwiXCIpIHsgLy9cIlwiIGlzIHRyZWF0ZWQgYXMgZmFsc2UsIHNvIHdlIG5lZWQgcmV0dXJuIGl0IGJlZm9yZSB0aGUgYmVsb3cgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlbiBkZXRlcm1pbmUgaW1wbGljaXQgdmFsdWVzIGZyb20gb3RoZXIgYXR0cmlidXRlc1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHRhZyA9IGVsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBSUFRVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdW3RhZ107XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiKlwiIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXVtcIipcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayByb2xlLWJhc2VkIGRlZmF1bHRzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzICYmIGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGlsbCBub3QgZGVmaW5lZD8gQ2hlY2sgZ2xvYmFsIGRlZmF1bHRzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCIgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogdHJ1ZSxcbiAgICAgICAgXCJkaXZcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB4bGluazpocmVmPz8gc2VlIHN2Z1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3VtbWFyeSBjaGlsZCBvZiBhIGRldGFpbHMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZSBcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJyBcbiAgICAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtPT5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JylbMF0sIGVsZW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vZGV0YWlscyBlbGVtZW50IHdpdGhvdXQgYSBkaXJlY3Qgc3VtbWFyeSBjaGlsZCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4gJiYgWy4uLmVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtPT5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JykubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3b3JkQ291bnQoc3RyKSA6IG51bWJlciB7XG4gICAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdCgvXFxzKy9nKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBkZXRlY3RzIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBpbiB0aGUgdGFiIG9yZGVyLlxuICAgICAqIEhvd2V2ZXIsIHRoaXMgZWxlbWVudCBtYXkgZGVsZWdhdGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50IHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgKiBBbHNvLCBmb2N1cyB2YXJpZXMgYnkgYnJvd3Nlci4uLiAgc3RpY2tpbmcgdG8gdGhpbmdzIHRoYXQgYXJlIGZvY3VzYWJsZSBvbiBjaHJvbWUgYW5kIGZpcmVmb3hcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFiYmFibGUoZWxlbWVudCkge1xuICAgICAgICAvLyBVc2luZyBodHRwczovL2FsbHlqcy5pby9kYXRhLXRhYmxlcy9mb2N1c2FibGUuaHRtbFxuICAgICAgICAvLyBIYW5kbGUgdGhlIGV4cGxpY2l0IGNhc2VzIGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBsaWNpdCBjYXNlcyBoYW5kbGVkIC0gbm93IHRoZSBpbXBsaWNpdFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBSUFRVdGlsLnRhYlRhZ01hcCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFJQVFV0aWwudGFiVGFnTWFwW25vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09IDEgJiYgIW53LmJFbmRUYWcgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiAgQnVnIHJlcG9ydHMgaGF2ZSBiZWVuIGFib3V0IHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMuXG4gICAgcHVibGljIHN0YXRpYyBpc0h0bWxFcXVpdihub2RlLCBodG1sRXF1aXYpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChodG1sRXF1aXYuaW5kZXhPZihcImNoZWNrYm94XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbEVxdWl2LmluZGV4T2YoXCJyYWRpb1wiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gdHlwZSA9PT0gXCJyYWRpb1wiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub3JtYWxpemVTcGFjaW5nKHMpIHtcbiAgICAgICAgcmV0dXJuIHMudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBub25FeGlzdGFudElEcyhub2RlLCB0YXJnZXRpZHMpIHtcbiAgICAgICAgbGV0IHJldHVybm5vdGZvdW5kaWRzID0gJyc7XG4gICAgICAgIGlmIChSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGFyZ2V0aWRzKS5sZW5ndGggPCAxKSByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG5cbiAgICAgICAgbGV0IHRhcmdldEFycmF5ID0gdGFyZ2V0aWRzLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHhwID0gXCIvLypbQGlkPSdcIiArIHRhcmdldEFycmF5W2ldICsgXCInXVwiO1xuICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBub2RlLCBkb2MuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgaWYgKCFyKSByZXR1cm5ub3Rmb3VuZGlkcyArPSB0YXJnZXRBcnJheVtpXSArICcsICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhyZXR1cm5ub3Rmb3VuZGlkcykubGVuZ3RoID49IDIpXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9IHJldHVybm5vdGZvdW5kaWRzLnN1YnN0cmluZygwLCByZXR1cm5ub3Rmb3VuZGlkcy5sZW5ndGggLSAyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgcmV0dXJuIHJldHVybm5vdGZvdW5kaWRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RG9jRWxlbWVudHNCeVRhZyhlbGVtLCB0YWdOYW1lKSB7XG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKSBhcyBhbnk7XG4gICAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVF9ET0NFTEVNU0JZVEFHXCIsIGNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVbdGFnTmFtZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWdIaWRkZW4ocGFyZW50RWxlbSwgdGFnTmFtZSwgaWdub3JlSGlkZGVuLCBjb25zaWRlckhpZGRlblNldHRpbmcpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnRFbGVtLmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHBhcmVudCB0byBidWlsZCBhIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0XG4gICAgICAgIC8vIG1hdGNoIHRoZSB0YWdOYW1lIHByb3ZpZGVkXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPSBudWxsKSB7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgY2hpbGRyZW4gaW50byB0aGUgcmV0dXJuIGFycmF5IGlmIHRoZXkgbWF0Y2ggd2l0aCB0YWduYW1lLlxuICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHRhZ05hbWUpIHtcblxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWdub3JlaGlkZGVuIHdhcyBzZXQgdG8gdHJ1ZSwgdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVja1xuICAgICAgICAgICAgICAgIC8vIGFuZCBpbiB0aGUgY2FzZSB0aGUgbm9kZSBpcyBub3QgdmlzaWxibGUgd2UgbW9yZSB0byB0aGVzZXMgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIGNvdXBsZSBvZiBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgaWdub3JlZCBvciBub3QuXG4gICAgICAgICAgICAgICAgLy8gIDEuIFdoZW4gaWdub3JlSGlkZGVuIGlzIHNldCB0byB0cnVlIHVwZnJvbnQsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGVcbiAgICAgICAgICAgICAgICAvLyAgMi4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIC8vICAyLjEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICBpZiAoKGlnbm9yZUhpZGRlbiB8fCAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmICFSUFRVdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChjaGlsZCkpKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudFxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgbWF0Y2ggZ2l2ZW4gcm9sZXMocykuXG4gICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHkgd2lsbCBub3QgY29uc2lkZXIgaW1wbGljaXQgcm9sZXMuXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtkb2N1bWVudH0gZG9jIC0gVGhlIGRvY3VtZW50IG5vZGVcbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG1hdGNoZWQgdGhlIHJvbGUocykgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbihkb2MsIHJvbGVzLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIHJvbGUgdG8gZWxlbWVudCBhc3NvaWNhdGlvbiBpcyBhbHJlYWR5IG1hZGUsIGFuZCBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBoYXNBdHRyaWJ1dGVcbiAgICAgICAgLy8gd2UgY2FuIGp1c3QgdXNlIHRoYXQgb25lIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBuZXcgb25lLlxuICAgICAgICBsZXQgcm9sZVRvRWxlbXMgPSBudWxsO1xuICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICByb2xlVG9FbGVtcyA9IGdldENhY2hlKGRvYywgXCJSUFRVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIG51bGwpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyBCdWlsZCB0aGUgbmV3IHJvbGUgdG8gZWxlbWVudCwgdGhpcyBpcyB3aGVyZSB3ZSBsb29wIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBhbmQgZXh0cmFjdCBhbGwgdGhlXG4gICAgICAgIC8vIGVsZW1lbnRzIGJzYWVkIG9uIHJvbGVzLlxuICAgICAgICBpZiAocm9sZVRvRWxlbXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJlLWluaXRpYWxpemUgdGhlIHJvbGVUb0VsZW1zIGhhc2hcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0ge307XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgYm9keSBvZiB0aGUgZG9jXG4gICAgICAgICAgICBsZXQgcm9vdCA9IGRvYy5ib2R5O1xuXG4gICAgICAgICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgYXJlIGF0IHRoZSB2ZXJ5IHBhcmVudCBub2RlIG9mIHRoZSBlbnRpcmUgcGFnZSwgc28gdGhhdCB3ZSBjYW4gbG9vcCB0aHJvdWdoXG4gICAgICAgICAgICAvLyBhbGwgdGhlIG5vZGVzLlxuICAgICAgICAgICAgd2hpbGUgKERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICAgICAgcm9vdCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQnVpbGQgYSBub2Rld2FsdGVyIGJhc2VkIG9mIHRoZSByb290IG5vZGUsIHRoaXMgbm9kZSB3YWx0ZXIgd2lsbCBiZSB1c2UgbG9vcCBvdmVyIGFsbCB0aGUgbm9kZXNcbiAgICAgICAgICAgIC8vIGFuZCBidWlsZCB0aGUgcm9sZXMgdG8gRWxlbWVudCBjb3JhbGF0aW9uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihyb290KTtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBlbnRpcmUgZG9jL2xpc3Qgb2Ygbm9kZXMgdG8gYnVpbGQgdGhlIHJvbGUgdG8gZWxlbWVudCBtYXBcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBidWlsZCBhbiByb2xlVG9FbGVtcyBoYXNoIHdoaWNoIGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LlxuICAgICAgICAgICAgLy8gcm9sZVRvRWxlbXMgPSB7XG4gICAgICAgICAgICAvLyAgICBkb2N1bWVudDogW3tkaXZ9LHthYmJyfSx7dmFyfV0sXG4gICAgICAgICAgICAvLyAgICBtYWluOiBbe2Rpdn1dLFxuICAgICAgICAgICAgLy8gICAgbmF2aWdhdGlvbjogW3tkaXZ9XVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmVsZW0oKSkgY29udGludWU7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2hlY2sgdGhlIGVsZW1lbnRzIHdoaWNoIGhhdmUgdGhlIHJvbGUgYXR0cmlidXRlIGFzc2ljaWF0ZWQgdG8gdGhlbVxuICAgICAgICAgICAgICAgIGlmICghbncuYkVuZFRhZykge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgbm9kZSBoYXMgcm9sZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5lbGVtKCkgJiYgbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSByb2xlcyB0aGF0IGFyZSBhc3NpZ25lZCB0byB0aGlzIGVsZW1lbnQsIGNhbiBoYXZlIG11bHRpcGxlIHJvbGVzIG9uIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBzcGxpdCBieSBzcGFjZSwgc28gd2UgbmVlZCB0byBleHRyYWN0IGFsbCBvZiB0aGVtIGludG8gYW4gYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIHdSb2xlcy5sZW5ndGggPT09IDAgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcm9sZXMgYW5kIGFzc2lnbmVkIHRoaXMgbm9kZSB0byBhbGwgdGhlcyByb2xlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGUgcm9sZSBrZXkgaXMgbm90IGFscmVhZHkgaW4gdGhlIHJvbGVUb0VsZW1zIGhhc2gsIGNvbnN0cnVjdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUga2V5IGFuZCBhc3NpZ24gZW1wdHkgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh3Um9sZXNbaV0gaW4gcm9sZVRvRWxlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGFycmF5IGZvciB0aGUgcm9sZVxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXS5wdXNoKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHJvbGVUb0VsZW1zIGhhc2ggbWFwIGFzIGEgZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFX0lNUExJQ0lUXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdXNlciBkZWZpbmVkIGVsZW1lbnQncyByb2xlcyBmcm9tIGRvbS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJvbGVzIC0gbGlzdCBvZiB1c2VyIGRlZmluZWQgcm9sZXMgaW4gdGhlIGVsZW1lbnQgcm9sZSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRSb2xlcyhlbGU6IEVsZW1lbnQpIDogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRSb2xlcyhlbGUsIGZhbHNlKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyBlbGVtZW50J3Mgcm9sZXMuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGZpbmRzIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgYXR0cmlidXRlIHJvbGVzIGFuZCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb2xlcyhlbGU6IEVsZW1lbnQsIGNvbnNpZGVySW1wbGljaXRSb2xlczogYm9vbGVhbikgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vYWRkIGltcGxpY2l0IHJvbGVzIHRvIHRoZSBhdHRyaWJ1dGVzIHJvbGVzLlxuICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVtZW50XG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoZSBpbXBsaWNpdCByb2xlIG9yIFtdIGlmIGRvZXNuJ3QgZXhpc3RcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdFJvbGUoZWxlKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKCFlbGUgfHwgZWxlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gW107XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzIDogc3RyaW5nW10gPSBnZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgbnVsbCk7XG4gICAgICAgIGlmICghaW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gUlBUVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KGVsZSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhcImdlbmVyaWNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlICdnZW5lcmljJyByb2xlIGlzIG9ubHkgYWxsb3dlZCBpZiBhIHZhbGlkIGFyaWEgYXR0cmlidXRlIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbUFyaWFBdHRyaWJ1dGVzID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKGVsZSwgXCJSUFRVdGlsX0ltcGxpY2l0Um9sZVwiLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0dGVybiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1snZ2VuZXJpYyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5yZXFQcm9wcyAmJiBwYXR0ZXJuLnJlcVByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocGF0dGVybi5yZXFQcm9wcywgcm9sZUF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoQVJJQURlZmluaXRpb25zLmdsb2JhbFByb3BlcnRpZXMsIHJvbGVBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7IFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAnZ2VuZXJpYycgcm9sZSBpZiByb2xlQXR0cmlidXRlcyBkb2Vzbid0IGNvbnRhaW4gYW55IG9mIGRvbUFyaWFBdHRyaWJ1dGVzIFxuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCAmJiAhcm9sZUF0dHJpYnV0ZXMuc29tZShhdHRyPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgaW1wbGljaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0O1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUoZWxlLCBcIlJQVFV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0Um9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBvZiB0aGUgcm9sZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSB0aGUgcm9sZVxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcHJvcGVydGllcyAtIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgZWxlKSB7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0pIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxUHJvcHM7XG4gICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIHNlcGFyYXRvclxuICAgICAgICAgICAgaWYgKHJvbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBlbGUgJiYgUlBUVXRpbC5pc0ZvY3VzYWJsZShlbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImFyaWEtdmFsdWVub3dcIl0sIHJlcXVpcmVkQXR0cmlidXRlcyB8fCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRBdHRyaWJ1dGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGlmIGEgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgaWYgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZXMgYXMgaW1wbGljaXQgcm9sZS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aCBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlICE9PSBudWxsICYmIGltcGxpY2l0Um9sZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGltcGxpY2l0Um9sZSwgd1JvbGVzKTtcbiAgICAgICAgICAgICAgICAvL2lmIHJvbGUgaXMgYXJyYXkgbG9vcCB0aHJ1IGFuZCBzZWUgaWYgYW55ICBvZiB0aGUgaW1wbGljaXQgcm9sZSBwcmVzZW50IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB3Um9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSByb2xlLCBpbmNsdWRpbmcgdGhlIGltcGxpZWQgcm9sZSBpZiByb2xlIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVwbGFjaW5nIHRoZSBoYXNSb2xlIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlSW5TZW1hbnRpY3MoZWxlLCByb2xlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJvbGVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZVNwZWNpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvbGVTcGVjaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgbGV0IGltcFJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0FueVJvbGUoZWxlLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIGV4aXN0LlxuICAgICAgICAvL05vdGU6IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGxldCBpbXBSb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wUm9sZXMgIT09IG51bGwgJiYgaW1wUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RhdGFUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEoUlBUVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJub25lXCIpIHx8IFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJSUFRVdGlsX2lzQ29tcGxleERhdGFUYWJsZVwiIGluIHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0YWJsZS5SUFRVdGlsX2lzQ29tcGxleERhdGFUYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0NvbXBsZXhUYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0YWJsZSAmJiBSUFRVdGlsLmlzRGF0YVRhYmxlKHRhYmxlKSkge1xuXG4gICAgICAgICAgICBsZXQgdGhOb2RlcyA9IG51bGwsXG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJOb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XG4gICAgICAgICAgICBsZXQgdHJOb2RlQ291bnQgPSB0ck5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0ZE5vZGVDb3VudCA9IDAsXG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRyTm9kZXNIYXZpbmdPbmx5VGhOb2RlcyA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhaXNDb21wbGV4VGFibGUgJiYgaSA8IHRyTm9kZUNvdW50OyArK2kpIHtcblxuICAgICAgICAgICAgICAgIHRoTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIik7XG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IHRyTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcbiAgICAgICAgICAgICAgICB0aE5vZGVDb3VudCA9IHRoTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRkTm9kZUNvdW50ID0gdGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGROb2RlQ291bnQgIT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRyIGVsZW1lbnQgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgdGQgZWxlbWVudCBhbmQgdHdvIG9yIG1vcmUgdGggZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAxO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGggZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGogPCB0aE5vZGVDb3VudDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IodGhOb2Rlc1tqXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ZCBlbGVtZW50IHdpdGggYSByb3dzcGFuIG9yIGNvbHNwYW4gYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgaGVhZGVycyBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb250YWlucyBtb3JlIHRoYW4gdHdvIElEUkVGc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGsgPCB0ZE5vZGVDb3VudDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSAmJiBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGROb2Rlc1trXS5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKS5zcGxpdChcIiBcIikubGVuZ3RoID4gMikpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih0ZE5vZGVzW2tdLCBcInRhYmxlXCIpID09PSB0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdHdvIG9yIG1vcmUgdHIgZWxlbWVudHMgdGhhdCBjb250YWluIG9ubHkgdGggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoTm9kZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKyt0ck5vZGVzSGF2aW5nT25seVRoTm9kZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPT09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhlYWROb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhlYWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXNMZW5ndGggPSB0aGVhZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGVhZE5vZGVzTGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHRoZWFkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzTGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoZWFkIGVsZW1lbnQgdGhhdCBjb250YWlucyB0d28gb3IgbW9yZSB0ciBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoZWFkTm9kZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKS5sZW5ndGggPiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSAmJiB0ck5vZGVDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aE5vZGVDb3VudCA+IDAgJiYgIVJQVFV0aWwuaXNUYWJsZUhlYWRlckluRmlyc3RSb3dPckNvbHVtbih0YWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGFibGUuUlBUVXRpbF9pc0NvbXBsZXhEYXRhVGFibGUgPSBpc0NvbXBsZXhUYWJsZTtcblxuICAgICAgICByZXR1cm4gaXNDb21wbGV4VGFibGU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgaXNUYWJsZUhlYWRlckluRmlyc3RSb3dPckNvbHVtbihydWxlQ29udGV4dCkge1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJvd3MgPSBydWxlQ29udGV4dC5yb3dzO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlyc3Qgcm93IGlzIGFsbCBUSCdzXG4gICAgICAgIGlmIChyb3dzICE9IG51bGwgJiYgcm93cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3RSb3cgPSByb3dzWzBdO1xuICAgICAgICAgICAgcGFzc2VkID0gZmlyc3RSb3cuY2VsbHMubGVuZ3RoID4gMCAmJiBSUFRVdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZmlyc3RSb3csIFwidGRcIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCByb3cgaXNuJ3QgYSBoZWFkZXIgcm93LCB0cnkgdGhlIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCB0aGUgZmlyc3QgY29sdW1uIGhhcyBhbGwgVEgncyB1bmxlc3Mgd2UgZmluZCBhIFREIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCByb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIGNlbGxzIGluIHRoaXMgcm93LCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFyb3dzW2ldLmNlbGxzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzW2ldLmNlbGxzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwidGRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSAtIGJvdGggZmlyc3Qgcm93IGFuZCBmaXJzdCBjb2x1bW4gYXJlIGhlYWRlcnMsIGJ1dCB0aGV5IGRpZCBub3QgdXNlXG4gICAgICAgICAgICAgICAgLy8gYSB0aCBmb3IgdGhlIHVwcGVyLWxlZnQgY2VsbFxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IHBhc3NlZCAmJiBpIDwgZmlyc3RSb3cuY2VsbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmlyc3RSb3cuY2VsbHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIHRoYXQncyBva2F5IHRvby5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIXJvd3NbaV0uY2VsbHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzW2ldLmNlbGxzWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJ0ZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShub2RlLCBcImdyaWRcIikgIT0gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0xheW91dFRhYmxlKHRhYmxlTm9kZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJub25lXCIpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVFeHQodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC9cXC4oKFteOz8jXFwuXXxeJCkrKShbOz8jXXwkKS8pO1xuICAgICAgICBpZiAobSAhPSBudWxsICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi5cIiArIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RmlsZUFuY2hvcih1cmwpIHtcbiAgICAgICAgbGV0IG0gPSB1cmwubWF0Y2goLyMoKFteOz9cXC5dfF4kKSspKFs7P118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gbVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaGVja09iakVtYmVkKG5vZGUsIGV4dFRlc3QsIG1pbWVUZXN0KSB7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAobm9kZU5hbWUgIT0gXCJvYmplY3RcIiAmJiBub2RlTmFtZSAhPSBcImVtYmVkXCIgJiZcbiAgICAgICAgICAgIG5vZGVOYW1lICE9IFwiYVwiICYmIG5vZGVOYW1lICE9IFwiYXJlYVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgbWltZSB0eXBlXG4gICAgICAgIGlmICghcmV0VmFsICYmIG5vZGUuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IG1pbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldFZhbCA9IG1pbWVUZXN0KG1pbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmV0VmFsICYmIG5vZGUuaGFzQXR0cmlidXRlKFwiY29kZXR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJjb2RldHlwZVwiKTtcbiAgICAgICAgICAgIHJldFZhbCA9IG1pbWVUZXN0KG1pbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIGZpbGVuYW1lXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImVtYmVkXCIpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJhXCIgfHwgbm9kZU5hbWUgPT09IFwiYXJlYVwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKFwiZGF0YVwiKSkge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09PSBudWxsKSBmaWxlbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIHJldFZhbCA9IGV4dFRlc3QoZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBmaWxlbmFtZXMgaW4gdGhlIHBhcmFtc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlTmFtZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBDaGVjayBIaWRkZW4gT3B0aW9uIGlzIHNldCB0aGVuIGNvbXBseSB3aXRoIHRoYXQgc2V0dGluZ1xuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IFJQVFV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihub2RlLCBcInBhcmFtXCIsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIHBhcmFtcyAhPSBudWxsICYmIGkgPCBwYXJhbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBwYXJhbXNbaV0uaGFzQXR0cmlidXRlKFwidmFsdWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgZXh0VGVzdChSUFRVdGlsLmdldEZpbGVFeHQocGFyYW1zW2ldLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0F1ZGlvT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBSUFRVdGlsLmlzQXVkaW9FeHQsIGZ1bmN0aW9uIChtaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbWltZS5zdGFydHNXaXRoKFwiYXVkaW9cIilcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb0V4dChleHQpIHtcbiAgICAgICAgbGV0IGF1ZGlvX2V4dGVuc2lvbnMgPSBbXCIuYWlmXCIsIFwiLmFpZmNcIiwgXCIuYWlmZlwiLCBcIi5haXJcIiwgXCIuYXNmXCIsIFwiLmF1XCIsIFwiLmNkYVwiLFxuICAgICAgICAgICAgXCIuZHNtXCIsIFwiLmRzc1wiLCBcIi5kd2RcIiwgXCIuaWZmXCIsIFwiLmthclwiLCBcIi5tMWFcIiwgXCIubWVkXCIsXG4gICAgICAgICAgICBcIi5tcDJcIiwgXCIubXAzXCIsIFwiLm1wYVwiLCBcIi5wY21cIiwgXCIucmFcIiwgXCIucmFtXCIsIFwiLnJtXCIsXG4gICAgICAgICAgICBcIi5zYW1cIiwgXCIuc2ZcIiwgXCIuc2YyXCIsIFwiLnNtcFwiLCBcIi5zbmRcIiwgXCIuc3Z4XCIsIFwiLnVsXCIsXG4gICAgICAgICAgICBcIi52b2NcIiwgXCIud2F2XCIsIFwiLndtYVwiLCBcIi53dmVcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBhdWRpb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc1ZpZGVvT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBSUFRVdGlsLmlzVmlkZW9FeHQsIGZ1bmN0aW9uIChtaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbWltZS5zdGFydHNXaXRoKFwidmlkZW9cIikgfHxcbiAgICAgICAgICAgICAgICBtaW1lLnN0YXJ0c1dpdGgoXCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb0V4dChleHQpIHtcbiAgICAgICAgbGV0IHZpZGVvX2V4dGVuc2lvbnMgPSBbXCIuYXNmXCIsIFwiLmF2aVwiLCBcIi5kaXZ4XCIsIFwiLmR2XCIsIFwiLm0xdlwiLCBcIi5tMnBcIiwgXCIubTJ2XCIsIFwiLm1vb3ZcIixcbiAgICAgICAgICAgIFwiLm1vdlwiLCBcIi5tcDRcIiwgXCIubXBlZ1wiLCBcIi5tcGdcIiwgXCIubXB2XCIsIFwiLm9nbVwiLCBcIi5vbWZcIiwgXCIucXRcIixcbiAgICAgICAgICAgIFwiLnJtXCIsIFwiLnJ2XCIsIFwiLnNtaVwiLCBcIi5zbWlsXCIsIFwiLnN3ZlwiLCBcIi52b2JcIiwgXCIud212XCIsIFwiLnJtdmJcIixcbiAgICAgICAgICAgIFwiLm12YlwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBSUFRVdGlsLnZhbEluQXJyYXkoZXh0LnRvTG93ZXJDYXNlKCksIHZpZGVvX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSW1hZ2VPYmpFbWJlZExpbmsobm9kZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5jaGVja09iakVtYmVkKG5vZGUsIFJQVFV0aWwuaXNJbWdFeHQsIGZ1bmN0aW9uIChtaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbWltZS5zdGFydHNXaXRoKFwiaW1hZ2VcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICBsZXQgaW1hZ2VfZXh0ZW5zaW9ucyA9IFtcIi5ibXBcIiwgXCIuZ2lmXCIsIFwiLmpwZ1wiLCBcIi5qcGVnXCIsIFwiLnBjeFwiLCBcIi5wbmdcIl07XG4gICAgICAgIHJldHVybiBSUFRVdGlsLnZhbEluQXJyYXkoZXh0LnRvTG93ZXJDYXNlKCksIGltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGhhc1RyaWdnZXJlZChkb2MsIGlkKSB7XG4gICAgICAgIHJldHVybiBnZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gZ2V0Q2FjaGUoZG9jLCBpZCwgZmFsc2UpO1xuICAgICAgICBzZXRDYWNoZShkb2MsIGlkLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRyaWdnZXJlZDtcbiAgICB9XG5cbiAgICAvKiBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gYXJyYXkgKi9cbiAgICBwdWJsaWMgc3RhdGljIHZhbEluQXJyYXkodmFsdWUsIGFycikge1xuICAgICAgICBmb3IgKGxldCBpZHggaW4gYXJyKSB7XG4gICAgICAgICAgICBpZiAoYXJyW2lkeF0gPT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAqIEBwYXJhbSB0YWdOYW1lcyBzdHJpbmcsIGFycmF5LCBvciBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHRhZ3MgdG8gc2VhcmNoIGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3IoZWxlbWVudCwgdGFnTmFtZXMpIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGhpc1RhZyA9IHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mICh0YWdOYW1lcykgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1RhZyA9PT0gdGFnTmFtZXMudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeCBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZXNbaWR4XSA9PT0gdGhpc1RhZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNUYWcgaW4gdGFnTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50MSBhbmQgZWxlbWVudDIgYXJlIHNpYmxpbmdzXG4gICAgcHVibGljIHN0YXRpYyBpc1NpYmxpbmcoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gICAgICAgIGlmIChlbGVtZW50MSAmJiBlbGVtZW50Mikge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKSAmJiBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50MSkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50MSkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gZWxlbWVudDIpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgcGFyZW50IG5vZGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gVGhlIHJvbGUgdG8gc2VhcmNoIGZvciBvbiBhbiBlbGVtZW50IHVuZGVyIHRoZSBwcm92aWRlZCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyh3YWxrTm9kZSwgcm9sZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZSh3YWxrTm9kZSwgcm9sZU5hbWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgfSAgIFxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igd2l0aCB0aGUgZ2l2ZW4gc3R5bGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge1tzdHJpbmddfSBzdHlsZVByb3BzIC0gVGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBvZiB0aGUgcGFyZW50IHRvIHNlYXJjaCBmb3IuXG4gICAgICogICAgICAgICBzdWNoIGFzIHtcIm92ZXJmbG93XCI6WydhdXRvJywgJ3Njcm9sbCddLCBcIm92ZXJmbG93LXhcIjpbJ2F1dG8nLCAnc2Nyb2xsJ119XG4gICAgICogICAgICAgICAgb3Ige1wib3ZlcmZsb3dcIjpbJyonXSwgXCJvdmVyZmxvdy14XCI6WycqJ119LCBUaGUgJyonIGZvciBhbnkgdmFsdWUgdG8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgc3R5bGUgcHJvcC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gZXhjbHVkZWRWYWx1ZXMgLSBzdHlsZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAgKiBAcmV0dXJuIHtub2RlfSB3YWxrTm9kZSAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQsIHdoaWNoIGhhcyB0aGUgc3R5bGUgcHJvcGVydGllc1xuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoU3R5bGVzKGVsZW0sIHN0eWxlUHJvcHMsIGV4Y2x1ZGVkVmFsdWVzID1bXSkge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMod2Fsa05vZGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBpbiBzdHlsZVByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdChcIiBcIilbMF07IC8vZ2V0IHJpZCBvZiAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVQcm9wc1tzdHlsZV0uaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVQcm9wc1tzdHlsZV0uaW5jbHVkZXModmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBub2RlIHdoaWNoIG1hdGNoZXMgdGhlIHJvbGUgYW5kIGlzIGEgc2libGluZyBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx0IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBSUFRVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFNpYmxpbmdXaXRoUm9sZShlbGVtZW50LCByb2xlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzIGltcGxpY2l0IHJvbGVzIGZvciB0aGUgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBjb25zaWRlciBlbGVtZW50cyB0aGF0IGFyZSBoaWRkZW4gYmFzZWQgb24gdGhlIGlmIHRoZSBDaGVja1xuICAgICAqIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIHNob3VsZCBiZSBjb25zaWRlcmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHNpYmxpbmcgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgSW1wbGljaXQgcm9sZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSB3YWxrTm9kZSAtIEEgc2libGluZyBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyh3YWxrTm9kZSwgcm9sZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IFJQVFV0aWwuaGFzUm9sZSh3YWxrTm9kZSwgcm9sZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgbm90IGZvdW5kIGEgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIHJvbGUsIHN0YXJ0IGEgcmV2ZXJzZSBsb29rIHVwXG4gICAgICAgICAgICBpZiAoIXdhbGtOb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIHByZXZpb3VzIFNpYmxpbmcgb2YgdGhpcyBlbGVtZW50XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBlbGVtZW50LnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIGFsbCB0aGUgcHJldmlvdXMgc2libGluZ3MgdG8gc2VhcmNoIGZvciBhbiBlbGVtZW50IHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwgJiYgIWhhc1JvbGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBSUFRVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGlzYWJsZWRCeVJlZmVycmluZ0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgcm9vdCA9IGRvYy5ib2R5O1xuICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAgICAgcm9vdCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHJvb3QpO1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGVsZW1lbnQgd2hvc2UgJ2FyaWEtZGVzY3JpYmVkYnknIGVxdWFscyB0byB0aGUgaWRcbiAgICAgICAgICAgIGlmIChudy5ub2RlICYmIG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgbncuZWxlbSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IEFyaWFEZXNjcmliZWRieUlEQXJyYXkgPSAobncuZWxlbSgpLmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhRGVzY3JpYmVkYnlJREFycmF5LmluY2x1ZGVzKGlkKSAmJiBSUFRVdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBSUFRVdGlsLmdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50cyBlbGVtZW50c1xuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSBzcGVjaWZpZWQgKG9ubHkgb25lKVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIGEgZGVzY2VuZGFudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudHMgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSBzcGVjaWZpZWQgKG9ubHkgb25lKVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhudy5ub2RlLCByb2xlTmFtZSkgOiBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgcm9sZU5hbWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnQgPSBudy5ub2RlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50cyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcykpIHtcbiAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKG53Lm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRpcmVjdCBjaGlsZHJlbiBpbiBBVCB0cmVlIHdpdGggYSByb2xlIChleGNsdWRlIG5vbmUgYW5kIHByZXNlbnRhdGlvbilcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgY2hpbGRyZW4gZm9yXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGlyZWN0IGNoaWxkIGVsZW1lbnRzIGluIEFUIHRyZWUgdGhhdCBoYXMgYSByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIGdldERpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgICAgICBsZXQgcmVxdWlyZWRDaGlsZFJvbGVzID0gUlBUVXRpbC5nZXRSZXF1aXJlZENoaWxkUm9sZXMoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGxldCBkaXJlY3Q6IEFycmF5PEhUTUxFbGVtZW50PiA9IFtdO1xuICAgICAgICBSUFRVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gIT09IG51bGwgJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVtZW50LmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBjb250YWlucyBcImFyaWEtb3duXCIgYXR0cmlidXRlLCB0aGVuIHRoZSBhcmlhLW93bmVkIGNoaWxkcmVuIG5lZWQgdG8gYmUgaW5jbHVkZWQgdG9vXG4gICAgICAgIGxldCBvd25lZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpO1xuICAgICAgICBpZiAob3duZWQpIHtcbiAgICAgICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgbGV0IG93bmVkSWRzID0gb3duZWQuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vaWdub3JlIGhpZGRlbiBhbmQgaW52aXNpYmxlIGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGNoaWxkcmVuW2ldKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNoaWxkcmVuW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhjaGlsZHJlbltpXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyb2xlcyA9PT0gbnVsbCB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbihyb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gXCJub25lXCIgJiYgcm9sZSAhPT0gXCJwcmVzZW50YXRpb25cIjtcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAvLyBhICdncm91cCcgcm9sZSBpcyBhbGxvd2VkIGJ1dCBub3QgcmVxdWlyZWQgZm9yIHNvbWUgZWxlbWVudHMgc28gcmVtb3ZlIGl0IGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZXMuaW5jbHVkZXMoXCJncm91cFwiKSAmJiByZXF1aXJlZENoaWxkUm9sZXMgJiYgcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKCdncm91cCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbihyb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09ICdncm91cCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMgIT09IG51bGwgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3QucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlIHVudGlsIGdldCBhIHJldHVybiB2YWx1ZSwgXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwucmV0cmlldmVEaXJlY3RBVENoaWxkcmVuKGNoaWxkcmVuW2ldLCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBudWxsIG9yIHJlcXVpcmVkIGNoaWxkIHJvbGVzIGZvciBhIGdpdmVuIGVsZW1lbnQgd2l0aCBvbmUgbW9yZSByb2xlcyxcbiAgICAgKiByZXR1cm4gbnVsbCBpZiB0aGUgcm9sZSBpcyAnbm9uZScgb3IgJ3ByZXNlbnRhdGlvbidcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgKiBAcGFyYW0gaW5jbHVkZUltcGxpY2l0IGluY2x1ZGUgaW1wbGljaXQgcm9sZXMgaWYgbm8gcm9sZSBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXF1aXJlZENoaWxkUm9sZXMoZWxlbWVudCwgaW5jbHVkZUltcGxpY2l0OiBib29sZWFuKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiBpbmNsdWRlSW1wbGljaXQpIHtcbiAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgbm9uZSBvciBwcmVzZW50YXRpb24gcm9sZVxuICAgICAgICAqL1xuICAgICAgICBsZXQgcHJlc2VudGF0aW9uUm9sZXMgPSBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdO1xuICAgICAgICBjb25zdCBmb3VuZCA9IHJvbGVzLnNvbWUociA9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcmVxdWlyZWRDaGlsZFJvbGVzOiBzdHJpbmdbXSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dICYmIGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hpbGRSb2xlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4sIHJlcXVpcmVkQ2hpbGRSb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVpcmVkQ2hpbGRSb2xlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyB0aGVcbiAgICAgKiByb2xlIHRoYXQgd2FzIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIE5vdGUgYnkgZGVmYXVsdCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IFJQVFV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGNoZWNrIGZvciBhcmlhLW93bnNcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBhcmlhLW93bnMgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGNoZWNrIGZvciBhcmlhLW93bnNcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBhcmlhLW93bnMgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIGFyaWEtb3ducyBpcyBub3Qgb24gdGhlIGVsZW1lbnQganVzdCBicmVhayBvdXQgb2YgdGhpcyBmdW5jdGlvbiB3aXRoIG51bGxcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLW93bnNcIikpIHtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSByZWZlcmVuY2UgSURcbiAgICAgICAgICAgIGxldCByZWZlcmVuY2VJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgZm9yIHRoZSByZWZlcmVuY2UgSURcbiAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudCwgcmVmZXJlbmNlSUQpO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IFJQVFV0aWwuaGFzUm9sZShyZWZlcmVuY2VkRWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA/IHJlZmVyZW5jZWRFbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiogZ2V0IGVsZW1lbnQgY29udGFpbmluZyBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnRcbiAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnB1dExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBnZXQgdGhlIGxhYmVsIGVsZW1lbnQgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50OiBFbGVtZW50LCBpZ25vcmVIaWRkZW4pIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGdsb2JhbCBSUFRVdGlsX0xBQkVMUyBoYXNoIGlzIGF2YWlsYWJsZSwgYXMgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGxhYmVsIG5vZGVzIGJhc2VkIG9uXG4gICAgICAgIC8vIGZvciBhdHRyaWJ1dGUuXG4gICAgICAgIC8vaWYgKCFnZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsXCJSUFRVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFnZXRDYWNoZSgocm9vdC5ub2RlVHlwZSA9PT0gMTEpPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiUlBUVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIlJQVFV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgICAgICBzZXRDYWNoZSgocm9vdC5ub2RlVHlwZSA9PT0gMTEpPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiUlBUVXRpbF9MQUJFTFNcIiwgaWRUb0xhYmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgYW4gaWQgYXR0cmlidXRlLCBnZXQgdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICAvLyBGZXRjaCB0aGUgaWQgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgY3RybElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY29yb3Nwb25kaW5nIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgICAgICAvLyBOb3RlOiBpbiB0aGUgY2FzZSB0aGF0IHRoZSB0aGUgaWQgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoIHRoYXQgbWVhbnMsIGl0IGRvZXMgbm90IGV4aXN0cyBvciBpcyBoaWRkZW5cbiAgICAgICAgICAgIGlmIChjdHJsSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL3JldHVybiBnZXRDYWNoZShlbGVtZW50LmdldFJvb3ROb2RlKCkub3duZXJEb2N1bWVudCxcIlJQVFV0aWxfTEFCRUxTXCIse30pW2N0cmxJZF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSk/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJSUFRVdGlsX0xBQkVMU1wiLHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gc3BlY2lmaWVkIGVsZW1lbnQgYXR0cmlidXRlIGlmIHByZXNlbnQgZWxzZSByZXR1cm4gbnVsbCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudCAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGhhcyB2YWxpZCBpbXBsaWNpdCBsYWJlbFxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW1wbGljaXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gUlBUVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50LCBcImxhYmVsXCIpO1xuICAgICAgICAvLyBUZXN0ICBhKSBpZiB0aGUgcGFyZW50IGlzIGEgbGFiZWwgd2hpY2ggaXMgdGhlIGltcGxpY2l0IGxhYmVsXG4gICAgICAgIC8vICAgICAgIGIpIGlmIHRoZSBmb3JtIGVsZW1lbnQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBsYWJlbFxuICAgICAgICAvLyAgICAgICBjKSBpZiB0aGUgZm9ybSBlbGVtZW50IHJlcXVpcmVzIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IGxhYmVsIDogXCJpbnB1dFwiLCAgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIlxuICAgICAgICAvLyBmb3JtIGVsZW1lbnRzIHRoYXQgZG8gbm90IHJlcXVpcmUgaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgZWxlbWVudCBhcmU6XG4gICAgICAgIC8vIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJkYXRhbGlzdFwiKGFkZGVkIGxhdGVyKS4gVGhlc2Ugd2VyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGluIHRoZSBtYWluIHJ1bGUsIG1pZ2h0IG5lZWQgdG8gcmVmYWN0b3IgdGhlIGNvZGUgbGF0ZXJcblxuICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiICYmIFJQVFV0aWwuaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Q2xvbmUgPSBwYXJlbnROb2RlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgYWxsIGZvcm0gZWxlbWVudHMgZnJvbSB0aGUgbGFiZWwgc2luY2UgdGhleSBtaWdodCBhbHNvIGhhdmUgaW5uZXIgY29udGVudFxuICAgICAgICAgICAgcGFyZW50Q2xvbmUgPSBSUFRVdGlsLnJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICByZXR1cm4gUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocGFyZW50Q2xvbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihwYXJlbnROb2RlKTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50c1JlcXVpcmluZ0xhYmVsLmluZGV4T2Yobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG53Lm5vZGUgPT09IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIHNoYWRvdyBob3N0IG9yIGRlc2NlbmRhbnQgb2YgYSBzaGFkb3cgaG9zdCwgYnV0IG5vdCBhIGRlc2NlZGFudCBvZiB0aGUgc2hhZG93IHJvb3Qgb2YgdGhlIGhvc3QgKHRvIGJlIGFzc2lnbmVkIHRvIHNoYWRvdyBzbG90IG9yIGlnbm9yZWQpICBcbiAgICBwdWJsaWMgc3RhdGljIGlzU2hhZG93SG9zdEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoUlBUVXRpbC5pc1NoYWRvd0VsZW1lbnQoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUuc2hhZG93Um9vdCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgc2hhZG93IHRyZWVcbiAgICBwdWJsaWMgc3RhdGljIGlzU2hhZG93RWxlbWVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgICAgIGxldCByb290ICA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKHJvb3QudG9TdHJpbmcoKSA9PT0gXCJbb2JqZWN0IFNoYWRvd1Jvb3RdXCIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGZvcm1FbGVtZW50cyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJidXR0b25cIiwgXCJkYXRhbGlzdFwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwia2V5Z2VuXCIsIFwib3V0cHV0XCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiXTtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmRleE9mKGNoaWxkTm9kZXNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVsc1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzVW5pcXVlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIGlzR2xvYmFsKSB7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnRzWzBdLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNEdXBsaWNhdGVMYWJlbHMgPSBmYWxzZTtcbiAgICAgICAgbGV0IHVuaXF1ZUFyaWFMYWJlbHMgPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IGdldENhY2hlKGRvYywgXCJSUFRVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXF1ZUFyaWFMYWJlbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAhaGFzRHVwbGljYXRlTGFiZWxzICYmIGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudHNbaV0sIGxhYmVsSUQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbE5vZGUgPyBSUFRVdGlsLmdldElubmVyVGV4dChsYWJlbE5vZGUpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gbm9ybWFsaXplZExhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbbm9ybWFsaXplZExhYmVsXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYXMgbm8gbGFiZWwgYXQgYWxsXG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFMYWJlbChlbGUpIHtcbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBsYWJlbElEcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlID8gUlBUVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRMYWJlbCArPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcobGFiZWwpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGUuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAvL2NvbnN0IGxhYmVsID0gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnQoZWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghbGFiZWwpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgcmV0dXJuIChSUFRVdGlsLmdldEFyaWFMYWJlbChsYWJlbCkgfHwgbGFiZWwuaW5uZXJUZXh0IHx8IFwiXCIpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtSUFRVdGlsLmdldEFyaWFMYWJlbChlbGUpXSA9IChkdXBlTWFwW1JQVFV0aWwuZ2V0QXJpYUxhYmVsKGVsZSldIHx8IDApICsgMTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGR1cGVNYXA7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVW5pcXVlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVsc1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIGlzR2xvYmFsKSB7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnRzWzBdLm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVsczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSBudWxsO1xuICAgICAgICBsZXQgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFMYWJlbCA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBhcmlhTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1thcmlhTGFiZWxdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXJpYUxhYmVsIGluIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbYXJpYUxhYmVsXSA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0ucHVzaChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEID0gbGFiZWxJRHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudHNbaV0sIGxhYmVsSUQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlID8gUlBUVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5O1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc0R1cGxpY2F0ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsUmVmID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSk7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gbGFiZWxSZWYgaW4gbGFiZWxSZWZzO1xuICAgICAgICAgICAgICAgIGxhYmVsUmVmc1tsYWJlbFJlZl0gPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaGFzRHVwbGljYXRlTGFiZWxzO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IFJQVFV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IFJQVFV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBhdHRyU3RyKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyU3RyKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyU3RyKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBmcmFtZSwgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LGZyYW1lTmFtZSkge1xuICAgICAgICBsZXQgd2luZG93ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgbGV0IGZyYW1lTGlzdCA9IFt3aW5kb3ddO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgd2hpbGUgKGlkeCA8IGZyYW1lTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lTGlzdFtpZHhdLm5hbWUgPT09IGZyYW1lTmFtZSkgcmV0dXJuIGZyYW1lTGlzdFtpZHhdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVMaXN0W2lkeF0uZnJhbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgaXQncyBhIHJlYWwgZnJhbWUgYW5kIGF2b2lkIHJlY3Vyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSAmJiAhZnJhbWVMaXN0LmluY2x1ZGVzKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxpc3QucHVzaChmcmFtZUxpc3RbaWR4XS5mcmFtZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICArK2lkeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHROU1Jlc29sdmVyKHByZWZpeCl7XG4gICAgICAgIGxldCB1cmk7XG4gICAgICAgIHN3aXRjaCAocHJlZml4KSB7XG4gICAgICAgICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBjYXNlICd4Mic6XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMic7XG4gICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBjYXNlICd4aHRtbCc6XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmk7XG4gICAgfVxuXG4gICAgLy9jaGVja2luZyBpZiBvbmx5IHRoZSBpbm5lciB0ZXh0IGlzIGVtcHR5IG9yIG5vdFxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRPbmx5RW1wdHkoZWxlbWVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudFxuICAgICAgICBsZXQgdGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgJiYgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBJbiBoZWFkbGVzcyBtb2RlLCAgaW5uZXJUZXh0IGlzIHNvbWV0aW1lcyAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgLy8gc28gd2UgdHJ5IHRleHRDb250ZW50IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnQudGV4dENvbnRlbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSAhKHRleHQgIT09IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIC8vVE9ETzogbmVlZCB0byBjb25zaWRlIGl0cyBvd24gY29udGVudCwgYSBzbG90IG1heSBoYXZlIGl0cyBvd24gY29udGVudCBvciBhc3NpZ25lZCBjb250ZW50XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RFbGVtIG9mIGVsZW1lbnQuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICYmIFJQVFV0aWwuaXNJbm5lclRleHRFbXB0eShzbG90RWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmltIHRoZSBpbm5lciB0ZXh0IGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHRoZSBpbm5lciB0ZXh0IG9mIHRoZSBnaXZlbiBlbGVtZW50ICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbm5lclRleHQoZWxlbWVudCkge1xuICAgICAgICBsZXQgcmV0VmFsID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgIGlmIChyZXRWYWwgPT09IHVuZGVmaW5lZCB8fCByZXRWYWwudHJpbSgpID09PSBcIlwiKVxuICAgICAgICAgICAgcmV0VmFsID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnRcbiAgICAgICAgbGV0IHRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtZW50KTtcblxuICAgICAgICAvLyBUcmltIHRoZSBpbm5lciB0ZXh0IGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiAhKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQ29udGVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzIGNhc2VzIHdoZXJlIGlubmVyIHRleHQgaXMgaGlkZGVuLCB3aGljaCBub3cgd2lsbFxuICAgICAqIGJlIGNsYXNzaWZpZWQgYXMgZG9lcyBub3QgaGF2ZSBoaWRkZW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIlxuICAgICAgICAgICAgICAgICAgICAmJiBSUFRVdGlsLnN2Z0hhc05hbWUobm9kZSBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhUlBUVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFSUFRVdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhUlBUVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgKFJQVFV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgXCJ0ZXh0Ym94XCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiAoUlBUVXRpbC5oYXNBcmlhTGFiZWwobncubm9kZSkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcInRpdGxlXCIpIHx8IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKG53LmVsZW0oKSwgdHJ1ZSkpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgYXJyLmluZGV4T2YoaXRlbSkgPT09IC0xICYmIGl0ZW0gIT09IG51bGwgPyBhcnIucHVzaChpdGVtKSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pIDogc3RyaW5nW10ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaXRlbUxpc3QgIT09IG51bGwgJiYgaSA8IGl0ZW1MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcnIgPSBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShpdGVtTGlzdFtpXSwgYXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhcnJheSBpdGVtcyBmcm9tIGEgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gaXRlbUxpc3QgaXRlbXMgdG8gYmUgcmVtb3ZlZCBmcm9tIGFyclxuICAgICAqIEBwYXJhbSBhcnIgdGhlIGFycmF5XG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2VBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiAge1xuICAgICAgICAgICAgICAgIHJldHVybiAhaXRlbUxpc3QuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVzb2x2aW5nIEFSSUEgcmVxdWlyZW1lbnRzIGZvciBhbiBIVE1MIGVsZW1lbnQgcGVyIEFSSUEgaW4gSFRNTFxuICAgICAqIEBwYXJhbSBydWxlQ29udGV4dCB0aGUgSFRNTCBlbGVtZW50IHRvIGJlIGV4YW1pbmVkXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KSB7XG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBnZXRDYWNoZShydWxlQ29udGV4dCwgXCJSUFRVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcmVhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmY3MgPSBSUFRVdGlsLmdldENoaWxkQnlUYWcocnVsZUNvbnRleHQsIFwiZmlnY2FwdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjcyAhPT0gbnVsbCAmJiBmY3MubGVuZ3RoID4gMCA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1maWdjYXB0aW9uXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZm9vdGVyXCI6IFxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaGVhZGVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImFydGljbGVcIiwgdHJ1ZSkgIT09IG51bGwgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJuYXZpZ2F0aW9uXCIsIHRydWUpICE9PSBudWxsIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImFydGljbGVcIiwgXCJhc2lkZVwiLCBcIm1haW5cIiwgXCJuYXZcIiwgXCJzZWN0aW9uXCJdKSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJvdGhlclwiXTsgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKSA9PT0gXCJcIiA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1lbXB0eS1hbHRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGgtYWx0LXRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hbHQtdGV4dFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aG91dC1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbdHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtcHJlc3NlZFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGVja2JveC13aXRoLWFyaWEtcHJlc3NlZFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGVja2JveC13aXRob3V0LWFyaWEtcHJlc3NlZFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJlbWFpbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWFyY2hcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJzZWFyY2gtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZWwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ1cmwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZWZhdWx0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZWZhdWx0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdHlwZSBpcyB0aGUgc2FtZSBhcyB0eXBlPXRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJsaVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50ICYmIFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQsIFwibGlzdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtb2YtbGlzdC1yb2xlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1jaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInNlbGVjdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic2l6ZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpID4gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJzdW1tYXJ5XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQgJiYgcnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscycgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgRE9NVXRpbC5zYW1lTm9kZShbLi4ucnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW09PmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0YWJsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZSA9IFJQVFV0aWwuZ2V0U2NvcGVGb3JUaChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZS1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtb3RoZXJcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcnQgPSBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJ0ICE9PSBudWxsICYmIHBydC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGwnID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWRsXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWRsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcImRlZmF1bHRcIl0gYXMgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDtcbiAgICAgICAgICAgICAgICB9IC8vc3dpdGNoXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUlBUVXRpbF9FbGVtZW50QXJpYVByb3BlcnR5XCIsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIHRhZ1Byb3BlcnR5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRTY29wZUZvclRoKGVsZW1lbnQpIHtcbiAgICAgICAgLyoqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS90YWJ1bGFyLWRhdGEuaHRtbCNoZWFkZXItYW5kLWRhdGEtY2VsbC1zZW1hbnRpY3NcbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXMgXG4gICAgICAgICAqIHNhaWQgdG8gYmUgYSBjb2x1bW4gaGVhZGVyIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGNvbHVtbiBzdGF0ZSwgb3JcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgYXV0byBzdGF0ZSwgYW5kIHRoZXJlIGFyZSBubyBkYXRhIGNlbGxzIGluIGFueSBvZiBcbiAgICAgICAgICogICB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB5LWNvb3JkaW5hdGVzIHkgLi4geStoZWlnaHQtMS5cbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXNcbiAgICAgICAgICogc2FpZCB0byBiZSBhIHJvdyBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcm93IHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCB0aGUgY2VsbCBpcyBub3QgYSBjb2x1bW4gaGVhZGVyLCBhbmQgdGhlcmUgYXJlXG4gICAgICAgICAqICAgbm8gZGF0YSBjZWxscyBpbiBhbnkgb2YgdGhlIGNlbGxzIGNvdmVyaW5nIHNsb3RzIHdpdGggeC1jb29yZGluYXRlcyB4IC4uIHgrd2lkdGgtMS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIE5vdGU6IGF1dG8gaXMgZGVmYXVsdCBzY29wZVxuICAgICAgICBcbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2NvcGUgaXMgYXV0bywgZGVmYXVsdCAod2l0aG91dCBhIHNjb3BlKSBvciBpbnZhbGlkIHZhbHVlLlxuICAgICAgICAvLyBpZiBhbGwgdGhlIHNpYmxpbmcgZWxlbWVudHMgYXJlIHRoLCB0aGVuIHJldHVybiBcImNvbHVtbmhlYWRlclwiIFxuICAgICAgICB2YXIgc2libGluZ3MgPSBlbGVtZW50ID0+IFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihub2RlPT5ub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUudGFnTmFtZSAhPSBcIlRIXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7IFxuICAgICAgICBlbHNlIHJldHVybiBcInJvd1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzIDogc3RyaW5nW10gPSBnZXRDYWNoZShydWxlQ29udGV4dCwgXCJSUFRVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZFJvbGVzKSB7XG4gICAgICAgICAgICBhbGxvd2VkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAhPT0gbnVsbCAmJiB0YWdQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkudmFsaWRSb2xlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkudmFsaWRSb2xlcywgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMgJiYgaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS52YWxpZFJvbGVzLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJQVFV0aWxfQWxsb3dlZEFyaWFSb2xlc1wiLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxvd2VkUm9sZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGVzLCBwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA6IHN0cmluZ1tdID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUlBUVXRpbF9BbGxvd2VkQXJpYUF0dHJpYnV0ZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbLi4ucm9sZXNdO1xuICAgICAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgZGlzYWJsZWQgYXR0cmlidXRlICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZGlzYWJsZWQtZWxlbWVudHMuaHRtbFxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLWRpc2FibGVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVsZW1lbnQgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBodHRwOi8vd3d3LnRoZS1hcnQtb2Ytd2ViLmNvbS9odG1sL2h0bWw1LWZvcm0tdmFsaWRhdGlvbi9cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVxdWlyZWQuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlcXVpcmVkIGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZXF1aXJlZFwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlYWRvbmx5IGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZWFkb25seVwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHByb3BlcnRpZXM7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBSUFRVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9wZXJ0aWVzLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRQcm9wcyA9IHJvbGVQcm9wZXJ0eS5wcm9oaWJpdGVkUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWRQcm9wcyAmJiBwcm9oaWJpdGVkUHJvcHMubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBSUFRVdGlsLmlzRm9jdXNhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgZ2xvYmFsIHByb3BlcnRpZXMgdG8gdGhlIHZhbGlkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllczsgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBvdGhlciByb2xlIHRvIHRoZSBhbGxvd2VkIHJvbGVzIGZvciB0aGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICYmIHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzICYmIHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzLCBwZXJtaXR0ZWRSb2xlcyk7ICAgICAgIFxuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhwZXJtaXR0ZWRSb2xlc1tpXSwgcnVsZUNvbnRleHQpOyAvLyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydGllcy5wcm9oaWJpdGVkUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aD4wKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgUlBUVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPT0gbnVsbCApIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWQubGVuZ3RoID4gMCkgICAgXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRhZ1Byb3BlcnR5Lm90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzW3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBhdHRyLnNwbGl0KFwiPVwiKTsgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXNhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChkaXNhbGxvd2VkLCBwcm9oaWJpdGVkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2V4Y2x1ZGUgdGhlIHByb2hpYml0ZWRBdHRyaWJ1dGVzIGZyb20gdGhlIGFsbG93ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkQXR0cmlidXRlcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAvL2V4Y2x1ZGUgYXJpYSBhdHRyaWJ1dGUgZm9yIGVsZW1lbnRzIHdpdGhvdXQgaW1wbGljaXQgcm9sZSBhbmQgd2l0aCAnTmFtaW5nIFByb2hpYml0ZWQnXG4gICAgICAgICAgICBpZiAoKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApICYmIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSA9PT0gbnVsbCAmJiB0YWdQcm9wZXJ0eS5wcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGUpXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJQVFV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7IFxuICAgICAgICAgICAgbGV0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gW107XG4gICAgICAgICAgICBsZXQgYXJpYUF0dHJWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0LmNvbmZsaWN0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBhcmlhQXR0clZhbHVlID0gZXhpc3QuY29uZmxpY3QuYXJpYUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3ZlcmxhcHBpbmcnKSAge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3Qub3ZlcmxhcHBpbmcpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyVmFsdWUgPSBleGlzdC5vdmVybGFwcGluZy5hcmlhQXR0cmlidXRlVmFsdWU7IFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgICAgICAgICAgaWYgKGFyaWFBdHRyVmFsdWUgPT09IG51bGwgfHwgYXJpYUF0dHJWYWx1ZSA9PT0gJ1ZBTFVFJyB8fCBhcmlhQXR0clZhbHVlID09PSBhcmlhQXR0clsndmFsdWUnXSkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sQXR0ck5hbWVzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGh0bWxBdHRyVmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyTmFtZXMgPSBleGlzdC5jb25mbGljdC5odG1sQXR0cmlidXRlTmFtZXM7XG4gICAgICAgICAgICAgICAgICAgICBodG1sQXR0clZhbHVlcyA9IGV4aXN0LmNvbmZsaWN0Lmh0bWxBdHRyaWJ1dGVWYWx1ZXM7XG4gICAgICAgICAgICAgICAgfSAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICBodG1sQXR0ck5hbWVzID0gZXhpc3Qub3ZlcmxhcHBpbmcuaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJWYWx1ZXMgPSBleGlzdC5vdmVybGFwcGluZy5odG1sQXR0cmlidXRlVmFsdWVzO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHsgXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGh0bWxBdHRyTmFtZXMuaW5kZXhPZihodG1sQXR0cnNbaV1bJ25hbWUnXSk7IFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxBdHRyVmFsdWVzID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGFyaWFBdHRyVmFsdWUgPT09ICdWQUxVRScgJiYgaHRtbEF0dHJWYWx1ZXNbaW5kZXhdID09PSAnVkFMVUUnICYmIGh0bWxBdHRyc1tpXVsndmFsdWUnXSAhPT0gYXJpYUF0dHJbJ3ZhbHVlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaHRtbEF0dHJzW2ldWyd2YWx1ZSddID09PSBodG1sQXR0clZhbHVlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHtyZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7cmVzdWx0OiAnUGFzcycsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ119KTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSA6IEhUTUxFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW0sIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcm9sZXMgIT09IG51bGwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm9sZVByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuICAgICAgICAgICAgaWYgKHJvbGVQcm9wZXJ0aWVzICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGlvbmFsID0gcm9sZVByb3BlcnRpZXMucHJlc2VudGF0aW9uYWxDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudGlvbmFsID09PSB0cnVlKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQoZWxlbWVudCA6IEhUTUxFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvKiogbW92ZWQgdG8gQ1NTVXRpbFxuICAgIHB1YmxpYyBzdGF0aWMgQ1NTKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBbXTtcbiAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gbnVsbCB8fCBzdHlsZVRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgICAvL3JlbW92ZSBjb21tZW50IGJsb2Nrc1xuICAgICAgICBsZXQgcmUgPSAvKFxcL1xcKisoPzooPzooPzpbXlxcKl0pKyl8KD86W1xcKl0rKD8hXFwvKSkpWypdK1xcLyl8XFwvXFwvLiogL2c7XG4gICAgICAgIGxldCBzdWJzdCA9ICcgJztcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuXG4gICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9O1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXlWYWxzW21bMV1dID0gbVsyXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFsc1xuICAgICAgICAgICAgfV07XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgbGV0IG0yO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gclNlbGVjdG9ycy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqL1xuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbE9mTGFiZWwobm9kZTogTm9kZSkge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGVhc3kgY2FzZSBvZiBsYWJlbCAtPiBmb3JcbiAgICAgICAgbGV0IGxhYmVsQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKG5vZGUsIFwibGFiZWxcIik7XG4gICAgICAgIGlmIChsYWJlbEFuY2VzdG9yKSB7XG4gICAgICAgICAgICBpZiAobGFiZWxBbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnRVdGlsLmdldEJ5SWQobm9kZSwgbGFiZWxBbmNlc3Rvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGlkcyBvZiBwYXJlbnQgbm9kZXNcbiAgICAgICAgbGV0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIik7XG4gICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8aW5wdXRzVXNpbmdMYWJlbGxlZEJ5Lmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VXNpbmdMYWJlbGxlZEJ5ID0gaW5wdXRzVXNpbmdMYWJlbGxlZEJ5W2lkeF07XG4gICAgICAgICAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGlucHV0VXNpbmdMYWJlbGxlZEJ5LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGNvbnN0IHNwID0gYXJpYUxhYmVsbGVkQnkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzcCkge1xuICAgICAgICAgICAgICAgIGlmIChpZCBpbiBpZERpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VXNpbmdMYWJlbGxlZEJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGNhc2VzIHdoZXJlIHdlJ3JlIHdpdGhpbiBhbiBhcmlhIGxhYmVsbGVkYnlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgdGhhdCBpcyBwcm92aWVkIGlzXG4gICAgICogZGlzYWJsZWQgb3Igbm90LiBGb2xsb3dpbmcgaXMgaG93IHRoZSBjaGVjayBpcyBwZXJmb3JtZWQ6XG4gICAgICogICAgMS4gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBkaXNhYmxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczpcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGRpc2FibGVkXG4gICAgICogICAgICAgICBBbHNvIG5lZWRzIHRvIGJlIFwiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsXG4gICAgICogICAgICAgICBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIiBub2RlcyAoaW4gYXJyYXkgZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQpXG4gICAgICogICAgICAgYXR0cmlidXRlIC0tPiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiXG4gICAgICogICAgMi4gQ2hlY2sgaWYgYW55IG9mIHRoZSBjdXJyZW50IG5vZGVzIHBhcmVudHMgYXJlIGRpc2FibGVkIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgZGlzYWJsZWQgdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBkaXNhYmxlZCkuXG4gICAgICpcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBkaXNhYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ESVNBQkxFRFwiLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIG5vZGVUeXBlIG9mIHRoaXMgbm9kZSwgaWYgdGhpcyBub2RlIGlzIGEgdGV4dCBub2RlIHRoZW5cbiAgICAgICAgLy8gd2UgZ2V0IHRoZSBwYXJlbnRub2RlIGFuZCBzZXQgdGhhdCBhcyB0aGUgbm9kZSBhcyBhIHRleHQgbm9kZXMsXG4gICAgICAgIC8vIGRpc2FibGVkIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZGlzYWJsZWQgZWxlbWVudCBwcm9wZXJ0eSwgZGlzYWJsZWQgYW5kIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIGFuZCBjaGVjayB0aGF0IGl0IGlzIHRydWVcbiAgICAgICAgbGV0IGRpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgbGV0IGRpc2FibGVkUHJvcGVydHlDdXN0b20gPSBQVF9OT0RFX0RJU0FCTEVEO1xuICAgICAgICBsZXQgYXJpYURpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSAmJiBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgPT09ICd0cnVlJztcblxuICAgICAgICAvLyBJZiB0aGlzIG5vZGUgaGFzIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgdGhlIG5vZGUgYWxsb3dzIGRpc2FibGVkIGF0dHJpYnV0ZSwgdGhlbiByZXR1cm4gdHJ1ZS5cbiAgICAgICAgLy8gRGlzYWJsZWQgYXR0cmlidXRlIGlzIG9ubHkgYWxsb3dlZCBvbiBcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhcmlhLWRpc2FibGVkIGlzIHNldCB0byB0cnVlLCB0aGVuIGFsc28gcmV0dXJuIHRydWVcbiAgICAgICAgaWYgKGRpc2FibGVkUHJvcGVydHlDdXN0b20gfHwgKGRpc2FibGVkQXR0cmlidXRlICYmIEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB8fCBhcmlhRGlzYWJsZWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIGRpc2FibGVkIGF0dHJpYnV0ZS4gT25seSBrZWVwIGNoZWNraW5nIHVudGlsIHdlIGFyZSBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBwYXJlbnROb2RlXG4gICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgIGxldCBwYXJlbnRFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBub2RlIGV4aXN0cyBhbmQgdGhlIG5vZGV0eXBlIGlzIGVsZW1lbnQgKDEpLCB0aGVuIHJ1biByZWN1cnNpdmUgY2FsbCB0byBwZXJmb3JtIHRoZSBjaGVja1xuICAgICAgICAvLyBhbGwgdGhlIHdheSB1cCB0byB0aGUgdmVyeSBwYXJlbnQgbm9kZS4gVXNlIHJlY3Vyc2l2ZSBjYWxsIGhlcmUgaW5zdGVhZCBvZiBhIHdoaWxlIGxvb3Agc28gdGhhdCB3ZSBkbyBub3RcbiAgICAgICAgLy8gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGxvZ2ljIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSBpcyBkaXNhYmxlZCBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseSwgYW5kIHNhdmUgdGhlIHJlc3VsdHMgaW4gYW4gdmFyaWFibGVcbiAgICAgICAgICAgIGxldCBub2RlRGlzYWJsZWQgPSBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBmb3VuZCB0byBiZSBkaXNhYmxlZCB0aGVuIGFkZCB0aGUgY3VzdG9tIFBUX05PREVfRElTQUJMRUQgdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIG5leHQgdGltZSwgdG8gcXVpY2tseSBkZXRlcm1pbmUgaWYgbm9kZSBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGV4dHJhIHBlcmNhdXRpb24sIHRoZSBpc05vZGVEaXNhYmxlZCBmdW5jdGlvbiBhbHJlYWR5IHNldHMgdGhpcy5cbiAgICAgICAgICAgIGlmIChub2RlRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIGNoZWNraW5nIG9yIG5vdCwgYmFzZWRcbiAgICAgKiBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZ3MgYW5kIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgLSBOb2RlIHRvIGNoZWNrIGlmIGl0IGlzIHZpc2libGUgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSB7XG4gICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAvLyBvciBub3QuXG4gICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoZSBub2RlIHNob3VsZCBub3QgYmUgc2Nhbm5lZC9hZGRlZCB0byBhbnkgaGFzaC9hcnJheS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgIGlmICghUlBUVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc2ZvY3VzYWJsZUJ5RGVmYXVsdChub2RlKSB7XG4gICAgICAgIHZhciBmb2N1c2FibGVFbGVtZW50cyA9IFsnaW5wdXQnLCAnc2VsZWN0JywgJ2J1dHRvbicsICd0ZXh0YXJlYScsICdvcHRpb24nLCAnYXJlYSddO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFcIiAmJiBSUFRVdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIgJiYgUlBUVXRpbC5oYXNBdHRyaWJ1dGUobm9kZSwgJ2hyZWYnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5pbmRleE9mKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50IDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHxcbiAgICAgICAgICAgIChwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG53LmVsZW0oKTtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkgeyAvLyBUZXh0IG5vZGUuIHVzdWFsbHkgaXMgYSBjYXJ0cmlkZ2UgcmV0dXJuLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmXG4gICAgICAgICAgICAgICAgKHBhcnNlSW50KGNoaWxkLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkgJiZcbiAgICAgICAgICAgICAgICAhUlBUVXRpbC5oYXNJbm5lckNvbnRlbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgdmFyIGhhc0F0dHJpYnV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGhhc0F0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0cmlidXRlcyAmJiBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IGVsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBhdHRyICYmIGF0dHIuc3BlY2lmaWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGU7XG4gICAgfVxufVxuLyoqIG1vdmVkIHRvIENTU1V0aWxcbmV4cG9ydCBjbGFzcyBSUFRVdGlsU3R5bGUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcImxpZ2h0XCI6IDEwMCxcbiAgICAgICAgICAgIFwiYm9sZFwiOiA3MDBcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJldFZhbCA9IHBhcnNlSW50KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgaWYgKHN0eWxlVmFsIGluIG1hcClcbiAgICAgICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICByZXR1cm4gNDAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Rm9udEluUGl4ZWxzID0gZnVuY3Rpb24gKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICAgICAgXCJ4LXNtYWxsXCI6IDEwLFxuICAgICAgICAgICAgXCJzbWFsbFwiOiAxMyxcbiAgICAgICAgICAgIFwibWVkaXVtXCI6IDE2LFxuICAgICAgICAgICAgXCJsYXJnZVwiOiAxOCxcbiAgICAgICAgICAgIFwieC1sYXJnZVwiOiAyNCxcbiAgICAgICAgICAgIFwieHgtbGFyZ2VcIjogMzJcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChzdHlsZVZhbCk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bml0cyA9IHN0eWxlVmFsLnN1YnN0cmluZygoXCJcIiArIHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG59XG4qL1xuLyogUmV0dXJuIGEgbm9kZSB3YWxrZXIgZm9yIHRoZSBnaXZlbiBlbGVtZW50LlxuICogYkVuZCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIGJ1dCBpZiB0cnVlLCBpbmRpY2F0ZXMgdGhlIG5vZGUgaXMgdGhlIGVuZCBub2RlKi9cbmV4cG9ydCBjbGFzcyBOb2RlV2Fsa2VyIHtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnIDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBOb2RlLCBiRW5kPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIG5leHROb2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi9cbiAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovXG4gICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm53T3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkubndTbG90SW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHROb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm53U2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lcjtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkubndTbG90T3duZXI7XG4gICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RJbmRleDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm53U2xvdEluZGV4ID0gbmV4dFNsb3RJbmRleDsgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5iRW5kVGFnICYmIHRoaXMubm9kZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJFbmRUYWcgJiYgKHRoaXMubm9kZS5maXJzdENoaWxkID09PSBudWxsIHx8IHR5cGVvZiAodGhpcy5ub2RlLmZpcnN0Q2hpbGQpID09PSAndW5kZWZpbmVkJykpXG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwcGVyLCBJTWFwUmVzdWx0LCBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tb25NYXBwZXIgaW1wbGVtZW50cyBJTWFwcGVyIHtcbiAgICBhYnN0cmFjdCBnZXRSb2xlKG5vZGU6IE5vZGUpIDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGdldE5hbWVzcGFjZSgpIDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5Um9sZSA6IHN0cmluZ1tdID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5UGF0aDogQXJyYXk8e1xuICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgfVxuICAgIH0+ID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5UmVzdWx0czogSU1hcFJlc3VsdFtdID0gbnVsbDtcblxuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJlc2V0KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuXG4gICAgICAgIGxldCBhbmNlc3RvcnMgOiBOb2RlW10gPSBbXTtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChjb25zdCBhbmNlc3RvciBvZiBhbmNlc3RvcnMpIHtcbiAgICAgICAgICAgIGxldCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBhbmNlc3Rvci5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2libGluZ3MgPSBzaWJsaW5ncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNpYmxpbmcgb2Ygc2libGluZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkoc2libGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3BIaWVyYXJjaHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShhbmNlc3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByb2xlIDogc3RyaW5nID0gdGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChyb2xlKTtcbiAgICAgICAgaWYgKHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50UGF0aEluZm8gPSB0aGlzLmhpZXJhcmNoeVBhdGhbdGhpcy5oaWVyYXJjaHlQYXRoLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSA9IChwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInJvbGVQYXRoXCI6IHBhcmVudFBhdGhJbmZvLnJvbGVQYXRoK1wiL1wiK3JvbGUrXCJbXCIrcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdK1wiXVwiLFxuICAgICAgICAgICAgICAgIFwicm9sZUNvdW50XCI6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdHRyID0ge31cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyLFxuICAgICAgICAgICAgcm9sZVBhdGg6IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdLnJvbGVQYXRoLFxuICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3BIaWVyYXJjaHkoKSB7XG4gICAgICAgIGxldCByb2xlID0gdGhpcy5oaWVyYXJjaHlSb2xlLnBvcCgpO1xuICAgICAgICBpZiAocm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucG9wKCk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgdGhpcy5wb3BIaWVyYXJjaHkoKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JRW5naW5lXCI7XG5cbi8vIENvbnRleHQgdGhhdCB3aWxsIGNhdXNlIHRoaXMgcnVsZSB0byBleGVjdXRlLiBcbi8vIENvbnRleHQgc3ludGF4OlxuLy8gICBUcmlnZ2Vyczpcbi8vICAgICBhcmlhOnJvbGUgLSBUcmlnZ2VycyBvbiBlbGVtZW50IHdpdGggQVJJQSByb2xlIHJvbGVcbi8vICAgICBhcmlhOnJvbGVbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdGhlIGVxdWl2YWxlbnQgbG9naWNhbCBcbi8vICAgICAgIGFyaWEtIGF0dHJpYnV0ZSAoZS5nLiwgYnV0dG9uW2Rpc2FibGVkXSB3aWxsIHRyaWdnZXIgb24gXG4vLyAgICAgICA8YnV0dG9uIGRpc2FibGVkPiBvciA8ZGl2IHJvbGU9XCJidXR0b25cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPilcbi8vICAgICByb2xlW2F0dHJpYnV0ZT12YWx1ZV0gLSBTaW1pbGFyIHRvIGFib3ZlLCB3aXRoIGNhc2Utc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgICB0byB2YWx1ZVxuLy8gICAgIHJvbGVbYXR0cmlidXRlfnZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaFxuLy8gICAgIGRvbTplbGVtZW50IC0gVHJpZ2dlcnMgb24gYW4gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZVxuLy8gICAgIGRvbTplbGVtZW50W2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhIGRvbSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbi8vICAgICBkb206KlthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gYWxsIGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbi8vICAgQ29tYmluaW5nIHRyaWdnZXJzOlxuLy8gICAgIHRyaWdnZXIxIHRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoaW4gYW4gXG4vLyAgICAgICBlbGVtZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICAhdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIG5vdCB3aXRoaW5cbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxPnRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBhbiBpbW1lZGlhdGUgcGFyZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMSt0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgaW1tZWRpYXRlIHByZXZpb3VzIHNpYmxpbmcgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxfnRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBzb21lIGVhcmxpZXIgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgY29udGV4dCxjb250ZXh0IC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCBlaXRoZXIgY29udGV4dFxuZXhwb3J0IGNsYXNzIEF0dHJJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluY2x1c2l2ZTogYm9vbGVhbixcbiAgICAgICAgcHVibGljIGF0dHI6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGVxPzogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgdmFsdWU/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgaWYgKCFpbmNsdXNpdmUgXG4gICAgICAgICAgICAgICAgJiYgKCh0eXBlb2YgZXEpICE9PSBcInVuZGVmaW5lZFwiICYmIGVxLmxlbmd0aCA+IDApKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSAhYXR0clwiK2VxK1wiIGNvbnRleHRcIik7ICAgIFxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdXNpdmUgJiYgKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCAmJiAoKHR5cGVvZiB2YWx1ZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdmFsdWUubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgZXF1aXZhbGVuY2UgY2hlY2sgd2l0aG91dCBhIHZhbHVlXCIpOyAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKGNvbnRleHQ6IElNYXBSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgcnVsZUF0dHJQYXJ0ID0gdGhpczsgXG4gICAgICAgIGNvbnN0IGVsZW1BdHRycyA9IGNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgaWYgKCEocnVsZUF0dHJQYXJ0LmF0dHIgaW4gZWxlbUF0dHJzKSkge1xuICAgICAgICAgICAgcmV0dXJuICFydWxlQXR0clBhcnQuaW5jbHVzaXZlXG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmVxKSB7XG4gICAgICAgICAgICAvLyBpbmNsdXNpdmUgbWF0Y2ggYW5kIEkgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBhbmQgbm8gZXF1aXZhbGVuY2UgZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbmNsdXNpdmUgbWF0Y2ggYW5kIEkgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBhbmQgZXF1aXZhbGVuY2UgZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gZWxlbUF0dHJzW3J1bGVBdHRyUGFydC5hdHRyXTtcbiAgICAgICAgICAgIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIT1cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIn5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgPT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIiF+XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlICE9PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgZXF1aXZhbGVuY2Ugb3BlcmF0b3Igbm90IHN1cHBvcnRlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFydEluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLCBcbiAgICAgICAgcHVibGljIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcm9sZTogc3RyaW5nLCBcbiAgICAgICAgcHVibGljIGF0dHJzOiBBdHRySW5mb1tdLCBcbiAgICAgICAgcHVibGljIGNvbm5lY3Rvcjogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCIqXCIgJiYgIWluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIiEqIGNvbnRleHQgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoIFxuICAgICAgICBjb250ZXh0SGllcjogUnVsZUNvbnRleHRIaWVyYXJjaHksXG4gICAgICAgIGhpZXJMZXZlbDogbnVtYmVyKSA6IGJvb2xlYW4gXG4gICAge1xuICAgICAgICBjb25zdCBydWxlUGFydCA9IHRoaXM7XG4gICAgICAgIGxldCBydWxlUm9sZU1hdGNoID0gKHJ1bGVQYXJ0Lm5hbWVzcGFjZSBpbiBjb250ZXh0SGllcikgJiYgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IHJ1bGVQYXJ0LnJvbGVcbiAgICAgICAgICAgICAgICB8fCBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSAhPT0gXCJub25lXCIgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIpO1xuICAgICAgICBpZiAocnVsZVJvbGVNYXRjaCBcbiAgICAgICAgICAgICYmIHJ1bGVQYXJ0LnJvbGUgPT09IFwiKlwiIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQubmFtZXNwYWNlID09PSBcImRvbVwiIFxuICAgICAgICAgICAgJiYgKGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIiN0ZXh0XCJcbiAgICAgICAgICAgICAgICB8fCBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gXCIvI3RleHRcIikpIHtcbiAgICAgICAgICAgIHJ1bGVSb2xlTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZVBhcnQuaW5jbHVzaXZlICYmICFydWxlUm9sZU1hdGNoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcnVsZVBhcnQuaW5jbHVzaXZlICYmICFydWxlUm9sZU1hdGNoKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBNYXRjaCB0aGUgYXR0cmlidXRlc1xuICAgICAgICBjb25zdCBydWxlQXR0cnMgPSBydWxlUGFydC5hdHRycztcbiAgICAgICAgY29uc3QgZWxlbUNvbnRleHQgPSBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF07XG4gICAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZUF0dHJQYXJ0IG9mIHJ1bGVBdHRycykge1xuICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaCAmJiBydWxlQXR0clBhcnQubWF0Y2hlcyhlbGVtQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUpIG1hdGNoID0gIW1hdGNoO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgICBjb250ZXh0SW5mbyA6IFBhcnRJbmZvW10gPSBbXVxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb250ZXh0SGllck1hdGNoZXMgOiBzdHJpbmdbXSA9IGNvbnRleHQubWF0Y2goLyE/Wy9hLXpBLVo6MC05KlxcLV9dKyhcXFtbXlxcXV0rXFxdKSpbID4rfl0/L2cpO1xuICAgICAgICBsZXQgcmVzdWx0cyA6IFBhcnRJbmZvW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGV4dEhpZXJNYXRjaGVzKSB7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSBwYXJ0Lm1hdGNoKC8oIT8pKFsvYS16QS1aOjAtOSpcXC1fXSspKChcXFtbXlxcXV0rXFxdKSopKFsgPit+XT8pLyk7XG4gICAgICAgICAgICBsZXQgYXR0ckluZm8gOiBBdHRySW5mb1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJQYXJ0IG9mIHBhcnRzWzNdLm1hdGNoKC9cXFsoW15cXF1dKylcXF0vZykgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clBhcnRzID0gYXR0clBhcnQubWF0Y2goL1xcWyghPykoW2EtejpBLVoqXFwtX10rKSghP1s9fl0pPyhbXlxcXV0rKT9cXF0vKTtcbiAgICAgICAgICAgICAgICBhdHRySW5mby5wdXNoKG5ldyBBdHRySW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzFdICE9PSBcIiFcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzJdLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1szXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzRdXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBuc1BhcnRzID0gcGFydHNbMl0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgbGV0IGluY2wgPSBwYXJ0c1sxXSAhPT0gXCIhXCI7XG4gICAgICAgICAgICBjb25zdCBucyA9IG5zUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCByb2xlID0gbnNQYXJ0cy5qb2luKFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBwYXJ0SW5mbyA9IG5ldyBQYXJ0SW5mbyhpbmNsLCBucywgcm9sZSwgYXR0ckluZm8sIHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocGFydEluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dEluZm8gPSByZXN1bHRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhbkNvbnRleHQoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyEvZywgXCIgIVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsoWz4rfixdKS9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8oWz4rfixdKSArL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArL2csIFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQudHJpbSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gQ29udGV4dC5zcGxpdE11bHRpcGxlKENvbnRleHQuY2xlYW5Db250ZXh0KGNvbnRleHQpKTtcblxuICAgICAgICBsZXQgcmV0VmFsIDogQ29udGV4dFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGN0eCA9IG5ldyBDb250ZXh0KGNvbnRleHRzW2ldKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluaXRpYWwgcHJvY2Vzc2luZyBvZiBzcGxpdHRpbmcgb24gY29tbWEgLSBjb250ZXh0LGNvbnRleHRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKi9cbiAgICBzdGF0aWMgc3BsaXRNdWx0aXBsZShjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nW10ge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBbXTtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmluZGV4T2YoXCIsXCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjb250ZXh0LnNwbGl0KFwiLFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dHM7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSUVuZ2luZSwgUmVwb3J0LCBSdWxlLCBSdWxlRGV0YWlscywgUnVsZVJlc3VsdCwgZVJ1bGVDb25maWRlbmNlLCBSdWxlQ29udGV4dCwgTmxzTWFwLCBIZWxwTWFwLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENvbnRleHQsIFBhcnRJbmZvLCBBdHRySW5mbyB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0LCBJTWFwcGVyIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgY2xlYXJDYWNoZXMgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBSdWxlRGV0YWlsc1tdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBSdWxlRGV0YWlsc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5naW5lIGltcGxlbWVudHMgSUVuZ2luZSB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRMYW5ndWFnZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLm5vZGVUeXBlID09PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52O1xuICAgICAgICAvLyBJZiBhbGwgZWxzZSBmYWlscywgZGVmYXVsdCB0byBVUyBFbmdsaXNoXG4gICAgICAgIGxldCBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgaWYgKGVudikge1xuICAgICAgICAgICAgbm9kZUxhbmcgPSBlbnYuTEFORyB8fCBlbnYuTEFOR1VBR0UgfHwgZW52LkxDX0FMTCB8fCBlbnYuTENfTUVTU0FHRVM7XG4gICAgICAgICAgICBpZiAobm9kZUxhbmcpIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IG5vZGVMYW5nLnNwbGl0KFwiLlwiKVswXS5yZXBsYWNlKC9fL2csXCItXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgfHwgW25vZGVMYW5nXTtcbiAgICB9XG4gICAgbWFwcGVycyA6IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBwZXIgfSA9IHt9O1xuICAgIHJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogUnVsZSB9ID0ge307XG4gICAgd3JhcHBlZFJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogV3JhcHBlZFJ1bGUgfSA9IHt9O1xuICAgIG5sc01hcCA6IE5sc01hcCA9IHt9XG4gICAgaGVscE1hcCA6IEhlbHBNYXAgPSB7fVxuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIGNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKHJvb3QpO1xuICAgICAgICBjb25zdCByZXRWYWwgOiBSZXBvcnQgPSB7XG4gICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgIG51bUV4ZWN1dGVkOiAwLFxuICAgICAgICAgICAgcnVsZVRpbWU6IDAsXG4gICAgICAgICAgICB0b3RhbFRpbWU6IDBcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAvLyBSZXNldCB0aGUgcm9sZSBtYXBwZXJzXG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ucmVzZXQocm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0IGRldGVjdG9yXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBydWxlIG1hcHBlcnNcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHRIaWVyYXJjaGllcyA6IFJ1bGVDb250ZXh0SGllcmFyY2h5ID0ge31cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUod2Fsa2VyLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibWV0YVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIHx8ICFET01VdGlsLmdldEFuY2VzdG9yKHdhbGtlci5ub2RlLCBbXCJib2R5XCJdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0IDogUnVsZUNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHRIaWVyYXJjaGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuc0hpZXIgPSBjb250ZXh0SGllcmFyY2hpZXNbbnNdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SGllciA9IG5zSGllcltuc0hpZXIubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W25zXSA9IGxhc3RIaWVyOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hpbmdSdWxlcyA9IHRoaXMuZ2V0TWF0Y2hpbmdSdWxlcyhjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgIGxldCBkZXBNYXRjaCA9IHt9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGluZ1J1bGUgb2YgbWF0Y2hpbmdSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBtYXRjaGluZ1J1bGUucnVsZS5kZXBlbmRlbmNpZXMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwTWF0Y2hbZGVwXSkgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVsZmlsbHNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzIDogUnVsZURldGFpbHNbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbWF0Y2hpbmdSdWxlLnJ1bih0aGlzLCBjb250ZXh0LCBvcHRpb25zLCBjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBlciBzaG93cyBlcnJvciBpbiBjb25zb2xlLiBTa2lwIHRoaXMgcnVsZSBhcyBOL0FcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIHNjb3BlLCBpdCBmdWxmaWxscyB0aGUgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbbWF0Y2hpbmdSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJ1bGVUaW1lICs9IHJlc3VsdC5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwubnVtRXhlY3V0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlWzFdID09PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFtyZXN1bHQucnVsZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSk7XG4gICAgICAgIGNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICByZXRWYWwudG90YWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0VmFsKTtcbiAgICB9XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBvZiBydWxlSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk5JTkc6IFJ1bGUgSWRcIixydWxlSWQsXCJjb3VsZCBub3QgYmUgZW5hYmxlZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlTWFwW3J1bGVJZF07XG4gICAgfVxuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJ1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhZGRSdWxlcyhydWxlczogUnVsZVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgIH1cblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSwgc2tpcFNvcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjdHhzIDpDb250ZXh0W10gPSBDb250ZXh0LnBhcnNlKHJ1bGUuY29udGV4dCk7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBjb25zdCBydWxlSWQgPSBydWxlLmlkO1xuICAgICAgICBpZiAocnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBSdWxlXCIscnVsZUlkLFwiYWxyZWFkeSBhZGRlZCB0byBlbmdpbmUuIElnbm9yaW5nLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdID0gcnVsZTtcbiAgICAgICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgICAgICAgbGV0IHdyYXBJZCA9IHJ1bGVJZDtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMSkge1xuICAgICAgICAgICAgICAgIHdyYXBJZCA9IHJ1bGVJZCtcIiQkXCIraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZFJ1bGUgPSBuZXcgV3JhcHBlZFJ1bGUocnVsZSxjdHgpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUnVsZU1hcFt3cmFwSWRdID0gd3JhcHBlZFJ1bGU7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSB3cmFwcGVkUnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICAgICAgbGV0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJSb2xlID0gbGFzdFBhcnQubmFtZXNwYWNlK1wiOlwiK2xhc3RQYXJ0LnJvbGU7XG4gICAgICAgICAgICBpZiAobGFzdFBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBTb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zb3J0UnVsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5ubHNNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSGVscE1hcChtYXA6IEhlbHBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLmhlbHBNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ubHNNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBsZXQgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy5ubHNNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICBpZiAoIW1lc3NhZ2VUZW1wbGF0ZSkgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLFxuICAgICAgICAgICAgKG1hdGNoZWRTdHIsIG1hdGNoZWROdW0sIG1hdGNoZWRJbmRleCkgPT4gbXNnQXJnc1ttYXRjaGVkTnVtXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIGFyY2hpdmVJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghYXJjaGl2ZUlkKSB7XG4gICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGxhdGVzdFxuICAgICAgICAgICAgYXJjaGl2ZUlkID0gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Q29uZmlnLmhlbHBSb290fS8ke2FyY2hpdmVJZH0vZG9jJHt0aGlzLmdldEhlbHBSZWwocnVsZUlkLCByZWFzb25JZCl9YDtcbiAgICB9XG5cbiAgICBnZXRIZWxwUmVsKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5oZWxwTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgcnVsZUlkeCA9IHJ1bGVJZHggfHwgMDtcbiAgICAgICAgbGV0IGhlbHBTdHIgPSBudWxsO1xuICAgICAgICBpZiAocnVsZUlkeCBpbiB0aGlzLmhlbHBNYXBbcnVsZUlkXSkge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhlbHBTdHIpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIGhlbHBTdHI7XG4gICAgfVxuXG4gICAgYWRkTWFwcGVyKG1hcHBlcjogSU1hcHBlcikge1xuICAgICAgICB0aGlzLm1hcHBlcnNbbWFwcGVyLmdldE5hbWVzcGFjZSgpXSA9IG1hcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXRjaChydWxlOiBXcmFwcGVkUnVsZSxcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGxldCBydWxlUGFydHMgPSBydWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgIGxldCBwYXJ0SWR4ID0gcnVsZVBhcnRzLmxlbmd0aC0xO1xuICAgICAgICBsZXQgY3VyTlMgPSBydWxlUGFydHNbcGFydElkeF0ubmFtZXNwYWNlO1xuICAgICAgICBsZXQgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICBjb25zdCBjb250ZXh0Tm9kZSA9IGN1ckhpZXIubm9kZTtcblxuICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBydWxlIHBhcnQgZG9lc24ndCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIHdlIGRvbid0IGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAoIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG9ubHkgb25lIHBhcnQsIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAocnVsZVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBkZWFsIHdpdGggcGFyZW50IHBhcnRzLiBUbyB3YWxrIHRoZSBoaWVyYXJjaHksIHRoZXNlIG5lZWQgdG8gYmVcbiAgICAgICAgLy8gYWxsIGluIHRoZSBzYW1lIG5hbWVzcGFjZS4gQ29uZmlybSB0aGF0IGlzIHRydWUuXG4gICAgICAgIGN1ck5TID0gcnVsZVBhcnRzWzBdLm5hbWVzcGFjZTtcbiAgICAgICAgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgIGlmIChydWxlUGFydHMuc2xpY2UoMCwgcnVsZVBhcnRzLmxlbmd0aC0xKS5zb21lKHBhcnQgPT4gcGFydC5uYW1lc3BhY2UgIT09IGN1ck5TKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUk9SXSBSdWxlICR7cnVsZS5ydWxlLmlkfSBoYXMgaW5jb25zaXRlbnQgcGFyZW50IG5hbWVzcGFjZXNgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIG1vdmUgdXAgcGFzdCBpdCwgb3RoZXJ3aXNlLCBzdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGxldCBoaWVySWR4ID0gY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aCAtIChjdXJIaWVyLm5vZGUuaXNTYW1lTm9kZShjb250ZXh0Tm9kZSkgPyAyIDogMSk7XG4gICAgICAgIHdoaWxlIChoaWVySWR4ID49IDAgJiYgcGFydElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlc1BhcnQgPSBydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgaGllcklkeCk7XG4gICAgICAgICAgICBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2VzIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBhbmNlc3RvciBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBkb2Vzbid0IG1hdGNoLCBqdXN0IG1vdmUgdXAgdGhlIHJvbGUgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IGRvZXNuJ3QgbWF0Y2ggLSBjaGVjayBmb3Igb3RoZXIgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2hJZHggPSBoaWVySWR4LTE7ICFwYXJlbnRNYXRjaCAmJiBzZWFyY2hJZHggPj0gMDsgLS1zZWFyY2hJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1hdGNoID0gIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBzZWFyY2hJZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgY29ubmVjdG9yIFwiK3BhcnQuY29ubmVjdG9yK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZHggPT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdSdWxlcyhjdHhIaWVyIDogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogV3JhcHBlZFJ1bGVbXSB7XG4gICAgICAgIGxldCBtYXRjaGVzIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaGVzKHJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5ydWxlLmVuYWJsZWQgJiYgRW5naW5lLm1hdGNoKHJ1bGUsIGN0eEhpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBucyBpbiBjdHhIaWVyKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zK1wiOlwiKyhjdHhIaWVyW25zXS5sZW5ndGggPiAwID8gY3R4SGllcltuc11bY3R4SGllcltuc10ubGVuZ3RoLTFdLnJvbGUgOiBcIm5vbmVcIik7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbcm9sZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB4Um9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh4Um9sZSAhPT0gcm9sZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuZXhjbFJ1bGVzW3hSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG5zK1wiOm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlLnN0YXJ0c1dpdGgobnMrXCI6L1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6LypcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjovKlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjoqXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6KlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGVwcyhtYXRjaGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgcnVsZXMgaW4gb3JkZXIgdG8gZXhlY3V0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcbiAgICAgKiBAcGFyYW0gaW5SdWxlcyBMaXN0IG9mIHdyYXBwZWQgcnVsZXMgdG8gc29ydFxuICAgICAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIHdyYXBwZWQgcnVsZXNcbiAgICAgKi9cbiAgICBzb3J0RGVwcyhpblJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgIGxldCBkZXBSdWxlczogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgaW5SdWxlcykge1xuICAgICAgICAgICAgZGVwUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHJldFZhbCA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgbGV0IGlkVG9SdWxlID0ge307XG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcnVsZXMuIElmIHRoYXQgcnVsZSdzIGRlcGVuZGVuY2llcyBjYW4gYmUgbWV0IGJ5IHJ1bGVzIGFscmVhZHkgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAvLyBSZXBlYXQgdW50aWwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgc2F0aXNmaWVkIGxpc3RcbiAgICAgICAgLy8gSWYgYSBydWxlIGNhbm5vdCBiZSBzYXRpc2ZpZWQsIGl0IHdpbGwgbmV2ZXIgZXhlY3V0ZSwgc28gaXQgY2FuIGJlIGRyb3BwZWQuXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGRlcFJ1bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBSdWxlID0gZGVwUnVsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmlkIGluIGlkVG9SdWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzICYmIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5wcmVyZXFzICYmIGRlcFJ1bGUucnVsZS5wcmVyZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUucHJlcmVxcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goZGVwUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9SdWxlW2RlcFJ1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZXBSdWxlcy5zcGxpY2UoaWR4LS0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBzdGF0aWMgREVCVUcgPSBmYWxzZTtcbiAgICBzdGF0aWMgaGVscFJvb3QgPSBcImh0dHBzOi8vYWJsZS5pYm0uY29tL3J1bGVzL2FyY2hpdmVzXCI7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbG9yVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIENTU0NvbG9yTG9va3VwID0ge1xuICAgICAgICBcImFsaWNlYmx1ZVwiOiBcIiNmMGY4ZmZcIixcbiAgICAgICAgXCJhbnRpcXVld2hpdGVcIjogXCIjZmFlYmQ3XCIsXG4gICAgICAgIFwiYXF1YVwiOiBcIiMwMGZmZmZcIixcbiAgICAgICAgXCJhcXVhbWFyaW5lXCI6IFwiIzdmZmZkNFwiLFxuICAgICAgICBcImF6dXJlXCI6IFwiI2YwZmZmZlwiLFxuICAgICAgICBcImJlaWdlXCI6IFwiI2Y1ZjVkY1wiLFxuICAgICAgICBcImJpc3F1ZVwiOiBcIiNmZmU0YzRcIixcbiAgICAgICAgXCJibGFja1wiOiBcIiMwMDAwMDBcIixcbiAgICAgICAgXCJibGFuY2hlZGFsbW9uZFwiOiBcIiNmZmViY2RcIixcbiAgICAgICAgXCJibHVlXCI6IFwiIzAwMDBmZlwiLFxuICAgICAgICBcImJsdWV2aW9sZXRcIjogXCIjOGEyYmUyXCIsXG4gICAgICAgIFwiYnJvd25cIjogXCIjYTUyYTJhXCIsXG4gICAgICAgIFwiYnVybHl3b29kXCI6IFwiI2RlYjg4N1wiLFxuICAgICAgICBcImNhZGV0Ymx1ZVwiOiBcIiM1ZjllYTBcIixcbiAgICAgICAgXCJjaGFydHJldXNlXCI6IFwiIzdmZmYwMFwiLFxuICAgICAgICBcImNob2NvbGF0ZVwiOiBcIiNkMjY5MWVcIixcbiAgICAgICAgXCJjb3JhbFwiOiBcIiNmZjdmNTBcIixcbiAgICAgICAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBcIiM2NDk1ZWRcIixcbiAgICAgICAgXCJjb3Juc2lsa1wiOiBcIiNmZmY4ZGNcIixcbiAgICAgICAgXCJjcmltc29uXCI6IFwiI2RjMTQzY1wiLFxuICAgICAgICBcImN5YW5cIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiZGFya2JsdWVcIjogXCIjMDAwMDhiXCIsXG4gICAgICAgIFwiZGFya2N5YW5cIjogXCIjMDA4YjhiXCIsXG4gICAgICAgIFwiZGFya2dvbGRlbnJvZFwiOiBcIiNiODg2MGJcIixcbiAgICAgICAgXCJkYXJrZ3JheVwiOiBcIiNhOWE5YTlcIixcbiAgICAgICAgXCJkYXJrZ3JlZW5cIjogXCIjMDA2NDAwXCIsXG4gICAgICAgIFwiZGFya2toYWtpXCI6IFwiI2JkYjc2YlwiLFxuICAgICAgICBcImRhcmttYWdlbnRhXCI6IFwiIzhiMDA4YlwiLFxuICAgICAgICBcImRhcmtvbGl2ZWdyZWVuXCI6IFwiIzU1NmIyZlwiLFxuICAgICAgICBcImRhcmtvcmFuZ2VcIjogXCIjZmY4YzAwXCIsXG4gICAgICAgIFwiZGFya29yY2hpZFwiOiBcIiM5OTMyY2NcIixcbiAgICAgICAgXCJkYXJrcmVkXCI6IFwiIzhiMDAwMFwiLFxuICAgICAgICBcImRhcmtzYWxtb25cIjogXCIjZTk5NjdhXCIsXG4gICAgICAgIFwiZGFya3NlYWdyZWVuXCI6IFwiIzhmYmM4ZlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWJsdWVcIjogXCIjNDgzZDhiXCIsXG4gICAgICAgIFwiZGFya3NsYXRlZ3JheVwiOiBcIiMyZjRmNGZcIixcbiAgICAgICAgXCJkYXJrdHVycXVvaXNlXCI6IFwiIzAwY2VkMVwiLFxuICAgICAgICBcImRhcmt2aW9sZXRcIjogXCIjOTQwMGQzXCIsXG4gICAgICAgIFwiZGVlcHBpbmtcIjogXCIjZmYxNDkzXCIsXG4gICAgICAgIFwiZGVlcHNreWJsdWVcIjogXCIjMDBiZmZmXCIsXG4gICAgICAgIFwiZGltZ3JheVwiOiBcIiM2OTY5NjlcIixcbiAgICAgICAgXCJkb2RnZXJibHVlXCI6IFwiIzFlOTBmZlwiLFxuICAgICAgICBcImZpcmVicmlja1wiOiBcIiNiMjIyMjJcIixcbiAgICAgICAgXCJmbG9yYWx3aGl0ZVwiOiBcIiNmZmZhZjBcIixcbiAgICAgICAgXCJmb3Jlc3RncmVlblwiOiBcIiMyMjhiMjJcIixcbiAgICAgICAgXCJmdWNoc2lhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcImdhaW5zYm9yb1wiOiBcIiNkY2RjZGNcIixcbiAgICAgICAgXCJnaG9zdHdoaXRlXCI6IFwiI2Y4ZjhmZlwiLFxuICAgICAgICBcImdvbGRcIjogXCIjZmZkNzAwXCIsXG4gICAgICAgIFwiZ29sZGVucm9kXCI6IFwiI2RhYTUyMFwiLFxuICAgICAgICBcImdyYXlcIjogXCIjODA4MDgwXCIsXG4gICAgICAgIFwiZ3JlZW5cIjogXCIjMDA4MDAwXCIsXG4gICAgICAgIFwiZ3JlZW55ZWxsb3dcIjogXCIjYWRmZjJmXCIsXG4gICAgICAgIFwiaG9uZXlkZXdcIjogXCIjZjBmZmYwXCIsXG4gICAgICAgIFwiaG90cGlua1wiOiBcIiNmZjY5YjRcIixcbiAgICAgICAgXCJpbmRpYW5yZWRcIjogXCIjY2Q1YzVjXCIsXG4gICAgICAgIFwiaW5kaWdvXCI6IFwiIzRiMDA4MlwiLFxuICAgICAgICBcIml2b3J5XCI6IFwiI2ZmZmZmMFwiLFxuICAgICAgICBcImtoYWtpXCI6IFwiI2YwZTY4Y1wiLFxuICAgICAgICBcImxhdmVuZGVyXCI6IFwiI2U2ZTZmYVwiLFxuICAgICAgICBcImxhdmVuZGVyYmx1c2hcIjogXCIjZmZmMGY1XCIsXG4gICAgICAgIFwibGF3bmdyZWVuXCI6IFwiIzdjZmMwMFwiLFxuICAgICAgICBcImxlbW9uY2hpZmZvblwiOiBcIiNmZmZhY2RcIixcbiAgICAgICAgXCJsaWdodGJsdWVcIjogXCIjYWRkOGU2XCIsXG4gICAgICAgIFwibGlnaHRjb3JhbFwiOiBcIiNmMDgwODBcIixcbiAgICAgICAgXCJsaWdodGN5YW5cIjogXCIjZTBmZmZmXCIsXG4gICAgICAgIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogXCIjZmFmYWQyXCIsXG4gICAgICAgIFwibGlnaHRncmV5XCI6IFwiI2QzZDNkM1wiLFxuICAgICAgICBcImxpZ2h0Z3JlZW5cIjogXCIjOTBlZTkwXCIsXG4gICAgICAgIFwibGlnaHRwaW5rXCI6IFwiI2ZmYjZjMVwiLFxuICAgICAgICBcImxpZ2h0c2FsbW9uXCI6IFwiI2ZmYTA3YVwiLFxuICAgICAgICBcImxpZ2h0c2VhZ3JlZW5cIjogXCIjMjBiMmFhXCIsXG4gICAgICAgIFwibGlnaHRza3libHVlXCI6IFwiIzg3Y2VmYVwiLFxuICAgICAgICBcImxpZ2h0c2xhdGVncmF5XCI6IFwiIzc3ODg5OVwiLFxuICAgICAgICBcImxpZ2h0c3RlZWxibHVlXCI6IFwiI2IwYzRkZVwiLFxuICAgICAgICBcImxpZ2h0eWVsbG93XCI6IFwiI2ZmZmZlMFwiLFxuICAgICAgICBcImxpbWVcIjogXCIjMDBmZjAwXCIsXG4gICAgICAgIFwibGltZWdyZWVuXCI6IFwiIzMyY2QzMlwiLFxuICAgICAgICBcImxpbmVuXCI6IFwiI2ZhZjBlNlwiLFxuICAgICAgICBcIm1hZ2VudGFcIjogXCIjZmYwMGZmXCIsXG4gICAgICAgIFwibWFyb29uXCI6IFwiIzgwMDAwMFwiLFxuICAgICAgICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIjNjZjZGFhXCIsXG4gICAgICAgIFwibWVkaXVtYmx1ZVwiOiBcIiMwMDAwY2RcIixcbiAgICAgICAgXCJtZWRpdW1vcmNoaWRcIjogXCIjYmE1NWQzXCIsXG4gICAgICAgIFwibWVkaXVtcHVycGxlXCI6IFwiIzkzNzBkOFwiLFxuICAgICAgICBcIm1lZGl1bXNlYWdyZWVuXCI6IFwiIzNjYjM3MVwiLFxuICAgICAgICBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBcIiM3YjY4ZWVcIixcbiAgICAgICAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIiMwMGZhOWFcIixcbiAgICAgICAgXCJtZWRpdW10dXJxdW9pc2VcIjogXCIjNDhkMWNjXCIsXG4gICAgICAgIFwibWVkaXVtdmlvbGV0cmVkXCI6IFwiI2M3MTU4NVwiLFxuICAgICAgICBcIm1pZG5pZ2h0Ymx1ZVwiOiBcIiMxOTE5NzBcIixcbiAgICAgICAgXCJtaW50Y3JlYW1cIjogXCIjZjVmZmZhXCIsXG4gICAgICAgIFwibWlzdHlyb3NlXCI6IFwiI2ZmZTRlMVwiLFxuICAgICAgICBcIm1vY2Nhc2luXCI6IFwiI2ZmZTRiNVwiLFxuICAgICAgICBcIm5hdmFqb3doaXRlXCI6IFwiI2ZmZGVhZFwiLFxuICAgICAgICBcIm5hdnlcIjogXCIjMDAwMDgwXCIsXG4gICAgICAgIFwib2xkbGFjZVwiOiBcIiNmZGY1ZTZcIixcbiAgICAgICAgXCJvbGl2ZVwiOiBcIiM4MDgwMDBcIixcbiAgICAgICAgXCJvbGl2ZWRyYWJcIjogXCIjNmI4ZTIzXCIsXG4gICAgICAgIFwib3JhbmdlXCI6IFwiI2ZmYTUwMFwiLFxuICAgICAgICBcIm9yYW5nZXJlZFwiOiBcIiNmZjQ1MDBcIixcbiAgICAgICAgXCJvcmNoaWRcIjogXCIjZGE3MGQ2XCIsXG4gICAgICAgIFwicGFsZWdvbGRlbnJvZFwiOiBcIiNlZWU4YWFcIixcbiAgICAgICAgXCJwYWxlZ3JlZW5cIjogXCIjOThmYjk4XCIsXG4gICAgICAgIFwicGFsZXR1cnF1b2lzZVwiOiBcIiNhZmVlZWVcIixcbiAgICAgICAgXCJwYWxldmlvbGV0cmVkXCI6IFwiI2Q4NzA5M1wiLFxuICAgICAgICBcInBhcGF5YXdoaXBcIjogXCIjZmZlZmQ1XCIsXG4gICAgICAgIFwicGVhY2hwdWZmXCI6IFwiI2ZmZGFiOVwiLFxuICAgICAgICBcInBlcnVcIjogXCIjY2Q4NTNmXCIsXG4gICAgICAgIFwicGlua1wiOiBcIiNmZmMwY2JcIixcbiAgICAgICAgXCJwbHVtXCI6IFwiI2RkYTBkZFwiLFxuICAgICAgICBcInBvd2RlcmJsdWVcIjogXCIjYjBlMGU2XCIsXG4gICAgICAgIFwicHVycGxlXCI6IFwiIzgwMDA4MFwiLFxuICAgICAgICBcInJlZFwiOiBcIiNmZjAwMDBcIixcbiAgICAgICAgXCJyb3N5YnJvd25cIjogXCIjYmM4ZjhmXCIsXG4gICAgICAgIFwicm95YWxibHVlXCI6IFwiIzQxNjllMVwiLFxuICAgICAgICBcInNhZGRsZWJyb3duXCI6IFwiIzhiNDUxM1wiLFxuICAgICAgICBcInNhbG1vblwiOiBcIiNmYTgwNzJcIixcbiAgICAgICAgXCJzYW5keWJyb3duXCI6IFwiI2Y0YTQ2MFwiLFxuICAgICAgICBcInNlYWdyZWVuXCI6IFwiIzJlOGI1N1wiLFxuICAgICAgICBcInNlYXNoZWxsXCI6IFwiI2ZmZjVlZVwiLFxuICAgICAgICBcInNpZW5uYVwiOiBcIiNhMDUyMmRcIixcbiAgICAgICAgXCJzaWx2ZXJcIjogXCIjYzBjMGMwXCIsXG4gICAgICAgIFwic2t5Ymx1ZVwiOiBcIiM4N2NlZWJcIixcbiAgICAgICAgXCJzbGF0ZWJsdWVcIjogXCIjNmE1YWNkXCIsXG4gICAgICAgIFwic2xhdGVncmF5XCI6IFwiIzcwODA5MFwiLFxuICAgICAgICBcInNub3dcIjogXCIjZmZmYWZhXCIsXG4gICAgICAgIFwic3ByaW5nZ3JlZW5cIjogXCIjMDBmZjdmXCIsXG4gICAgICAgIFwic3RlZWxibHVlXCI6IFwiIzQ2ODJiNFwiLFxuICAgICAgICBcInRhblwiOiBcIiNkMmI0OGNcIixcbiAgICAgICAgXCJ0ZWFsXCI6IFwiIzAwODA4MFwiLFxuICAgICAgICBcInRoaXN0bGVcIjogXCIjZDhiZmQ4XCIsXG4gICAgICAgIFwidG9tYXRvXCI6IFwiI2ZmNjM0N1wiLFxuICAgICAgICBcInR1cnF1b2lzZVwiOiBcIiM0MGUwZDBcIixcbiAgICAgICAgXCJ2aW9sZXRcIjogXCIjZWU4MmVlXCIsXG4gICAgICAgIFwid2hlYXRcIjogXCIjZjVkZWIzXCIsXG4gICAgICAgIFwid2hpdGVcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwid2hpdGVzbW9rZVwiOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgXCJ5ZWxsb3dcIjogXCIjZmZmZjAwXCIsXG4gICAgICAgIFwieWVsbG93Z3JlZW5cIjogXCIjOWFjZDMyXCIsXG4gICAgICAgIFwiYnV0dG9udGV4dFwiOiBcInJnYmEoMCwgMCwgMCwgMC44NDcpXCIsXG4gICAgICAgIFwiYnV0dG9uZmFjZVwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgXCJncmF5dGV4dFwiOiBcInJnYmEoMCwgMCwgMCwgMC4yNDcpXCJcbiAgICB9XG5cblxuICAgIC8vIFJld3JpdGUgdGhlIGNvbG9yIG9iamVjdCB0byBhY2NvdW50IGZvciBhbHBoYVxuICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBjc3NTdHlsZUNvbG9yID0gY3NzU3R5bGVDb2xvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gbmV3IENvbG9yT2JqKDI1NSwgMjU1LCAyNTUsIDApO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciBpbiBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXApXG4gICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoobVsxXSwgbVsyXSwgbVszXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoobVsxXSwgbVsyXSwgbVszXSwgbVs0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5jaGFyQXQoMCkgIT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRoaXNSZWQgPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygxLCAzKSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNHcmVlbiA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDMsIDUpLCAxNik7XG4gICAgICAgICAgICBsZXQgdGhpc0JsdWUgPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZyg1LCA3KSwgMTYpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaih0aGlzUmVkLCB0aGlzR3JlZW4sIHRoaXNCbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAgICByZXR1cm4gbnVsbDsgLy8gVW5yZWFjaGFibGVcbiAgICB9O1xuXG4gcHVibGljIHN0YXRpYyBDb2xvckNvbWJvKHJ1bGVDb250ZXh0IDogSFRNTEVsZW1lbnQpIHtcbiAgICB0cnkgeyBcbiAgICAgICAgdmFyIGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgICAgIGxldCB3YWxrTm9kZSA6IEVsZW1lbnQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEpIFxuICAgICAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIgcmV0VmFsID0ge1xuICAgICAgICAgICAgXCJoYXNHcmFkaWVudFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwiaGFzQkdJbWFnZVwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwidGV4dFNoYWRvd1wiOiBmYWxzZSxcbiAgICAgICAgICAgIFwiZmdcIjogbnVsbCxcbiAgICAgICAgICAgIFwiYmdcIjogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gc3RhcnRcbiAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgdmFyIGNvbXBTdHlsZUNvbG9yID0gY1N0eWxlLmNvbG9yO1xuICAgICAgICBpZiAoIWNvbXBTdHlsZUNvbG9yKVxuICAgICAgICAgICAgY29tcFN0eWxlQ29sb3IgPSBcImJsYWNrXCI7XG4gICAgICAgIHZhciBmZyA9IENvbG9yVXRpbC5Db2xvcihjb21wU3R5bGVDb2xvcik7XG4gICAgICAgIHZhciByZUNvbG9yID0gL3RyYW5zcGFyZW50fHJnYmE/XFwoW14pXStcXCkvZ2k7XG4gICAgICAgIHZhciBndWVzc0dyYWRDb2xvciA9IGZ1bmN0aW9uIChncmFkTGlzdCwgYmdDb2xvciwgZmdDb2xvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGNvbG9yLCByZXR1cm4gdGhhdFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ3JhZExpc3QubGVuZ3RoID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JhZExpc3Q7XG5cbiAgICAgICAgICAgICAgICB2YXIgb3ZlcmFsbFdvcnN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgb3ZlcmFsbFdvcnN0UmF0aW8gPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlHcmFkID0gMTsgaUdyYWQgPCBncmFkTGlzdC5sZW5ndGg7ICsraUdyYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSAuMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGVwID4gLjAwMDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggKyBzdGVwIDw9IDEgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCArIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggKyBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCAtIHN0ZXAgPj0gMCAmJiB3b3JzdFJhdGlvID4gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4IC0gc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKHdvcnN0Q29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGlkeCAtIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gc3RlcCAvIDEwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyYWxsV29yc3RSYXRpbyA9PT0gbnVsbCB8fCBvdmVyYWxsV29yc3RSYXRpbyA+IHdvcnN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxXb3JzdFJhdGlvID0gd29yc3RSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxXb3JzdCA9IHdvcnN0Q29sb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJhbGxXb3JzdDsgLy8gcmV0dXJuIHRoZSBkYXJrZXN0IGNvbG9yXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmdDb2xvcjtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcHJpb3JTdGFja0JHID0gQ29sb3JVdGlsLkNvbG9yKFwid2hpdGVcIik7XG4gICAgICAgIHZhciB0aGlzU3RhY2tPcGFjaXR5ID0gbnVsbDtcbiAgICAgICAgdmFyIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgdmFyIHRoaXNTdGFja0JHID0gbnVsbDtcbiAgICAgICAgLy8gQW5jZXN0b3JzIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3Btb3N0IHBhcmVudCB0b3dhcmQgdGhlIGNoaWxkXG4gICAgICAgIHdoaWxlIChhbmNlc3RvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgICAgICAgLy92YXIgcHJvY05leHQgPSBhbmNlc3RvcnMuc3BsaWNlKDAsIDEpWzBdO1xuICAgICAgICAgICAgLy8gY1N0eWxlIGlzIHRoZSBjb21wdXRlZCBzdHlsZSBvZiB0aGlzIGxheWVyXG4gICAgICAgICAgICB2YXIgY1N0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUocHJvY05leHQpO1xuICAgICAgICAgICAgaWYgKGNTdHlsZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHRoaXNCZ0NvbG9yIGlzIHRoZSBjb2xvciBvZiB0aGlzIGxheWVyIG9yIG51bGwgaWYgdGhlIGxheWVyIGlzIHRyYW5zcGFyZW50XG4gICAgICAgICAgICB2YXIgdGhpc0JnQ29sb3IgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgY1N0eWxlLmJhY2tncm91bmRDb2xvciAhPSBcInRyYW5zcGFyZW50XCIgJiYgY1N0eWxlLmJhY2tncm91bmRDb2xvciAhPSBcInJnYmEoMCwgMCwgMCwgMClcIikge1xuICAgICAgICAgICAgICAgIHRoaXNCZ0NvbG9yID0gQ29sb3JVdGlsLkNvbG9yKGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBncmFkaWVudCBpbnZvbHZlZCwgc2V0IHRoaXNCZ0NvbG9yIHRvIHRoZSB3b3JzdCBjb2xvciBjb21iaW5hdGlvbiBhdmFpbGFibGUgYWdhaW5zdCB0aGUgZm9yZWdyb3VuZFxuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYWRDb2xvcnMgOiBzdHJpbmdbXSA9IGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubWF0Y2gocmVDb2xvcik7XG4gICAgICAgICAgICAgICAgaWYgKGdyYWRDb2xvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyYWRDb2xvckNvbXAgOiBDb2xvck9ialtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhZENvbG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFkQ29sb3JzW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRDb2xvcnMuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvckNvbXAgPSBDb2xvclV0aWwuQ29sb3IoZ3JhZENvbG9yc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29tcC5hbHBoYSAhPT0gdW5kZWZpbmVkICYmIGNvbG9yQ29tcC5hbHBoYSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IHRoZSBncmRpZW50IGJnIGNvbG9yIHdpdCBwYXJlbnQgYmcgaWYgYWxwaGEgPCAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21wU3RhY2tCZyA9IHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JDb21wID0gY29sb3JDb21wLmdldE92ZXJsYXlDb2xvcihjb21wU3RhY2tCZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRDb2xvckNvbXAucHVzaChjb2xvckNvbXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXNCZ0NvbG9yID0gZ3Vlc3NHcmFkQ29sb3IoZ3JhZENvbG9yQ29tcCwgdGhpc1N0YWNrQkcgfHwgcHJpb3JTdGFja0JHLCBmZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXNvbGlkIG9wYWNpdHlcbiAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSBudWxsIHx8IChjU3R5bGUub3BhY2l0eSAmJiBjU3R5bGUub3BhY2l0eS5sZW5ndGggPiAwICYmIHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpIDwgMSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgc3RhY2ssIHJlc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcmxheVxuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRy5hbHBoYSA9IHRoaXNTdGFja09wYWNpdHkgKiB0aGlzU3RhY2tBbHBoYTtcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXNTdGFja09wYWNpdHkgPSAxLjA7XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gcGFyc2VGbG9hdChjU3R5bGUub3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzQmdDb2xvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1N0YWNrQkcuYWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIHNvbGlkIGNvbG9yIGJhY2tncm91bmRzIGFuZCBncmFkaWVudCBjb2xvciBiYWNrZ3JvdW5kc1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhY2sgYWxyZWFkeSBoYXMgYSBiYWNrZ3JvdW5kIGNvbG9yLCBibGVuZCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3IuZ2V0T3ZlcmxheUNvbG9yKHRoaXNTdGFja0JHKTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzU3RhY2tBbHBoYSA9IHRoaXNCZ0NvbG9yLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICM1MjY6IElmIHRoaXNCZ0NvbG9yIGhhZCBhbiBhbHBoYSB2YWx1ZSwgaXQgbWF5IG5vdCBleHBvc2UgdGhyb3VnaCB0aGlzU3RhY2tCRyBpbiB0aGUgYWJvdmUgY29kZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHdpcGUgb3V0IHRoZSBncmFkaWVudCBpbmZvIGlmIHRoaXMgbGF5ZXIgd2FzIHRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IDEuMCAmJiB0aGlzU3RhY2tBbHBoYSA9PT0gMS4wICYmICh0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjApID09PSAxLjAgJiYgKHRoaXNCZ0NvbG9yLmFscGhhIHx8IDEuMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZSAhPSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKFwiZ3JhZGllbnRcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmZyA9IGZnLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICBkZWxldGUgZmcuYWxwaGE7XG4gICAgICAgIH1cbiAgICAgICAgZmcuYWxwaGEgPSAoZmcuYWxwaGEgfHwgMSkgKiB0aGlzU3RhY2tPcGFjaXR5O1xuICAgICAgICBmZyA9IGZnLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICBwcmlvclN0YWNrQkcgPSB0aGlzU3RhY2tCRy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWwuZmcgPSBmZztcbiAgICAgICAgcmV0VmFsLmJnID0gcHJpb3JTdGFja0JHO1xuXG4gICAgICAgIGlmIChjU3R5bGUudGV4dFNoYWRvdyAmJiBjU3R5bGUudGV4dFNoYWRvdyAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgcmV0VmFsLnRleHRTaGFkb3cgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyBoYXBwZW5lZCwgdGhlbi4uLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yT2JqIHtcbiAgICByZWQgOiBudW1iZXI7XG4gICAgZ3JlZW4gOiBudW1iZXI7XG4gICAgYmx1ZSA6IG51bWJlcjtcbiAgICBhbHBoYSA6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlZCA6IHN0cmluZyB8IG51bWJlciwgZ3JlZW4gOiBzdHJpbmcgfCBudW1iZXIsIGJsdWUgOiBzdHJpbmcgfCBudW1iZXIsIGFscGhhPyA6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBmdW5jdGlvbiBmaXhDb21wb25lbnQoY29tcCA6IHN0cmluZyB8IG51bWJlcikgOiBudW1iZXIge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY29tcCkgIT0gdHlwZW9mIChcIlwiKSkgcmV0dXJuIGNvbXAgYXMgbnVtYmVyO1xuICAgICAgICAgICAgbGV0IGNvbXBTdHIgPSBjb21wIGFzIHN0cmluZztcbiAgICAgICAgICAgIGNvbXBTdHIgPSBjb21wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChjb21wU3RyW2NvbXBTdHIubGVuZ3RoIC0gMV0gIT0gXCIlXCIpIHJldHVybiBwYXJzZUludChjb21wU3RyKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoY29tcFN0ci5zdWJzdHJpbmcoMCwgY29tcFN0ci5sZW5ndGggLSAxKSkgKiAyLjU1KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZCA9IGZpeENvbXBvbmVudChyZWQpO1xuICAgICAgICB0aGlzLmdyZWVuID0gZml4Q29tcG9uZW50KGdyZWVuKTtcbiAgICAgICAgdGhpcy5ibHVlID0gZml4Q29tcG9uZW50KGJsdWUpO1xuICAgICAgICBpZiAodHlwZW9mIChhbHBoYSkgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hbHBoYSA9ICh0eXBlb2YgKGFscGhhKSA9PT0gdHlwZW9mIChcIlwiKSkgPyBwYXJzZUZsb2F0KGFscGhhIGFzIHN0cmluZykgOiBhbHBoYSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b0hleEhlbHAodmFsdWUgOiBudW1iZXIpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IE1hdGgucm91bmQodmFsdWUpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfTtcblxuICAgIHRvSGV4KCkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCIjXCIgKyB0aGlzLnRvSGV4SGVscCh0aGlzLnJlZCkgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmdyZWVuKSArIHRoaXMudG9IZXhIZWxwKHRoaXMuYmx1ZSk7XG4gICAgfTtcblxuICAgIGNvbnRyYXN0UmF0aW8oYmdDb2xvciA6IENvbG9yT2JqKSB7IFxuICAgICAgICBsZXQgZmdDb2xvcjogQ29sb3JPYmogPSB0aGlzO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgIT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgIGZnQ29sb3IgPSB0aGlzLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICBcbiAgICAgICAgbGV0IGx1bTEgPSBmZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGlmICghYmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSkge1xuICAgICAgICAgICAgbGV0IHMgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGJnQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBzICs9IGtleSArIFwiXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGVydChiZ0NvbG9yKTtcbiAgICAgICAgICAgIGFsZXJ0KHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsdW0yID0gYmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBsZXQgcmF0aW8gPSAobHVtMSA+IGx1bTIpID8gKGx1bTEgKyAuMDUpIC8gKGx1bTIgKyAuMDUpIDogKGx1bTIgKyAuMDUpIC8gKGx1bTEgKyAuMDUpO1xuICAgICAgICByZXR1cm4gcmF0aW87XG4gICAgfTtcblxuICAgIHJlbGF0aXZlTHVtaW5hbmNlKCkgOiBudW1iZXIge1xuICAgICAgICBsZXQgUiA9IHRoaXMucmVkIC8gMjU1LjA7XG4gICAgICAgIGxldCBHID0gdGhpcy5ncmVlbiAvIDI1NS4wO1xuICAgICAgICBsZXQgQiA9IHRoaXMuYmx1ZSAvIDI1NS4wO1xuICAgICAgICBSID0gUiA8PSAuMDQwNDUgPyBSIC8gMTIuOTIgOiBNYXRoLnBvdygoUiArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEcgPSBHIDw9IC4wNDA0NSA/IEcgLyAxMi45MiA6IE1hdGgucG93KChHICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgQiA9IEIgPD0gLjA0MDQ1ID8gQiAvIDEyLjkyIDogTWF0aC5wb3coKEIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICByZXR1cm4gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCO1xuICAgIH07XG5cbiAgICBtaXgoY29sb3IyIDogQ29sb3JPYmosIHBlcmNUaGlzIDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAoY29sb3IyLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHBoYVRoaXMgPSB0aGlzLmFscGhhID8gdGhpcy5hbHBoYSA6IDE7XG4gICAgICAgICAgICBsZXQgYWxwaGFPdGhlciA9IGNvbG9yMi5hbHBoYSA/IGNvbG9yMi5hbHBoYSA6IDE7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5yZWQgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5yZWQsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmdyZWVuICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuZ3JlZW4sXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmJsdWUgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ibHVlLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogYWxwaGFUaGlzICsgKDEgLSBwZXJjVGhpcykgKiBhbHBoYU90aGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGdldE92ZXJsYXlDb2xvcihiZ0NvbG9yIDogQ29sb3JPYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5hbHBoYSA+PSAxKSB7XG4gICAgICAgICAgICAvLyBObyBtaXhpbmcgcmVxdWlyZWQgLSBpdCdzIG9wYXF1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWxwaGEgPCAwKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiSW52YWxpZCBhbHBoYSB2YWx1ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKGJnQ29sb3IuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIgJiYgYmdDb2xvci5hbHBoYSA8IDEpIHtcbiAgICAgICAgICAgIC8vXHRcdEhhYWMuRXJyb3IubG9nRXJyb3IoXCJDYW5ub3QgbWl4IHdpdGggYSBiYWNrZ3JvdW5kIGFscGhhXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMubWl4KGJnQ29sb3IsIHRoaXMuYWxwaGEpO1xuICAgICAgICBkZWxldGUgcmV0VmFsLmFscGhhOyBcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21DU1NDb2xvcihjc3NTdHlsZUNvbG9yKSB7XG4gICAgICAgIGxldCB0aGlzUmVkID0gLTE7XG4gICAgICAgIGxldCB0aGlzR3JlZW4gPSAtMTtcbiAgICAgICAgbGV0IHRoaXNCbHVlID0gLTE7XG5cbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzUmVkID0gbVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzR3JlZW4gPSBtWzJdO1xuICAgICAgICAgICAgICAgIHRoaXNCbHVlID0gbVszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooLispXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5jaGFyQXQoMCkgIT0gXCIjXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciBpbiBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXApXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXBbY3NzU3R5bGVDb2xvcl07XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tSGV4ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIGxldCBsb29rdXAgPSB7XG4gICAgICAgICAgICAgICAgICAgIFwiYVwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgXCJiXCI6IDExLFxuICAgICAgICAgICAgICAgICAgICBcImNcIjogMTIsXG4gICAgICAgICAgICAgICAgICAgIFwiZFwiOiAxMyxcbiAgICAgICAgICAgICAgICAgICAgXCJlXCI6IDE0LFxuICAgICAgICAgICAgICAgICAgICBcImZcIjogMTVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAqIDE2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHZhbC5jaGFyQXQoaSkgaW4gbG9va3VwID8gbG9va3VwW3ZhbC5jaGFyQXQoaSldIDogdmFsLmNoYXJBdChpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZWUtZGlnaXQgUkdCICgjcmdiKSBpcyBjb252ZXJ0ZWQgdG8gc2l4LWRpZ2l0IGZvcm0gKCNycmdnYmIpIGJ5IHJlcGxpY2F0aW5nIGRpZ2l0c1xuICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTMvI3JnYi1jb2xvcilcbiAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gXCIjXCIgKyBjc3NTdHlsZUNvbG9yLmNoYXJBdCgxKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgyKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgzKS5yZXBlYXQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzUmVkID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygxLCAzKSk7XG4gICAgICAgICAgICB0aGlzR3JlZW4gPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDMsIDUpKTtcbiAgICAgICAgICAgIHRoaXNCbHVlID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZyg1LCA3KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaih0aGlzUmVkLCB0aGlzR3JlZW4sIHRoaXNCbHVlKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcblxuZXhwb3J0IGNsYXNzIERPTU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkb21cIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIHJldFZhbFthdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSB7XG4gICAgICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgICAgICBpZiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAgICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKChib3VuZHMubGVmdCArIHNjcm9sbFgpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbCgoYm91bmRzLnRvcCArIHNjcm9sbFkpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aCAqIGFkanVzdG1lbnQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBET01VdGlsIHtcbiAgICBcbiAgICBzdGF0aWMgaGFzUGFyZW50KG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXA7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFuY2VzdG9yKG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHNhbWVOb2RlKGE6IE5vZGUsIGI6IE5vZGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmlzU2FtZU5vZGUoYik7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuV2hpdGVzcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvWyBcXHRcXHJcXG5dL2csIFwiIFwiKS5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5TcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvICsvZyxcIiBcIik7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHRydWUgaWYgZWxlbWVudDEgYW5kIGVsZW1lbnQyIChjZWxscykgYXJlIGluIHRoZSBzYW1lIHRhYmxlXG4gICAgc3RhdGljIGlzSW5TYW1lVGFibGUoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gICAgICAgIGlmIChlbGVtZW50MSAmJiBlbGVtZW50Mikge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IFsndGFibGUnXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDE9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDEsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Mj0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MiwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAocGFyZW50MSAhPT0gbnVsbCAmJiBwYXJlbnQyICE9IG51bGwgJiYgRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQxLCBwYXJlbnQyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBzaGFkb3dSb290Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG5kID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5kICE9IG51bGwgJiYgbmQubm9kZVR5cGUgIT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlcbiAgICAgICAgICAgIG5kID0gbmQucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIG5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvYmplY3RzLCBidXQgcmV0YWlucyBOb2RlIGF0dHJpYnV0ZXMgYXMgcmVmZXJlbmNlc1xuICAgICAqIEBwYXJhbSByaHMgXG4gICAgICovXG4gICAgc3RhdGljIG9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFyaHMpIHJldHVybiByaHM7XG4gICAgICAgIGlmICh0eXBlb2YgcmhzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJocyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmhzIGluc3RhbmNlb2YgTm9kZSB8fCAhIXJocy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWw7XG4gICAgICAgICAgICBpZiAocmhzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2godGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2tleV0gPSB0aGlzLm9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyTmFtZSwgYXR0clZhbHVlKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKDxFbGVtZW50PndhbGtOb2RlKS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpID09PSBhdHRyVmFsdWUpIFxuICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudE5vZGUobm9kZTogTm9kZSkgOiBOb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHAgOiBOb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoKG5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgfSBlbHNlIGlmICgobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICB9IGVsc2UgaWYgKHAgJiYgcC5ub2RlVHlwZSA9PT0gMTEpIHtcbiAgICAgICAgICAgIGlmICgocCBhcyBTaGFkb3dSb290KS5ob3N0KSB7XG4gICAgICAgICAgICAgICAgcCA9IChwIGFzIFNoYWRvd1Jvb3QpLmhvc3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJlbnRFbGVtZW50KG5vZGU6IE5vZGUpIDogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBsZXQgZWxlbSA6IEVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGlzTm9kZVZpc2libGUobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHZpcyA9IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgdyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBsZXQgY3MgPSB3LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzLmRpc3BsYXkgPT09IFwibm9uZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHZpcyA9PT0gbnVsbCAmJiBjcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZpcyA9IGNzLnZpc2liaWxpdHk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aXMgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgfSB3aGlsZSAoZWxlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2xvdEluZGV4IDwgc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IG5leHRTbG90SW5kZXg7ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLylcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSAmJiB0aGlzLm5vZGUubGFzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuL0RPTVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgVmlzVXRpbCB7XG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50IHRhZ3Mgd2hpY2ggY2FuIG5vdCBiZSBoaWRkZW4sIHdoZW4gaGlkZGVuIGlzXG4gICAgLy8gYWRkZWQgdG8gdGhlc2VzIGVsZW1lbnRzIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIGF0IGFsbC5cbiAgICAvLyAgYXJlYSAtLT4gYXJlYSBlbGVtZW50IGlzIHBhcnQgb2YgYSBtYXAgZWxlbWVudCBhbmQgaXQgY2FuIG5vdCBiZSBoaWRkZW4gYmVjYXVzZSBpdCBpcyB1c2VkIHRvXG4gICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgLy8gIHBhcmFtIC0tPiBlbGVtZW50IGNhbiBvbmx5IGJlIHBhcnQgb2Ygb2JqZWN0IGVsbWVudCBhbmQgaXQgY2Fubm90IGJlIGhpZGRlbiBkaXJlY3RseSwgaXRcbiAgICAvLyAgICAgICAgICAgIGNhbiBvbmx5IGJlIGhpZGRlbiBpZiB0aGUgcGFyZW50IGlzIGhpZGRlbi5cbiAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAvLyAgICAgICAgICAgIHZpb2xhdGlvbnMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAvLyBOb3RlOiBBbGwgZWxlbWVudCB0YWdzIHRoYXQgYXJlIGFkZGVkIGhlcmUgc2hvdWxkIGJlIGFkZGVkIGFzIGxvd2VyY2FzZSwgYXMgd2UgYXJlIHVzaW5nIGluZGV4T2YgdG8gZG8gdGhlIGNoZWNrLlxuICAgIHB1YmxpYyBzdGF0aWMgdW5oaWRlYWJsZUVsZW1lbnRzID0gWydhcmVhJywgJ3BhcmFtJywgJ2F1ZGlvJ107XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIC8vIG9uIHRoZXNlcyBlbGVtZW50cyB3ZSBuZWVkIHRvIG1ha2UgdGhlbiB2aXNpYmxlIGJ5IGRlZmF1bHQgc28gdGhhdCB0aGUgcnVsZXMgY2FuIHRyaWdnZXIgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBDaGVjayBIaWRkZW4gQ29udGVudCBvcHRpb24gaW4gdGhlIHRvb2xzLlxuICAgIC8vICBzY3JpcHQgLS0+IHNjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdFxuICAgIC8vICBsaW5rIC0tPiBsaW5rIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIHN0eWxlIC0tPiBzdHlsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IHRoZSBhY3R1YWxseSBDU1Mgc2NyaXB0IGlzIHN0aWxsIGV4ZWN1dGVkIHNvIHdlIGhhdmUgdG9cbiAgICAvLyAgICAgICAgICAgIG1hcmsgdGhpcyBlbGVtZW50IGFzIHZpc2libGUgYXQgYWxsIHRpbWVzLlxuICAgIC8vICBoZWFkIC0tPiBoZWFkIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBiZWhhdmUgY29ycmVjdFxuICAgIC8vICB0aXRsZSAtLT4gdGl0bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGRpc3BsYXkgdGhlIHRpdGxlXG4gICAgLy8gIG1ldGEgLS0+IG1ldGEgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIHBlcmZvcm0gdGhlIGFjdGlvbiB0aGF0IG1ldGEgaXMgc3VwcG9zZSB0b1xuICAgIC8vICBiYXNlIC0tPiBiYXNlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgbm9zY3JpcHQgLS0+IG5vc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgdGVtcGxhdGUgLS0+IHRlbXBsYXRlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZXkgYXJlIGp1c3QgYSBtZWNoYW5pc20gZm9yIGhvbGRpbmcgY2xpZW50LXNpZGUgY29udGVudFxuICAgIC8vICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgdG8gYmUgcmVuZGVyZWQgd2hlbiBhIHBhZ2UgaXMgbG9hZGVkLiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGVtcGxhdGVcbiAgICAvLyAgZGF0YWxpc3QgLS0+IGRhdGFsaXN0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LFxuICAgIHB1YmxpYyBzdGF0aWMgaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgPSBbJ3NjcmlwdCcsICdsaW5rJywgJ3N0eWxlJywgJ2hlYWQnLCAndGl0bGUnLCAnbWV0YScsICdiYXNlJywgJ25vc2NyaXB0JywgJ3RlbXBsYXRlJywgJ2RhdGFsaXN0J11cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIHRoYXQgaXMgcHJvdmllZCBpc1xuICAgICAqIHZpc2libGUgb3Igbm90LiBGb2xsb3dpbmcgaXMgaG93IHRoZSBjaGVjayBpcyBwZXJmb3JtZWQ6XG4gICAgICogICAgMS4gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gICAgICogICAgICAgQ1NTIC0tPiBkaXNsYXk6IG5vbmVcbiAgICAgKiAgICAgICBDU1MgLS0+IHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gaGlkZGVuXG4gICAgICogICAgMi4gQ2hlY2sgaWYgdGhlIGFueSBvZiB0aGUgY3VycmVudCBub2RlcyBwYXJlbnRzIGFyZSBoaWRkZW4gd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgKG5vZGUgaXMgbm90IHZpc2libGUpLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgdmlzaWJsZSBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gZmFsc2UgaWYgdGhlIG5vZGUgaXMgTk9UIHZpc2libGUsIHRydWUgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgVmlzVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIGlzTm9kZVZpc2libGUobm9kZUluOiBOb2RlKSA6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBpZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyB2aXNpYmlsaXR5IGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZUluLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBub2RlSW4gPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlSW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBub2RlID0gbm9kZUluIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIHNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSkpO1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIGlmIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiYgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSB1bmRlZmluZWQgJiYgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgaGlkZGVuIGVsZW1lbnQgcHJvcGVydHkgYW5kIGhpZGRlbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCBoaWRkZW5BdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eUN1c3RvbSA9IGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGNvbXBTdHlsZSBpcyBkZWZpbmVkIHdlIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIGRpc3BsYXkgc2V0IHRvIG5vbmVcbiAgICAgICAgICAgIC8vICBDU1Mgc3R5bGUgdmlzaWJpbGl0eSBzZXQgdG8gaGlkZGVuXG4gICAgICAgICAgICAvLyAgICBOb3RlOiBGb3IgdGhpcyBwcm9wZXJ0eSBzaW5jZSBpdCBpcyBpbmhlcml0ZWQsIG5lZWQgdG8gc2tpcCB0aGUgY2hlY2sgb24gcGFyZW50cyBhc1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhlIHBhcmVudCBjYW4gaGF2ZSBoaWRkZW4gYnV0IHRoZSBjaGlsZCBjYW4gYmUgdmlzaWJsZS4gU28gd2Ugb25seSBjaGVjayB0aGlzIHByb3BlcnR5XG4gICAgICAgICAgICAvLyAgICAgICAgICBvbiBjaGlsZCBlbGVtZW50cy9lbGVtZW50cyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICAgIC8vICBub2RlIGhpZGRlbiBwcm9wZXJ0eSBzZXQgKG5vZGUuaGlkZGVuKVxuICAgICAgICAgICAgLy8gIG5vZGUgYXR0cmlidXRlIGhpZGRlbiBzZXQgKHRvIGFueSB2YWx1ZSlcbiAgICAgICAgICAgIC8vICBub2RlIGN1c3RvbSBoaWRkZW4gcHJvcGVydHkgc2VyIChub2RlLlBUX05PREVfSElEREVOKVxuICAgICAgICAgICAgLy8gSWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSB0cnVlIHRoZW4gd2UgcmV0dXJuIGZhbHNlIGFzIHRoaXMgZWxlbWVudCBpcyBub3QgdmlzaWJsZVxuICAgICAgICAgICAgaWYgKChjb21wU3R5bGUgIT09IG51bGwgJiYgKChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpID09PSAnbm9uZScgfHxcbiAgICAgICAgICAgICAgICAoIWdldENhY2hlKG5vZGUsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgbnVsbCkgJiYgY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ2hpZGRlbicpKSkgfHxcbiAgICAgICAgICAgICAgICAoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSAhPT0gJ2Jsb2NrJyAgJiYgKGhpZGRlblByb3BlcnR5IHx8IGhpZGRlbkF0dHJpYnV0ZSAhPSBudWxsIHx8IGhpZGRlblByb3BlcnR5Q3VzdG9tKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IGEgY3VzdG9tIGV4cGFuZG9zIHByb3BlcnR5IG9uIHRoZSB0aGUgbm9kZSB0byBpZGVudGlmeSB0aGF0IGl0IGlzIGhpZGRlbiwgc28gdGhhdCB3ZSBjYW4gdXNlc1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGlzIGluIHRoZSBydWxlcyB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgaXMgaGlkZGVuIG9yIG5vdCwgaWYgd2UgbmVlZCB0by5cbiAgICAgICAgICAgICAgICAvLyBVc2UgZXhwYW5kb3MgcHJvcGVydHkgaW5zdGVhZCBvZiBhIGhhc2ggbWFwIHdoaWNoIHN0b3JlcyB0aGUgZWxlbWVudHMsIGFkZGluZy9jaGVja2luZyBleHBhbmRvc1xuICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgaXMgYSBsb3QgZmFzdGVyIHBlcmZvcm1hbmNlIHdoaXNlLiBGb3IgSGFzaCBtYXAgd2UgbmVlZCB0byBzdG9yZSBiYXNlZCBvbiB4cGF0aCwgYW5kIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgIC8vIHhwYXRoIGl0IGlzIG1vcmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgICAgICAgICAgICAgIHNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlIGZvciB0aGlzIG5vZGUsIGJlY3Vhc2Ugd2UgaGF2ZSB0byBjaGVjayBhbGwgcGFyZW50cyB0byBtYWtlIHN1cmUgdGhleSBkbyBub3QgaGF2ZVxuICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90IGZvciBhbGwgdGhlIHBhcmVudHMgc3RhcnRpbmcgd2l0aFxuICAgICAgICAvLyBjaGlsZCBub2RlLlxuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGdvaW5nIHRocm91Z2ggdGhlIGlzTm9kZVZpc2libGUgZnVuY3Rpb24gd2UgaGF2ZSB0byBtYXJrIGl0IGFzIHN1Y2hcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgaW4gdGhlIGZ1bmN0aW9uIHdlIGNhbiBza2lwIGNoZWNraW5nIHZpc2liaWxpdHk6IGhpZGRlbiBmb3IgcGFyZW50IGVsZW1lbnRzIHNpbmNlIHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAgICAgICAgLy8gaXMgaW5oZXJpdGVkLCB3aGljaCBhbGxvd3MgYSBjaGlsZCB0byBoYXZlIGEgZGlmZmVyZW50IHNldHRpbmcgdGhlbiB0aGUgY2hpbGQuIFRoaXMgcHJvcGVydHkgb25seSBuZWVkcyB0byBiZSBjaGVja2VkXG4gICAgICAgICAgICAvLyBvbmNlIGZvciB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHBhc3NlZCBkb3duIGFuZCB0aGF0IGlzIGFsbC4gSWdub3JlIGl0IGZvciBhbGwgdGhlIHBhcmVudHMgdGhhdCB3ZSBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAgICBzZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICByZXR1cm4gbm9kZVZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdHJ1ZSAobm9kZSBpcyB2aXNpYmxlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShub2RlKSB8fCBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgYW5jZXN0b3IgPSBET01VdGlsLmdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShub2RlLCBcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImNvbXB1dGVkXCI7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJjc3NcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHN0eWxlLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gc3R5bGVbaWR4XS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbFtuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuXG5leHBvcnQgZW51bSBlUnVsZUNvbmZpZGVuY2Uge1xuICAgIFBBU1MgPSBcIlBBU1NcIixcbiAgICBGQUlMID0gXCJGQUlMXCIsXG4gICAgUE9URU5USUFMID0gXCJQT1RFTlRJQUxcIixcbiAgICBNQU5VQUwgPSBcIk1BTlVBTFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlUG9saWN5IHtcbiAgICBWSU9MQVRJT04gPSBcIlZJT0xBVElPTlwiLFxuICAgIFJFQ09NTUVOREFUSU9OID0gXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgIElORk9STUFUSU9OID0gXCJJTkZPUk1BVElPTlwiXG59XG5cbmV4cG9ydCBlbnVtIGVUb29sa2l0TGV2ZWwge1xuICAgIExFVkVMX09ORSA9IFwiMVwiLFxuICAgIExFVkVMX1RXTyA9IFwiMlwiLFxuICAgIExFVkVMX1RIUkVFID0gXCIzXCIsXG4gICAgTEVWRUxfRk9VUiA9IFwiNFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlc2V0VHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBSdWxlRGV0YWlscyA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZVJ1bGVDYXRlZ29yeSxcbiAgICBwYXRoOiB7IFtuczogc3RyaW5nXSA6IHN0cmluZyB9LFxuXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYm91bmRzPzoge1xuICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgbGVmdDogbnVtYmVyLFxuICAgICAgICB3aWR0aDogbnVtYmVyLFxuICAgICAgICBoZWlnaHQ6IG51bWJlclxuICAgIH0sXG4gICAgc25pcHBldDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIHJ1bGVzZXRzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBudW06IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSxcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsXG4gICAgfT5cblxuICAgIHJlZmFjdG9yPzoge1xuICAgICAgICBbb2xkUnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbb2xkUmVhc29uQ29kZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW2xvY2FsZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBoZWxwOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFxuICAgICAqIEhvdyB0aGlzIHJ1bGUgbWFwcyB0byBBQ1QgcnVsZXMsIGlmIGFueSAoaHR0cHM6Ly9hY3QtcnVsZXMuZ2l0aHViLmlvL3J1bGVzLylcbiAgICAgKiBcbiAgICAgKiBzdHJpbmc6IEZvciBhIHNpbmdsZSBydWxlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdG8gdGhlIHJ1bGUgKFBhc3MgLT4gcGFzcywgUG90ZW50aWFsIC0+IGNhbnRUZWxsLCBGYWlsIC0+IGZhaWwsIHVubGlzdGVkID0+IGluYXBwbGljYWJsZSlcbiAgICAgKiBBcnJheTw+OiBDdXN0b20gbWFwcGluZyBvZiBydWxlIHRvIEFDVCByZXN1bHRzXG4gICAgICovXG4gICAgYWN0Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBBcnJheTxzdHJpbmcgfCB7XG4gICAgICAgIFthY3RSdWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogXCJwYXNzXCIgfCBcImZhaWxcIiB8IFwiY2FudFRlbGxcIiB8IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH0+XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSB8IG51bGxcblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cblxuZXhwb3J0IHR5cGUgUmVwb3J0ID0ge1xuICAgIHJlc3VsdHM6IFJ1bGVEZXRhaWxzW10sXG4gICAgbnVtRXhlY3V0ZWQ6IG51bWJlcixcbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIC8vIFRoaXMgbWF5IGJlIHVuZGVmaW5lZCBmb3IgYSBmaWx0ZXJlZCByZXBvcnRcbiAgICB0b3RhbFRpbWU/OiBudW1iZXIsXG4gICAgbmxzPzoge1xuICAgICAgICBbcnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBObHNNYXAgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW11cbn1cblxuZXhwb3J0IHR5cGUgSGVscE1hcCA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbmdpbmUge1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYSBzY2FuIG9uIGEgZG9jdW1lbnQgb3Igc3VidHJlZVxuICAgICAqIEBwYXJhbSBydWxlc2V0SWRzIEFycmF5IG9mIHJ1bGVzZXQgaWRzIG9mIHJ1bGVzZXRzIHRvIHVzZSBmb3IgdGhpcyBzY2FuXG4gICAgICogQHBhcmFtIHJvb3QgRG9jdW1lbnQgb3Igc3VidHJlZSB0byBzY2FuXG4gICAgICovXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KSA6IFByb21pc2U8UmVwb3J0PjtcblxuICAgIGVuYWJsZVJ1bGVzKHJ1bGVJZHM6IHN0cmluZ1tdKTtcblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlO1xuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdO1xuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmc7XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICBhZGRSdWxlcyhydWxlOiBSdWxlW10pO1xuXG4gICAgYWRkUnVsZShydWxlOiBSdWxlKTtcblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCk7XG5cbiAgICBhZGRIZWxwTWFwKG1hcDogTmxzTWFwKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElFbmdpbmUsIGVSdWxlUG9saWN5LCBSZXBvcnQsIGVSdWxlQ2F0ZWdvcnksIGVUb29sa2l0TGV2ZWwsIGVSdWxlc2V0VHlwZSwgUnVsZSBhcyBSdWxlVjIgfSBmcm9tIFwiLi4vLi4vdjIvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJ1bGUgYXMgUnVsZVY0IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBTdHlsZU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9zdHlsZS9TdHlsZU1hcHBlclwiO1xuaW1wb3J0IHsgYTExeVJ1bGVzZXRzIH0gZnJvbSBcIi4uL3J1bGVzZXRzXCI7XG5pbXBvcnQgKiBhcyBjaGVja1J1bGVzVjQgZnJvbSBcIi4uL3J1bGVzXCI7XG5cbmxldCBjaGVja1J1bGVzID0gW107XG5sZXQgY2hlY2tObHMgPSB7fTtcbmxldCBjaGVja0hlbHAgPSB7fTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7XG4gICAgY29uc3QgbGFuZ3MgPSBFbmdpbmUuZ2V0TGFuZ3VhZ2VzKCk7XG4gICAgLy8gUHJvY2VzcyBWNCBydWxlcyBpbnRvIHRoZSBWMiBmb3JtYXRcbiAgICBmb3IgKGxldCBydWxlbmFtZSBpbiBjaGVja1J1bGVzVjQpIHtcbiAgICAgICAgLy8gQ29udmVydCBydWxlXG4gICAgICAgIGxldCB2NFJ1bGU6IFJ1bGVWNCA9IGNoZWNrUnVsZXNWNFtydWxlbmFtZV07XG4gICAgICAgIGNoZWNrUnVsZXMucHVzaCh2NFJ1bGUpO1xuICAgICAgICBmb3IgKGNvbnN0IGxhbmdJZCBvZiBsYW5ncykge1xuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUubWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdID0gdjRSdWxlLm1lc3NhZ2VzW2xhbmdJZF07XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFuZ0lkIGluIHY0UnVsZS5oZWxwKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tIZWxwW3Y0UnVsZS5pZF0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlYXNvbklkIGluIHY0UnVsZS5oZWxwW2xhbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tIZWxwW3Y0UnVsZS5pZF1bcmVhc29uSWRdID0gYC8ke2xhbmdJZH0vJHt2NFJ1bGUuaGVscFtsYW5nSWRdW3JlYXNvbklkXX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdWzBdID0gY2hlY2tObHNbdjRSdWxlLmlkXS5ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDb252ZXJ0IFJTXG4gICAgICAgIGZvciAoY29uc3QgcnNTZWN0aW9uIG9mIHY0UnVsZS5ydWxlc2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMgYXMgUnVsZXNldFtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrUnNJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24uaWQgPT09IFwic3RyaW5nXCIgPyBbcnNTZWN0aW9uLmlkXSA6IHJzU2VjdGlvbi5pZDtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tSc0lkcy5pbmNsdWRlcyhycy5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBycy5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ1BJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24ubnVtID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5udW1dIDogcnNTZWN0aW9uLm51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NQSWRzLmluY2x1ZGVzKGNwLm51bSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB2NFJ1bGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiByc1NlY3Rpb24ubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xraXRMZXZlbDogcnNTZWN0aW9uLnRvb2xraXRMZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5faW5pdGlhbGl6ZSgpO1xuXG5leHBvcnQgdHlwZSBSdWxlc2V0ID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgdHlwZT86IGVSdWxlc2V0VHlwZSxcbiAgICBjaGVja3BvaW50czogQXJyYXk8e1xuICAgICAgICBudW06IHN0cmluZyxcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL2Jsb2IvbWFpbi9zcmMvZGF0YS9zYy11cmxzLmpzb25cbiAgICAgICAgc2NJZD86IHN0cmluZyxcbiAgICAgICAgLy8gSkNIOiBhZGQgbmFtZSBvZiBjaGVja3BvaW50IGFuZCBzdW1tYXJ5IGRlc2NyaXB0aW9uXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgd2NhZ0xldmVsOiBzdHJpbmcsXG4gICAgICAgIHN1bW1hcnk6IHN0cmluZyxcbiAgICAgICAgcnVsZXM/OiBBcnJheTx7IGlkOiBzdHJpbmcsIGxldmVsOiBlUnVsZVBvbGljeSwgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsIH0+XG4gICAgfT5cbn1cblxuZXhwb3J0IGNsYXNzIENoZWNrZXIge1xuICAgIGVuZ2luZTogSUVuZ2luZTtcbiAgICBydWxlc2V0czogUnVsZXNldFtdID0gW107XG4gICAgcnVsZXNldElkczogc3RyaW5nW10gPSBbXTtcbiAgICBydWxlc2V0UnVsZXM6IHsgW3JzSWQ6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBydWxlTGV2ZWxzIDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZVJ1bGVQb2xpY3kgfX0gPSB7fTtcbiAgICBydWxlQ2F0ZWdvcnkgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlUnVsZUNhdGVnb3J5IH19ID0ge307XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IGVuZ2luZSA9IHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSgpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IEFSSUFNYXBwZXIoKSk7XG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IFN0eWxlTWFwcGVyKCkpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRSdWxlcyhjaGVja1J1bGVzKTtcbiAgICAgICAgZW5naW5lLmFkZE5sc01hcChjaGVja05scyk7XG4gICAgICAgIGVuZ2luZS5hZGRIZWxwTWFwKGNoZWNrSGVscCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZXNldChycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRSdWxlc2V0KHJzOiBSdWxlc2V0KSB7XG4gICAgICAgIHRoaXMucnVsZXNldHMucHVzaChycyk7XG4gICAgICAgIHRoaXMucnVsZXNldElkcy5wdXNoKHJzLmlkKTtcbiAgICAgICAgY29uc3QgcnVsZUlkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIHJzLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgcnVsZUlkcy5wdXNoKHJ1bGUuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZUxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZUxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF1bcnMuaWRdID0gcnVsZS5sZXZlbDtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdIHx8IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdW3JzLmlkXSA9IHJzLmNhdGVnb3J5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZXNldFJ1bGVzW3JzLmlkXSA9IHJ1bGVJZHM7XG4gICAgfVxuXG4gICAgY2hlY2sobm9kZTogTm9kZSB8IERvY3VtZW50LCByc0lkcz86IHN0cmluZyB8IHN0cmluZ1tdKSA6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgICAgbGV0IHJ1bGVJZHMgOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpeCB0aGUgaW5wdXRcbiAgICAgICAgaWYgKCFyc0lkcykge1xuICAgICAgICAgICAgcnVsZUlkcyA9IHRoaXMuZW5naW5lLmdldFJ1bGVzSWRzKCk7XG4gICAgICAgIH0gZWxzZXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcnNJZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByc0lkcyA9IFtyc0lkc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHRoaXMucnVsZXNldFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMgPSBydWxlSWRzLmNvbmNhdCh0aGlzLnJ1bGVzZXRSdWxlc1tyc0lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbmdpbmUuZW5hYmxlUnVsZXMocnVsZUlkcyk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSByZXBvcnQgbGV2ZWxzXG4gICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUucnVuKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVwb3J0KSB7XG4gICAgICAgICAgICAgICAgcmVwb3J0Lm5scyA9IHt9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJ1bGVJZCBpbiBjaGVja05scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSA9IHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbklkIGluIGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdID0gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFsdWVbMF0gPSBteVRoaXMuZ2V0TGV2ZWwocnNJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2F0ZWdvcnkgPSBteVRoaXMuZ2V0Q2F0ZWdvcnkocnNJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzdWx0LnBhdGguY3NzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0TGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5WSU9MQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIGdldENhdGVnb3J5KHJzSWRzOiBzdHJpbmdbXSwgcnVsZUlkOiBzdHJpbmcpIDogZVJ1bGVDYXRlZ29yeSB7XG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gXCJcIjtcblxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlQ2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZVJ1bGVDYXRlZ29yeS5PVEhFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJzSWRzKSB7XG4gICAgICAgICAgICByc0lkcyA9IHRoaXMucnVsZXNldElkcztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiByc0luZm9bcnNJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVSdWxlQ2F0ZWdvcnkuT1RIRVI7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2VycyBzaG91bGQgYmUgd2FybmVkIGluIGFkdmFuY2UgaWYgdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3cgb3Igb3RoZXJ3aXNlIGNoYW5nZSB0aGVpciBjb250ZXh0XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3cgb3Igb3RoZXJ3aXNlIGNoYW5nZSB0aGVpciBjb250ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IFJQVFV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgcGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFfdGV4dF9wdXJwb3NlOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGV4dF9wdXJwb3NlXCIsXG4gICAgLy8gZG9jLWJpYmxpb3JlZiBpcyBhIGxpbmtcbiAgICBjb250ZXh0OiBcImFyaWE6bGluayxhcmlhOmRvYy1iaWJsaW9yZWZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkh5cGVybGlua3MgbXVzdCBoYXZlIGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGVpciBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkh5cGVybGluayBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJIeXBlcmxpbmsgaGFzIG5vIGxpbmsgdGV4dCwgbGFiZWwgb3IgaW1hZ2Ugd2l0aCBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjQuNFwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogXCJjNDg3YWVcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJ1bGUgb25seSBwYXNzZXMgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudCxcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IGhpZGRlbiBjb250ZW50IHVuZGVyIHRoZSB0aGUgZWxlbWVudCBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgICAgICB8fCBSUFRVdGlsLm5vblRhYmFibGVDaGlsZENoZWNrKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcHBsZXRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsZXRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FwcGxldF9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFwcGxldD4gZWxlbWVudHMgbXVzdCBwcm92aWRlIGFuICdhbHQnIGF0dHJpYnV0ZSBhbmQgYW4gYWx0ZXJuYXRpdmUgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuICdhbHQnIGF0dHJpYnV0ZSB0aGF0IHByb3ZpZGVzIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FsdCcgYXR0cmlidXRlIHZhbHVlIGZvciBhbiA8YXBwbGV0PiBlbGVtZW50IGR1cGxpY2F0ZXMgdGhlICdjb2RlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0LCBidXQgZG9lcyBub3QgcHJvdmlkZSBpbm5lciBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmICghUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvZGVcIikgJiYgYWx0ID09IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvZGVcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0XCI6IHtcbiAgICAgICAgICAgIDA6IGBIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgMDogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBiZSBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIG5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGFyZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMi4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiZG9jdW1lbnRcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY2hpbGRyZW5baV0ubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFyZWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmVhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXJlYV9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcmVhPiBlbGVtZW50cyBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbn1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGRpc2FibGVkIGh0bWw1IGF0dHJpYnV0ZSBvciBhcmlhLWRpc2FibGVkOlxuICAgICAgICAvLyAgMS4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgZGlzYWJsZWQgYXR0cmlidXRlIGFuZCB0aGUgZWxlbWVudCBzdXBwb3J0cyBpdCwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyAgMi4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiB0aGUgYXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHZhbGlkIGZvciB0aGUgcm9sZSBvZiB0aGUgZWxlbWVudFxuICAgICAgICBcblxuICAgICAgICAvLyBJZiB0aGUgdGFiaW5kZXggYXR0cmlidXRlIGlzIHByb3ZpZGVkIHRoZW4gdmVyaWZ5IHRoYXQgaXQgaXMgMCBvciAtMVxuICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBub2RlIHRva2VuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBpZCByZWZlcmVuY2VkIGJ5IGFyaWEtYWN0aXZlZGVzY2VuZGFudFxuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS5zcGxpdChcIiBcIikuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1hY3RpdmVkZXNjZW5kYW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY3RpdmVEZXNjZW5kYW50Q2hlY2tcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiRmFpbF80XCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgcmVmZXJlbmNlcyBhIGhpZGRlbiBub2RlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgaXMgbm90IGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGRlc2NlbmRhbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiRWxlbWVudCBpcyBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGNvbXBvbmVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSB0aGUgJ2lkJyBvZiBhIG5vbi1lbXB0eSwgbm9uLWhpZGRlbiBhY3RpdmUgY2hpbGQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBjb21ib2JveCBhY3RpdmUgZGVzY2VuZGFudHMgaGFuZGxlZCBieSAnY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQnXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudF9pZCA9IFJQVFV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIC8vIFBPRjE6IFRoZSBhdHRyaWJ1dGUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCFkZXNjZW5kYW50X2lkIHx8IGRlc2NlbmRhbnRfaWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBkZXNjZW5kYW50X2lkLnRyaW0oKSk7XG4gICAgICAgIGlmICghZGVzY2VuZGFudCkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkb2Vzbid0IGV4aXN0LiBXZSBsZXQgMTA3NyB0byB0cmlnZ2VyIHRoZSBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgLy8gUE9GMjogYXJpYS1hY3RpdmVkZXNjZW5kYW50IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4gVGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcnMgdG8gYW4gZWxlbWVudCB0aGF0IGlzIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvZklkID0gMjtcblxuICAgICAgICAvLyBvciBpcyBhIGxvZ2ljYWwgZGVzY2VuZGFudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgIGxldCBvd25lZF9pZHMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bmVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gVGhlIGVsZW1lbnQgd2l0aCBET00gZm9jdXMgaXMgYSB0ZXh0Ym94IHdpdGggYXJpYS1jb250cm9scyByZWZlcnJpbmcgdG8gYW4gZWxlbWVudCB0aGF0IFxuICAgICAgICAvLyAgc3VwcG9ydHMgYXJpYS1hY3RpdmVkZXNjZW5kYW50LCBhbmQgdGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCBzcGVjaWZpZWQgZm9yIHRoZSBcbiAgICAgICAgLy8gIHRleHRib3ggcmVmZXJzIHRvIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgdGhlIGVsZW1lbnQgY29udHJvbGxlZCBieSB0aGUgdGV4dGJveCBvciBpcyBhIGxvZ2ljYWwgXG4gICAgICAgIC8vICBkZXNjZW5kYW50IG9mIHRoYXQgY29udHJvbGxlZCBlbGVtZW50IGFzIGluZGljYXRlZCBieSB0aGUgYXJpYS1vd25zIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAzO1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfaWRzID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGNvbnRyb2xsZWRfaWRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlZF9lbGUuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25zX2lkcyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhjb250cm9sbGVkX2VsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3duc19pZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc19pZHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBPRjM6IEknbSBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGlzIG5vdCBhIGRlc2NlbmRhbnQgYW5kIG5vdCBvd25lZCBieSB0aGUgZWxlbWVudCBcbiAgICAgICAgLy8gdGhhdCByZWZlcmVuY2VkIGl0LlxuICAgICAgICBpZiAocG9mSWQgPT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcHBsaWNhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcHBsaWNhdGlvbkxhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb25cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcHBsaWNhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQXBwbGljYXRpb25MYW5kbWFya0xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcnRpY2xlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFydGljbGVSb2xlc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFydGljbGVcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCA9PT0gXCJcIiB8fCAhKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDE7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQncyByb2xlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBhdHRyaWJ1dGUocykgJ3swfScgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCA8ezF9PiBpcyBub3QgYSB2YWxpZCBBUklBIHN0YXRlIG9yIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNWY5OWE3XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgXG4gICAgICAgIC8vIFRoaXMgZ2V0cyBhbGwgZWxlbWVudHMgd2l0aCBhdHRyaWJ1dGVzIHNvIHdlIHN0aWxsIGhhdmUgc29tZVxuICAgICAgICAvLyBPdXQgb2YgU2NvcGUgc2luY2Ugbm90IGFsbCBhdHRyaWJ1dGVzIGFyZSBhcmlhIFxuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICAgICAgbGV0IGZhaWxlZFByb3BlcnRpZXMgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UganVzdCBoYXZlIGFyaWEgYXR0cmlidXRlcyB3aGljaCBjYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBvciBmYWlsIGJhc2VkIG9uIHdoZXRoZXIgdGhlcmUgcHJvcGVydHkgaXMgdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhVHlwZXMpIHsgLy8gaWYgcHJvcGVydHkgaXMgbm90IGluIHZhbGlkIHByb3BlcnR5IGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmYWlsZWRQcm9wZXJ0aWVzIGNvbW1hIHNlcCBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkUHJvcGVydGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFByb3BlcnRpZXMgPSBhdHRyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGZhaWxlZFByb3BlcnRpZXMgKyBcIiwgXCIgKyBhdHRyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbGVkUHJvcGVydGllcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbZmFpbGVkUHJvcGVydGllcywgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3JldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBKQ0ggLSBwYXNzaW5nIGlzIGJhc2VkIG9uIGFsbCBhdHRyaWJ1dGVzIG5vdCBqdXN0IGFyaWEgYXR0cmlidXRlc1xuICAgICAgICAvLyAgICAgICBsZWFkaW5nIHRvIE9WRVIgQ09VTlRJTkcgc28gbW92ZWQgcGFzcyB1cFxuICAgICAgICAvL3JldHVybiBSdWxlUGFzcygxKTtcbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzLCBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9jb25mbGljdDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29uZmxpY3RcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWFyaWFBdHRyaWJ1dGVzIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jb25mbGljdFwiLCBbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddLCBjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2h0bWxBdHRyJ11dKSk7XG4gICAgICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddKSlcbiAgICAgICAgICAgICAgICBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXV0sIGFyaWFBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9yb2xlXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgQVJJQSByb2xlcyBhbmQgYXR0cmlidXRlIGFyZSB1c2VkIHBlciBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9yb2xlXCI6IFwiVGhlIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBkZXByZWNhdGVkIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBkZXByZWNhdGVkIGZvciB0aGUgcm9sZSBcXFwiezF9XFxcIiBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm8gZGVwcmVjYXRlZCBBUklBIHJvbGUgb3IgYXR0cmlidXRlIHNob3VsZCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4xXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lOyBcbiAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nKSBcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JhbERlcHJlY2F0ZWRSb2xlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUm9sZXM7XG4gICAgICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9hcmlhX3JvbGUnLCBbcm9sZXNbaV1dKSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOyAgICBcbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuICAgICAgICAgICAgICAgIGlmIChyb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaU5hbWVzID0gcm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlc1snZGVwcmVjYXRlZFByb3BzJ107XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlOYW1lcyAmJiBkZXByZWNhdGVkQXR0cmlOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfYXR0cicsIFthcmlhQXR0cnNbaV1dKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHJlY2F0ZWRBdHRyaU5hbWVzLmluY2x1ZGVzKGFyaWFBdHRyc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfcm9sZV9hdHRyJywgW2FyaWFBdHRyc1tpXSwgcm9sZXNbaV1dKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkKVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpOyAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0VtcHR5UHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcIlRoZSBlbGVtZW50IGF0dHJpYnV0ZShzKTogJ3swfScgdmFsdWUgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHNwZWNpZnlpbmcgYSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIG11c3Qgbm90IGJlIGVtcHR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlblxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBSUFRVdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuXG4gICAgICAgIGxldCByb2xlcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBSUFRVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZXNbal0sIHJ1bGVDb250ZXh0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVkUm9sZVByb3BzID0gUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGVzW2pdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJlcXVpcmVkUm9sZVByb3BzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSByZXF1aXJlZFJvbGVQcm9wc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUocmVxdWlyZWRSb2xlUHJvcHNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocm9sZXNbaV0gPT0gXCJyYWRpb2dyb3VwXCIpICYmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyb2xlc1tpXSA9PSBcInByb2dyZXNzYmFyXCIpICYmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS12YWx1ZXRleHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0pIHtcbiAgICAgICAgICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBSUFRVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHBlcm1pdHRlZFJvbGVzLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCBwZXJtaXR0ZWRSb2xlcywgdGFnUHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBhbGxvd2VkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gYWxsb3dlZEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gXCJhcmlhLWNoZWNrZWRcIiB8fCBhdHRyaWJ1dGUgPT0gXCJhcmlhLXNlbGVjdGVkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtZXhwYW5kZWRcIiB8fCBhdHRyaWJ1dGUgPT0gXCJhcmlhLW9yaWVudGF0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtbGV2ZWxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwICYmICFhdHRyTmFtZUFyci5pbmNsdWRlcyhhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldE1zZyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIHJldE1zZy5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCByZXRNc2cpO1xuICAgICAgICBpZiAodGVzdGVkUHJvcGVydGllcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiLCByZXRNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzLCBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiB0aGUgQVJJQSBhdHRyaWJ1dGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgbGV0IGludmFsaWRBdHRyaWJ1dGVzID0gZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRBdHRyaWJ1dGVzICYmIGludmFsaWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZiBjb25mbGljdCBhbHJlYWR5IHJlcG9ydGVkLCBpZ25vcmUgcmVwb3J0aW5nIG92ZXJsYXBcbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvbmZsaWN0QXR0cmlidXRlcyAmJiBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBsZXQgaHRtbEF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFJQVFV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ292ZXJsYXBwaW5nJyk7XG4gICAgICAgICAgICBpZiAoZXhhbWluZWRIdG1sQXRyTmFtZXMgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdQYXNzJykgeyAvL3Bhc3NcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgeyAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhQXR0cnNbaV1bJ25hbWUnXSwgaXRlbVsnYXR0ciddXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pOyAgICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVxdWlyZWRQcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHVzaW5nIGEgQVJJQSByb2xlIG9uIGFuIGVsZW1lbnQsIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciB0aGF0IHJvbGUgbXVzdCBiZSBkZWZpbmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkFuIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgJ3swfScgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGUocyk6ICd7MX0nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNGU4YWI2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCByb2xlcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQVJJQU1hcHBlci5lbGVtVG9JbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gUlBUVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCB0ZXN0ZWRSb2xlcyA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIHJvbGVzTGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBqIDwgcm9sZXNMZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZS5sZW5ndGggPiAwICYmIGltcGxpY2l0Um9sZS5pbmNsdWRlcyhyb2xlc1tqXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBSUFRVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZXNbal0sIHJ1bGVDb250ZXh0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVkUm9sZVByb3BzID0gUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGVzW2pdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVNaXNzaW5nUmVxUHJvcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRlc3RlZFJvbGVzKys7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHByb3BlcnRpZXNMZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBwcm9wZXJ0aWVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIHJlcXVpcmVkUm9sZVByb3BzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gYXJpYS1sYWJlbGxlZGJ5IGlzbid0IHByZXNlbnQsIGFuIGFyaWEtbGFiZWwgd2lsbCBtZWV0IHRoZSByZXF1aXJlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpIHx8IChyb2xlc1tpXSAhPSBcInJhZGlvZ3JvdXBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkgfHwgKHJvbGVzW2ldICE9IFwicHJvZ3Jlc3NiYXJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtY29udHJvbHNcIiAmJiByb2xlc1tqXSA9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgY2hlY2sgc2luY2UgYXJpYS1jb250cm9scyBpbiB0aGUgdGV4dGJveCBvZiBhIGNvbWJvYm94IGlzIGFscmVhZHkgaGFuZGxlZCBpbiBydWxlIEhBQUNfQ29tYm9ib3hfTXVzdF9oYXZlX1RleHRfSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm9sZU1pc3NpbmdSZXFQcm9wID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7IC8vIG9ubHkgYXJpYSBhdHRyaWJ1dGVzIHNvIE5PIE9VVCBPRiBTQ09QRVxuICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldFRva2VuLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiByZXRUb2tlbik7XG4gICAgICAgIGlmICh0ZXN0ZWRSb2xlcyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSB2YWxpZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciBhdHRyaWJ1dGUgJ3sxfScgb24gZWxlbWVudCA8ezJ9PiBpcyBub3QgdmFsaWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNmE3MjgxXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGF0YVR5cGVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydHlWYWx1ZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcysrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2Yobm9kZVZhbHVlKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2YoJ3VuZGVmaW5lZCcpICE9IC0xICYmIG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RyYW5zbGF0ZSAndW5kZWZpbmVkJyB0byBtZWFuICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJpYS1yZWxldmFudCBpcyByZXByZXNlbnRlZCBhcyBhIHNwYWNlIGRlbGltaXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25zLCByZW1vdmFscywgdGV4dDsgb3IgYSBzaW5nbGUgY2F0Y2gtYWxsIHZhbHVlIGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy50eXBlID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWVzID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgYWxsIGlzIHNwZWNpZmllZCwgaXQgY2Fubm90IGhhdmUgYW55IG90aGVyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlcy5sZW5ndGggPiAxICYmIGF0dHJWYWx1ZXMuaW5jbHVkZXMoXCJhbGxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc2ggPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJWYWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGluZGl2aWR1YWwgdmFsdWUgaXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzW2pdICE9IFwiXCIgJiYgIWRhdGFUeXBlcy52YWx1ZXMuaW5jbHVkZXMoYXR0clZhbHVlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW2F0dHJOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGF0dHJWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiBkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlWYWwgPSBwYXJzZUludChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGlWYWwpIHx8IChcIlwiICsgaVZhbCAhPT0gbm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmVmFsID0gcGFyc2VGbG9hdChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGZWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG1wViA9IG5vZGVWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWICE9PSBcInRydWVcIiAmJiB0bXBWICE9PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2godmFsdWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIC8vIHJldE1zZy5wdXNoIChkYXRhVHlwZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnR5VmFsdWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCByZXRNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YmFubmVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUJhbm5lckxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9iYW5uZXJfc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYmFubmVyX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpoZWFkZXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09uZUJhbm5lckluU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYmFubmVyX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYmFubmVyX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBvbiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZXJlIG11c3QgYmUgb25seSBvbmUgZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgb24gdGhlIHBhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJiYW5uZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBSUFRVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKSA9PT0gbnVsbDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NoaWxkX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY2hpbGRfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdGb2N1c2FibGVDaGlsZFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcImZhaWxfbWlzc2luZ19jaGlsZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcIk5vbmUgb2YgdGhlIGRlc2NlbmRlbnQgZWxlbWVudHMgd2l0aCBcXFwiezF9XFxcIiByb2xlIGlzIHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVUkgY29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZGVzY2VuZGFudCBmb3Iga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBBbiBBUklBIGxpc3QgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHsgXCJsaXN0XCI6IHRydWUsIFwicm93XCI6IHRydWUsIFwicm93Z3JvdXBcIjogdHJ1ZSwgXCJ0YWJsZVwiOiB0cnVlLCBcImdyaWRcIjogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3QgYSB2YWxpZCBtZXNzYWdlIGZvciBtb2JpbGUgYmVjYXVzZSBhbGwgZWxlbWVudHMgYXJlIGZvY3VzYWJsZSBpbiBpT1Mgd2hlbiBWb2ljZU92ZXIgaXMgZW5hYmxlZC5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNsYXNzXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLnN1YnN0cmluZygwLCAzKSA9PSBcIm1ibFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGZvY3VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IFJQVFV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gXCJcIjtcbiAgICAgICAgbGV0IGluU2NvcGUgPSBmYWxzZTtcblxuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuY29udGFpbmVycy5pbmNsdWRlcyhyb2xlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkICE9ICd0cnVlJyAmJiAhaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykgJiYgIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpblNjb3BlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCJkZXNjZW5kYW50OjoqW1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXFDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwICs9IFwiQHJvbGU9J1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicgb3IgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4cCA9IHhwLnN1YnN0cmluZygwLCB4cC5sZW5ndGggLSA0KSArICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAociAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBjaGlsZCBpcyBub3QgZm9jdXNhYmxlIHZpYSB0YWJpbmRleC4gIFNlZSBpZiB0aGVyZSBpcyBhIGdyYW5kY2hpbGQgdGhhdCBpcyBmb2N1c2FibGUgYnkgZGVmYXVsdCBvciBieSB0YWJpbmRleC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmJhYmxlKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyID0gci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlIGFycmF5cy9zdHJpbmdzIGFyZSBlbXB0eSwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZpb2xhdGlvbiBzbyB3ZSBjYW4gcmVzZXQgaXQgYmFjayB0byBwYXNzZWQsIHRoZSByZWFzb24gZm9yIHRoaXNcbiAgICAgICAgLy8gaXMgdGhhdCB3ZSBhcmUgc2V0dGluZyBwYXNzZWQ9ZmFsc2Ugd2hpbGUgd2UgcGVyZm9ybSBhIGxvb3Agd2hpY2ggY2F1c2VzIHZpb2xhdGlvbiB0byB0cmlnZ2VyIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaXNzdWVzLiBJbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB3aG9sZSBydWxlIHRvIHN3aXRjaCBmcm9tIHVzaW5nIHBhc3NlZCBpbiB0aGF0IHdheSBzaW1wbHkgZG8gdGhlIGNoZWNrIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGlmIChub2RlTmFtZS5sZW5ndGggPiAwICYmIHJvbGVOYW1lQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghaW5TY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nX2NoaWxkXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY2hpbGRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF92YWxpZFwiLFxuICAgIC8vY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIC8vZGVwZW5kZW5jaWVzOiBbXCJScHRfQXJpYV9WYWxpZFJvbGVcIl0sXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCIsIFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYSBBUklBIHJvbGUgbXVzdCBvd24gYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQW4gZWxlbWVudCB3aXRoIGEgQVJJQSByb2xlIG93bnMgYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG93biBhbnkgY2hpbGQgZWxlbWVudCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIHJvbGUocyk6IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBvd25zIHRoZSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIHJvbGUgXFxcInsxfVxcXCIgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHJvbGUocyk6IFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCJiYzRhNzVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBjb250YWlucyBub25lIG9yIHByZXNlbnRhdGlvbiByb2xlXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25Sb2xlcyA9IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl07XG4gICAgICAgIGNvbnN0IGZvdW5kID0gcm9sZXMuc29tZShyPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vICBGb3IgY29tYm9ib3gsIHdlIGhhdmUgZzExOTMgLi4uIGcxMTk5IHRvIGNoZWNrIHRoZSB2YWx1ZXMgZXRjLlxuICAgICAgICAvLyAgV2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDExNTIgYWdhaW4uIFNvLCB3ZSBieXBhc3MgaXQgaGVyZS5cbiAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiY29tYm9ib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXF1aXJlZENoaWxkUm9sZXMgPSBSUFRVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmRleE9mKCdncm91cCcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiBhIHJvbGUgZG9lc24ndCByZXF1aXJlIGEgY2hpbGQgd2l0aCBhbnkgc3BlY2lmaWMgcm9sZVxuICAgICAgICAgKiB0aGUgcmV2ZXJzZSBtaWdodCBiZSBub3QgdHJ1ZSAtIHBhcmVudCB3aWxsIGJlIGNoZWNrZWQgaW4gUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3MgcnVsZVxuICAgICAgICAqL1xuICAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gUlBUVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZGlyZWN0QVRDaGlsZHJlbiB8fCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSByZXF1aXJlZCByb2xlIGRvc2VuJ3QgY29udGFpbiBhbnkgYWNjZXNzaWJsZSBjaGlsZFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXaGVuIGEgd2lkZ2V0IGlzIG1pc3NpbmcgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZHVlIHRvIHNjcmlwdCBleGVjdXRpb24gb3IgbG9hZGluZywgXG4gICAgICAgICAgICAgKiBhdXRob3JzIE1VU1QgbWFyayBhIGNvbnRhaW5pbmcgZWxlbWVudCB3aXRoICdhcmlhLWJ1c3knIGVxdWFsIHRvIHRydWUuIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgbGV0IGJ1c3kgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIik7XG4gICAgICAgICAgICAgaWYgKCFidXN5IHx8IGJ1c3kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX25vX2NoaWxkXCIsIHJldFRva2VuKTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIGl0J3MgJ2J1c3knIGxvYWRpbmcsIGlnbm9yZSBpdCBcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHZpb2xhdGVFbGVtUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgICAgIGlmICghY2hpbGRSb2xlcyB8fCBjaGlsZFJvbGVzLmxlbmd0aCA9PSAwKSBcbiAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB3aGVuIG11bHRpcGxlIHJvbGVzIGFyZSBzcGVjaWZpZWQgYXMgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZm9yIGEgcm9sZSwgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIG9uZSByZXF1aXJlZCBvd25lZCBlbGVtZW50IGlzIGV4cGVjdGVkLiBcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlIGxpc3RlZCBvd25lZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUsIHRoZSByZXF1aXJlbWVudCBpcyBtZXQgaWYgaXQgaGFzIGFueSBvbmUgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLiAgIFxuICAgICAgICAgICAgICAgICAqLyAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGNoaWxkUm9sZXMuc29tZShyPT4gcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSBcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZUVsZW1Sb2xlcy5wdXNoKGNoaWxkUm9sZXMuam9pbihcIiwgXCIpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIG5vdCBzZW1hbnRpYywgc2hvdWxkbid0IGhhcHBlbiBcbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHZpb2xhdGVFbGVtUm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfY2hpbGRcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgc2hvdWxkIGhhdmUgYSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlSZXF1aXJlZExhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50X2luX2xhbmRtYXJrOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBpcyBub3Qgd2l0aGluIGEgbGFuZG1hcmsgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBjb250ZW50IG11c3QgcmVzaWRlIHdpdGhpbiBhbiBlbGVtZW50IHdpdGggYSBsYW5kbWFyayByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0gZ2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFwYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBsYW5kbWFya3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInJlZ2lvblwiLCBcInNlYXJjaFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9ycGhhbmVkV2lkZ2V0czoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJjaGVja2JveFwiLCBcImdyaWRcIiwgXCJoZWFkaW5nXCIsIFwibGlua1wiLCBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInRhYmxpc3RcIiwgXCJ0ZXh0Ym94XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHJlZWdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRFbGVtZW50czoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wicFwiLCBcInRhYmxlXCIsIFwiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImJ1dHRvblwiLCBcImFcIiwgXCJvbFwiLCBcInVsXCIsIFwiZGxcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImg2XCIsIFwiZW1iZWRcIiwgXCJvYmplY3RcIiwgXCJhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBub0xhbmRtYXJrZWRSb2xlczoge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSByb2xlcyBkb24ndCByZXF1aXJlIGxhbmRtYXJrc1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImRpYWxvZ1wiLCBcInRvb2x0aXBcIl0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWFwTGFuZG1hcmtzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0czoge30sXG4gICAgICAgICAgICAgICAgbWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBOb0xhbmRtYXJrZWRSb2xlczoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbnZlcnQgYXJyYXlzIHRvIG1hcHNcbiAgICAgICAgICAgIHBhcmFtcy5tYXBMYW5kbWFya3MgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxhbmRtYXJrcy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBMYW5kbWFya3NbcGFyYW1zLmxhbmRtYXJrcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHNbcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMucG9zc2libGVPcnBoYW5lZEVsZW1lbnRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50c1twYXJhbXMucG9zc2libGVPcnBoYW5lZEVsZW1lbnRzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlc1twYXJhbXMubm9MYW5kbWFya2VkUm9sZXMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFJQVFV0aWwuaXNMYXlvdXRUYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSBwb3NzaWJsZSBvcnBoYW5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgcnVsZSBpZiBlbGVtZW50IGlzIGEgc3RhbmQtYWxvbmUgd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTm9UcmlnZ2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29udGVudGluZm9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbnRlbnRpbmZvX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db250ZW50aW5mb1dpdGhOb01haW5fSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBwcmVzZW50IHdpdGhvdXQgYW4gZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBvbmx5IHBlcm1pdHRlZCB3aXRoIGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vY29uc2lkZXIgaW1wbGljaXQgcm9sZVxuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkubGVuZ3RoID4gMDtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50aW5mb19zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0luU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZm91bmQgb24gYSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vZmluZCBvdXQgaWYgPGZvb3Rlcj4gZWxlbWVudCBoYXMgc2libGluZ3MgYXMgPGZvb3Rlcj4gaGFzIGltcGxpY2l0IGNvbnRlbnRpbmZvIHJvbGVcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb250ZW50aW5mb1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCcm93c2VycyBpZ25vcmUgdGhlIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBBUklBIHJvbGVzIG9mIHRoZSBkZXNjZW5kYW50cyBvZiBjZXJ0YWluIGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCBjb250YWlucyB2YWxpZCBkZXNjZW5kYW50c1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIGltcGxpY2l0IHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiMzA3bjV6XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCByZXF1aXJlIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKCFSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBSUFRVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGlyZWN0QVRDaGlsZHJlbiAmJiBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIG5vbi1wcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgbGV0IGV4cGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxpbWc+IGFuZCA8c3ZnPlxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGRpcmVjdEFUQ2hpbGRyZW5bal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnID09PSAnaW1nJyB8fCB0YWcgPT09ICdzdmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBnZXQgZXhwbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbXBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7ICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpkb2N1bWVudFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVEb2N1bWVudFJvbGVzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIGEgXFxcImRvY3VtZW50XFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgZWxlbWVudHMgd2l0aCBhIFxcXCJkb2N1bWVudFxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgPT09IFwiXCIgfHwgIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxO1xuXG4gICAgICAgIC8vIHJldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXNzIGlmIHRoaXMgZWxlbWVudCBpcyByZWNlaXZlZCBmb2N1cyBieSBkZWZhdWx0XG4gICAgICAgIGlmIChSUFRVdGlsLmlzZm9jdXNhYmxlQnlEZWZhdWx0KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGFueSBvZiB0aGUgZ2l2ZW4gZXZlbnQgaGFuZGxlcidzXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCBldmVudEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICAvLyBGcm9tIFdDQUcyMF9TY3JpcHRfVXNlVzNDRG9tRnVuY3Rpb25zXG4gICAgICAgIC8vbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmNvbnRleHRtZW51XCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubG9hZFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25tb3VzZXdoZWVsXCIsIFwib25yZXNldFwiLCBcIm9ucGFzdGVcIiwgXCJvbnJlc2l6ZVwiLCBcIm9uc2Nyb2xsXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9uc2VsZWN0XCIsIFwib25zdWJtaXRcIiwgXCJvbmFjdGl2YXRlXCIsIFwib25kZWFjdGl2YXRlXCIsIFwib25tb3VzZWVudGVyXCIsIFwib25tb3VzZWxlYXZlXCJdO1xuICAgICAgICBsZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ucmVzaXplXCJcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoZXZlbnRzW2ldKSlcbiAgICAgICAgICAgICAgICBldmVudEFyci5wdXNoKGV2ZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChldmVudEFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImZvcm1cIiB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9ncmFwaGljX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncmFwaGljcy1kb2N1bWVudCxhcmlhOmdyYXBoaWNzLXN5bWJvbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX1N2Z0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYSBncmFwaGljcyByb2xlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgaGFzIG5vIGxhYmVsIG9yIGFuIGVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIG1pc3Npbmcgbm9uLWVtcHR5ICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sIC8qQ2hhbmdlIG1hcHBpbmcgdG8gMS4xLjEgZnJvbSA0LjEuMiAqL1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpIHx8ICFydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLmluY2x1ZGVzKFwiZ3JhcGhpY3MtXCIpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBzaW5jZSBpZiBhbiBlbGVtZW50IGhhcyByb2xlPWltZywgdGhlbiB0aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciBhbHQgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlY25lIG9mIHJvbGU9cHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIC8qIEpDSCAtIFBvaW50cyBvZiBmYWlsdXJlXG4gICAgICAgICAqICAgIDAuIE1pc3NpbmcgYWx0IGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKiAgICAxLiBNaXNzaW5nIGFyaWEtbGFiZWwgb3IgYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAqICAgIDIuIE1pc3NpbmcgdGl0bGUgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqL1xuICAgICAgICAvLyBTa2lwIGFuIGltYWdlIHdpdGggYSBzdHJ1Y3R1cmFsIHJvbGUgLSBpbWcgbXVzdCBiZSBpbiB0aGUgcm9sZSBsaXN0IGF0IGxlYXN0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBmb2N1c2FibGUgZWxlbWVudCBzaG91bGQgbm90IGJlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggJ2FyaWEtaGlkZGVuJyBzZXQgdG8gXFxcInRydWVcXFwiXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0c09uZUlEUmVmID0gKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBkYXRhIHR5cGUgc3VwcG9ydHMgb25lIG9yIG1vcmUgaWQgcmVmcyBkbyBlcnJvciBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzT25lSURSZWYgfHwgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUmVmZXJlbmNlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWVMZW5ndGggPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkQXJyYXkgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IElEIFJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChcIlxcXCJcIiArIGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRvbyBtYW55IElEUmVmc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRzT25lSURSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBoYXMgdG9vIG1hbnkgSURSZWZzIGl0IGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhcHR1cmUgYWxsIHRoZSBJRFJlZnMgZm9yIGlkVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyB6IDwgbGVuZ3RoOyArK3opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbel0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaWQgcmVmcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmIG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXS5sZW5ndGggPiAwKSB7IC8vIGl0IGlzIGFuIGVtcHR5IHN0cmluZyBpZiBzcGFjZXMgYXJlIG9uZSBhZnRlciB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYnkgSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZWxlbWVudEJ5SWQgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGV4aXN0cyBhbmQgdGhpcyBpcyBhbiBhcmlhIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVjaywgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2libGUgdGhlbiB3ZSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgIWRhdGFUeXBlcy5oaWRkZW5JRFJlZlN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBvZiB0aGUgaWQgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHZhbGlkIHRvIG1hcmsgdGhlIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiB3ZSBmaW5kIGEgc2luZ2xlIHZpc2libGUgZWxlbWVudCB0aGVuIHN0b3AgY2hlY2tpbmcgYW5kIG1hcmsgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbjMucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChpZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2goaWRUb2tlbnMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yLCByZXRUb2tlbjNdKTtcbiAgICAgICAgaWYgKHRlc3RlZFJlZmVyZW5jZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCksIHJldFRva2VuMy50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaW1nX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaW1nX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX0ltZ0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byAxLjEuMSBmcm9tIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiMjNhMmE4XCIsIHtcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgLy8gSWYgbm8gcm9sZSwgdGhpcyBpcyBpbXBsaWNpdCwgYW5kIGNvdmVyZWQgYnkgV0NBRzIwX0ltZ19IYXNBbHRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLyogSkNIIC0gUG9pbnRzIG9mIGZhaWx1cmVcbiAgICAgICAgICogICAgMC4gTWlzc2luZyBhbHQgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqICAgIDEuIE1pc3NpbmcgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICogICAgMi4gTWlzc2luZyB0aXRsZSBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIC8vIFNraXAgYW4gaW1hZ2Ugd2l0aCBhIHN0cnVjdHVyYWwgcm9sZSAtIGltZyBtdXN0IGJlIGluIHRoZSByb2xlIGxpc3QgYXQgbGVhc3RcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuIDxkaXY+LCA8c3Bhbj4sIGV0YylcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCBzdmdUaXRsZSA9IHJ1bGVDb250ZXh0LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHN2Z1RpdGxlICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50KHN2Z1RpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL2NoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBndWlkZSBwZW9wbGUgdG8gdXNlIGFsdCBvciBsYWJlbCAtIHRoaXMgaXMganVzdCBhIHNlY29uZGFyeSBhcHByb2FjaCB0byBzaWxlbmNlIHRoZSBydWxlLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCBrZWVwIHRoZSBQT0YgZnJvbSBhYm92ZS5cbiAgICAgICAgICAgIC8vIGlmICghcGFzc2VkKSBQT0YgPSBcIkZhaWxfM1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIilcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgbGV0IGFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTWlzc2luZ0tleWJvYXJkSGFuZGxlclwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIjogXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIjogXCJWZXJpZnkgdGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBrZXlib2FyZCBhY2Nlc3NcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBXQUlfQVJJQSBVSSBjb21wb25lbnRzIG11c3QgcHJvdmlkZSBrZXlib2FyZCBhY2Nlc3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBzYXZlZFBhc3NlZCA9IHBhc3NlZDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZCwgdGhlICdhcmlhX3JvbGVfcmVkdW5kYW50JyBydWxlIHNob3VsZCBiZSB0cmlnZ2VyZWQgYW5kIGFkZHJlc3NlZCBmaXJzdCxcbiAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IHJ1bGUgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnICYmIHJvbGVzICYmIHJvbGVzLmluY2x1ZGVzKFwibGlzdGJveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBSUFRVdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgLy8gQ29tcG9zaXRlIHVzZXIgaW50ZXJmYWNlIHdpZGdldCByb2xlcy4gVGhleSBhY3QgYXMgY29udGFpbmVycyB0aGF0IG1hbmFnZSBvdGhlciwgY29udGFpbmVkIHdpZGdldHMuXG4gICAgICAgIGxldCByb2xlQ29udGFpbmVycyA9IFtcImNvbWJvYm94XCIsIFwiZ3JpZFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidHJlZVwiLCBcInRyZWVncmlkXCJdO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV07XG4gICAgICAgICAgICBpZiAocm9sZUNvbnRhaW5lcnMuaW5kZXhPZihyb2xlc1tqXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZCA9IGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtZGlzYWJsZWQnKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgOiAnJztcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBvbiB0aGUgcGFyZW50IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8ga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3VuZCBvbiBwYXJlbnQuICBTZWUgaWYga2V5Ym9hcmQgZXZlbnQgaGFuZGxlcnMgYXJlIG9uIHJlcXVpcmVkIGNoaWxkIGVsZW1lbnRzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXFDaGlsZHJlbiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7IC8qIFNNRiBUT0RPIG1lbnViYXIgZG9lcyBub3QgaGF2ZSBhbnkgcmVxQ2hpbGRyZW4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGggPSByZXFDaGlsZHJlbi5sZW5ndGg7IGkgPCByZXF1aXJlZENoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cCA9IFwiKltjb250YWlucyhAcm9sZSwnXCIgKyByZXFDaGlsZHJlbltpXSArIFwiJyldXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIHJ1bGVDb250ZXh0LCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hpbGQgZGlkIG5vdCBoYXZlIGEga2V5IGhhbmRsZXIuICBTZWUgaWYgYW55IG9mIHRoZSBncmFuZGNoaWxkcmVuIGRvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyOiBFbGVtZW50ID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmJhYmxlKHIyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMi5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcjIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gcjIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIG5hbWUgZm9sbG93aW5nIFwiamF2YXNjcmlwdDpcIiAoaS5lLiwgaHJlZi5sZW5ndGggPiAxMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHRoZSByZXF1aXJlZCBjaGlsZHJlbiAob3IgYW55IGRlc2NlbmRhbnRzIG9mIHRoZSByZXF1aXJlZCBjaGlsZHJlbikgbXVzdCBoYXZlIGtleXByZXNzL2tleWRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90LCBpdCBpcyBhIGZhaWx1cmUsIG5vIG5lZWQgdG8ga2VlcCBjaGVja2luZyBhbnkgbW9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBlbGVtZW50IGZhaWxlZCB0aGUga2V5ZG93bi9rZXlwcmVzcywgYW5kIGl0IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgY2hpbGRyZW4sIHN1Y2ggYXMgbWVudWJhci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgY2hlY2sgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCBydWxlQ29udGV4dCwgUlBUVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhXCIgJiYgcjIuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aW9uIGxpbmsgbXVzdCBzdGFydCB3aXRoIFwiamF2YXNjcmlwdDpcIiwgbXVzdCBub3QgY29udGFpbiBhIFwidm9pZFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHNwZWNpZmllZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHNhdmVkUGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgbGVhdmUgaXQgdG8gdGhlIGNvbWJvYm94IHJ1bGVzIHRvIGNoZWNrXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2F2ZWRQYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbXBsZW1lbnRhcnksIGFyaWE6YmFubmVyLCBhcmlhOmNvbnRlbnRpbmZvLCBhcmlhOm1haW4sIGFyaWE6bmF2aWdhdGlvbiwgYXJpYTpyZWdpb24sIGFyaWE6c2VhcmNoLCBhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImxhbmRtYXJrX25hbWVfdW5pcXVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcIkZhaWxfMFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJNdWx0aXBsZSBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aCB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHVuaXF1ZSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiTXVsdGlwbGUgXFxcInswfVxcXCIgbGFuZG1hcmtzIHdpdGggdGhlIHNhbWUgcGFyZW50IHJlZ2lvbiBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZnJvbSBvbmUgYW5vdGhlciBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgc2FtZSBcXFwiezF9XFxcIiBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk11bHRpcGxlIGxhbmRtYXJrcyBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnYXJpYS1sYWJlbGxlZGJ5JyBvciAnYXJpYS1sYWJlbCcgb3IgYmUgbmVzdGVkIGluIGEgZGlmZmVyZW50IHBhcmVudCByZWdpb25zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUT0RPIGRvIEkgbmVlZCB0byBmaXRlciBvdXQgYmFkIGNvbnRlbnRpbmZvIG5vZGVzOiBUaGUgZm9vdGVyIGVsZW1lbnQgaXMgbm90IGEgY29udGVudGluZm8gbGFuZG1hcmsgd2hlbiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGZvbGxvd2luZyBIVE1MNSBzZWN0aW9uaW5nIGVsZW1lbnRzOiBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNy9OT1RFLXdhaS1hcmlhLXByYWN0aWNlcy0xLjEtMjAxNzEyMTQvZXhhbXBsZXMvbGFuZG1hcmtzL0hUTUw1Lmh0bWxcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGlzIGxhbmRtYXJrIGlzIGluc2lkZSBhIGRpYWxvZyBlbGVtZW50LiBJZiBpdCBpcyB3ZSBhcmUgZ29pbmcgdG8gc2tpcCBjaGVja2luZyBpdC4gXG4gICAgICAgIHZhciBjb3B5T2ZSdWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB2YXIgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0ID0gW107XG4gICAgICAgIHdoaWxlIChjb3B5T2ZSdWxlQ29udGV4dCkge1xuICAgICAgICAgICAgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0LnVuc2hpZnQoY29weU9mUnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgY29weU9mUnVsZUNvbnRleHQgPSBjb3B5T2ZSdWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsIC8vIFNraXBwaW5nIGNoZWNraW5nIGxhbmRtYXJrcyB0aGF0IGhhcHBlbiB0byBiZSBpbnNpZGUgZGlhbG9nIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEJlZ2luaW5nIGZvcm1DYWNoZSB3b3JrXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlIDoge1xuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IGFueVtdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDogc3RyaW5nW11cbiAgICAgICAgfSA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0tLS1FTlRFUklORyBGT1JNIENBQ0hFXCIpXG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsczogW10sXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50czogW10sXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnYXNpZGUsW3JvbGU9XCJjb21wbGVtZW50YXJ5XCJdLCBmb290ZXIsW3JvbGU9XCJjb250ZW50aW5mb1wiXSwgaGVhZGVyLFtyb2xlPVwiYmFubmVyXCJdLCBtYWluLFtyb2xlPVwibWFpblwiXSwgbmF2LFtyb2xlPVwibmF2aWdhdGlvblwiXSwgZm9ybSxbcm9sZT1cImZvcm1cIl0sIHNlY3Rpb24sW3JvbGU9XCJyZWdpb25cIl0sW3JvbGU9XCJzZWFyY2hcIl0nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2RlcyA9IEFycmF5LmZyb20obmF2aWdhdGlvbk5vZGVzVGVtcCk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzUGFyZW50cyA9IFtdO1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQgOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIGJsb2NrIG9mIGNvZGUgZmlsdGVycyBvdXQgYW55IG5hdiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciBhbiBkaWFsb2cuIEFzIHRob3NlIGFyZSBub3Qgb25lcyB3ZSB3YW50IHRvIHRlc3QgYWdhaW5zdCBhcyB3ZSBjb25zaWRlciBkaWFsb2dzIGFyZSBzZXBhcmF0ZSBsb2NhdGlvbnMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbWFpbiBwYWdlLiAgICBcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgYS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dOb2RlRm91bmRGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlcyA9IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzO1xuXG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBsZXQgZWxzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGEgPSBuYXZpZ2F0aW9uTm9kZXNbaV0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYSkge1xuICAgICAgICAgICAgICAgICAgICBlbHMucHVzaChhKTtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIG5lYXJlc3QgbGFuZG1hcmsgcGFyZW50IGJhc2VkIG9uIHRoZSB0YWdOYW1lIG9yIHRoZSByb2xlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkFTSURFXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPT1RFUlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGT1JNXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkhFQURFUlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJNQUlOXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk5BVlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTRUNUSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoZWxzW2pdLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZU5hbWVUcmlnZ2VyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbHNbal0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVUcmlnZ2VyID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29tcGxlbWVudGFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZvcm1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmF2aWdhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVnaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoZWxzW2pdLmdldEF0dHJpYnV0ZShcInJvbGVcIikpOyAvLyBUT0RPIHdlIGFyZSBub3QgY292ZXJpbmcgdGhlIGNhc2Ugd2hlcmUgYSBlbGVtZW5lbnQgd2l0aCBtdWx0aXBsZSByb2xlcy4gRS5nLiByb2xlID0gXCJmb3JtIGJhbm5lclwiLiBUaGlzIGlzIGEgaW1wcm92bWVudCB3ZSBtaWdodCB3YW50IHRvIGFkZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lVHJpZ2dlciB8fCByb2xlTmFtZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lYXJlc3QgcGFyZW50LWxhbmRtYXJrIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLnB1c2goZWxzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBmaWxlIHNvIGl0IGRvZXMgbm90IGhhdmUgYSBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXMgdG8gZmluZCBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc18wX2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IHR3byByb290IG5vZGVzLCBzbyB3ZSBzaG91bGQgY29tcGFyZSB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiRmFpbF8wXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0gPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbG9va2luZyBhdCBhIHNpbmdsZSByb290IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgZm9jdXMgb24gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBsYW5kbWFyayBpcyBOT1QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLnNhbWVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIHNhbWUgcGFyZW50LWxhbmRtYXJrIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiRmFpbF8wXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBwYXJlbnRzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzXzBfZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwibnVsbFwiKTsgLy8gVGhpcyBpcyBub3QgdGhlIGtleXdvcmQgbnVsbCBvbiBwdXJwb3NlLiBJdCBpcyBhIHNwYWNlaG9sZGVyIGluIHRoZSBhcnJheSBzbyBpbmRleGVzIG1hdGNoIHVwLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzUGFyZW50cyA9IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA9IG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGZvcm1DYWNoZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVE9ETyBBZGQgdmFsaWRhdGlvbiB0aGF0IGFsbCAzIGFycmF5cyBhcmUgdGhlIHNhbWUgbGVuZ3RoXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS1FbmQgZm9ybUNhY2hlXCIpXG4gICAgICAgIH0gLy8gRW5kIGZvcm1DYWNoZVxuXG4gICAgICAgIGxldCBpbmRleFRvQ2hlY2sgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgIGluZGV4VG9DaGVjayA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4VG9DaGVjayA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZFtpbmRleFRvQ2hlY2tdID09PSBcIlBhc3NfMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJGYWlsXzBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8wXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2luZGV4VG9DaGVja10sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX21haW5fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bWFpblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1JlcXVpcmVMYWJlbF9JbXBsaWNpdF8yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIG11c3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZXh0TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgbGV0IHBhcmVudERvY1JvbGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IG1haW5zID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1haW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobWFpbnNbaV0gPT09IHJ1bGVDb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgbGV0IHRoaXNQYXJlbnREb2NSb2xlID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKFxuICAgICAgICAgICAgICAgIG1haW5zW2ldLFxuICAgICAgICAgICAgICAgIFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRoaXNQYXJlbnREb2NSb2xlID09PSBwYXJlbnREb2NSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QXJpYUxhYmVsKG1haW5zW2ldKSA9PT0gY29udGV4dExhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfbWFpbl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1Zpc2libGVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgdmlzaWJsZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy9jYWxsIGdldEVsZW1lbnRzQnlSb2xlSGlkZGVuIHdpdGggY29uc2lkZXJJbXBsaWNpdCBmbGFnIGFzIHRydWVcbiAgICAgICAgLy9zbyB0aGF0IHRoZSBtZXRob2QgcmV0dXJzIDxtYWluPiBlbGVtZW50c1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzVW5pcXVlQXJpYUxhYmVsbGVkYnkobGFuZG1hcmtzKTtcblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpuYXZpZ2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU5hdmlnYXRpb25MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3BhcmVudF9yZXF1aXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3BhcmVudF9yZXF1aXJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCByb2xlIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGlzIG5vdCBjb250YWluZWQgaW4gb3Igb3duZWQgYnkgYW4gZWxlbWVudCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJvbGVzOiBcXFwiezF9XFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogQ2hlY2sgRmFpbCAzXG4gICAgYWN0OiBcImZmODljOVwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBjb250YWlucyBub25lIG9yIHByZXNlbnRhdGlvbiByb2xlXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25Sb2xlcyA9IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl07XG4gICAgICAgIGNvbnN0IGZvdW5kID0gcm9sZXMuc29tZShyPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgY29udGFpbmVyUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHRlc3RlZENvbnRhaW5lciA9IDA7XG5cbiAgICAgICAgbGV0IGFuY2VzdG9yUm9sZXMgPSBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLm1hcChpbmZvID0+IGluZm8ucm9sZSk7XG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gYW5jZXN0b3JSb2xlc1thbmNlc3RvclJvbGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICBsZXQgY291bnQgPSAyO1xuICAgICAgICB3aGlsZSAocGFyZW50Um9sZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgcGFyZW50Um9sZSA9IGFuY2VzdG9yUm9sZXNbYW5jZXN0b3JSb2xlcy5sZW5ndGggLSBjb3VudF07XG5cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBjb250YWluZXJzTGVuZ3RoID0gY29udGFpbmVyUm9sZXMubGVuZ3RoOyAhcGFzc2VkICYmIGkgPCBjb250YWluZXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goY29udGFpbmVyUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKHRlc3RlZENvbnRhaW5lciA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVJlZ2lvbnNVbmlxdWVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBhIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFBlciBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNy9OT1RFLXdhaS1hcmlhLXByYWN0aWNlcy0xLjEtMjAxNzEyMTQvZXhhbXBsZXMvbGFuZG1hcmtzL0hUTUw1Lmh0bWxcbiAgICAgICAgLy8gZm9ybSBlbGVtZW50IHNob3VsZCBvbmx5IGJlIGNvbnNpZGVyZWQgaWYgaXQgaGFzIGFuIGFyaWEgbGFiZWwgb3IgdGl0bGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKSA9PT0gXCJyZWdpb25cIiB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yZWdpb25fbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206c2VjdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVnaW9uTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNlY3Rpb24gZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IFxcXCJyZWdpb25cXFwiIHJvbGUgaXMgbm90IGxhYmVsZWQgd2l0aCBhbiAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGlzIG5vdCBsYWJlbGVkIHdpdGggYW4gJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YWdOYW1lID09PSBcInNlY3Rpb25cIiAmJlxuICAgICAgICAgICAgIVJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgZmFsc2UpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSAhPT0gXCJzZWN0aW9uXCIgJiZcbiAgICAgICAgICAgICFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJyZWdpb25cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSBcInNlY3Rpb25cIiA/IFJ1bGVGYWlsKFwiRmFpbF8xXCIpIDogUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JvbGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIG11c3QgaGF2ZSBhIHZhbGlkICdyb2xlJyBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSByb2xlICd7MH0nIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgaXMgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTb21lIG9mIHRoZSByb2xlcywgJ3swfScsIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgYXJlIG5vdCB2YWxpZCBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJlY2hlY2tcbiAgICBhY3Q6IFwiNjc0YjEwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHJvbGVTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocm9sZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgLy8gbm93IHdlIGhhdmUgYWxsIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgICAgICAgaWYgKCEocm9sZS50b0xvd2VyQ2FzZSgpIGluIGRlc2lnblBhdHRlcm5zKSkge1xuICAgICAgICAgICAgICAgIGludmFsaWRSb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW3JvbGVzW2ldXSk7XG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMubGVuZ3RoID09PSByb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLFwiKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBpc1RhYmxlRGVzY2VuZGFudCwgYXJlUm9sZXNEZWZpbmVkIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfcm9sZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgZXhwbGljaXRseS1hc3NpZ25lZCBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBzaG91bGQgbm90IGJlIHJlZHVuZGFudCB3aXRoIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZWxlbU5hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYXJpYVJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWFyaWFSb2xlcyB8fCBhcmlhUm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGxldCByb2xlX2RlZmluZWQgPSBhcmVSb2xlc0RlZmluZWQoYXJpYVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkIGluIHRoZSBwYXJlbnQgcmVsYXRpb24sIHRoZW4gc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXMoZWxlbU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICBpZiAocGFyZW50Um9sZSAhPT0gbnVsbCAmJiBwYXJlbnRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFpbXBsaWNpdFJvbGVzIHx8IGltcGxpY2l0Um9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFpbXBsaWNpdFJvbGVzLmluY2x1ZGVzKGFyaWFSb2xlc1tpXSkpICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgZWxzZSAgICAgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYVJvbGVzW2ldLCBlbGVtTmFtZV0pKTtcbiAgICAgICAgfSAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnNlYXJjaFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVTZWFyY2hMYW5kbWFya3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJzZWFyY2hcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy8gcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzLCBhcmVSb2xlc0RlZmluZWQsIGlzVGFibGVEZXNjZW5kYW50LCBnZXRJbnZhbGlkUm9sZXMgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX3NlbWFudGljc19yb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gYW5kIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBicm93c2VyIHNpbmNlIHRoZSBlbGVtZW50IGlzIGZvY3VzYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgcm9sZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSkgYW5kIGZyYWdtZW50IG5vZGVzICgxMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIGl0J3MgYWxyZWFkeSBmYWlsZWQsIHRoZW4gc2tpcFxuICAgICAgICBpZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICBpZiAocGFyZW50Um9sZSAhPT0gbnVsbCAmJiBwYXJlbnRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tUm9sZXM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFkb21Sb2xlcyB8fCBkb21Sb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGNoZWNrIHRoZSAnZ2VuZXJpYycgcm9sZSBmaXJzdFxuICAgICAgICBpZiAoZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbXCJnZW5lcmljXCIsIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBsZXQgcm9sZV9kZWZpbmVkID0gYXJlUm9sZXNEZWZpbmVkKGRvbVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzID09PSBudWxsIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG5cbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5pbmNsdWRlcyhcInByZXNlbnRhdGlvblwiKSB8fCBpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJub25lXCIpICYmIFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRvbVJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyBUaGlzIHJ1bGUgaXMgaW4gdGhlIHNhbWUgZmlsZSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVwZW5kZW5jeSB0aGF0IGFyaWFfcm9sZV92YWxpZCBydW5zIGZpcnN0LFxuLy8gYW5kIHRoZSBpbmZvIGlzIHBhc3NlZCBieSBjYWNoZSwgYnV0IHRoZXJlIGlzbid0IGEgZGVwZW5kZW5jeSBpbiB0aGUgRmFpbF8yIHNjZW5hcmlvLCBzbyByZWd1bGFyXG4vLyBkZXBlbmRlbmN5IGNhbm5vdCBiZSB1c2VkXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIC8vIFRoZSB0aGUgQVJJQSByb2xlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsIFwiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGUgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFSSUEgYXR0cmlidXRlcyBhcmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBpbXBsaWNpdCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjVjMDFlYVwiLCB7IFwiNDZjYTdmXCI6IHsgXCJQYXNzXCI6IFwicGFzc1wiLCBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJmYWlsXCIsIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBubyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXM6c3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMgPT09IG51bGwgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgICAgIGxldCByb2xlczogc3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZXhwbGljaXQgPSB0cnVlO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgICAgICBpZiAoIWFyZVJvbGVzRGVmaW5lZChyb2xlcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL25vIGV4cGxpY2l0IHJvbGUgZGVmaW5lZFxuICAgICAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZXhwbGljaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBmYWlsZWRBdHRyaWJ1dGVzID0gZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFmYWlsZWRBdHRyaWJ1dGVzIHx8IGZhaWxlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiLCBbYXJpYUF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcblxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCBcIm5vbmVcIl0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dG9vbGJhclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVUb29sYmFyVW5pcXVlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIHRvb2xiYXIgY29tcG9uZW50cyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIHRvb2xiYXIgY29tcG9uZW50cyBvbiBhIHBhZ2UgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbHMgc3BlY2lmaWVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJ0b29sYmFyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfd2lkZ2V0X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfV2lkZ2V0TGFiZWxzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCJtNmIxcTNcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBhbmQgcm9sZT1ub25lIHNpbmNlIHRoZXNlIDIgcm9sZXMgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiB3aWRnZXQgdHlwZSByb2xlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAgICAgICAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIilcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGlhZ25vc2UgdGhhdCBhIGNvbWJvYm94IGlucHV0IHRleHRib3ggaGFzIGEgbGFiZWwoZ2l0aHViIGlzc3VlICMxMTA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbVJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNcbiAgICAgICAgbGV0IHNraXBSb2xlcyA9IFtcbiAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICBcImxpc3Rib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgICAgICBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaGJveFwiLFxuICAgICAgICAgICAgXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwic3BpbmJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICAgIFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJsaW5rXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChza2lwUm9sZXMuaW5jbHVkZXMoZWxlbVJvbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSA9PT0gXCJvdXRwdXRcIiB8fFxuICAgICAgICAgICAgKHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIEZvcm0vaW5wdXQgZWxlbWVudHMgYXJlIGNoZWNrZWQgYnkgRzQxLCB3ZSBza2lwIHRoZW0gZnJvbSB0aGlzIHJ1bGUuIEdpdGh1YiBpc3N1ZSA0NDlcbiAgICAgICAgICAgIGxldCBza2lwRWxlbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwia2V5Z2VuXCIsXG4gICAgICAgICAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJtZXRlclwiLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBza2lwRWxlbWVudHMuaW5kZXhPZihydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPVxuICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgcm9sZXNUb0NoZWNrW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBjb21ib2JveGVzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IFJQVFV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW93bnNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhX293bnMudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duc1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByb2hpYml0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGxldCBudW1XaWRnZXRzVGVzdGVkID0gMDtcbiAgICAgICAgbGV0IGludGVyYWN0aXZlUm9sZVR5cGVzID0gW1wid2lkZ2V0XCIsIFwibGl2ZVJlZ2lvblwiLCBcIndpbmRvd1wiXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJvbGVzLmxlbmd0aDsgcGFzc2VkICYmIGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lUmVxdWlyZWQgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnJvbGVUeXBlICYmXG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVSb2xlVHlwZXMuaW5jbHVkZXMocGF0dGVybi5yb2xlVHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICsrbnVtV2lkZ2V0c1Rlc3RlZDtcblxuICAgICAgICAgICAgICAgIC8vIEFsbCB3aWRnZXRzIG1heSBoYXZlIGFuIGF1dGhvciBzdXBwbGllZCBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgLy8gVGl0bGUgaXMgbGVnYWwsIGJ1dCBkb24ndCBhZHZlcnRpc2UgaXRzIHVzZSBpbiBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgICAgIC8vIEVuY291cmFnZSB1c2Ugb2YgYXJpYS1sYWJlbCwgYXJpYS1sYWJlbGxlZGJ5IG9yIGh0bWwgbGFiZWwgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJjb250ZW50c1wiKSA+PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB3aWRnZXQncyBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgYnkgZWxlbWVudCdzIGlubmVyIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50T3JBbHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBpbXBsaWNpdCBsYWJlbCwgbGlrZSA8bGFiZWw+PGlucHV0IC4uLi4+YWJjIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwicHJvaGliaXRlZFwiKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2hpYml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRnZXRzVGVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2VsZW1Sb2xlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXNjaWlhcnRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhc2NpaWFydF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206cHJlLCBkb206bGlzdGluZywgZG9tOnhtcCwgZG9tOnBsYWludGV4dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1ByZV9BU0NJSUFydFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBBU0NJSSBhcnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFTQ0lJIGFydCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEZpeCBmb3IgSURXQiB3cml0ZXJzLiBEb24ndCB0cmlnZ2VyIGlmIGNvbnRlbnQgaXMgaW4gYSBjb2RlIGVsZW1lbnQuICBUaGUgY29kZSBlbGVtZW50IGlzIHNlYXJjaGVkIGZvclxuICAgICAgICAvLyBpbiB2YXJpb3VzIHBsYWNlcyBiZWNhdXNlIG9mIHRoZSB3ZWlyZCB3YXkgdmFyaW91cyBicm93c2VycyByZW5kZXIgPGNvZGU+PHByZT48L3ByZT48L2NvZGUuICBGaXJlZm94LFxuICAgICAgICAvLyBIdG1sVW5pdCBhbmQgQ2hyb21lIGFsbCByZW5kZXIgZGlmZmVyZW50bHkuICBGaXJlZm94OiA8Y29kZT48L2NvZGU+PHByZT48L3ByZT4gIEh0bWxVbml0OiA8L2NvZGU+PHByZT48Y29kZT48L2NvZGU+PC9wcmU+XG4gICAgICAgIC8vIFNlZSB1bml0IHRlc3QgQ29kZUVsZW1lbnRBYm92ZVByZUVsZW1lbnQuaHRtbC4gIERvbid0IGtub3cgaG93IFJQVCByZW5kZXJzLCBzbyBjb3ZlciBhbGwgdGhlIGJhc2VzLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInByZVwiKSB7XG4gICAgICAgICAgICBpZiAoKHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZyAmJiBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImNvZGVcIikgfHxcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvZGVcIikubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiY29kZVwiKSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eHRWYWx1ZSA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0Q2hhcmFjdGVyID0gXCJcIjtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRleHQgY29udGVudFxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBwYXNzZWQgJiYgKGlkeCA8IHR4dFZhbHVlLmxlbmd0aCk7ICsraWR4KSB7XG4gICAgICAgICAgICBsZXQgY2hTdHIgPSB0eHRWYWx1ZS5zdWJzdHIoaWR4LCAxKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGFscGhhbnVtZXJpYyBvciBwdW5jdHVhdGlvblxuICAgICAgICAgICAgaWYgKC9bXFx3IUAjJCUmXFwqKCkuLD9cXFtcXF17fTw+PVwiOlxcL1xcXFwtXS8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlY3Qgc2FtZSBjaGFyYWN0ZXIgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICBpZiAobGFzdENoYXJhY3RlciA9PSBjaFN0cikge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCArIDE7O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xccy8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgKyAxO1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdENoYXJhY3RlciA9IGNoU3RyO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBkZWNpc2lvblxuICAgICAgICAgICAgaWYgKG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPj0gNSB8fCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID49IDQpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYmxpbmtfY3NzX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19jc3NfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0JsaW5rX0NTU1RyaWdnZXIxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBmb3IgbG9uZ2VyIHRoYW4gZml2ZSBzZWNvbmRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlIENTUyAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBpcyBub3QgdXNlZCBmb3IgbW9yZSB0aGFuIHRoYW4gZml2ZSBzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRleHRWYWx1ZSA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0ZXh0LWRlY29yYXRpb246YmxpbmtcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgYmxpbmtfZWxlbV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2VsZW1fZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQmxpbmtfQWx3YXlzVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29udGVudCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHkgbXVzdCBub3QgYmUgdXNlZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDb250ZW50IGZvdW5kIHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBibG9ja3F1b3RlX2NpdGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpibG9ja3F1b3RlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2txdW90ZV9IYXNDaXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IDxibG9ja3F1b3RlPiBzaG91bGQgbm90IGJlIHVzZWQgb25seSBmb3IgcXVvdGF0aW9ucywgbm90IGluZGVudGF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIDxibG9ja3F1b3RlPiBvbmx5IGZvciBxdW90YXRpb25zLCBub3QgaW5kZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBjaXRlRWxlbXMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNpdGVFbGVtcyAhPSBudWxsICYmIGNpdGVFbGVtcy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhbnZhc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19DYW52YXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGFjY2Vzc2liaWxpdHkgb2YgdGhlIDxjYW52YXM+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhbnZhcz4gZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgY2FwdGlvbl90cmFja19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FwdGlvbl90cmFja19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19WaWRlb19IYXNOb1RyYWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGNhcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIG9yIHByb3ZpZGUgYSBjYXB0aW9uIHRyYWNrIGZvciB0aGUgPHZpZGVvPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8dmlkZW8+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjFcIiwgXCIxLjIuMlwiLCBcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZ25vcmUgZGVjb3JhdGl2ZSB2aWRlbyBpZiB1c2VyIHVzZXMgYXJpYS1oaWRkZW5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2tzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0cmFja1wiKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHRyYWNrc1tpXS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpID09PSAnY2FwdGlvbnMnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrcyBmb3IgYWRkaXRpb24gb2YgZHluYW1pYyB0cmFja3NcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRleHRUcmFja3MgJiYgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgcnVsZUNvbnRleHQudGV4dFRyYWNrc1tpXS5raW5kID09PSAnY2FwdGlvbnMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyB1c2VkIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5ICdpZCcgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aXRoIHRoZSByb2xlcyBcXFwiezF9XFxcIiwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBvZiAnb3B0aW9uJywgJ2dyaWRjZWxsJywgJ3JvdycsIG9yICd0cmVlaXRlbSdcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgJ2FyaWEtc2VsZWN0ZWQnIHNldCB0byB0cnVlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSBmb2N1cyB3aXRoaW4gdGhlIGNvbWJvYm94IHBvcHVwLCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBFbGVtZW50LCBwb3B1cElkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gVGhpcyBydWxlIG9ubHkgYXBwbGllcyBpZiB0aGUgYWN0aXZlZGVzY2VuZGFudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICBpZiAoIWFjdGl2ZUlkIHx8IGFjdGl2ZUlkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYWN0aXZlSWQpO1xuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbWlzc2luZ1wiLCBbYWN0aXZlSWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWZvdW5kICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGFjdGl2ZUlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlUGFzcyhcIkZhaWxfbm90X2luX3BvcHVwXCIsIFthY3RpdmVJZCwgcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3RpdmVSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoYWN0aXZlRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wib3B0aW9uXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3dcIiwgXCJ0cmVlaXRlbVwiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gYWN0aXZlUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIiwgW2FjdGl2ZUlkLCBhY3RpdmVSb2xlcy5qb2luKFwiLFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiLCBbYWN0aXZlSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJGYWlsX2lubGluZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHVzZSAnYXJpYS1hdXRvY29tcGxldGUnIHZhbHVlICdcXFwiaW5saW5lXFxcIicgbm9yIGRvZXMgaXQgaGF2ZSAnYXJpYS1hdXRvY29tcGxldGUnIGRlZmluZWQgd2l0aGluIHRoZSBwb3B1cFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgY29tYm9ib3ggaGFzIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBpbmNvcnJlY3RseSBzZXQgb24gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3Qgc3VwcG9ydCBhbiAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgdG8gJ1xcXCJpbmxpbmVcXFwiJyBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGNvbWJvYm94IHRoYXQgc3VwcG9ydHMgYXV0b2NvbXBsZXRpb24gYmVoYXZpb3IgbXVzdCBoYXZlIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBvbmx5IG9uIGl0cyB0ZXh0IGlucHV0IGVsZW1lbnQgd2l0aCBhIHZhbGlkIHZhbHVlOyBhIHZhbHVlIG9mICdcXFwiaW5saW5lXFxcIicgaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cElkLCBwb3B1cEVsZW1lbnQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfaW5saW5lXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlOyBcbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhcG9wdXBFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIW53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudy5iRW5kVGFnICYmIG53Lm5vZGUgPT09IHBvcHVwRWxlbWVudC5sYXN0RWxlbWVudENoaWxkKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfMVwiLCBbcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhdHRlcm5EZXRlY3QoZWxlbTogRWxlbWVudCk6IFN0cmluZyB7XG4gICAgLy8gY2hlY2sgJ2V4cGxpY2l0JyByb2xlIGNvbWJvYm94IGFuZCB0aGF0IGl0IGlzIG5vdCA8c2VsZWN0Pi4gXG4gICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSAhPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgIHJldHVybiBcImltcGxpY2l0XCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGV4dFwiKVxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMCBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIHRvIGNvbnRpbnVlIHRvIGFsbG93XG4gICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImlucHV0XCJcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjEgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyBpcyBub3cgaW52YWxpZFxuICAgICAgICByZXR1cm4gXCIxLjFcIjtcbiAgICB9XG4gICAgLy8gQXNzdW1lIHRoZXkncmUgdHJ5aW5nIHRvIGRvIHRoZSBsYXRlc3QsIDEuMiBwYXR0ZXJuXG4gICAgcmV0dXJuIFwiMS4yXCI7XG59XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfZGVzaWduX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfdmVyc2lvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiUGFzc18xLjBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJGYWlsXzEuMVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcIlBhc3NfMS4yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4wLCB3aGljaCBpcyBhbGxvd2VkIGJ5IEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4xLCB3aGljaCBpcyBub3QgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBtdXN0IGJlIHZhbGlkIGZvciBBUklBIDEuMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXR0ZXJuID0gcGF0dGVybkRldGVjdChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gV2UgZG9uJ3QgYXNzZXNzIG5hdGl2ZSBzZWxlY3QgZWxlbWVudHMgaGVyZVxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCJpbXBsaWNpdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgZXhwYW5kZWQgPSAoUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXhwYW5kZWRcIikgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICBsZXQgZWRpdGFibGUgPSB0YWdOYW1lID09PSBcImlucHV0XCIgJiYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIpO1xuXG4gICAgICAgIGxldCBrZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgXCJpbnB1dEVsZW1lbnRcIjogZWRpdGFibGUgPyBydWxlQ29udGV4dCA6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgXCJleHBhbmRlZFwiOiBleHBhbmRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50czogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiRE9NIGZvY3VzIGlzIGFsbG93ZWQgb25seSBvbiB0aGUgY29tYm9ib3ggZWxlbWVudCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcIlRoZSBjb21ib2JveCBlbGVtZW50IGRvZXMgbm90IGFsbG93IERPTSBmb2N1cyBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiVGhlIHBvcHVwIG9mIHRoZSBjb21ib2JveCBoYXMgRE9NIGZvY3VzIG9yIGhhcyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBkZWZpbmVkLCB3aGljaCBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmJhYmxlIGZvY3VzIGZvciB0aGUgY29tYm9ib3ggbXVzdCBiZSBhbGxvd2VkIG9ubHkgb24gdGhlIHRleHQgaW5wdXQsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBSUFRVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSlbMF07XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdXG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX25vdF90YWJiYWJsZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIHRvIGNoZWNrIHRoZSBwb3B1cCB3aGVuIGV4cGFuZGVkXG4gICAgICAgIC8vIHRoaXMgZG9lcyBub3QgYXBwbHkgdG8gZGlhbG9ncywgcmV0dXJuIHBhc3Mgc2luY2UgdGhlIG1haW4gZWxlbWVudCB3YXMgZm9jdXNhYmxlIGFib3ZlXG4gICAgICAgIGlmIChleHBhbmRlZCA9PT0gZmFsc2UgfHwgcG9wdXBSb2xlID09PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHBvcHVwRWxlbWVudCBpdHNlbGYgaGFzIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJcbiAgICAgICAgICAgIHBhc3NlZCA9ICFSUFRVdGlsLmlzVGFiYmFibGUocG9wdXBFbGVtZW50KSAmJiAhUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHBvcHVwRWxlbWVudCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7O1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9oYXNwb3B1cF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfaGFzcG9wdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBhcHByb3ByaWF0ZWx5IHJlZmVyZW5jZXMgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdyb2xlJyB2YWx1ZSBcXFwiezB9XFxcIiBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIiBzaG91bGQgYmUgb25lIG9mIFxcXCJsaXN0Ym94XFxcIiwgXFxcImdyaWRcXFwiLCBcXFwidHJlZVxcXCIgb3IgXFxcImRpYWxvZ1xcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiVGhlIHZhbHVlIG9mIHRoZSBjb21ib2JveCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG1hdGNoIHRoZSAncm9sZScgdmFsdWUgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggYXR0cmlidXRlICdhcmlhLWhhc3BvcHVwJyB2YWx1ZSBtdXN0IGJlIGFwcHJvcHJpYXRlIGZvciB0aGUgcm9sZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMClcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHBvcHVwIHJvbGUgaXMgbGlzdGJveCwgZ3JpZCwgdHJlZSwgb3IgZGlhbG9nIGFuZCB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBwb3B1cFJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpO1xuICAgICAgICBsZXQgdmFsaWRSb2xlcyA9IFtcImxpc3Rib3hcIiwgXCJncmlkXCIsIFwidHJlZVwiLCBcImRpYWxvZ1wiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gcG9wdXBSb2xlcy5pbmNsdWRlcyh2YWxpZFJvbGUpKTtcbiAgICAgICAgaWYgKHZhbGlkUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLCBbcG9wdXBSb2xlcy5qb2luKFwiLFwiKSwgcG9wdXBJZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBvcHVwUm9sZSA9IHZhbGlkUm9sZXNbMF07XG4gICAgICAgICAgICBsZXQgaGFzcG9wdXBWYWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpIHx8IFwibGlzdGJveFwiO1xuICAgICAgICAgICAgLy8gUG9wdXAgcm9sZSBtdXN0IG1hdGNoIGFyaWEtaGFzcG9wdXAgdW5sZXNzIHBvcHVwUm9sZSBpcyBsaXN0Ym94LCB0aGVuIGFyaWEtaGFzcG9wdXAgc2hvdWxkIG5vdCBiZSBkZWZpbmVkICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGhhc3BvcHVwVmFsICE9PSBwb3B1cFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9wdXBSb2xlICE9PSBcImxpc3Rib3hcIiB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiLCBbaGFzcG9wdXBWYWwsIHBvcHVwUm9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBleHBhbmRlZCB9ID0gY2FjaGVkRWxlbTtcblxuICAgICAgICBsZXQgcG9wdXBJZDtcbiAgICAgICAgbGV0IHBvcHVwRWxlbWVudDtcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50LCBzdGljayBpdCBpbiB0aGUgY2FjaGUgYW5kIHRoZW4gY2hlY2sgaXRzIHJvbGVcbiAgICAgICAgY2FjaGVkRWxlbS5wb3B1cElkID0gcG9wdXBJZDtcbiAgICAgICAgY2FjaGVkRWxlbS5wb3B1cEVsZW1lbnQgPSBwb3B1cEVsZW1lbnQ7XG5cblxuICAgICAgICBpZiAoZXhwYW5kZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhwYW5kZWQgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKGV4cGFuZGVkID8gXCJQYXNzXzEuMF9leHBhbmRlZFwiIDogXCJQYXNzXzEuMF9jb2xsYXBzZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoZXhwYW5kZWQgPyBcIlBhc3NfMS4yX2V4cGFuZGVkXCIgOiBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZGV0ZWN0b3JfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGV0ZWN0b3JfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJFWFRFTlNJT05TXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGllckNvbnRleHQgPSBjb250ZXh0SGllcmFyY2hpZXMuYXJpYVtjb250ZXh0SGllcmFyY2hpZXMuYXJpYS5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtdLCBbe1xuICAgICAgICAgICAgbmFtZTogaGllckNvbnRleHQuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgcm9sZTogaGllckNvbnRleHQucm9sZSxcbiAgICAgICAgICAgIHRhYmluZGV4OiBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBcIjBcIilcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBkaXJfYXR0cmlidXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2Rpcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfRWxlbV9EaXJWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW52YWxpZCB2YWx1ZSB1c2VkIGZvciB0aGUgJ2RpcicgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2RpcicgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgXFxcImx0clxcXCIsIFxcXCJydGxcXFwiLCBvciBcXFwiYXV0b1xcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGRpclN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRpclwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZGlyU3RyID09IFwibHRyXCIgfHwgZGlyU3RyID09IFwicnRsXCIgfHwgZGlyU3RyID09IFwiYXV0b1wiO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRvd25sb2FkIG1lY2hhbmlzbSBkb2VzIG5vdCBjYXVzZSBhIGtleWJvYXJkIHRyYXBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGaWxlIGRvd25sb2FkIG1lY2hhbmlzbXMgc2hvdWxkIGJlIGtleWJvYXJkLW9wZXJhYmxlIGFuZCBwcmVzZXJ2ZSBwYWdlIGZvY3VzIGxvY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGhyZWYgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGhyZWYpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVtcIi5kb2N4XCIsIFwiLmRvY1wiLCBcIi5wZGZcIiwgXCIub2R0XCJdLmluY2x1ZGVzKGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthY2Nlc3NrZXldXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjY2Vzc2tleV9OZWVkTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGhlIEhUTUwgZWxlbWVudCB3aXRoIGFuIGFzc2lnbmVkICdhY2Nlc3NrZXknIGF0dHJpYnV0ZSBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBIVE1MIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKSkgeyAvLyBpZ25vcmUgaGlkZGVuXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIHZhbGlkaXR5IG9mIHRoZSBpZCAob2YgYXJpYS1sYWJlbGxlZGJ5KSBpcyBjaGVja2VkIGJ5IGEgZGlmZmVyZW50IHJ1bGVcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAmJiBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiKSB7XG4gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIHZhbGlkaXR5IG9mIHRoZSBsYWJlbCwgZS5nLiBlbXB0eSBsYWJlbCwgaXMgY2hlY2tlZCBieSBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VsZW1fVW5pcXVlQWNjZXNzS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGVsZW1lbnQgaXMgbm90IHVuaXF1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhY2Nlc3NrZXknIGF0dHJpYnV0ZSB2YWx1ZXMgb24gZWFjaCBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIiwge30pO1xuXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmNvbnN0IERFUFJFQ0FURURfRUxFTUVOVFMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhcHBsZXRcIiwgXCJiYXNlZm9udFwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImZvbnRcIiwgXCJpc2luZGV4XCIsIFwibGlzdGluZ1wiLFxuICAgIFwicGxhaW50ZXh0XCIsIFwic3BhY2VyXCIsIFwic1wiLCBcInN0cmlrZVwiLCBcInVcIiwgXCJ4bXBcIixcbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJhY3JvbnltXCIsIFwiZnJhbWVcIiwgXCJmcmFtZXNldFwiLCBcIm5vZnJhbWVzXCIsIFwibm9lbWJlZFwiLCBcImJpZ1wiLCBcImJsaW5rXCIsIFwibWFycXVlZVwiLCBcInR0XCIsXG5cbl1cblxuY29uc3QgREVQUkVDQVRFRF9IVE1MX0dMT0JBTF9BVFRSSUJVVEVTID0gW1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwiYWxpZ25cIiwgXCJsaW5rXCIsIFwiYXJjaGl2ZVwiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwiY2xlYXJcIiwgXCJjb2RlXCIsIFwiY29sb3JcIixcbiAgICBcImNvbXBhY3RcIiwgXCJmYWNlXCIsIFwiaHNwYWNlXCIsIFwibGFuZ3VhZ2VcIiwgXCJsaW5rXCIsIFwibm9zaGFkZVwiLCBcIm5vd3JhcFwiLCBcIm9iamVjdFwiLFxuICAgIFwicHJvbXB0XCIsIFwic3RhcnRcIiwgXCJ0ZXh0XCIsIFwidmVyc2lvblwiLCBcInZsaW5rXCIsIFwidnNwYWNlXCJcbl1cblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVMgPSB7XG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJ0ZFwiOiBbXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImFiYnJcIiwgXCJheGlzXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJub3dyYXBcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiLCBcImFsaWduXCIsIFwiYmdjb2xvclwiXSxcbiAgICBcInRoXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyb2ZmXCIsIFwiaGVpZ2h0XCIsIFwiYmdjb2xvclwiLCBcImFsaWduXCIsIFwibm93cmFwXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcIndpZHRoXCJdLFxuICAgIFwibGlcIjogW1widHlwZVwiLCBcInZhbHVlXCIsIFwidHlwZVwiXSxcbiAgICBcInVsXCI6IFtcInR5cGVcIiwgXCJjb21wYWN0XCJdLFxuICAgIFwicHJlXCI6IFtcIndpZHRoXCJdLFxuXG4gICAgLyoqIGFkZGVkIGZyb20gaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3BmLXN1bW1hcnkvb2Jzb2xldGUuaHRtbCAqL1xuICAgIFwibWV0YVwiOiBbXCJodHRwLWVxdWl2XCJdLFxuICAgIFwiYVwiOiBbXCJjaGFyc2V0XCIsIFwiY29vcmRzXCIsIFwic2hhcGVcIiwgXCJyZXZcIiwgXCJzY2hlbWVcIl0sXG4gICAgXCJsaW5rXCI6IFtcInJldlwiLCBcImNoYXJzZXRcIiwgXCJ0YXJnZXRcIl0sXG4gICAgXCJpbWdcIjogW1wibmFtZVwiLCBcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJhcmVhXCI6IFtcIm5vaHJlZlwiXSxcbiAgICBcImhlYWRcIjogW1wicHJvZmlsZVwiXSxcbiAgICBcImh0bWxcIjogW1widmVyc2lvblwiXSxcbiAgICBcImlmcmFtZVwiOiBbXCJsb25nZGVzY1wiLCBcImFsaWduXCIsIFwiZnJhbWVib3JkZXJcIiwgXCJtYXJnaW5oZWlnaHRcIiwgXCJtYXJnaW53aWR0aFwiLCBcInNjcm9sbGluZ1wiXSxcbiAgICBcIm9iamVjdFwiOiBbXCJhcmNoaXZlXCIsIFwiY29kZVwiLCBcImNvZGViYXNlXCIsIFwiY29kZXR5cGVcIiwgXCJkZWNsYXJlXCIsIFwic3RhbmRieVwiLCBcImFsaWduXCIsIFwiaHNwYWNlXCIsIFwidnNwYWNlXCIsIFwiYm9yZGVyXCJdLFxuICAgIFwicGFyYW1cIjogW1widHlwZVwiLCBcInZhbHVldHlwZVwiXSxcbiAgICBcInNjcmlwdFwiOiBbXCJsYW5ndWFnZVwiXSxcbiAgICBcImJvZHlcIjogW1wiYWxpbmtcIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmdjb2xvclwiLCBcImxpbmtcIiwgXCJ0ZXh0XCIsIFwidmxpbmtcIl0sXG4gICAgXCJiclwiOiBbXCJjbGVhclwiXSxcbiAgICBcImNhcHRpb25cIjogW1wiYWxpZ25cIl0sXG4gICAgXCJjb2xcIjogW1wiYWxpZ25cIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiLCBcIndpZHRoXCJdLFxuICAgIFwiZGl2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiZGxcIjogW1wiY29tcGFjdFwiXSxcbiAgICBcImhyXCI6IFtcImFsaWduXCIsIFwibm9zaGFkZVwiLCBcInNpemVcIiwgXCJ3aWR0aFwiLCBcImFsaWduXCJdLFxuICAgIFwiaDJcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoM1wiOiBbXCJhbGlnblwiXSxcbiAgICBcImg0XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDVcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImlucHV0XCI6IFtcImFsaWduXCIsIFwidXNlbWFwXCJdLFxuICAgIFwibGVnZW5kXCI6IFtcImFsaWduXCJdLFxuICAgIFwibWVudVwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwib2xcIjogW1wiY29tcGFjdFwiLCBcInR5cGVcIiwgXCJ0eXBlXCJdLFxuICAgIFwicFwiOiBbXCJhbGlnblwiXSxcbiAgICBcInRhYmxlXCI6IFtcImJnY29sb3JcIiwgXCJjZWxscGFkZGluZ1wiLCBcImNlbGxzcGFjaW5nXCIsIFwiZnJhbWVcIiwgXCJydWxlc1wiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJ0Ym9keVwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIiwgXCJjaGFyb2ZmXCJdLFxuICAgIFwidGZvb3RcIjogW1wiYWxpZ25cIiwgXCJjaGFyb2ZmXCIsIFwiY2hhclwiLCBcInZhbGlnblwiXSxcbiAgICBcInRoZWFkXCI6IFtcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJ0clwiOiBbXCJhbGlnblwiLCBcImJnY29sb3JcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiXVxufVxuXG5mdW5jdGlvbiBhcnJheVRvQ29udGV4dFN0cihvYmosIHR5cGUpIHtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqKSB7XG4gICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoJywgJykpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIGlmICh0eXBlID09PSAnSFRNTF9FTEVNRU5UUycpXG4gICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ0hUTUxfQVRUUklCVVRFUycpXG4gICAgICAgICAgICBzdHIgKz0gJ2RvbToqWycgKyBwcm9wICsgXCJdXCI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIG9ialRvQ29udGV4dFN0cihvYmosIHR5cGU6IHN0cmluZykge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRfQVRUUklCVVRFUycpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmpbcHJvcF0gYXMgU3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKFwiLCBcIikpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgICAgICAgICAgc3RyICs9ICdkb206JyArIHByb3AgKyAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldCwgZG9tOmJhc2Vmb250LCBkb206Y2VudGVyLCBkb206ZGlyLCBkb206Zm9udCwgZG9tOmlzaW5kZXgsIGRvbTpsaXN0aW5nLCBkb206bWVudSwgZG9tOnBsYWludGV4dCwgZG9tOnNwYWNlciwgZG9tOnMsIGRvbTpzdHJpa2UsIGRvbTp1LCBkb206eG1wLCBkb206YWNyb255bSwgZG9tOmZyYW1lLCBkb206ZnJhbWVzZXQsIGRvbTpub2ZyYW1lcywgZG9tOm5vZW1iZWQsIGRvbTpiaWcsIGRvbTpibGluaywgZG9tOm1hcnF1ZWUsIGRvbTp0dE5hTmRvbToqW2FsaWduXSwgZG9tOipbbGlua10sIGRvbToqW2FyY2hpdmVdLCBkb206KltiYWNrZ3JvdW5kXSwgZG9tOipbYmdjb2xvcl0sIGRvbToqW2NsZWFyXSwgZG9tOipbY29kZV0sIGRvbToqW2NvbG9yXSwgZG9tOipbY29tcGFjdF0sIGRvbToqW2ZhY2VdLCBkb206Kltoc3BhY2VdLCBkb206KltsYW5ndWFnZV0sIGRvbToqW2xpbmtdLCBkb206Kltub3NoYWRlXSwgZG9tOipbbm93cmFwXSwgZG9tOipbb2JqZWN0XSwgZG9tOipbcHJvbXB0XSwgZG9tOipbc3RhcnRdLCBkb206Klt0ZXh0XSwgZG9tOipbdmVyc2lvbl0sIGRvbToqW3ZsaW5rXSwgZG9tOipbdnNwYWNlXU5hTmRvbTp0ZFtoZWlnaHRdLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWJicl0sIGRvbTp0ZFtheGlzXSwgZG9tOnRkW2NoYXJdLCBkb206dGRbY2hhcm9mZl0sIGRvbTp0ZFtoZWlnaHRdLCBkb206dGRbbm93cmFwXSwgZG9tOnRkW3ZhbGlnbl0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthbGlnbl0sIGRvbTp0ZFtiZ2NvbG9yXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFt3aWR0aF0sIGRvbTp0aFthYmJyXSwgZG9tOnRoW2F4aXNdLCBkb206dGhbY2hhcm9mZl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbYmdjb2xvcl0sIGRvbTp0aFthbGlnbl0sIGRvbTp0aFtub3dyYXBdLCBkb206dGhbY2hhcl0sIGRvbTp0aFt2YWxpZ25dLCBkb206dGhbd2lkdGhdLCBkb206bGlbdHlwZV0sIGRvbTpsaVt2YWx1ZV0sIGRvbTpsaVt0eXBlXSwgZG9tOnVsW3R5cGVdLCBkb206dWxbY29tcGFjdF0sIGRvbTpwcmVbd2lkdGhdLCBkb206bWV0YVtodHRwLWVxdWl2XSwgZG9tOmFbY2hhcnNldF0sIGRvbTphW2Nvb3Jkc10sIGRvbTphW3NoYXBlXSwgZG9tOmFbcmV2XSwgZG9tOmFbc2NoZW1lXSwgZG9tOmxpbmtbcmV2XSwgZG9tOmxpbmtbY2hhcnNldF0sIGRvbTpsaW5rW3RhcmdldF0sIGRvbTppbWdbbmFtZV0sIGRvbTppbWdbbG9uZ2Rlc2NdLCBkb206aW1nW2FsaWduXSwgZG9tOmltZ1toc3BhY2VdLCBkb206aW1nW3ZzcGFjZV0sIGRvbTppbWdbYm9yZGVyXSwgZG9tOmFyZWFbbm9ocmVmXSwgZG9tOmhlYWRbcHJvZmlsZV0sIGRvbTpodG1sW3ZlcnNpb25dLCBkb206aWZyYW1lW2xvbmdkZXNjXSwgZG9tOmlmcmFtZVthbGlnbl0sIGRvbTppZnJhbWVbZnJhbWVib3JkZXJdLCBkb206aWZyYW1lW21hcmdpbmhlaWdodF0sIGRvbTppZnJhbWVbbWFyZ2lud2lkdGhdLCBkb206aWZyYW1lW3Njcm9sbGluZ10sIGRvbTpvYmplY3RbYXJjaGl2ZV0sIGRvbTpvYmplY3RbY29kZV0sIGRvbTpvYmplY3RbY29kZWJhc2VdLCBkb206b2JqZWN0W2NvZGV0eXBlXSwgZG9tOm9iamVjdFtkZWNsYXJlXSwgZG9tOm9iamVjdFtzdGFuZGJ5XSwgZG9tOm9iamVjdFthbGlnbl0sIGRvbTpvYmplY3RbaHNwYWNlXSwgZG9tOm9iamVjdFt2c3BhY2VdLCBkb206b2JqZWN0W2JvcmRlcl0sIGRvbTpwYXJhbVt0eXBlXSwgZG9tOnBhcmFtW3ZhbHVldHlwZV0sIGRvbTpzY3JpcHRbbGFuZ3VhZ2VdLCBkb206Ym9keVthbGlua10sIGRvbTpib2R5W2JhY2tncm91bmRdLCBkb206Ym9keVtiZ2NvbG9yXSwgZG9tOmJvZHlbbGlua10sIGRvbTpib2R5W3RleHRdLCBkb206Ym9keVt2bGlua10sIGRvbTpicltjbGVhcl0sIGRvbTpjYXB0aW9uW2FsaWduXSwgZG9tOmNvbFthbGlnbl0sIGRvbTpjb2xbY2hhcl0sIGRvbTpjb2xbY2hhcm9mZl0sIGRvbTpjb2xbdmFsaWduXSwgZG9tOmNvbFt3aWR0aF0sIGRvbTpkaXZbYWxpZ25dLCBkb206ZGxbY29tcGFjdF0sIGRvbTpoclthbGlnbl0sIGRvbTpocltub3NoYWRlXSwgZG9tOmhyW3NpemVdLCBkb206aHJbd2lkdGhdLCBkb206aHJbYWxpZ25dLCBkb206aDJbYWxpZ25dLCBkb206aDNbYWxpZ25dLCBkb206aDRbYWxpZ25dLCBkb206aDVbYWxpZ25dLCBkb206aDZbYWxpZ25dLCBkb206aW5wdXRbYWxpZ25dLCBkb206aW5wdXRbdXNlbWFwXSwgZG9tOmxlZ2VuZFthbGlnbl0sIGRvbTptZW51W2NvbXBhY3RdLCBkb206b2xbY29tcGFjdF0sIGRvbTpvbFt0eXBlXSwgZG9tOm9sW3R5cGVdLCBkb206cFthbGlnbl0sIGRvbTp0YWJsZVtiZ2NvbG9yXSwgZG9tOnRhYmxlW2NlbGxwYWRkaW5nXSwgZG9tOnRhYmxlW2NlbGxzcGFjaW5nXSwgZG9tOnRhYmxlW2ZyYW1lXSwgZG9tOnRhYmxlW3J1bGVzXSwgZG9tOnRhYmxlW3dpZHRoXSwgZG9tOnRhYmxlW2FsaWduXSwgZG9tOnRib2R5W2FsaWduXSwgZG9tOnRib2R5W2NoYXJdLCBkb206dGJvZHlbdmFsaWduXSwgZG9tOnRib2R5W2NoYXJvZmZdLCBkb206dGZvb3RbYWxpZ25dLCBkb206dGZvb3RbY2hhcm9mZl0sIGRvbTp0Zm9vdFtjaGFyXSwgZG9tOnRmb290W3ZhbGlnbl0sIGRvbTp0aGVhZFtjaGFyXSwgZG9tOnRoZWFkW2NoYXJvZmZdLCBkb206dGhlYWRbdmFsaWduXSwgZG9tOnRoZWFkW2FsaWduXSwgZG9tOnRyW2FsaWduXSwgZG9tOnRyW2JnY29sb3JdLCBkb206dHJbY2hhcl0sIGRvbTp0cltjaGFyb2ZmXSwgZG9tOnRyW3ZhbGlnbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGZvciB0aGUgPHsxfT4gZWxlbWVudCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2Ugb2Ygb2Jzb2xldGUgZmVhdHVyZXMgaWYgcG9zc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEhUTUxVbml0IGF1dG8gYWRkcyBhIHRib2R5W2FsaWduPWxlZnRdIHRvIHRhYmxlcyBpZiB0Ym9keSBpcyBtaXNzaW5nIVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0Ym9keVwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsaWduXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3ZWJjb21wb25lbnQgZWxlbWVudCwgSFRNTCBkb2Vzbid0IGRlZmluZSB3aGF0J3MgZGVwcmVjYXRlZFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBlbGVtZW50XG4gICAgICAgIGlmIChERVBSRUNBVEVEX0VMRU1FTlRTLmluY2x1ZGVzKG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbGVtXCIsIFtub2RlTmFtZV0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBIVE1MIGdsb2JhbCBhdHRyaWJ1dGVcbiAgICAgICAgY29uc3QgYXR0cnMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuICAgICAgICBsZXQgdmlvbGF0aW9ucyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgIGlmIChERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMuaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zICs9IGF0dHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2F0dHJcIiwgW3Zpb2xhdGlvbnNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZWxlbWVudCAmIGF0dHJpYnV0ZVxuICAgICAgICB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXSAmJiBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFU1tub2RlTmFtZV0uaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB2aW9sYXRpb25zICs9ICcsICc7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1fYXR0clwiLCBbdmlvbGF0aW9ucywgbm9kZU5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KltpZF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX1VuaXF1ZUlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGFscmVhZHkgaW4gdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBlbGVtZW50ID09PSBydWxlQ29udGV4dDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwibGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIik7XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLnZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF80XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbn1cblxuZXhwb3J0IGxldCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IHZhbGlkYXRlTGFuZ1xufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2xhbmddLCBkb206Klt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjaGFuZ2UgaW4gbGFuZ3VhZ2Ugb2Ygc3BlY2lmaWMgY29udGVudCBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICAvLyBcImI1YzNmOFwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgXCJkZTQ2ZTRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIElmIGl0J3MgdGhlIEhUTUwgbm9kZSwgdGhhdCdzIGhhbmRsZWQgYnkgaHRtbF9sYW5nX3ZhbGlkXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJodG1sXCIpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmV0VmFsID0gdmFsaWRhdGVMYW5nKGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcykgYXMgUnVsZVJlc3VsdDtcbiAgICAgICAgaWYgKHJldFZhbC52YWx1ZVsxXSAhPT0gZVJ1bGVDb25maWRlbmNlLlBBU1MpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlJ3MgYWN0dWFsbHkgY29udGVudCBvZiB0aGlzIGVsZW1lbnQgLSBza2lwIHN1YnRyZWVzIHRoYXQgaGF2ZSBvdGhlciBsYW5nIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IG53Lm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IGVsZW1lbnQuaGFzQXR0cmlidXRlKFwibGFuZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gaGFzQ29udGVudCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gaGFzQ29udGVudCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBudy5ub2RlLm5vZGVUeXBlID09PSAzICYmIG53Lm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmRibGNsaWNrXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlZG93bl0sIGRvbToqW29ubW91c2V1cF0sIGRvbToqW29ubW91c2VvdmVyXSwgZG9tOipbb25tb3VzZW91dF0sIGRvbToqW29uY2xpY2tdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRWxlbV9FdmVudE1vdXNlQW5kS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIkNvbmZpcm0gdGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBtb3VzZSBldmVudCBoYW5kbGVyKHMpICd7MX0nIGhhcyBhIGNvcnJlc3BvbmRpbmcga2V5Ym9hcmQgaGFuZGxlcihzKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBpbnRlcmFjdGl2ZSBjb250ZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcnMgbXVzdCBoYXZlIGVxdWl2YWxlbnQga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpIHx8XG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZGJsY2xpY2tcIikgJiZcbiAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW1vdmVcIikgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2V1cFwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW92ZXJcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdXRcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25ibHVyXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jbGlja1wiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIpKTtcblxuICAgICAgICBsZXQgZmFpbGVkTW91c2VFdmVudHMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vc3RvcmUgYW5kIGRpc3BsYXkgZXZlbnQgbmFtZSBhbmQgbm9kZSBuYW1lIGluIHRoZSB0b2tlbnNcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9uZGJsY2xpY2tcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW1vdmVcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW1vdmVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZWRvd25cIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlZG93blwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5dXBcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZXVwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2VvdmVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdXRcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSlcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9uY2xpY2tcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIsIFtub2RlTmFtZSwgZmFpbGVkTW91c2VFdmVudHMuam9pbihcIiwgXCIpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcywgc2VsZWN0b3JNYXRjaGVzRWxlbSwgZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybSwgZ2V0Um90YXRpb25EZWdyZWV9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCBpcyBub3QgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb2NrZWRcIjogXCJUaGUgZWxlbWVudCA8ezB9PiBpcyByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHNob3VsZCBub3QgYmUgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogWydiMzNlZmYnXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaW52aXNpYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJ0aXRsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gY2FjaGUgdGhlIG9yaWVudGF0aW9uIHJlc3N1bHQgZm9yIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSBhcyBhbnk7XG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9NRURJQV9PUklFTlRBVElPTl9UUkFOU0ZST01cIiwgbnVsbCk7XG4gICAgICAgIGlmICghb3JpZW50YXRpb25UcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYyk7XG4gICAgICAgICAgICBzZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9NRURJQV9PUklFTlRBVElPTl9UUkFOU0ZST01cIiwgb3JpZW50YXRpb25UcmFuc2Zvcm1zKTtcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIC8vIGZpbmQgaWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyBvcmllbnRhdGlvbiBzZWxlY3RvcihzKVxuICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtcyA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldKS5mb3JFYWNoKHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pLmxlbmd0aCA+IDAgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShydWxlQ29udGV4dCwgdGFnKSlcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTsgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gbm8gbWF0Y2gsIHRoZSBlbGVtZW5ldCBpcyBub3QgaW4gbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtXG4gICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1lZGlhX3RyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhX3RyYW5zZm9ybSA9IG1lZGlhX3RyYW5zZm9ybXNbaV07XG4gICAgICAgICAgICBsZXQgY29udGFpbnNSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgWydyb3RhdGUnLCAncm90YXRlM2QnLCAncm90YXRlWicsICdtYXRyaXgnLCAnbWF0cml4M2QnXS5mb3JFYWNoKHJvdGF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3JtLmluY2x1ZGVzKHJvdGF0aW9uKSkgY29udGFpbnNSb3RhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG5vIHJvdGF0aW9uIHRyYW5zZm9ybSwgc2tpcFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1JvdGF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGRlZ3JlZSA9IGdldFJvdGF0aW9uRGVncmVlKG1lZGlhX3RyYW5zZm9ybSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIG5vIG9yIDM2MG4gZGVncmVlIHJvdGF0aW9uIFxuICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMCkgeyBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHBhZ2Ugcm90YXRpb24gdHJhbnNmb3JtYXRpb24sIGV4YW1wbGVcbiAgICAgICAgICAgICAqICBodG1sIHsgdHJhbnNmb3JtOiByb3RhdGUoMi41ZGVnKTsgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZSA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiBjb21wZW5zYXRlIHRoZSBtZWRpYSBvcmllbnRhdGlvbiB3aXRoIHRoZSBwYWdlIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZV9kZWdyZWUgPSBnZXRSb3RhdGlvbkRlZ3JlZShkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKTtcbiAgICAgICAgICAgICAgICBkZWdyZWUgLT0gcGFnZV9kZWdyZWU7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhbGxvdyAxIGRlZ3JlZSBmbG9hdGluZyByYW5nZSBmb3IgdGhlIHJpZ2h0IGFuZ2xlXG4gICAgICAgICAgICBpZiAoKGRlZ3JlZSA+IDg5ICYmIGRlZ3JlZSA8IDkxKSB8fCAoZGVncmVlID4gLTkxICYmIGRlZ3JlZSA8IC04OSkpXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xvY2tlZFwiLCBbbm9kZU5hbWVdKSk7XG4gICAgICAgICAgICBlbHNlIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGdldFBpeGVsc0Zyb21TdHlsZSB9IGZyb20gXCIuLi8vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIG51bTogW1wiMi4xLjFcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIm9zc3c5a1wiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJpZnJhbWVcIiwgXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCBpZiBubyB2aXNpYmxlIGNvbnRlbnRcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZSwgaW5hcHBsaWNhYmxlXG4gICAgICAgIGlmICgoc3R5bGVzLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnIHx8IHN0eWxlcy5vdmVyZmxvd1ggPT09ICdoaWRkZW4nKVxuICAgICAgICAgICAgJiYgKHN0eWxlcy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyB8fCBzdHlsZXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIG92ZXJhbGwgc2Nyb2xsYWJsZSBlbGVtZW50IChjbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoIGFuZCBjbGllbnRIZWlnaHQgKyBzY3JvbGxiYXJIZWlnaHQpIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgocnVsZUNvbnRleHQub2Zmc2V0V2lkdGgsIHJ1bGVDb250ZXh0Lm9mZnNldEhlaWdodCkgPCAzMCB8fCBNYXRoLm1pbihydWxlQ29udGV4dC5vZmZzZXRXaWR0aCwgcnVsZUNvbnRleHQub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBudWxsOyBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCB4IGFuZCB5IHNjcm9sbCBkaXN0YW5jZXMgPCBlbGVtZW50J3MgaG9yaXpvbnRhbC92ZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeCA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0xlZnQsIHJ1bGVDb250ZXh0KSArIGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1JpZ2h0LCBydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeSA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgcnVsZUNvbnRleHQpICsgZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nQm90dG9tLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5zY3JvbGxXaWR0aCAtICBydWxlQ29udGV4dC5jbGllbnRXaWR0aCA8IDEgKyBwYWRkaW5nX3ggXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5zY3JvbGxIZWlnaHQgLSAgcnVsZUNvbnRleHQuY2xpZW50SGVpZ2h0IDwgMSsgcGFkZGluZ195KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBwYXNzIGlmcmFtZSBlbGVtZW50IGhhcyBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIG5vdCBuZWdhdGl2ZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgJiYgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3RhYmJhYmxlXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgY29udGVudCBpcyB0YWJiYWJsZVxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ludGVyYWN0aXZlXCIpO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpbiBGaXJlZm94IGlmIG5vIHRhYmluZGV4IGF0IGFsbCAobm90IHRlc3RlZCBpbiBlbWJlZGRlZCBvciBhbnkgc2ltdWxhdG9yKVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfc2Nyb2xsYWJsZVwiLCBbbm9kZU5hbWVdKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXREZWZpbmVkU3R5bGVzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDpcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9yb2xlXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaGFzIGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCdzIHJvbGUgJ3swfScgaXMgbm90IGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIFJQVFV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gUlBUVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgZWxlbWVudHMgd2l0aCBDU1Mgb3ZlcmZsb3c6IHNjcm9sbCBvciBhdXRvXG4gICAgICAgIGxldCBzdHlsZXMgPSBnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlc1snb3ZlcmZsb3cteCddID09PSAnc2Nyb2xsJyB8fCBzdHlsZXNbJ292ZXJmbG93LXknXSA9PT0gJ3Njcm9sbCcgXG4gICAgICAgICAgICB8fCBzdHlsZXNbJ292ZXJmbG93LXgnXSA9PT0gJ2F1dG8nIHx8IHN0eWxlc1snb3ZlcmZsb3cteSddID09PSAnYXV0bycpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlnbm9yZSAnYXBwbGljYXRpb24nIHJvbGUgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBmb2N1c2FibGUgZWxlbWVudHMgdGhhdCBkbyBub3QgZm9sbG93IGEgc3RhbmRhcmQgaW50ZXJhY3Rpb24gcGF0dGVybiBzdXBwb3J0ZWQgYnkgYSB3aWRnZXQgcm9sZTpodHRwczovL3d3dy53My5vcmcvVFIvMjAyMy9QUi1XQUktQVJJQS0xLjItMjAyMzAzMjgvI2FwcGxpY2F0aW9uIFxuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMuaW5jbHVkZXMoXCJhcHBsaWNhdGlvblwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZWxlbWVudHMgd2hvc2Ugcm9sZXMgYWxsb3cgbm8gZGVzY2VuZGFudHMgdGhhdCBhcmUgaW50ZXJhY3RpdmUgb3Igd2l0aCBhIHRhYmluZGV4ID49IDAgXG4gICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBpbiB3aWRnZXRfdGFiYmFibGVfc2luZ2xlIGFuZCBhcmlhX2NoaWxkX3RhYmJhYmxlXG4gICAgICAgIGNvbnN0IHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkID1bXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImltZ1wiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIl07XG5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFyZW50X3JvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwYXJlbnQgYXMgRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgb25lIG9mIHRoZSBwYXJlbnQgcm9sZXMgaXMgaW4gcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcGFyZW50X3JvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQuaW5jbHVkZXMocGFyZW50X3JvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gUm93IGlzIHdlaXJkLiBJdCdzIHN0cnVjdHVyZSwgYnV0IGNhbiBhbHNvIGJlIHdpZGdldFxuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInJvd1wiIHx8IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb2N1c2FibGUgc2VwYXJhdG9ycyBhcmUgd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInNlcGFyYXRvclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9yb2xlXCIsIFtyb2xlcy5sZW5ndGggPT09IDAgPyAnbm9uZScgOiByb2xlcy5qb2luKCcsICcpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcywgZ2V0Q29tcHV0ZWRTdHlsZSB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF90YWJiYWJsZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb24gdGhlIHNjcmVlbiB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaXMgdmlzaWJsZSBvbiB0aGUgc2NyZWVuXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiQ29uZmlybSB0aGUgZWxlbWVudCBzaG91bGQgYmUgdGFiYmFibGUsIGFuZCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4gd2hlbiBpdCBoYXMga2V5Ym9hcmQgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZGVmaW5lZCBzdHlsZXMgb25seSBnaXZlIHRoZSBzdHlsZXMgdGhhdCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChib3VuZHNbJ2hlaWdodCddID09PSAwIHx8IGJvdW5kc1snd2lkdGgnXSA9PT0gMCBcbiAgICAgICAgICAgIHx8IChkZWZpbmVkX3N0eWxlc1sncG9zaXRpb24nXT09PSdhYnNvbHV0ZScgJiYgZGVmaW5lZF9zdHlsZXNbJ2NsaXAnXSAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddLnJlcGxhY2VBbGwoJyAnLCAnJyk9PT0ncmVjdCgwcHgsMHB4LDBweCwwcHgpJ1xuICAgICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcblxuICAgICAgICBpZiAoYm91bmRzWyd0b3AnXSA+PSAwICYmIGJvdW5kc1snbGVmdCddID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVmYXVsdF9zdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b3AgPSBib3VuZHNbJ3RvcCddO1xuICAgICAgICBsZXQgbGVmdCA9IGJvdW5kc1snbGVmdCddOyAgICAgXG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganMgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHsgICBcbiAgICAgICAgICAgIC8vIHdpdGggb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ107XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWyd0b3AnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBvbmZvY3VzX3N0eWxlc1sndG9wJ10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgcGFyZW50J3MgcG9zaXRpb24gaXMgJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ2xlZnQnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gb25mb2N1c19zdHlsZXNbJ2xlZnQnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbWJlZF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtYmVkX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VtYmVkX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgPGVtYmVkPiBlbGVtZW50IGhhcyBhbHRlcm5hdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IGZvciA8ZW1iZWQ+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZW1iZWRfbm9lbWJlZF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VtYmVkX0hhc05vRW1iZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX25vZW1iZWRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9ub2VtYmVkX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIDxlbWJlZD4gZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1lbWJlZGRlZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGVtYmVkPiBlbGVtZW50cyBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24tZW1iZWRkZWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibm9lbWJlZFwiKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibm9lbWJlZFwiKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbW90aWNvbnNfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlbW90aWNvbnNfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UZXh0X0Vtb3RpY29uc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBlbW90aWNvbnMgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbW90aWNvbnMgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGVpciBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGVtb3RpY29uczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCI6LSlcIiwgXCI6KVwiLCBcIjpvKVwiLCBcIjpdXCIsIFwiOjNcIiwgXCI6YylcIiwgXCI6PlwiLCBcIj1dXCIsIFwiOClcIiwgXCI9KVwiLCBcIjpEXCIsIFwiQzpcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LURcIiwgXCI6RFwiLCBcIjhEXCIsIFwiWERcIiwgXCI9RFwiLCBcIj0zXCIsIFwiPD0zXCIsIFwiPD04XCIsIFwiLS0hLS1cIiwgXCI6LShcIiwgXCI6KFwiLCBcIjpjXCIsIFwiOjxcIiwgXCI6W1wiLFxuICAgICAgICAgICAgICAgICAgICBcIkQ6XCIsIFwiRDhcIiwgXCJEO1wiLCBcIkQ9XCIsIFwiRFhcIiwgXCJ2LnZcIiwgXCI6LTlcIiwgXCI7LSlcIiwgXCI7KVwiLCBcIiopXCIsIFwiO11cIiwgXCI7RFwiLCBcIjotUFwiLCBcIjpQXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiOi1wXCIsIFwiOnBcIiwgXCI9cFwiLCBcIjotw55cIiwgXCI6w55cIiwgXCI6LWJcIiwgXCI6YlwiLCBcIjotT1wiLCBcIjpPXCIsIFwiT19PXCIsIFwib19vXCIsIFwiOE9cIiwgXCJPd09cIiwgXCJPLU9cIixcbiAgICAgICAgICAgICAgICAgICAgXCIwX29cIiwgXCJPX29cIiwgXCJPM09cIiwgXCJvMG/CoDtvX287XCIsIFwiby4uLm9cIiwgXCIwdzBcIiwgXCI6LS9cIiwgXCI6L1wiLCBcIjpcXFxcXCIsIFwiPS9cIiwgXCI9XFxcXFwiLCBcIjpTXCIsIFwiOnxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkOi0pXCIsIFwicUItKVwiLCBcIjopflwiLCBcIjotKT4uLi4uXCIsIFwiOi1YXCIsIFwiOlhcIiwgXCI6LSNcIiwgXCI6I1wiLCBcIk86LSlcIiwgXCIwOjNcIiwgXCJPOilcIiwgXCI6JyhcIiwgXCI7KihcIixcbiAgICAgICAgICAgICAgICAgICAgXCJUX1RcIiwgXCJUVF9UVFwiLCBcIlQuVFwiLCBcIjotKlwiLCBcIjoqXCIsIFwiXm8pXCIsIFwiPjopXCIsIFwiPjspXCIsIFwiPjotKVwiLCBcIkIpXCIsIFwiQi0pXCIsIFwiOClcIiwgXCI4LSlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJePi4+XlwiLCBcIl48LjxeXCIsIFwiXj5fPl5cIiwgXCJePF88XlwiLCBcIkQ6PFwiLCBcIj46KFwiLCBcIkQtOjxcIiwgXCI+Oi0oXCIsIFwiOi1AWzFdXCIsIFwiOyhcIiwgXCJgX8K0XCIsIFwiRDxcIixcbiAgICAgICAgICAgICAgICAgICAgXCI8M1wiLCBcIjwzMzNcIiwgXCI9Xl9ePVwiLCBcIj0+Lj49XCIsIFwiPTxfPD1cIiwgXCI9Pi48PVwiLCBcIlxcXFwsLC9cIiwgXCJcXFxcbS9cIiwgXCJcXFxcbS9cXFxcPi48L1xcXFxtL1wiLCBcIlxcXFxvL1wiLCBcIlxcXFxvIG8vXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiby9cXFxcb1wiLCBcIjomXCIsIFwiOnVcIlxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGVtb3RpY29ucyA9IHZhbGlkYXRlUGFyYW1zLmVtb3RpY29ucy52YWx1ZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0ZXN0VGV4dCA9IFwiXCI7XG5cbiAgICAgICAgbGV0IHdhbGtOb2RlOiBOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICAvLyBDb21wbHkgdG8gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHQgYXMgdGhpcyBydWxlIHRyaWdnZXJzIG9uIGVhY2ggZWxlbWVudFxuICAgICAgICAgICAgLy8gYW5kIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBTbyBhbGwgaW5uZXIgZWxlbWVudHMgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY292ZXJlZCBvbiB0aGVpciBvd24uIEN1cnJlbnRseSBmb3IgdGhpcyBydWxlIGJ5IGRlZmF1bHQgQ2hlY2sgSGlkZGVuIENvbnRlbnQgd2lsbCB3b3JrLCBhcyB3ZSBhcmUgZG9pbmdcbiAgICAgICAgICAgIC8vIGEgbm9kZSB3YWxrIG9ubHkgb24gc2libGluZ3Mgc28gaXQgd291bGQgbm90IGdldCB0ZXh0IG5vZGVzIGZyb20gb3RoZXIgc2libGluZ3MgYXQgYWxsLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgaW4gdGhlIGZ1dHVyZSBzb21ldGhpbmcgY2huZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgdGVzdFRleHQgKz0gXCIgXCIgKyB3YWxrTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlc3RUZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgcGFzc2VkICYmIGogPCBlbW90aWNvbnMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBsZXQgZW1vdElkeCA9IHRlc3RUZXh0LmluZGV4T2YoZW1vdGljb25zW2pdKTtcbiAgICAgICAgICAgICAgICBsZXQgZUxuZ3RoID0gZW1vdGljb25zW2pdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIGVtb3RJZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2VzIGlmOiB0aGUgZW1vdGljb24gaXMgbm90IHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBlbW90aWNvbiBpcyBub3QgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSB1bmxlc3MgaXQncyBwdW5jdHVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgaXQncyBpbiBhIHByZSwgY29kZSwgb3Igc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZW1vdElkeCA+IDAgJiYgIS9cXHMvLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggLSAxLCBlbW90SWR4KSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZW1vdElkeCA8IHRlc3RUZXh0Lmxlbmd0aCAtIGVMbmd0aCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCArIGVMbmd0aCwgZW1vdElkeCArIGVMbmd0aCArIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEvWy4sISdcIj9dLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyB1c2FnZSBvZiAoOiBzdHVmZiA6KSBzaW5jZSB0aGlzIGlzIGEgY29tbWVudCBpbiBzb21lIGxhbmd1YWdlc1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChlbW90aWNvbnNbal0gPT0gXCI6KVwiIHx8IGVtb3RpY29uc1tqXSA9PSBcIig6XCIpICYmIC9cXChcXDouKlxcOlxcKS8udGVzdCh0ZXN0VGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChlbW90aWNvbnNbal0gPT0gXCI7KVwiIHx8IGVtb3RpY29uc1tqXSA9PSBcIig7XCIpICYmIC9cXChcXDsuKlxcO1xcKS8udGVzdCh0ZXN0VGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0sIGVtb3RJZHggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHQsIHByZSwgY29kZVxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwiYm9keVwiXSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZXJyb3JfbWVzc2FnZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtaW52YWxpZD10cnVlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX0Vycm9yTWVzc2FnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ3VzdG9tIGVycm9yIG1lc3NhZ2UgaGFzIGludmFsaWQgcmVmZXJlbmNlICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiQ3VzdG9tIGVycm9yIG1lc3NhZ2UgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGN1c3RvbSBlcnJvciBtZXNzYWdlIG11c3QgcmVmZXJlbmNlIGEgdmFsaWQgJ2lkJyB2YWx1ZSBhbmQgd2hlbiB0cmlnZ2VyZWQgdGhlIG1lc3NhZ2UgbXVzdCBiZSBhcHByb3ByaWF0ZWx5IGV4cG9zZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhcmlhX2Vyck1zZ0lkID0gUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG93bmVyRG9jdW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBmb3JtQ2FjaGUgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImxhbmRtYXJrX2dyb3VwX2lucHV0XCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHM6IFtdLFxuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGFsbEdyb3Vwc1RlbXAgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgJ2ZpZWxkc2V0LFtyb2xlPVwiZ3JvdXBcIl0nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGFsbEdyb3VwcyA9IEFycmF5LmZyb20oYWxsR3JvdXBzVGVtcCk7XG4gICAgICAgICAgICBsZXQgZ3JvdXBzV2l0aElucHV0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxHcm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBncm91cCBub2Rlc1xuICAgICAgICAgICAgICAgIGlmIChhbGxHcm91cHNbaV0ucXVlcnlTZWxlY3RvcihcImlucHV0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHMucHVzaChhbGxHcm91cHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzV2l0aElucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZ3JvdXBzV2l0aElucHV0c1tpXSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImxhbmRtYXJrX2dyb3VwX2lucHV0XCIsZm9ybUNhY2hlKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHM6IFwiICtlbGVtZW50LmlkKVxuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBcIiArZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscylcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBcIiArZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5sZW5ndGgpXG5cbiAgICAgICAgbGV0IHJ1bGVDb250ZXh0Rm91bmRJbmdyb3Vwc1dpdGhJbnB1dHNGbGFnID0gZmFsc2U7XG4gICAgICAgIGxldCBjb21wdXRlZE5hbWUgPSBcIlwiO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzKSB7XG4gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSBhbnkgZ3JvdXBzIHdpdGggaW5wdXRzLiBUaGVyZWZvcmUgd2Ugc2hvdWxkIHNraXAgdGhpcyBydWxlIHRyaWdnZXIuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzW2ldKSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgZm91bmQgb3VyIHJ1bGVDb250ZXh0IGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Rm91bmRJbmdyb3Vwc1dpdGhJbnB1dHNGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZhaWxfMVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBmb3VuZFNhbWVOYW1lRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaiA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBqKytcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTYW1lTmFtZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFNhbWVOYW1lRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZhaWxfMlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXB1dGVkTmFtZSA9IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJudWxsIHJldHVyblwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJQYXNzXzFcIilcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xXCIsIFtjb21wdXRlZE5hbWVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGZpZWxkc2V0X2xlZ2VuZF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWVsZHNldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZpZWxkc2V0X0hhc0xlZ2VuZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIDxsZWdlbmQ+XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIjxmaWVsZHNldD4gZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgPGxlZ2VuZD4gaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCIgPGZpZWxkc2V0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhIGxlZ2VuZCBpcyBoaWRkZW4sIHdlIHNob3VsZCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9ucyBmb3IgdGhpc1xuICAgICAgICBsZXQgbGVnZW5kcyA9IFJQVFV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJsZWdlbmRcIiwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICBpZiAobGVnZW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEZpZWxkc2V0IGhhcyBOTyBMZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChsZWdlbmRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIEZpZWxkc2V0IGhhcyBtb3JlIHRoYW4gb25lIGxlZ2VuZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGxlZ2VuZHNbMF0pLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEZpZWxkc2V0IGhhcyBsZWdlbmQgYnV0IGxlZ2VuZCBpcyBlbXB0eVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGZpZ3VyZV9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmlndXJlX2xhYmVsX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZpZ3VyZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19GaWd1cmVfbGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmaWd1cmVfbGFiZWxfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ZmlndXJlPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZpZ3VyZT4gZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZpZ3VyZXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImZpZ2NhcHRpb25cIik7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgZmlnY2FwdGlvbiBlbGVtZW50cyB0byBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRoYXQgaXMgbm90IGVtcHR5IGFuZCBub3QgaGlkZGVuLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgZmlndXJlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAvLyBNYXJrIHRoaXMgcnVsZSBhcyBwYXNzZWQgaWYgYW55IG9uZSBvZiB0aGUgZmlndXJlY2FwdGlvbiBlbGVtZW50IGhhcyBjb250ZW50IGFuZCBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoZmlndXJlc1tpXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGZpZ3VyZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyB3ZSBvbmx5IGNoZWNrIGlmIHRoZSBcImFyaWEtbGFiZWxsZWRieVwiIGlzIHRoZXJlLiBUaGVyZSBpcyBhIGRpZmZlcmVudCBydWxlIHRvIGNoZWNrIGlmIHRoZSBpZCBpcyB2YWxpZC5cbiAgICAgICAgICAgIHBhc3NlZCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpmb3JtW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaW50ZXJhY3Rpbmcgd2l0aCBjb250ZW50IHdpbGwgbm90IG9wZW4gcG9wLXVwIHdpbmRvd3Mgb3IgY2hhbmdlIHRoZSBhY3RpdmUgd2luZG93IHdpdGhvdXQgaW5mb3JtaW5nIHRoZSB1c2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlciBzaG91bGQgYmUgaW5mb3JtZWQgaW4gYWR2YW5jZSB3aGVuIGludGVyYWN0aW5nIHdpdGggY29udGVudCBjYXVzZXMgYSBjaGFuZ2Ugb2YgY29udGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PT0gXCJfcGFyZW50XCIgfHwgdFN0ciA9PT0gXCJfc2VsZlwiIHx8IHRTdHIgPT09IFwiX3RvcFwiIHx8IFJQVFV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsIHRTdHIpICE9IG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBOYW1lIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZnJhbWVzZXQg4oCTIG11c3QgaGF2ZSBwb3RlbnRpYWwgdG8gY3JlYXRlIG5ldyB3aW5kb3c/XG4gICAgICAgICAgICAvLyBTZWUgaWYgYSBuZXcgd2luZG93IGlzIG1lbnRpb25lZFxuICAgICAgICAgICAgbGV0IHRleHRTdHIgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikpXG4gICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBmb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJmb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MYWJlbF9VbmlxdWVGb3JcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBoYXMgbW9yZSB0aGFuIG9uZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvcm0gY29udHJvbHMgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBsZXQgbGFiZWxJZHMgPSBnZXRDYWNoZShGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCksIFwiUlBUX0xhYmVsX1NpbmdsZVwiLCB7fSlcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIShpZCBpbiBsYWJlbElkcyk7XG4gICAgICAgIGxhYmVsSWRzW2lkXSA9IHRydWU7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFudy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9zdWJtaXRfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fc3VibWl0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFtvbmNoYW5nZV0sIGRvbTppbnB1dFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb3JtX0NoYW5nZUVtcHR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNvbmZpcm0gdGhlIGZvcm0gZG9lcyBub3Qgc3VibWl0IGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBmb3JtIHNob3VsZCBub3QgYmUgc3VibWl0dGVkIGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nIHRoZSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm9uY2hhbmdlXCIpLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGZyYW1lX3NyY192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV9zcmNfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9GcmFtZV9TcmNIdG1sXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgPGZyYW1lPiBjb250ZW50IGlzIGFjY2Vzc2libGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmcmFtZT4gY29udGFpbmluZyBub24tSFRNTCBjb250ZW50IG11c3QgYmUgbWFkZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInNyY1wiKSAmJlxuICAgICAgICAgICAgUlBUVXRpbC5pc0h0bWxFeHQoUlBUVXRpbC5nZXRGaWxlRXh0KHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKSkpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmV4cG9ydCBsZXQgZnJhbWVfdGl0bGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRnJhbWVfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIklubGluZSBmcmFtZXMgbXVzdCBoYXZlIGEgdW5pcXVlLCBub24tZW1wdHkgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW5saW5lIGZyYW1lIGRvZXMgbm90IGhhdmUgYSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCAvKkNoYW5nZSBtYXBwaW5nIHRvIDQuMS4yIGZyb20gMi40LjEgdHlwbz8gKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFwiY2FlNzYwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIC8qcmVtb3ZlZCBvbmx5IHRoZSBjaGVjayBmb3Igcm9sZT1ub25lLiBBbHRob3VnaCByb2xlPXByZXNlbnRhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiB0aGVcbiAgICAgICAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFyaWEvI2RvY2NvbmZvcm1hbmNlICB0YWJsZSwgdGhlIGNoZWNrIGhhcyBiZWVuIGtlcHQgZHVlIHRvIHRoZVxuICAgICAgICAgZGVjaXNpb25zIHRha2VuIGluIERBUCBcIkNoZWNrIGlmcmFtZXMgd2l0aCByb2xlPVwicHJlc2VudGF0aW9uXCIgc2hvdWxkIGNvbnNpZGVyIHJvbGU9XCJub25lXCIgYWxzbyAoOTYzOTUpKi9cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikgfHwgIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaGVhZGluZ19jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSGVhZGVyX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkhlYWRpbmcgZWxlbWVudCBoYXMgZGVzY3JpcHRpdmUgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIG5vIGRlc2NyaXB0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIGVsZW1lbnRzIG11c3QgcHJvdmlkZSBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuNlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGhlYWRpbmdfbWFya3VwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJoZWFkaW5nX21hcmt1cF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpoMSwgZG9tOmgyLCBkb206aDMsIGRvbTpoNCwgZG9tOmg1LCBkb206aDZcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImhlYWRpbmdfY29udGVudF9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSGVhZGVyc19GZXdXb3Jkc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgaGVhZGluZyBlbGVtZW50IGlzIGEgZ2VudWluZSBoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IG5vdCBiZSB1c2VkIGZvciBwcmVzZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgaGVhZGluZ0xlbmd0aFRocmVzaDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBoZWFkaW5nTGVuZ3RoVGhyZXNoID0gdmFsaWRhdGVQYXJhbXMuaGVhZGluZ0xlbmd0aFRocmVzaC52YWx1ZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwud29yZENvdW50KFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSkgPD0gaGVhZGluZ0xlbmd0aFRocmVzaDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuXG5leHBvcnQgbGV0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuICAgIFxuZXhwb3J0IGxldCBodG1sX3NraXBuYXZfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImh0bWxfc2tpcG5hdl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSHRtbF9Ta2lwTmF2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBodG1sX3NraXBuYXZfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlcmUgaXMgYSB3YXkgdG8gYnlwYXNzIGJsb2NrcyBvZiBjb250ZW50IHRoYXQgYXJlIHJlcGVhdGVkIG9uIG11bHRpcGxlIFdlYiBwYWdlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZyYW1lcyA9IFJQVFV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJmcmFtZVwiKTtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiaDFcIik7XG5cbiAgICAgICAgaWYgKChmcmFtZXMgIT0gbnVsbCAmJiBmcmFtZXMubGVuZ3RoID4gMCkgfHwgKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAvLyBJZiBmcmFtZXMgb3IgaGVhZGluZ3MgYXJlIHVzZWQsIHBhc3NcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBza2lwIGFuY2hvcnNcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgIXBhc3NlZCAmJiBpZHggPCBhbmNob3JzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSBhbmNob3JzW2lkeF0uaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBocmVmICE9PSB0eXBlb2YgXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuYmFzZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBocmVmLmJhc2VWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0bXBMb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVApICE9IFwidW5kZWZpbmVkXCIgJiYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVAgIT0gbnVsbCkgeyAvLyBEQVAgc2V0cyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wTG9jYXRpb24gPSAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCBhcyBhbnkpLmxvY2F0aW9uRnJvbURBUDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyIHNjYW4gaGFzIHRoZSBsb2NhdGlvbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jSHJlZiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jSHJlZiA9IHRtcExvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRml4IHdlaXJkIGJ1Z3Mgd2l0aCBob3cgdmFyaW91cyBwYXJzZXJzIHJlcG9ydCBvbiBmaWxlOiB1cmwnczpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBocmVmID0gXCJmaWxlOi9cIiArIGhyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jSHJlZi5zdGFydHNXaXRoKFwiZmlsZTovLy9cIikpIGRvY0hyZWYgPSBcImZpbGU6L1wiICsgZG9jSHJlZi5zdWJzdHJpbmcoXCJmaWxlOi8vL1wiLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuY2hhckF0KDApID09IFwiI1wiIHx8IGhyZWYuc3RhcnRzV2l0aChkb2NIcmVmICsgXCIjXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gUlBUVXRpbC5nZXRGaWxlQW5jaG9yKGhyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCB0YXJnZXQpICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RhcmdldF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNob3JzW2lkeF0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgZm9yd2FyZCBqdW1waW5nIHRhcmdldHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBhbmNob3JzW2lkeF0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZihcIiNcIikgIT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gUlBUVXRpbC5nZXRGaWxlQW5jaG9yKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBuYW1lIGluIHRhcmdldHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppZnJhbWVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBzaG91bGQgbm90IGJlIGV4Y2x1ZGVkIGZyb20gdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgaWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBub3QgZXhjbHVkZWQgZnJvbSB0aGUgdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSA8aWZyYW1lPiB3aXRoIGludGVyYWN0aXZlIGNvbnRlbnQgaXMgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiYWtuN2JuXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGlmcmFtZSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAzMCB8fCBNYXRoLm1pbihib3VuZHNbJ2hlaWdodCddLCBib3VuZHNbJ3dpZHRoJ10pIDwgMTUpICBcbiAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuXG4gICAgICAgIC8vIHBhc3MgaWZyYW1lIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgbmVnYXRpdmUgbnVtYmVyXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmcmFtZSBjb250ZW50XG4gICAgICAgIGNvbnN0IGlmcmFtRWxlbSA9IHJ1bGVDb250ZXh0IGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICBpZiAoIWlmcmFtRWxlbSB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudCB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0V4cGxpY2l0TGFiZWxJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiUGFzc18yXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJGYWlsXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgYSBBUklBIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBzaG91bGQgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNTk3OTZmXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvZmFpbHVyZXMvRjY1XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgIT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltYWdlbWFwX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1t1c2VtYXBdLCBkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbWdfVXNlbWFwQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBtYXAgb3IgY2hpbGQgPGFyZWE+IGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW1hZ2UgbWFwIGFuZCBlYWNoIDxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgdGV4dCBhbHRlcm5hdGl2ZShzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaXNtYXBcIikgJiYgIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidXNlbWFwXCIpKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltZ19hbHRfYmFja2dyb3VuZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2JhY2tncm91bmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0JhY2tncm91bmRJbWdfSGFzVGV4dE9yVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGltcG9ydGFudCBiYWNrZ3JvdW5kIGltYWdlIGluZm9ybWF0aW9uIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgaW4gc3lzdGVtIGhpZ2ggY29udHJhc3QgbW9kZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJhY2tncm91bmQgaW1hZ2VzIHRoYXQgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvbiBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgc3R5bGUgPSBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhY2tncm91bmRJbWdzID0gc3R5bGUuYmFja2dyb3VuZEltYWdlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoYmFja2dyb3VuZEltZ3MgIT0gbnVsbCAmJiBiYWNrZ3JvdW5kSW1ncyAhPSBcIlwiICYmIGJhY2tncm91bmRJbWdzICE9ICdub25lJyAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pbm5lckhUTUwgIT0gbnVsbCAmJiBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggIT0gMClcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1ByZXNlbnRhdGlvbkltZ0hhc05vbk51bGxBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBoYXMgbm9uLW51bGwgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIG11c3QgaGF2ZSAnYWx0PVxcXCJcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWcsIGRvbTphcmVhLCBkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfQWx0Q29tbW9uTWlzdXNlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIG5hbWUgc2VydmVzIGFzIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBiYWRUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInNob3J0IGRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vIEFsdCB0ZXh0IGNoZWNrIGFyZSBlbHNld2hlcmUgKFNlZSA0MSwgMjQwLCA0NTUpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFkVGV4dCA9IHZhbGlkYXRlUGFyYW1zLmJhZFRleHQudmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmFkVGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBhbHRUZXh0LmluZGV4T2YoYmFkVGV4dFtpXSkgPT0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNyYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgobm9kZU5hbWUgPT0gXCJhcmVhXCIpID8gXCJocmVmXCIgOiBcInNyY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgaXQgdG8gcGFzcyBpZiB0aGVyZSdzIG5vIHNyYyAtIGNhbid0IGRldGVybWluZSB0aGVzZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHRoZSBhbHQgbWF0Y2hlcyB0aGUgc3JjIGV4YWN0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gZmFpbCBpZiB0aGUgYWx0IGhhcyBhIC4gaW4gaXQgYW5kIGVpdGhlciB0aGUgc3JjIGlzIGluIHRoZSBhbHQgb3IgdGhlIGFsdCBpcyBpbiB0aGUgc3JjXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBzcmMudHJpbSgpICE9IGFsdFRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWx0VGV4dC5pbmRleE9mKFwiLlwiKSA9PSAtMSB8fCAoYWx0VGV4dC5pbmRleE9mKHNyYykgPT0gLTEgJiYgc3JjLmluZGV4T2YoYWx0VGV4dCkgPT0gLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbWdfYWx0X251bGw6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9udWxsXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfVGl0bGVFbXB0eVdoZW5BbHROdWxsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICd0aXRsZScgYXR0cmlidXRlIGlzIG5vdCBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gdGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgdGhlICd0aXRsZScgYXR0cmlidXRlIG11c3QgYWxzbyBiZSBlbXB0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIGEgdGl0bGUsIGJ1dCBhbHQgaXMgZW1wdHlcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19MaW5rVGV4dE5vdFJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGluayB0ZXh0IGlzIHJlcGVhdGVkIGluIGFuIGltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxpbmsgdGV4dCBvZiBwcmV2aW91cyBsaW5rIGlzIHJlcGVhdGVkIGluIGltYWdlICdhbHQnIHZhbHVlIG9mIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJJbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gYSBsaW5rIGlzIHJlcGVhdGVkIGluIGxpbmsgdGV4dCBvZiB0aGUgbGluayBhZnRlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbiBpbWFnZSB3aXRoaW4gYSBsaW5rIHNob3VsZCBub3QgcmVwZWF0IHRoZSBsaW5rIHRleHQgb3IgYWRqYWNlbnQgbGluayB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYU5vZGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgIC8vSWYgbm90IGluIGFuIGFuY2hvciwgT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmIChhTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIGFsdCB0ZXh0IGlzIGVtcHR5LCB0aGVyZSdzIG5vIHRleHQgdG8gYmUgcmVkdW5kYW50IC0gbGV0IGFfdGV4dF9wdXJwb3NlXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIC8vIFNvIE91dCBvZiBTY29wZSBmb3IgdGhpcyBydWxlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJUZXh0ID0gYU5vZGUuaW5uZXJUZXh0O1xuICAgICAgICBsZXQgbGlua1RleHQgPSBcIlwiO1xuXG4gICAgICAgIGlmIChpbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGlua1RleHQgPSBpbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0ID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBpbiBsaW5rXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvL2FsdCBpcyBub24temVybywgYnV0IG5vIGxpbmsgdGV4dCAtIGVuc3VyZSBhZGphY2VudCBsaW5rIHRleHQgaXNuJ3QgcmVkdW5kYW50XG4gICAgICAgICAgICBsZXQgd2FsayA9IG5ldyBOb2RlV2Fsa2VyKGFOb2RlKTtcbiAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsay5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBub2RlIGFuZCBub2RlTmFtZVxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gd2Fsay5ub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJhXCIgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IGJlZm9yZSBpbWFnZSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGsgPSBuZXcgTm9kZVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbWdfYWx0X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJmYWlsX2JsYW5rX2FsdFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcImZhaWxfbm9fYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJmYWlsX2JsYW5rX3RpdGxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkltYWdlcyBoYXMgcmVxdWlyZWQgJ2FsdCcgYXR0cmlidXRlLCBBUklBIGxhYmVsIG9yIHRpdGxlIGlmIHRoZXkgY29udmV5IG1lYW5pbmcsIG9yICdhbHQ9XFxcIlxcXCIgaWYgZGVjb3JhdGl2ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFsdCBhdHR0cmlidXRlIG5vciBhbiBBUklBIGxhYmVsIG9yIHRpdGxlXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiBhbHQgYXR0cmlidXRlIG9yIEFSSUEgbGFiZWwgYW5kICd0aXRsZScgYXR0cmlidXRlIHZhbHVlIGNvbnNpc3RzIG9ubHkgb2YgYmxhbmsgc3BhY2UocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZXMgcmVxdWlyZSBhbiAnYWx0JyBhdHRyaWJ1dGUgd2l0aCBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmUgaWYgdGhleSBjb252ZXkgbWVhbmluZywgb3IgJ2FsdD1cXFwiXFxcIiBpZiBkZWNvcmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjIzYTJhOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIG5vdCB2aXNpYmxlIHRvIHRoZSBzY3JlZW4gcmVhZGVyLCBpZ25vcmVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy9wYXNzIGlmIGltYWdlcyB3aXRoIGEgdmFsaWQgJ2FsdCcgICAgXG4gICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgIGlmIChhbHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICBcbiAgICAgICAgICAgIGVsc2UgeyBcbiAgICAgICAgICAgICAgICAvLyBhbHQudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHQgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAoYWx0PVwiIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFsdC5sZW5ndGggPT09IDAsIHByZXNlbnRhdGlvbmFsIGltYWdlLCB0aXRsZSBpcyBvcHRpb25hbCwgaGFuZGxlZCBieSBvdGhlciBydWxlKHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAgUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGFsdFxuICAgICAgICAgICAgbGV0IGxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBibGFuayBzcGFjZSBvbmx5ICh0aXRsZT1cIiBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmVpdGhlciBhbHQgbm9yIGFyaWEgbGFiZWwgb3IgdGl0bGUgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWx0XCIpOyBcbiAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltZ19pc21hcF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2lzbWFwX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tpc21hcF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfVXNlbWFwVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBkbyBub3QgaGF2ZSBkdXBsaWNhdGUgdGV4dCBsaW5rc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNlcnZlci1zaWRlIGltYWdlIG1hcCBob3Qtc3BvdHMgbXVzdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInVzZW1hcFwiKSkge1xuICAgICAgICAgICAgbGV0IHVzZW1hcCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInVzZW1hcFwiKTtcbiAgICAgICAgICAgIHVzZW1hcCA9IHVzZW1hcC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGxldCBpZHggPSB1c2VtYXAuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICBpZiAoaWR4ICE9IC0xKVxuICAgICAgICAgICAgICAgIHVzZW1hcCA9IHVzZW1hcC5zdWJzdHIoaWR4ICsgMSk7XG5cbiAgICAgICAgICAgIGlmICh1c2VtYXAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXBzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcIm1hcFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgbWFwcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBtYXBzW2ldLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHNbaV0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKS50b0xvd2VyQ2FzZSgpID09IHVzZW1hcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2xvbmdkZXNjX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2xvbmdkZXNjXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Mb25nRGVzY3JpcHRpb24yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgdGhlICdsb25nZGVzYycgYXR0cmlidXRlIGNvbnRhaW5zIHZhbGlkIEhUTUwgY29udGVudCAoZmlsZSBleHRlbnNpb24gbm90IHJlY29nbml6ZWQpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIFRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBIVE1MIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGxvbmdkZXNjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibG9uZ2Rlc2NcIik7XG4gICAgICAgIC8vIGlmIChsb25nZGVzYyBpcyBiYWQgVVJMKSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGxvbmdkZXNjKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGV4dC5sZW5ndGggIT0gMCAmJiBSUFRVdGlsLmlzSHRtbEV4dChleHQpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiI1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImh0dHA6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImRhdGE6XCIpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBcIm5wbSBydW4gcHJlYnVpbGRcIi4gRG8gbm90IGVkaXRcblxuZXhwb3J0ICogZnJvbSBcIi4vYV90YXJnZXRfd2FybmluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hX3RleHRfcHVycG9zZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsZXRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJlYV9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NoaWxkX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29udGVudF9pbl9sYW5kbWFya1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZ3JhcGhpY19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2lkX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2ltZ19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcGFyZW50X3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfYWxsb3dlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlbWFudGljc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfd2lkZ2V0X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpYXJ0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfY3NzX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9ibGlua19lbGVtX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jYW52YXNfY29udGVudF9kZXNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FwdGlvbl90cmFja19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2Rlc2lnbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RlYnVnX3BhdGhzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RldGVjdG9yX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpcl9hdHRyaWJ1dGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VtYmVkX25vZW1iZWRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vtb3RpY29uc19hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yX21lc3NhZ2VfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWd1cmVfbGFiZWxfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fZm9udF9jb2xvclwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ludGVyYWN0aW9uX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fc3VibWl0X3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mcmFtZV9zcmNfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfdGl0bGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfY29udGVudF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaGVhZGluZ19tYXJrdXBfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfbGFuZ19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaHRtbF9za2lwbmF2X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZW1hcF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfYmFja2dyb3VuZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2RlY29yYXRpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9udWxsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2lzbWFwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfbG9uZ2Rlc2NfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfZmllbGRzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYWZ0ZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYmVmb3JlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X29uY2hhbmdlX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX25hbWVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9jaGlsZHJlbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9saXN0X21hcmt1cF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL21hcnF1ZWVfZWxlbV9hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hbHRfYnJpZWZcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9saXZlX2NhcHRpb25lZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV90cmFja19hdmFpbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhX3JlZnJlc2hfZGVsYXlcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV92aWV3cG9ydF96b29tYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdF90ZXh0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X3NlbGVjdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NraXBfbWFpbl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfY29sb3JfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2ZvY3VzX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfYXJpYV9kZXNjZW5kYW50c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9jYXB0aW9uX2VtcHR5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fbmVzdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfcmVsYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zY29wZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfYmxvY2tfaGVhZGluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9xdW90ZWRfY29ycmVjdGx5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc2Vuc29yeV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9zcGFjaW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfd2hpdGVzcGFjZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpZGdldF90YWJiYWJsZV9zaW5nbGVcIiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbYXV0b2NvbXBsZXRlXSwgZG9tOnRleHRhcmVhW2F1dG9jb21wbGV0ZV0sIGRvbTpzZWxlY3RbYXV0b2NvbXBsZXRlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0lucHV0X0F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbiBpbnB1dCBmb3JtIGZpZWxkIG9mIGFueSB0eXBlXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgICAgICBcInRva2Vuc09uT2ZmXCI6IFtcIm9uXCIsIFwib2ZmXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbk9wdGlvbmFsU2VjdGlvblwiOiBcInNlY3Rpb24tXCIsXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsUHVycG9zZVwiOiBbXCJzaGlwcGluZ1wiLCBcImJpbGxpbmdcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZFwiOiBbXCJuZXctcGFzc3dvcmRcIiwgXCJjdXJyZW50LXBhc3N3b3JkXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfbXVsdGlsaW5lXCI6IFtcInN0cmVldC1hZGRyZXNzXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGhcIjogW1wiY2MtZXhwXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfbnVtZXJpY1wiOiBbXCJjYy1leHAtbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cC15ZWFyXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1hbW91bnRcIixcbiAgICAgICAgICAgICAgICBcImJkYXktZGF5XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LXllYXJcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlXCI6IFtcImJkYXlcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV91cmxcIjogW1widXJsXCIsIFwicGhvdG9cIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV90ZXh0XCI6IFtcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uLXRpdGxlXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWNzY1wiLFxuICAgICAgICAgICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgICAgICAgICBcImxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgXCJzZXhcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGxcIjogW1wibmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwiZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJuZXctcGFzc3dvcmRcIixcbiAgICAgICAgICAgICAgICBcImN1cnJlbnQtcGFzc3dvcmRcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJzdHJlZXQtYWRkcmVzc1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnlcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcImNjLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAtbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cC15ZWFyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1hbW91bnRcIixcbiAgICAgICAgICAgICAgICBcImxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS15ZWFyXCIsXG4gICAgICAgICAgICAgICAgXCJzZXhcIixcbiAgICAgICAgICAgICAgICBcInVybFwiLFxuICAgICAgICAgICAgICAgIFwicGhvdG9cIl0sXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsR3JvdXAyXCI6IFtcImhvbWVcIixcbiAgICAgICAgICAgICAgICBcIndvcmtcIixcbiAgICAgICAgICAgICAgICBcIm1vYmlsZVwiLFxuICAgICAgICAgICAgICAgIFwiZmF4XCIsXG4gICAgICAgICAgICAgICAgXCJwYWdlclwiXSxcblxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdGVsXCI6IFtcInRlbFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX2VtYWlsXCI6IFtcImVtYWlsXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdXJsXCI6IFtcImltcHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZXh0XCI6IFtcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsXCI6IFtcInRlbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWNvdW50cnktY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1leHRlbnNpb25cIixcbiAgICAgICAgICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgICAgICAgICAgXCJpbXBwXCJdXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbGlkX3ZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpXG4gICAgICAgICAgICB2YWxpZF92YWx1ZXM9dmFsaWRfdmFsdWVzLmNvbmNhdChjYWNoZVtrZXldKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBmb3VuZE1hbmRhdG9yeVRva2VuID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuXG4gICAgICAgIGxldCBhdXRvY29tcGxldGVBdHRyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCB0b2tlbnMgPSBhdXRvY29tcGxldGVBdHRyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwIHx8IGF1dG9jb21wbGV0ZUF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCF0b2tlbnMuZXZlcnkociA9PiB2YWxpZF92YWx1ZXMuaW5jbHVkZXMocikgfHwgci5zdGFydHNXaXRoKGNhY2hlWyd0b2tlbk9wdGlvbmFsU2VjdGlvbiddKSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2F0dHJpYnV0ZV9pbmNvcnJlY3RcIik7XG4gICAgICAgIFxuICAgICAgICBsZXQgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gW107XG4gICAgICAgIGxldCB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBbXTtcblxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiB8fCBub2RlTmFtZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgICAgICAgLy8gYWNjZXB0IGFsbCB0b2tlbnNcbiAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGw7XG4gICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgdmFyaW91cyAnaW5wdXQnIHR5cGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV90ZXh0LmNvbmNhdChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRlbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdGVsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGhpcyBydWxlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgbGV0IGF1dG9maWxsTWFudGxlID0gLyogKG5vZGVOYW1lPT09XCJpbnB1dFwiICYmIHR5cGU9PT1cImhpZGRlblwiKSA/IFwiYW5jaG9yXCIgOiAqLyBcImV4cGVjdGF0aW9uXCI7XG5cbiAgICAgICAgaWYgKGF1dG9maWxsTWFudGxlID09PSBcImV4cGVjdGF0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG9ufG9mZiBmb3IgZXhwZWN0YXRpb24gbWFudGxlLlxuICAgICAgICAgICAgaWYgKHRva2Vucy5pbmNsdWRlcyhcIm9uXCIpIHx8IHRva2Vucy5pbmNsdWRlcyhcIm9mZlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ufG9mZiBzaG91bGQgYmUgdGhlIG9ubHkgdG9rZW5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGRldGFpbCBhdXRvZmlsbCB0b2tlbnNcbiAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgIGxldCBjdXJyUmVjb2duaXplZEluZGV4ID0gMDtcblxuICAgICAgICAvLyBjaGVjayBvcHRpb25hbCAnc2VjdGlvbi0qJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vuc1tjdXJySW5kZXhdLnN0YXJ0c1dpdGgoY2FjaGUudG9rZW5PcHRpb25hbFNlY3Rpb24pICYmXG4gICAgICAgICAgICB0b2tlbnNbY3VyckluZGV4XS5sZW5ndGggPiA4KSB7XG4gICAgICAgICAgICBjdXJySW5kZXgrKzsgLy8gY29uc3VtZSB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NoaXBwaW5nfGJpbGxpbmcnIHRva2Vuc1xuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IGN1cnJJbmRleCAmJlxuICAgICAgICAgICAgY2FjaGUudG9rZW5zT3B0aW9uYWxQdXJwb3NlLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgIHRva2VuXG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAxXG4gICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAxLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnNNYW5kYXRvcnlHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsIHRva2VucyBmb3IgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNPcHRpb25hbEdyb3VwMi5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgcGFzcyBpZiB3ZSBoYXZlIHNlZW4gZWl0aGVyIG9mIHRoZSBtYW5kYXRvcnkgZ3JvdXBzIGFuZCBhbGwgdG9rZW5zIGhhdmUgYmVlbiBjb25zdW1lZFxuICAgICAgICBpZiAoZm91bmRNYW5kYXRvcnlUb2tlbiAmJiB0b2tlbnMubGVuZ3RoID09PSBjdXJySW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3VuZFJlY29nbml6ZWRUb2tlbiAmJiB0b2tlbnMubGVuZ3RoID09PSBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X1JhZGlvQ2hrSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfTG9uZU5vZ3JvdXBcIjogXCJQYXNzX0xvbmVOb2dyb3VwXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcIlBhc3NfR3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwiUGFzc19SYWRpb05vTmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcIkZhaWxfTm90U2FtZUdyb3VwXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJQb3RlbnRpYWxfTG9uZUNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xvbmVOb2dyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19Hcm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19SYWRpb05vTmFtZVwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfQ29udHJvbE5hbWVNaXNtYXRjaFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyR3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90U2FtZUdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlJlbGF0ZWQgc2V0cyBvZiByYWRpbyBidXR0b25zIG9yIGNoZWNrYm94ZXMgc2hvdWxkIGJlIHByb2dyYW1tYXRpY2FsbHkgZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xvbmVOb2dyb3VwXCI6IFwiezB9IGdyb3VwaW5nIG5vdCByZXF1aXJlZCBmb3IgYSBjb250cm9sIG9mIHRoaXMgdHlwZVwiLFxuICAgICAgICAgICAgXCJQYXNzX0dyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgZ3JvdXBlZCB3aXRoIG90aGVyIHJlbGF0ZWQgY29udHJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lXCIsXG4gICAgICAgICAgICBcIlBhc3NfUmFkaW9Ob05hbWVcIjogXCJSYWRpbyBpbnB1dCBpcyBub3QgZ3JvdXBlZCwgYnV0IHBhc3NlcyBiZWNhdXNlIGl0IGhhcyBubyBuYW1lIHRvIGdyb3VwIHdpdGggb3RoZXIgcmFkaW8gaW5wdXRzXCIsXG4gICAgICAgICAgICBcIkZhaWxfQ29udHJvbE5hbWVNaXNtYXRjaFwiOiBcInswfSBpbnB1dCBmb3VuZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lLCBcXFwiezJ9XFxcIiBhcyBhIHsxfSBpbnB1dFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgbm90IGluIHRoZSBncm91cCB3aXRoIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJOb3RHcm91cGVkXCI6IFwiezB9IGlucHV0IGFuZCBvdGhlcnMgd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIiBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RTYW1lR3JvdXBcIjogXCJ7MH0gaW5wdXQgaXMgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgdGhhbiBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuLW5hbWVkLCB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKGNvbnRleHRbXCJhcmlhXCJdLnJvbGUgPT09ICdub25lJyB8fCBjb250ZXh0W1wiYXJpYVwiXS5yb2xlID09PSAncHJlc2VudGF0aW9uJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZ2V0R3JvdXAgPSAoZTogRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IoZSwgXCJmaWVsZHNldFwiKVxuICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInJhZGlvZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcImdyaWRcIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5nZXRBbmNlc3RvcihlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgJiYgIVJQVFV0aWwuaXNEYXRhVGFibGUocmV0VmFsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMgYXJlIGluIHNjb3BlXG4gICAgICAgIGxldCBjdHhUeXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuICAgICAgICBpZiAoY3R4VHlwZSAhPT0gXCJjaGVja2JveFwiICYmIGN0eFR5cGUgIT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZm9ybSB3ZSdyZSBpbiAoaWYgYW55KSB0byBkZXRlcm1pbmUgb3VyIHNjb3BlXG4gICAgICAgIGxldCBjdHhGb3JtID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImZvcm1cIilcbiAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiaHRtbFwiKVxuICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gR2V0IGRhdGEgYWJvdXQgYWxsIG9mIHRoZSB2aXNpYmxlIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyBpbiB0aGUgc2NvcGUgb2YgdGhpcyBmb3JtXG4gICAgICAgIC8vIGFuZCBjYWNoZSBpdCBmb3IgYWxsIG9mIHRoZSBvdGhlciBpbnB1dHMgaW4gdGhpcyBzY29wZVxuICAgICAgICBsZXQgZm9ybUNhY2hlID0gZ2V0Q2FjaGUoY3R4Rm9ybSwgXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgY2hlY2tib3hCeU5hbWU6IHt9LFxuICAgICAgICAgICAgICAgIHJhZGlvc0J5TmFtZToge30sXG4gICAgICAgICAgICAgICAgbmFtZVRvR3JvdXA6IHtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbnVtQ2hlY2tib3hlczogMCxcbiAgICAgICAgICAgICAgICBudW1SYWRpb3M6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIGNoZWNrYm94ZXMgaW4gdGhlIGZvcm0gb3IgYm9keSAoYnV0IG5vdCBuZXN0ZWQgaW4gc29tZXRoaW5nIGVsc2UgYW5kIG5vdCBoaWRkZW4pXG4gICAgICAgICAgICAvLyBBbmQgZ2V0IGEgbWFwcGluZyBvZiB0aGVzZSBjaGVja2JveGVzIHRvXG4gICAgICAgICAgICBsZXQgY1dhbGtlciA9IG5ldyBET01XYWxrZXIoY3R4Rm9ybSwgZmFsc2UsIGN0eEZvcm0pO1xuICAgICAgICAgICAgbGV0IGNoZWNrYm94USA9IFtdO1xuICAgICAgICAgICAgbGV0IHJhZGlvc1EgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlIChjV2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNXYWxrZXIuYkVuZFRhZ1xuICAgICAgICAgICAgICAgICAgICAmJiBjV2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgY1dhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoY1dhbGtlci5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IChjV2Fsa2VyLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hRLnB1c2goY1dhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvc1EucHVzaChjV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbGV0IGNoZWNrYm94USA9IGN0eEZvcm0ucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9Y2hlY2tib3hdXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2hlY2tib3hRLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGNoZWNrYm94UVtpZHhdO1xuICAgICAgICAgICAgICAgIGlmICgoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGNiLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gY3R4Rm9ybVxuICAgICAgICAgICAgICAgICAgICAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdIHx8IFtdKS5wdXNoKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSByYWRpb3MgaW4gdGhlIGZvcm0gb3IgYm9keSAoYnV0IG5vdCBuZXN0ZWQgaW4gc29tZXRoaW5nIGVsc2UgYW5kIG5vdCBoaWRkZW4pXG4gICAgICAgICAgICAvLyBsZXQgcmFkaW9zUSA9IGN0eEZvcm0ucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcmFkaW9zUS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJhZGlvc1FbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRDdHggPSAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHIsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChyYWRDdHggPT09IGN0eEZvcm1cbiAgICAgICAgICAgICAgICAgICAgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gci5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUucmFkaW9zQnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSB8fCBbXSkucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKHIpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1SYWRpb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUoY3R4Rm9ybSwgXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIiwgZm9ybUNhY2hlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8gQ2FsY3VsYXRlZCBldmVyeXRoaW5nLCBub3cgY2hlY2sgdGhlIHZhcmlvdXMgY2FzZXNcblxuICAgICAgICBjb25zdCBjdHhOYW1lID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgY29uc3QgY3R4R3JvdXAgPSBnZXRHcm91cChydWxlQ29udGV4dCk7XG4gICAgICAgIGN0eFR5cGUgPSBjdHhUeXBlID09PSBcInJhZGlvXCIgPyBcIlJhZGlvXCIgOiBcIkNoZWNrYm94XCI7XG5cbiAgICAgICAgaWYgKCFjdHhOYW1lIHx8IGN0eE5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IHByb2Nlc3MgY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgaXMgbm90IG5hbWVkXG4gICAgICAgICAgICBpZiAoY3R4VHlwZSA9PT0gXCJSYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gUmFkaW9zIHdpdGhvdXQgbmFtZXMgZG9uJ3QgYWN0IGxpa2UgZ3JvdXBzLCBzbyBkb24ndCBlbmZvcmNlIGdyb3VwaW5nXG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfUmFkaW9Ob05hbWVcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgYW4gdW5uYW1lZCBjaGVja2JveFxuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtcIlwiXSB8fCBbXSkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0xvbmVOb2dyb3VwXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb25zaWRlcmluZyBhIG5hbWVkIGNoZWNrYm94XG4gICAgICAgICAgICBjb25zdCBudW1SYWRpb3NXaXRoTmFtZSA9IChmb3JtQ2FjaGUucmFkaW9zQnlOYW1lW2N0eE5hbWVdIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBudW1DaGVja2JveGVzV2l0aE5hbWUgPSAoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW2N0eE5hbWVdIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAvLyBDYXBpdGFsaXplIHRoZSBpbnB1dCB0eXBlIGZvciBtZXNzYWdlc1xuICAgICAgICAgICAgaWYgKG51bVJhZGlvc1dpdGhOYW1lID4gMCAmJiBudW1DaGVja2JveGVzV2l0aE5hbWUgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG5hbWluZyBtaXNtYXRjaCBiZXR3ZWVuIGRpZmZlcmVudCBjb250cm9sc1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfQ29udHJvbE5hbWVNaXNtYXRjaFwiLCBbY3R4VHlwZSwgY3R4VHlwZSA9PT0gXCJjaGVja2JveFwiID8gXCJyYWRpb1wiIDogXCJjaGVja2JveFwiLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eFR5cGUgPT09IFwiUmFkaW9cIiAmJiAoZm9ybUNhY2hlLm51bVJhZGlvcyA9PT0gMSB8fCBudW1SYWRpb3NXaXRoTmFtZSA9PT0gMSlcbiAgICAgICAgICAgICAgICB8fCBjdHhUeXBlID09PSBcIkNoZWNrYm94XCIgJiYgZm9ybUNhY2hlLm51bUNoZWNrYm94ZXMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbG9uZSBjb250cm9sIChlaXRoZXIgb25seSBjb250cm9sIG9mIHRoaXMgdHlwZSBvbiB0aGUgcGFnZSwgb3IgYSByYWRpbyBidXR0b24gd2l0aG91dCBhbnkgb3RoZXJzIGJ5IHRoYXQgbmFtZSlcbiAgICAgICAgICAgICAgICAvLyBXZSBwYXNzIHRoaXMgY29udHJvbCBpbiBhbGwgY2FzZXNcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Mb25lTm9ncm91cFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfR3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4VHlwZSA9PT0gXCJDaGVja2JveFwiICYmIGZvcm1DYWNoZS5udW1DaGVja2JveGVzID4gMSAmJiBudW1DaGVja2JveGVzV2l0aE5hbWUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG9ubHkgb25lIGNoZWNrYm94IHdpdGggdGhpcyBuYW1lLCBidXQgdGhlcmUgYXJlIG90aGVyIGNoZWNrYm94ZXMgaW4gdGhlIGZvcm0uXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGdyb3VwZWQsIGFzayB0aGVtIHRvIGV4YW1pbmUgaXRcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfTG9uZUNoZWNrYm94XCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBzaGFyZSBhIG5hbWUgd2l0aCBhbm90aGVyIHNpbWlsYXIgY29udHJvbC4gQXJlIHdlIGdyb3VwZWQgdG9nZXRoZXI/XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtQ2FjaGUubmFtZVRvR3JvdXBbY3R4TmFtZV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBncm91cGVkLCBidXQgc29tZSBjb250cm9sIHdpdGggdGhlIHNhbWUgbmFtZSBpcyBpbiBhIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbmUgb2YgdXMgYXJlIGdyb3VwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiLCBbY3R4VHlwZSwgY3R4TmFtZV0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtjdHhOYW1lXSAhPT0gY3R4R3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGluIHRoZSBtYWluIGdyb3VwIHdpdGggdGhlIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX05vdFNhbWVHcm91cFwiLCBbY3R4VHlwZSwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGFsbCBncm91cGVkIHVwIVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2ZpZWxkc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2ZpZWxkc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXQsIGRvbTp0ZXh0YXJlYSwgZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVXNlIHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gZ3JvdXAgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSA8ZmllbGRzZXQ+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBmb3Igb3RoZXIgaW5wdXQgdHlwZXMgb3IgaWYgd2UncmUgaW4gYSBmaWVsZHNldFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwiZmlsZVwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmaWVsZHNldFwiKSAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIC8vIE5vIGZpZWxkc2V0IC0gc2VlIGlmIHRoaXMgaW5wdXQgaXMgYWxsIGJ5IGl0c2VsZiAtIG5vIG5lZWQgdG8gZ3JvdXAgc2luZ2xlIGlucHV0c1xuICAgICAgICBsZXQgcGFyZW50ID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiZm9ybVwiLCBcImJvZHlcIl0pO1xuICAgICAgICBsZXQgY2hlY2tUeXBlcyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIl07XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoZWNrVHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjb250cm9scyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGVja1R5cGVzW2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGNvbnRyb2xzLmxlbmd0aDsgKytqKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNvbnRyb2xzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGV4dGFyZWFzIGFuZCBzZWxlY3RzIHdpbGwgYmUgY2FsbGVkIHR5cGU9J3RleHQnXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBjb250cm9sc1tqXS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gY29udHJvbHNbal0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpIDogXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgICAgLy8gT25seSBmYWlsIGlmIHRoaXMgaXMgYW5vdGhlciBjb250cm9sIGluIHRoZSBmb3JtIGFuZCBpdHMgdHlwZSBpcyBhbm90aGVyIHRleHQtbGlrZSBpbnB1dFxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRyb2xzW2pdID09IHJ1bGVDb250ZXh0IHx8ICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiICYmIHR5cGUgIT0gXCJmaWxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgaW5wdXRfaGFzcG9wdXBfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtsaXN0XVthcmlhLWhhc3BvcHVwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiaW5wdXRfaGFzcG9wdXBfaW52YWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJQb3RlbnRpYWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggJ2xpc3QnIGF0dHJpYnV0ZSBkb2VzIG5vdCB1c2UgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgYWxzbyB1c2VzICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgd2l0aCB0eXBlPVxcXCJ7MH1cXFwiXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggJ2xpc3QnIGF0dHJpYnV0ZSBhbHNvIHVzZXMgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZSB3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBpbnB1dCB0eXBlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggJ2xpc3QnIGF0dHJpYnV0ZSBzaG91bGQgbm90IGFsc28gdXNlICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy90cmlnZ2VyaW5nIGlucHV0IHR5cGVzOiB0ZXh0LCBzZWFyY2gsIHRlbCwgdXJsLCBlbWFpbCwgb3IgbWlzc2luZyBvciBpbnZhbGlkIFxuICAgICAgICBsZXQgeWVzVHlwZXMgPSBbXCJ0ZXh0XCIsIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIl07XG4gICAgICAgIGxldCBub1R5cGVzID0gW1wiZmlsZVwiLCBcInBhc3N3b3JkXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCIsXG4gICAgICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLCBcInRpbWVcIiwgXCJjb2xvclwiLCBcImltYWdlXCIsXG4gICAgICAgICAgICBcIm1vbnRoXCIsIFwid2Vla1wiLCBcImRhdGV0aW1lLWxvY2FsXCIsIFwiaGlkZGVuXCIsIFwiYnV0dG9uXCJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgYXR0clZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgLy9taXNzaW5nIGlucHV0IHR5cGVcbiAgICAgICAgaWYgKCFhdHRyVmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuXG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZ25vcmUgZm9yIG5vIHRyaWdnZXJpbmcgaW5wdXQgdHlwZXMgXG4gICAgICAgIGlmIChub1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gZmFpbHVyZV8xIGlmIGFueSB0cmlnZ2VyaW5nIGlucHV0IHR5cGVzICAgIFxuICAgICAgICBpZiAoeWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIiwgW2F0dHJWYWx1ZV0pO1xuXG4gICAgICAgIC8vaW52YWxpZCBpbnB1dCB0eXBlXG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2xhYmVsX2FmdGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2FmdGVyXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDaGVja2JveCBvciByYWRpbyBidXR0b24gaXMgbmVzdGVkIGluIGxhYmVsLCBzbyBsYWJlbCBpcyBub3QgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGJlZm9yZSBpdHMgYXNzb2NpYXRlZCBjaGVja2JveCBvciByYWRpbyBidXR0b24gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgbXVzdCBoYXZlIGEgbGFiZWwgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpXG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT09IG51bGwgfHwgIVJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IFJQVFV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IG5ldyBOb2RlV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgICAgICB3YWxrTm9kZS5ub2RlID0gcnVsZUNvbnRleHQ7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZS5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKCh3YWxrTm9kZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiI3RleHRcIiAmJiB3YWxrTm9kZS5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgfHwgKHdhbGtOb2RlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzcGFuXCIgJiYgd2Fsa05vZGUubm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYmVmb3JlIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBiZWZvcmUgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaW5wdXRfbGFiZWxfYmVmb3JlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2JlZm9yZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEJlZm9yZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2JlZm9yZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgaW5wdXQgaXMgbmVzdGVkIGluIGxhYmVsIHN1Y2ggdGhhdCBpbnB1dCBwcmVjZWRlcyB0aGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYWZ0ZXIgaXRzIGFzc29jaWF0ZWQgdGV4dCBpbnB1dCBvciA8c2VsZWN0PiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGV4dCBpbnB1dHMgYW5kIDxzZWxlY3Q+IGVsZW1lbnRzIG11c3QgaGF2ZSBhIGxhYmVsIGJlZm9yZSB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcImZpbGVcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PSBudWxsIHx8ICFSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IFJQVFV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHZhbHVlID09IC0yKSB7XG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKCh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiI3RleHRcIiAmJiB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwic3BhblwiICYmIHdhbGtOb2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGFmdGVyIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhdmVuJ3QgcmV0dXJuZWQgeWV0LCB0aGVuIEkgcGFzc1xuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgaW5wdXQgdHlwZVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJ1dHRvblwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IFwiYnV0dG9uZWxlbVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgdHlwZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNJbWFnZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgUE9GID0gLTE7XG4gICAgICAgIGxldCB0ZXh0VHlwZXMgPSBbXG4gICAgICAgICAgICBcInRleHRcIiwgXCJmaWxlXCIsIFwicGFzc3dvcmRcIixcbiAgICAgICAgICAgIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLFxuICAgICAgICAgICAgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCAgLy9IVE1MIDUuIE5vdGU6IHR5cGUgPSBcImhpZGRlblwiIGRvZXNuJ3QgcmVxdWlyZSB0ZXh0XG4gICAgICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLCAvL0hUTUwgNS4gdHlwZSA9IFwiaW1hZ2VcIiBpcyBjaGVja2VkIGluIGcxMC5cbiAgICAgICAgICAgIFwidGltZVwiLCBcImNvbG9yXCJcbiAgICAgICAgXVxuICAgICAgICBsZXQgYnV0dG9uVHlwZXMgPSBbXG4gICAgICAgICAgICBcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJcbiAgICAgICAgXVxuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudCwgaW4gdGhlIGNhc2UgdGhhdCBhbiBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgLy8gTm90ZTogbGFiZWxbZm9yXSBkb2VzIG5vdCB3b3JrIGZvciBBUklBLWRlZmluZWQgaW5wdXRzXG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSA/IG51bGwgOiBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgaGFzTGFiZWxFbGVtQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxFbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxsZWRCeUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChsYWJlbEVsZW0sIGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsbGVkQnlFbGVtICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsbGVkQnlFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGFiZWxFbGVtQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXNzZWQgPSAoISFsYWJlbEVsZW0gJiYgaGFzTGFiZWxFbGVtQ29udGVudCkgfHxcbiAgICAgICAgICAgICAgICAoIWxhYmVsRWxlbSAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicGxhY2Vob2xkZXJcIikpIHx8XG4gICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwIHx8IFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgXG4gICAgICAgIH0gZWxzZSBpZiAoYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTEpIHsgLy8gSWYgdHlwZSBpcyBhIGJ1dHRvblxuICAgICAgICAgICAgaWYgKGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzLmluZGV4T2YodHlwZSkgIT09IC0xICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgIC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cyBzbyBwYXNzIGlmIHRoZXJlIGlzIG5vICd2YWx1ZScgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ2YWx1ZVwiKSB8fCBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJidXR0b25lbGVtXCIpIHtcbiAgICAgICAgICAgIC8vIElmIEkgYW0gYW4gaW1hZ2UgYW5kIEkgaGF2ZSBhbHQgdGV4dCAtIGFjY2Vzc2liaWxpdHktd2ViLWVuZ2luZSMyNjlcbiAgICAgICAgICAgIGxldCBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgYkFsdCB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCAmJiAoYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT0gXCJkaWppdE9mZlNjcmVlblwiICYmIERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5oYXNBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGRpaml0IGJ1dHRvbnNcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxJZCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5nZXRBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSArIFwiX2xhYmVsXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsSWQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBJIGZhaWxlZCBhYm92ZSBhbHNvXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDQgKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgLy8gSXMgYSBub24tZW1wdHkgdmFsdWUgYXR0cmlidXRlIGFsc28gZW5vdWdoIGZvciBhbiBvcHRpb24gZWxlbWVudD9cbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIikgfHwgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgYXJpYSByb2xlXG4gICAgICAgICAgICAvL2FueSBtb3JlIHJvbGVzIGZvciBpbnB1dD8gXG4gICAgICAgICAgICBjb25zdCBuYW1lRnJvbUJvdGggPSBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJtZW51aXRlbWNoZWNrYm94XCIpIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcIm1lbnVpdGVtcmFkaW9cIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJyYWRpb1wiKSB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjaGVja2JveFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVGcm9tQXV0aG9yT25seSA9IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImxpc3Rib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIFxuICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIilcbiAgICAgICAgICAgICAgICB8fCAhUlBUVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKTsgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5hbWVGcm9tQm90aClcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkgJiYgUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lRnJvbUJvdGggfHwgbmFtZUZyb21BdXRob3JPbmx5KVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3gsYXJpYTpwcm9ncmVzc2Jhcixkb206aW5wdXRbdHlwZT1maWxlXSxkb206b3V0cHV0XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJpbnB1dF9sYWJlbF9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW5wdXQgZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAhKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXZvaWQgZGlhZ25vc2luZyB0aGUgcG9wdXAgbGlzdCBvZiBhIGNvbWJvYm94LlxuICAgICAgICBsZXQgcm9sZXNUb0NoZWNrID0gW1wibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzVG9DaGVjay5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBSUFRVdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoY29tYm9ib3gsIFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhhcmlhX293bnMudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJ1dHRvblwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IFwiYnV0dG9uZWxlbVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgdHlwZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGV4dFR5cGVzID0gW1widGV4dFwiLCBcImZpbGVcIiwgXCJwYXNzd29yZFwiLFxuICAgICAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsXG4gICAgICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICAgICAgXCJ0aW1lXCIsIFwiY29sb3JcIixcbiAgICAgICAgICAgIFwibW9udGhcIiwgXCJ3ZWVrXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIl07XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IFtcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdO1xuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudCwgaW4gdGhlIGNhc2UgdGhhdCBhbiBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IChsYWJlbEVsZW0gIT0gbnVsbCAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSBcImZpbGVcIjsgLy8gaW5wdXQgdHlwZT1maWxlIGhhcyBhIHZpc2libGUgZGVmYXVsdC5cbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSB8fCB0eXBlID09IFwiYnV0dG9uZWxlbVwiKSB7XG4gICAgICAgICAgICAvLyBCdXR0b25zIGFyZSBub3QgaW4gc2NvcGUgZm9yIHRoaXMgc3VjY2VzcyBjcml0ZXJpYSAoSUJNYS9lcXVhbC1hY2Nlc3MjMjA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZpc2libGUgbGFiZWwgcG9pbnRlZCB0byBieSB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZS5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50QnlJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxhYmVsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIikgfHwgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25lIGxhc3QgY2hlY2sgZm9yIHJvbGVzIHRoYXQgc3VwcG9ydCBuYW1lIGZyb20gY29udGVudFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gbGlzdCBmcm9tIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI25hbWVmcm9tY29udGVudFxuICAgICAgICAgICAgbGV0IHJvbGVzV2l0aE5hbWVGcm9tQ29udGVudCA9IFtcImJ1dHRvblwiLCBcImNlbGxcIiwgXCJjaGVja2JveFwiLCBcImNvbHVtbmhlYWRlclwiLCBcImdyaWRjZWxsXCIsIFwiaGVhZGluZ1wiLCBcImxpbmtcIixcbiAgICAgICAgICAgICAgICBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInJvd1wiLFxuICAgICAgICAgICAgICAgIFwicm93Z3JvdXBcIiwgXCJyb3doZWFkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0b29sdGlwXCIsLypcInRyZWVcIiwqL1widHJlZWl0ZW1cIl07XG4gICAgICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlc1dpdGhOYW1lRnJvbUNvbnRlbnQuaW5kZXhPZihyb2xlc1tpXSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgdGhlIGxhYmVsIGJlbG9uZ3MgdG8gdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X29uY2hhbmdlX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSGFzT25jaGFuZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgYW55IGNoYW5nZXMgb2YgY29udGV4dCBhcmUgZXhwbGFpbmVkIGluIGFkdmFuY2UgdG8gdGhlIHVzZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJWZXJpZnkgdGhhdCBhbnkgY2hhbmdlcyBvZiBjb250ZXh0IGFyZSBleHBsYWluZWQgaW4gYWR2YW5jZSB0byB0aGUgdXNlclwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwiZmlsZVwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiICYmIHR5cGUgIT0gXCJjaGVja2JveFwiICYmIHR5cGUgIT0gXCJyYWRpb1wiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jaGFuZ2VcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbcGxhY2Vob2xkZXJdLCBkb206dGV4dGFyZWFbcGxhY2Vob2xkZXJdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0lucHV0X1BsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJQb3RlbnRpYWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSFRNTDUgcGxhY2Vob2xkZXIgaXMgdGhlIG9ubHkgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIkFkZGl0aW9uYWwgdmlzaWJsZSBsYWJlbCByZWZlcmVuY2VkIGJ5ICdhcmlhLWxhYmVsbGVkYnknIGlzIG5vdCB2YWxpZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhUTUw1ICdwbGFjZWhvbGRlcicgYXR0cmlidXRlIG11c3Qgbm90IGJlIHVzZWQgYXMgYSB2aXNpYmxlIGxhYmVsIHJlcGxhY2VtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSBcImhpZGRlblwiIHx8IHR5cGUgPT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJoaWRkZW5cIikpIHtcbiAgICAgICAgICAgIGxldCBoaWRkZW4gPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBpZiAoaGlkZGVuID09IFwiXCIgfHwgaGlkZGVuLnRvTG93ZXJDYXNlKCkgPT0gXCJoaWRkZW5cIikgeyAvLyB3aGVuIGhpZGRlbiBpcyBlbXB0eSBpbiB0aGUgZWxlbWVudCwgXCJcIiBpcyByZXR1cm5lZCwgc2FtZSBhcyBpdCBoYXMgYSB2YWx1ZSBvZiBcIlwiLlxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpO1xuICAgICAgICAgICAgbGV0IHJlZklkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoL1xccysvKTsgLy8gc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlIHdoaXRlIHNwYWNlc1xuICAgICAgICAgICAgaWYgKCFyZWZJZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcblxuZXhwb3J0IGxldCBsYWJlbF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0xhYmVsX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJQYXNzX1JlZ3VsYXJcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJQYXNzX0FyaWFMYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJQYXNzX0xhYmVsbGVkQnlcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB3aXRoIGlubmVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWwnXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGxhYmVsPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIGV4cGVjdGVkIGlucHV0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8bGFiZWw+IGVsZW1lbnQgbXVzdCBoYXZlIG5vbi1lbXB0eSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJhY3RpdmUgY29tcG9uZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX1JlZ3VsYXJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgXCJcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfQXJpYUxhYmVsXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0gJiYgUlBUVXRpbC5oYXNJbm5lckNvbnRlbnQobGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfTGFiZWxsZWRCeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgaXNNYXRlcmlhbEljb25Gb250IH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGxldCBsYWJlbF9uYW1lX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfbmFtZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Z3JpZGNlbGwsYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c3dpdGNoLGFyaWE6dGFiLGFyaWE6dHJlZWl0ZW0sZG9tOmlucHV0LGRvbTp0ZXh0YXJlYSxkb206c2VsZWN0LGRvbTpvdXRwdXQsZG9tOm1ldGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfTGFiZWxfQWNjZXNzaWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfbmFtZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG1hdGNoZXMgb3IgY29udGFpbnMgdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBY2Nlc3NpYmxlIG5hbWUgZG9lcyBub3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG11c3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmV2aWV3IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXJ1bGVzLmdpdGh1Yi5pby9pc3N1ZXMvMTYxOFxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvYXJpYS9BUklBMjRcbiAgICBhY3Q6IFwiMmVlOGI4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFzcyBpZiB0aGUgdmlzaWJsZSB0ZXh0IHVzZXMgTWF0ZXJpYWwgSWNvbiBmb250XG4gICAgICAgIGlmIChpc01hdGVyaWFsSWNvbkZvbnQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCBpc0lucHV0QnV0dG9uID0gZmFsc2U7XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IFtcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCIvKiwgXCJpbWFnZVwiKi9dO1xuICAgICAgICBsZXQgaW5wdXRUeXBlID0gbnVsbDtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgaW5wdXRUeXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGJ1dHRvblR5cGVzLmluZGV4T2YoaW5wdXRUeXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpc0lucHV0QnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aGVMYWJlbEJ5ID0gUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIWlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrcyBpZiBpdCBoYXMgYW4gYXJpYS1sYWJlbGxlZGJ5IHNpbmNlIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoZUxhYmVsQnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxWYWx1ZXMgPSB0aGVMYWJlbEJ5LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbFZhbHVlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudEJ5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoaXNJbnB1dEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhlIGFsdCBjaGVjayBpbiBpbWFnZXMgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGU9PT1cImltYWdlXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICdhbHQnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBcbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ3ZhbHVlJyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlID09PSBcInN1Ym1pdFwiLyp8fGlucHV0VHlwZT09PVwiaW1hZ2VcIiovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFR5cGUgPT09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwicmVzZXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhIDxsYWJlbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAvKiYmIFJQVFV0aWwuaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIHJ1bGVDb250ZXh0KSovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q2xvbmUgPSBwYXJlbnROb2RlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgYWxsIGZvcm0gZWxlbWVudHMgZnJvbSB0aGUgbGFiZWwgc2luY2UgdGhleSBtaWdodCBhbHNvIGhhdmUgaW5uZXIgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxFbGVtID0gUlBUVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBsYWJlbEVsZW0gPyBsYWJlbEVsZW0gOiBydWxlQ29udGV4dDtcblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjayA9IFtcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwicHJvZ3Jlc3NcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSAmJiBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjay5pbmRleE9mKG5vZGVOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwiXCI7IC8vIHNraXAgY29udGVudCBjaGVjayBmb3Igc29tZSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEaXNhYmxlIHRoaXMgYWx0IGNoZWNrIGluIGltYWdlcyBmb3Igbm93IHVudGlsIHdlIGdldCBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgYWx0IGF0dHJpYnV0ZSBvZiBhbiBpbWFnZSB3aGljaCBpcyBjb25zaWRlcmVkIHZpc2libGUgdGV4dC5cbiAgICAgICAgICAgICAgICBsZXQgaGFzSW1nQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBudyA9IFJQVFV0aWwubmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICghaGFzSW1nQWx0ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50ICYmIG53Lm5vZGUgIT0gZWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW1nQWx0ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImltZ1wiICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ltZ0FsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ID8gdGV4dCArIG53Lm5vZGUuZ2V0QXR0cmlidXRlKFwiYWx0XCIpIDogbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG5vbmFscGhhbnVtZXJpYyA9IC9bXmEtekEtWjAtOV0vZztcblxuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShub25hbHBoYW51bWVyaWMsIFwiIFwiKTsgLy8gb25seSBjb25zaWRlciBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRUZXh0ID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRleHQpLnRvTG93ZXJDYXNlKCk7IC8vIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGRpZmZlcmVuY2UgaW4gY2FzZSBzZW5zaXRpdml0eSBzaG91bGQgYmUgaWdub3JlZC5cblxuICAgICAgICAgICAgdGhlTGFiZWwgPSB0aGVMYWJlbC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRoZUxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZFRleHQubGVuZ3RoID4gMSkgeyAvLyBza2lwIG5vbi10ZXh0IGNvbnRlbnQuIGUuZy4gPGJ1dHRvbiBhcmlhLWxhYmVsPVwiY2xvc2VcIj5YPC9idXR0b24+XG4gICAgICAgICAgICAgICAgbGV0IGxvY2F0aW9uID0gbm9ybWFsaXplZExhYmVsLmluZGV4T2Yobm9ybWFsaXplZFRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgbWF0Y2hpbmcgcGFydGlhbCB3b3Jkcy5lLmcuIHRleHQgXCJuYW1lXCIgc2hvdWxkIG5vdCBtYXRjaCAnc3VybmFtZScgb3IgJ25hbWVzJ1xuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA+PSAwICYmIG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGggPiBub3JtYWxpemVkVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldHRlcnMgPSAvXlswLTlhLXpBLVpdKyQvO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKSA8IG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBsb2NhdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gLTEpIHsgLy8gY2hlY2sgdGhhdCB2aXNpYmxlIHRleHQgY29udGVudCBvZiB0aGUgdGFyZ2V0IGlzIGNvbnRhaW5lZCB3aXRoaW4gaXRzIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgbGFiZWxfcmVmX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9MYWJlbF9SZWZWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSAnZm9yJyBhdHRyaWJ1dGUgaXMgbm90IHRoZSAnaWQnIG9mIGEgdmFsaWQgPGlucHV0PiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdmb3InIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSwgdW5pcXVlICdpZCcgYXR0cmlidXRlIG9mIGFuIDxpbnB1dD4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCB0YXJnZXQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCBsYWJlbCBhbmQgY29udHJvbCBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaGFuZGxlcyBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHdlJ3JlIHBvaW50aW5nIGF0IHNvbWV0aGluZyB0aGF0IGlzIGxhYmVsbGVkIGJ5IGFub3RoZXIgbWVjaGFuaXNtXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09IFwic2VsZWN0XCIgfHwgbm9kZU5hbWUgPT0gXCJ0ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIgfHwgbm9kZU5hbWUgPT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwia2V5Z2VuXCIgfHwgbm9kZU5hbWUgPT0gXCJvdXRwdXRcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcInByb2dyZXNzXCIgfHwgbm9kZU5hbWUgPT0gXCJtZXRlclwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiZmllbGRzZXRcIiB8fCBub2RlTmFtZSA9PSBcImxlZ2VuZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09IFwidGV4dFwiIHx8IHR5cGUgPT0gXCJwYXNzd29yZFwiIHx8IHR5cGUgPT0gXCJmaWxlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT0gXCJyYWRpb1wiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcInNlYXJjaFwiIHx8IHR5cGUgPT0gXCJ0ZWxcIiB8fCB0eXBlID09IFwidXJsXCIgfHwgdHlwZSA9PSBcImVtYWlsXCIgfHwgIC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZVwiIHx8IHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwicmFuZ2VcIiB8fCB0eXBlID09IFwiaW1hZ2VcIiB8fCAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcInRpbWVcIiB8fCB0eXBlID09IFwiY29sb3JcIiB8fCAgLy8gSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZXRpbWVcIiB8fCB0eXBlID09IFwibW9udGhcIiB8fCB0eXBlID09IFwid2Vla1wiOyAvL0hUTUw1LjFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBvbmUgbW9yZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHRhcmdldCBlbGVtZW50IGlzIE5PVCBoaWRkZW4sIGluIHRoZSBjYXNlIHRoZSB0YXJnZXQgaXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBmbGFnIGEgdmlvbGF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBpcy5cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW5dKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCByZXRUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGxldCBsaXN0X2NoaWxkcmVuX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfY2hpbGRyZW5fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfTGlzdF9Hcm91cF9MaXN0SXRlbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgaGFzIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCA8bGlzdGl0ZW0+IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgbXVzdCBsaW1pdCBjaGlsZHJlbiB0byA8bGlzdGl0ZW0+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHBhcmVudCwgXCJsaXN0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImxpc3RpdGVtXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGxpc3RfbWFya3VwX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X21hcmt1cF9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9Vc2VNYXJrdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHdoZXRoZXIgdGhpcyBpcyBhIGxpc3QgdGhhdCBzaG91bGQgdXNlIEhUTUwgbGlzdCBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZSBwcm9wZXIgSFRNTCBsaXN0IGVsZW1lbnRzIHRvIGNyZWF0ZSBsaXN0c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtOb2RlKSB7XG4gICAgICAgICAgICAvLyBDb21wbHkgdG8gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHQgYXMgdGhpcyBydWxlIHRyaWdnZXJzIG9uIGVhY2ggZWxlbWVudFxuICAgICAgICAgICAgLy8gYW5kIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBTbyBhbGwgaW5uZXIgZWxlbWVudHMgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY292ZXJlZCBvbiB0aGVpciBvd24uIEN1cnJlbnRseSBmb3IgdGhpcyBydWxlIGJ5IGRlZmF1bHQgQ2hlY2sgSGlkZGVuIENvbnRlbnQgd2lsbCB3b3JrLCBhcyB3ZSBhcmUgZG9pbmdcbiAgICAgICAgICAgIC8vIGEgbm9kZSB3YWxrIG9ubHkgb24gc2libGluZ3Mgc28gaXQgd291bGQgbm90IGdldCB0ZXh0IG5vZGVzIGZyb20gb3RoZXIgc2libGluZ3MgYXQgYWxsLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgaW4gdGhlIGZ1dHVyZSBzb21ldGhpbmcgY2huZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dFZhbCA9IHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZSA9IC9eWyBcXHRcXHJcXG5dKlsoIF0qWzEtOV0qW1xcKlxcLSkuXVsgXFx0XVtBLVosYS16XSsvLnRlc3QodHh0VmFsKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZmFpbHVyZTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIHNvbWUgc29ydCBvZiBibG9jayBsZXZlbCBlbGVtZW50IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGR1ZSB0byB0aGluZ3MgbGlrZSA8aT5Tb21lIHNlbnRlbmNlPC9pPi4gTmV3IHNlbnRlbmNlLlxuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcih3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53LnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbXCJibG9ja3F1b3RlXCIsIFwiY2VudGVyXCIsIFwiZGlyXCIsIFwiZGl2XCIsIFwiZm9ybVwiLCBcImgxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLCBcImg2XCIsIFwiaHJcIiwgXCJiclwiLCBcIm1lbnVcIiwgXCJwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwcmVcIl0uaW5jbHVkZXMobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4dCA9IG53Lm5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR4dC5sZW5ndGggPiAwICYmICFbXCIgXCIsIFwiXFx0XCIsIFwiXFxuXCJdLmluY2x1ZGVzKHR4dC5jaGFyQXQodHh0Lmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiXSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3Rfc3RydWN0dXJlX3Byb3BlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmRsLCBkb206dWwsIGRvbTpvbCwgZG9tOmRpciwgZG9tOm1lbnUsIGRvbTpsaSwgZG9tOmRkLCBkb206ZHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X01pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJMaXN0IGVsZW1lbnQgaXMgbWlzc2luZyBvciBpbXByb3Blcmx5IHN0cnVjdHVyZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGVsZW1lbnRzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGxpc3RzIG9mIHJlbGF0ZWQgaXRlbXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgcnVsZUNvbnRleHRcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW5cblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJkbFwiKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHdhbGtDaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW5zIHNldCBhcyBwYXNzZWQsIHNpbmNlIGRsIGVsZW1lbnRzIGNhbiBoYXZlXG4gICAgICAgICAgICAvLyB6ZXJvIG9yIG1vcmUgb2Y6IG9uZSBvciBtb3JlIGR0IGVsZW1lbnRzLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkZCBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa0NoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgd2Fsa2luZyB0aHJvdWdoIHRoZSBlbGVtZW50cyB1bmRlciBkbCwgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBtb3ZlIHRvIHRoZSBuZXh0IGVsZW1lbnQgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzUHJlc2VudGF0aW9uYWxFbGVtZW50KHdhbGtDaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25hbEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2V0IHRvIHBhc3MgaWYgd2UgZmluZCBkZCBvciBkdCBlbGVtZW50LCBpbiB0aGUgY2FzZSBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgd2Ugd2lsbCBjYXRjaCBpdCBoZXJlLiBpLmUuIGltZyBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSBkZXBlbmRpbmcgb24gd2hpY2ggaXMgZm91bmQgZmlyc3QgYW5kIGxhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBcIlwiKSBmaXJzdCA9IG5vZGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG5vZGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBoYXZlIGZvdW5kIGR0IGFuZCBkZCBlbGVtZW50cyB1bmRlciBkbCB3ZSBwYXNzIHJpZ2h0IGF3YXkuXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBkdCBvciBkZCBlbGVtZW50LCBidXQgYnVuY2ggb2YgcHJlc2VudGF0aW9uYWwgZWxlbWVudHMgd2UgbWFyayB0aGlzIGFzIGFcbiAgICAgICAgICAgICAgICAvLyBwYXNzLiBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cyBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBmaXJzdCA9PSBcImR0XCIgJiYgbGFzdCA9PSBcImRkXCIpIHx8IChwYXNzZWQgJiYgcHJlc2VudGF0aW9uYWxGb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJsaVwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJ1bFwiLCBcIm9sXCIsIFwiZGlyXCIsIFwibWVudVwiXSkgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImRsXCIpICE9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgd2Fsa0NoaWxkcmVuID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICAgICAgLy8gWmVybyBvciBtb3JlIGxpIGVsZW1lbnRzIGFyZSBwZXJtaXR0ZWQgaW5zaWRlIG9mIDxvbD4sIDx1bD4gb3IgPG1lbnU+IGVsZW1lbnRzIG5vdyBhcyBwZXIgdGhlIGh0bWw1IHNwZWMuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZVxuICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgemVybyBlbGVtZW50cyB1bmRlciB0aGUgPG9sPiwgPHVsPiBvciA8bWVudT4uXG4gICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwidWxcIiB8fCBub2RlTmFtZSA9PSBcIm9sXCIgfHwgbm9kZU5hbWUgPT0gXCJtZW51XCIpICYmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGxpc3QgZWxlbWVudHMsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBza2lwIGNoZWNraW5nIGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0dGluZyB0ZXh0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25hbEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgbm9kZSB0eXBlIGlzIGFueXRoaW5nIGJ1dCAxLCBvciBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgbGkgZWxlbWVudC4gRm9yIGFueSBvdGhlciBub2RlIFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlIGNhdWdodCBoZXJlIHRoYXQgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB1bmRlciBsaXN0IG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1cnRoZXJtb3JlIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBlbGVtZW50IHdpdGggdGhlIHBhcmVudCBiZWluZyB1bC9vbCBkb24ndCBmbGFnIGEgdmlvbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHdhbGtDaGlsZHJlbi5ub2RlVHlwZSAhPSAxIHx8IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIiB8fCAod2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZW1wbGF0ZVwiICYmIChub2RlTmFtZSA9PSBcInVsXCIgfHwgbm9kZU5hbWUgPT0gXCJvbFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGxpIGZvdW5kIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCAobm9kZVR5cGU9MSkgaXMgYW4gbGkgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBsaUZvdW5kID0gbGlGb3VuZCB8fCAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEgJiYgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGl0IGhhcyBwYXNzZWQgYW5kIGFsc28gbGkgZWxlbWVudCBpcyBmb3VuZCB1bmRlciBsaXN0IG5vZGUsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGxpIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGxpRm91bmQpIHx8IChwYXNzZWQgJiYgcHJlc2VudGF0aW9uYWxGb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbWFycXVlZV9lbGVtX2F2b2lkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm1hcnF1ZWVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NYXJxdWVlX1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzZWRfMFwiOiBcIlBhc3NlZF8wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc2VkXzBcIjogXCJtYXJxdWVlX2VsZW1fYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJtYXJxdWVlX2VsZW1fYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NlZF8wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU2Nyb2xsaW5nIGNvbnRlbnQgZm91bmQgdGhhdCB1c2VzIHRoZSBvYnNvbGV0ZSA8bWFycXVlZT4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8bWFycXVlZT4gZWxlbWVudCBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2FsdF9icmllZjogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hbHRfYnJpZWZcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XSwgZG9tOmFwcGxldFthbHRdLCBkb206YXJlYVthbHRdLCBkb206ZW1iZWRbYWx0XSwgZG9tOmlucHV0W3R5cGVdW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BbHRCcmllZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJUZXh0IGFsdGVybmF0aXZlIGlzIG1vcmUgdGhhbiAxNTAgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsdGVybmF0aXZlIHRleHQgaW4gJ2FsdCcgYXR0cmlidXRlIHNob3VsZCBiZSBicmllZiAoPDE1MCBjaGFyYWN0ZXJzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1heEFsdDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxNTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBhbHRMZW5ndGggPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpLmxlbmd0aDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGFsdExlbmd0aCA8PSB2YWxpZGF0ZVBhcmFtcy5tYXhBbHQudmFsdWU7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1ZpZGVvQWx0RmlsZW5hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiRmlsZW5hbWUgdXNlZCBhcyBsYWJlbCBmb3IgZW1iZWRkZWQgYXVkaW8gb3IgdmlkZW9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBvciB2aWRlbyBvbiB0aGUgcGFnZSBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBtZWRpYSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB1cmkgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFyZWFcIikge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB1cmkgPSBcIlwiO1xuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KHVyaSk7XG4gICAgICAgIGxldCBpc0F1ZFZpZCA9IGV4dC5sZW5ndGggIT0gMCAmJiAoUlBUVXRpbC5pc0F1ZGlvRXh0KGV4dCkgfHwgUlBUVXRpbC5pc1ZpZGVvRXh0KGV4dCkpO1xuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFpc0F1ZFZpZCB8fCAoYWx0VGV4dC5sZW5ndGggPiAwICYmIGFsdFRleHQuaW5kZXhPZihleHQpID09IC0xKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBtZWRpYV9hdWRpb190cmFuc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJnc291bmQsIGRvbTphW2hyZWZdLCBkb206YXJlYVtocmVmXSwgZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQXVkaW9UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlByb3ZpZGUgdHJhbnNjcmlwdHMgZm9yIGF1ZGlvIGZpbGVzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXVkaW8gaW5mb3JtYXRpb24gc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGluIHRleHQgZm9ybVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgbGV0IHRoaXNOb2RlID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRoaXNOb2RlID09IFwiYmdzb3VuZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9ICFSUFRVdGlsLmlzQXVkaW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsOyAvLyBPdXQgb2YgU2NvcGVcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnBhcmFtW25hbWU9YXV0b3BsYXldLCBkb206cGFyYW1bbmFtZT1hdXRvc3RhcnRdLCBkb206ZW1iZWRbZmxhc2h2YXJzXSwgZG9tOmVtYmVkW3NyY10sIGRvbToqW2F1dG9zdGFydD10cnVlXSwgZG9tOipbYXV0b3N0YXJ0PTFdLCBkb206Ymdzb3VuZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VtYmVkX0F1dG9TdGFydFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlcmUgaXMgYSBtZWNoYW5pc20gdG8gcGF1c2Ugb3Igc3RvcCBhbmQgY29udHJvbCB0aGUgdm9sdW1lIGZvciB0aGUgYXVkaW8gdGhhdCBwbGF5cyBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTWVjaGFuaXNtIG11c3QgYmUgYXZhaWxhYmxlIHRvIHBhdXNlIG9yIHN0b3AgYW5kIGNvbnRyb2wgdGhlIHZvbHVtZSBvZiB0aGUgYXVkaW8gdGhhdCBwbGF5cyBhdXRvbWF0aWNhbGx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJiZ3NvdW5kXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwicGFyYW1cIikge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKVxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gY29udGVudC5pbmRleE9mKFwiMDtcIikgPT0gMCB8fFxuICAgICAgICAgICAgICAgICEoY29udGVudC5pbmRleE9mKFwidHJ1ZVwiKSAhPSAtMSB8fCBjb250ZW50LmluZGV4T2YoXCIxXCIpICE9IC0xKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImVtYmVkXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiZmxhc2h2YXJzXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImZsYXNodmFyc1wiKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBzdHIuaW5kZXhPZihcImF1dG9zdGFydD10cnVlXCIpID09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PTFcIikgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInNyY1wiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9dHJ1ZVwiKSA9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdHIuaW5kZXhPZihcImF1dG9zdGFydD0xXCIpID09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXV0b3N0YXJ0XCIpKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXV0b3N0YXJ0XCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSB2YWwgIT0gJ3RydWUnICYmIHZhbCAhPSAnMSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YXVkaW8sIGRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BdWRpb19WaWRlb19UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBtZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgbXVzdCBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImF1ZGlvXCIgfHwgbm9kZU5hbWUgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfbGl2ZV9jYXB0aW9uZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX1ZpZGVvT2JqZWN0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9saXZlX2NhcHRpb25lZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgY2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBsaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbykgc2hvdWxkIGhhdmUgY2FwdGlvbnMgZm9yIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFSUFRVdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBtZWRpYV90cmFja19hdmFpbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSwgZG9tOmFyZWFbaHJlZl0sIGRvbTphcHBsZXQsIGRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX1ZpZGVvUmVmZXJlbmNlVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV90cmFja19hdmFpbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgYXZhaWxhYmlsaXR5IG9mIGEgdXNlci1zZWxlY3RhYmxlIGF1ZGlvIHRyYWNrIHdpdGggZGVzY3JpcHRpb24gb2YgdmlzdWFsIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcmUtcmVjb3JkZWQgbWVkaWEgc2hvdWxkIGhhdmUgYW4gYXVkaW8gdHJhY2sgdGhhdCBkZXNjcmliZXMgdmlzdWFsIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuM1wiLCBcIjEuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImFwcGxldFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9ICFSUFRVdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IG1ldGFfcmVkaXJlY3Rfb3B0aW9uYWw6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm1ldGFbaHR0cC1lcXVpdl1bY29udGVudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9NZXRhX1JlZGlyZWN0WmVyb1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJmYWlsX2xvbmdyZWZyZXNoXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlIHNob3VsZCBub3QgYXV0b21hdGljYWxseSByZWZyZXNoIHdpdGhvdXQgd2FybmluZyBvciBvcHRpb24gdG8gdHVybiBpdCBvZmYgb3IgYWRqdXN0IHRoZSB0aW1lIGxpbWl0XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIkNoZWNrIHBhZ2UgZG9lcyBub3QgYXV0b21hdGljYWxseSByZWZyZXNoIHdpdGhvdXQgd2FybmluZyBvciBvcHRpb25zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFsgXCJiaXN6NThcIiwgXG4gICAgICAgIHsgXG4gICAgICAgICAgICBcImJjNjU5YVwiIDoge1xuICAgICAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgICAgICBcImZhaWxcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwicGFzc1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAoIWNvbnRlbnQubWF0Y2goL15cXGQrJC8pICYmICFjb250ZW50Lm1hdGNoKC9eXFxkKzsvKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBjaGVjayB0aGUgZmlyc3Qgb25lIHNpbmNlIGl0IHRha2VzIHByaW9yaXR5XG4gICAgICAgIGlmIChSUFRVdGlsLnRyaWdnZXJPbmNlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goL14oXFxkKyk7ICtbXiBdLyk7XG4gICAgICAgIGlmICghdGltZU1hdGNoIHx8IHBhcnNlSW50KHRpbWVNYXRjaFsxXSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IHBhcnNlSW50KHRpbWVNYXRjaFsxXSk7XG4gICAgICAgICAgICBpZiAodGltZSA8IDcyMDAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sb25ncmVmcmVzaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBtZXRhX3JlZnJlc2hfZGVsYXk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV9yZWZyZXNoX2RlbGF5XCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01ldGFfUmVmcmVzaFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZXMgc2hvdWxkIG5vdCByZWZyZXNoIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgcGFnZSBpcyBub3QgYmVpbmcgY2F1c2VkIHRvIHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogWyBcImJpc3o1OFwiLCBcImJjNjU5YVwiIF0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImh0dHAtZXF1aXZcIikudG9Mb3dlckNhc2UoKSAhPT0gJ3JlZnJlc2gnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAoIWNvbnRlbnQubWF0Y2goL15cXGQrJC8pICYmICFjb250ZW50Lm1hdGNoKC9eXFxkKzsvKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZhaWwgPSAhY29udGVudC5tYXRjaCgvXlxcZCs7ICtbXiBdLyk7XG4gICAgICAgIHJldHVybiAhZmFpbCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbWV0YV92aWV3cG9ydF96b29tYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtuYW1lXVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwibWV0YV92aWV3cG9ydF96b29tXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIHNob3VsZCBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgZG9lcyBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIHdpdGggXFxcInswfVxcXCIgY2FuIGJlIHpvb21lZCBieSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjQuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC4xMFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNGYwYzNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgIT09ICd2aWV3cG9ydCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gbmVpdGhlciBtYXhpbXVtLXNjYWxlIG5vciB1c2VyLXNjYWxhYmxlIChkZWZhdWx0IHllcylcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpID09PSAnJyB8fCAoIWNvbnRlbnQuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSAmJiAhY29udGVudC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCB1c2VyX21zZyA9IG51bGw7XG4gICAgICAgIGxldCBtYXhfbXNnID0gbnVsbDtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBjb250ZW50LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgbGV0IHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGVfdmFsdWUgPSAnMi4wJztcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBwaWVjZXMgPSBwcm9wLnRyaW0oKS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgaWYgKHBpZWNlcy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpIHtcbiAgICAgICAgICAgICAgICB1c2VyX21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgdXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSB1c2VyX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCB1c2VyX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpKSB7XG4gICAgICAgICAgICAgICAgbWF4X21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgbWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCBtYXhpbXVtX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIodXNlcl9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gMSB8fCB2YWx1ZSA8PSAtMSkgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKG1heGltdW1fc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUgPT09ICd5ZXMnKSBtYXhpbXVtX3NjYWxlID0gMS4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gMC4xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXNlci1zY2FsYWJsZSBpcyBub3Qgc2V0IHRvICd5ZXMnLCBpZ25vcmUgbWF4aW11bV9zY2FsZVxuICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZSAhPT0gJ3llcycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIiwgW3VzZXJfbXNnXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlci1zY2FsYWJsZSBpcyAneWVzJywgYnV0IG1heGltdW1fc2NhbGUgaXMgdG9vIHNtYWxsXG4gICAgICAgIGlmIChtYXhpbXVtX3NjYWxlIDwgMi4wKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFttYXhfbXNnXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgbm9lbWJlZF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bm9lbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9Ob2VtYmVkX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkFkZCBkZXNjcmlwdGl2ZSB0ZXh0IHRvIHRoZSA8bm9lbWJlZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxub2VtYmVkPiBlbGVtZW50cyBzaG91bGQgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBvYmplY3RfdGV4dF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwib2JqZWN0X3RleHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfT2JqZWN0X0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxvYmplY3Q+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgdGhlIGNvbnRlbnQgcmVuZGVyZWQgYnkgdGhlIG9iamVjdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiPG9iamVjdD4gZWxlbWVudCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIkFuIDxvYmplY3Q+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiOGZjM2I2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoaXMgb2JqZWN0IGlzIG9mIHR5cGUgdGV4dCwgYnkgY2hlY2tpbmcgdGhlIG9iamVjdCB0eXBlIGluIHRoZSBjYXNlIGl0IGlzIHRleHQgdGhlbiBkbyBub3QgdHJpZ2dlciB0aGlzIHJ1bGVcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikpLmluZGV4T2YoXCJ0ZXh0XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZDogaW5jbHVkaW5nICdwcmVzZW50YXRpb24nLCAnbm9uZScsICdhcHBsaWNhdGlvbicsICdkb2N1bWVudCcgb3IgJ2ltZydcbiAgICAgICAgLy8gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiBvdGhlciBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlciBBQ1QsIGlnbm9yZSBlbWJlZGRlZCBIVE1MIGZpbGVzXG4gICAgICAgIGxldCBkYXRhID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgbGV0IGV4dCA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IHR5cGVvZiBcIlwiID8gZGF0YS5zdWJzdHJpbmcoZGF0YS5sYXN0SW5kZXhPZihcIi5cIikpIDogXCJcIjtcbiAgICAgICAgaWYgKGV4dCA9PT0gXCIuaHRtbFwiIHx8IGV4dCA9PT0gXCIuaHRtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5cbmV4cG9ydCBsZXQgcGFnZV90aXRsZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRG9jX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcGFnZSBzaG91bGQgaGF2ZSBhIHRpdGxlIHRoYXQgY29ycmVjdGx5IGlkZW50aWZpZXMgdGhlIHN1YmplY3Qgb2YgdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTWlzc2luZyA8aGVhZD4gZWxlbWVudCBzbyB0aGVyZSBjYW4gYmUgbm8gPHRpdGxlPiBlbGVtZW50IHByZXNlbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTWlzc2luZyA8dGl0bGU+IGVsZW1lbnQgaW4gPGhlYWQ+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiVGhlIDx0aXRsZT4gZWxlbWVudCBpcyBlbXB0eSAobm8gaW5uZXJIVE1MKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCIyNzc5YTVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBpbnNpZGUgYSBwcmVzZW50YXRpb25hbCBmcmFtZVxuICAgICAgICBpZiAoQW5jZXN0b3JVdGlsLmlzRnJhbWUoY29udGV4dEhpZXJhcmNoaWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgTm9kZTtcbiAgICAgICAgLy8gRmlyc3QsIGZpbmQgdGhlIGhlYWQgZWxlbWVudFxuICAgICAgICBsZXQgZmluZEhlYWQgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIGxldCBmaW5kVGl0bGUgPSBudWxsO1xuICAgICAgICB3aGlsZSAoZmluZEhlYWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGZpbmRIZWFkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJoZWFkXCIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBmaW5kSGVhZCA9IGZpbmRIZWFkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3NzaWJsZVRpdGxlcyA9IChydWxlQ29udGV4dCBhcyBFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKFwidGl0bGVcIik7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHBvc3NpYmxlVGl0bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGlmICghUlBUVXRpbC5nZXRBbmNlc3Rvcihwb3NzaWJsZVRpdGxlc1tpZHhdLCBbXCJzdmdcIl0pKSB7XG4gICAgICAgICAgICAgICAgZmluZFRpdGxlID0gcG9zc2libGVUaXRsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluZEhlYWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghZmluZFRpdGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbmRUaXRsZSA9PT0gbnVsbCkgeyAvLyBkb24ndCBoYXZlIHRpdGxlIHNlY29uZCBQb0ZcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIGdldCBoZXJlIHdlIGhhdmUgPGhlYWQ+IGFuZCA8dGl0bGU+XG5cbiAgICAgICAgaWYgKGZpbmRUaXRsZSAhPSBudWxsICYmIFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGZpbmRUaXRsZSkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gPHRpdGxlPiBoYXMgbm8gaW5uZXJIVE1MIHRoaXJkIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBwYWdlX3RpdGxlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpoZWFkIGRvbTp0aXRsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RpdGxlX1ZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlBhZ2UgPHRpdGxlPiBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlZlcmlmeSB0aGF0IHVzaW5nIHRoZSBmaWxlbmFtZSBhcyB0aGUgcGFnZSA8dGl0bGU+IHZhbHVlIGlzIGRlc2NyaXB0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSA8dGl0bGU+IHNob3VsZCBiZSBhIGRlc2NyaXB0aXZlIHRpdGxlLCByYXRoZXIgdGhhbiBhIGZpbGVuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGxldCB0aXRsZVN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCk7XG5cbiAgICAgICAgLy8gYWxsb3cgLmNvbSwgLm5ldCBhbmQgLm9yZ1xuICAgICAgICBsZXQgdGl0bGVTdHJMb3dlcmNhc2UgPSB0aXRsZVN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIuY29tXCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm5ldFwiKSB8fCB0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5vcmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aXRsZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY292ZXJlZCBieSBwYWdlX3RpdGxlX2V4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9SdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSAhL15cXFMqXFwuW2EtekEtWl17MSw0fSg/IS4pfF5odHRwcz86XFwvXFwvXFxTKi9pLnRlc3QodGl0bGVTdHIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25mb2N1c11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TY3JpcHRfRm9jdXNCbHVyc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgc2NyaXB0IGRvZXMgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdGluZyBtdXN0IG5vdCByZW1vdmUgZm9jdXMgZnJvbSBjb250ZW50IHRoYXQgbm9ybWFsbHkgcmVjZWl2ZXMgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC43XCIsIFwiMy4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm9uZm9jdXNcIikuaW5kZXhPZihcIi5ibHVyKFwiKSA9PSAtMTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgc2NyaXB0X29uY2xpY2tfYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJzY3JpcHRfb25jbGlja19taXN1c2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCAnb25jbGljaycgZXZlbnRzIGFyZSBub3QgdXNlZCBpbiBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhcmlhLXJvbGUgc3BlY2lmaWVkLCBkb24ndCB0cmlnZ2VyIHRoaXMuXG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInJvbGVcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiIHx8IG5vZGVOYW1lID09IFwiaW5wdXRcIjtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgc2NyaXB0X29uY2xpY2tfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvc3NpYmxlIHVzZSBvZiBhIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZmFpbFN1YnN0cmluZzoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhdGlvbi5ocmVmXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhIG9yIGFyZWEsIGRvbid0IHRyaWdnZXIgaWYgdGhlcmUncyBhbiBocmVmLlxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIikgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJocmVmXCIpKTtcblxuICAgICAgICAvLyBJZiB0aGUgZ3VhcmRzIGZhaWxlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZXkncmUgbG9va2luZyBhdCBsaW5rc1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGZhaWxTdWJzdHJpbmcgPSB2YWxpZGF0ZVBhcmFtcy5mYWlsU3Vic3RyaW5nLnZhbHVlOztcbiAgICAgICAgICAgIGxldCBvbmNsaWNrID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25jbGlja1wiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGZhaWxTdWJzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBvbmNsaWNrLmluZGV4T2YoZmFpbFN1YnN0cmluZ1tpXSkgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfc2VsZWN0X3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfc2VsZWN0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9Ob0NoYW5nZUFjdGlvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBubyBjaGFuZ2Ugb2YgY29udGV4dCBvciBhY3Rpb24gb2NjdXJzIHdoZW4gc2VsZWN0aW9uIG9wdGlvbnMgaW4gdGhpcyBjb21wb25lbnQgcmVjZWl2ZSBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGNoYW5nZXMgb2YgY29udGV4dCBzaG91bGQgb2NjdXIgd2hlbiBhIHNlbGVjdGlvbiB2YWx1ZSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2hhbmdlXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzZWxlY3Rfb3B0aW9uc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TZWxlY3RfSGFzT3B0R3JvdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiR3JvdXAgb2YgcmVsYXRlZCBvcHRpb25zIG1heSBuZWVkIDxvcHRncm91cD5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgcmVsYXRlZCBvcHRpb25zIHdpdGhpbiBhIHNlbGVjdGlvbiBsaXN0IHNob3VsZCBiZSBncm91cGVkIHdpdGggPG9wdGdyb3VwPlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1OdW1PcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBvcHRncm91cCBpcyBoaWRkZW4sIHdoaWNoIHNob3VsZCB0cmlnZ2VyIGEgdmlvbGF0aW9uc1xuICAgICAgICAvLyBidXQgaW4gdGhlIGNhc2UgdGhhdCBDaGVjayBoaWRkZW4gb3B0aW9uIGlzIHNldCB0aGVuIHNob3VsZCBub3QgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRncm91cFwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGlvblwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoIDw9XG4gICAgICAgICAgICB2YWxpZGF0ZVBhcmFtcy5wYXJhbU51bU9wdGlvbnMudmFsdWU7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc2tpcF9tYWluX2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZGVzY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wic2tpcF9tYWluX2V4aXN0c1wiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Cb2R5X0ZpcnN0QUNvbnRhaW5zU2tpcFRleHRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGlmIHRoaXMgaHlwZXJsaW5rIHNraXBzIGNvbnRlbnQsIHRoZSBkZXNjcmlwdGlvbiBjb21tdW5pY2F0ZXMgd2hlcmUgaXQgbGlua3MgdG9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVzY3JpcHRpb24gb2YgYSBoeXBlcmxpbmsgdXNlZCB0byBza2lwIGNvbnRlbnQgbXVzdCBjb21tdW5pY2F0ZSB3aGVyZSBpdCBsaW5rcyB0b1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtU2tpcFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2tpcFwiLCBcImp1bXBcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBbXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwic2VhcmNoXCJcbiAgICAgICAgICAgIF0sIHRydWUsIHRydWUpLmxlbmd0aCA+IDApO1xuICAgICAgICB9XG4gICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBsaW5rcyA9IGRvYy5saW5rcztcbiAgICAgICAgICAgIC8vIFNraXAgbGluayBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgcGFnZSB3aXRoIGFuIGhyZWYgYXR0cmlidXRlIChpLmUuLCBsaW5rc1swXSlcbiAgICAgICAgICAgIC8vIGFsc28gaWYgdGhlIGZpcnN0IGxpbmsgaXMgaGlkZGVuIHRoZW4gd2Ugc2hvdWxkIGFsc28gdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgIGlmIChsaW5rcyAmJiBsaW5rcy5sZW5ndGggPiAwICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShsaW5rc1swXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdFRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChkb2MubGlua3NbMF0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdGVzdFRleHQuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVNraXBUZXh0LnZhbHVlW2ldKSAhPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc2tpcF9tYWluX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBU2tpcHNfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBwYWdlIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVpY2tseSBuYXZpZ2F0ZSB0byB0aGUgbWFpbiBjb250ZW50IChBUklBIFxcXCJtYWluXFxcIiBsYW5kbWFyayBvciBhIHNraXAgbGluaylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gc2tpcCBkaXJlY3RseSB0byB0aGUgbWFpbiBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBpbnNpZGUgYSBwcmVzZW50YXRpb25hbCBmcmFtZVxuICAgICAgICBpZiAoQW5jZXN0b3JVdGlsLmlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoaWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBbXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwic2VhcmNoXCJcbiAgICAgICAgICAgIF0sIHRydWUsIHRydWUpLmxlbmd0aCA+IDApO1xuICAgICAgICB9XG4gICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG5cbiAgICAgICAgICAgIC8vIFNraXAgYW5jaG9yIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0ZXN0QW5jaG9yID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGFuY2hvcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RBbmNob3IgPSBhbmNob3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB0YXJnZXQgaWRcbiAgICAgICAgICAgIGxldCB0YXJnZXRJZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGVzdEFuY2hvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhyZWZTdHIgPSB0ZXN0QW5jaG9yLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgbGV0IGlkeCA9IGhyZWZTdHIuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZCA9IGhyZWZTdHIuc3Vic3RyaW5nKGlkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBlbGVtZW50IGlkIG9yIG5hbWVkIGFuY2hvciBvbiB0aGUgcGFnZSB3aXRoIHRoaXNcbiAgICAgICAgICAgIC8vIHRhcmdldCBpZC5cblxuICAgICAgICAgICAgaWYgKHRhcmdldElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpICE9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IGFuY2hvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09IHRhcmdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQmFja2dyb3VuZEltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGUgQ1NTIGJhY2tncm91bmQgaW1hZ2UgZG9lcyBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBpbmNsdWRlZCBieSB1c2luZyBDU1MgYWxvbmUgbXVzdCBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIpIHtcbiAgICAgICAgICAgIC8vIEV4dGVybmFsIHN0eWxlc2hlZXQgLSB0cmlnZ2VyXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLnRyaWdnZXJPbmNlKHJ1bGVDb250ZXh0LCBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBub2RlTmFtZSA9PT0gXCJzdHlsZVwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVUZXh0O1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICAgICAgbGV0IGJnTWF0Y2hlcyA9IHN0eWxlVGV4dC5tYXRjaCgvYmFja2dyb3VuZDpbXjtdKi9nKTtcbiAgICAgICAgICAgIGlmIChiZ01hdGNoZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiZ01hdGNoZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGJnTWF0Y2hlc1tpXS5pbmRleE9mKFwidXJsKFwiKSA9PT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENTU1N0eWxlIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIGlmIDpiZWZvcmUgYW5kIDphZnRlciBhcmUgdXNlZCBpbiBDU1MgKEludGVybmFsIGFuZCBFeHRlcm5hbCkgd2l0aCBjb250ZW50XG4gKiBPcmlnaW46IFdDQUcgMi4wIEY4N1xuICovXG5leHBvcnQgbGV0IHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1N0eWxlX0JlZm9yZUFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIENTUyAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIHRvIGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIGRvIG5vdCBpbnNlcnQgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4zLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vY2hlY2sgSW50ZXJuYWwgc3R5bGVzICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgbGV0IGNzcyA9IGdldENTU1N0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNzcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYmFkIENTU1xuICAgICAgICAgICAgICAgIGlmIChjc3NbaV0uc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKGNzc1tpXS5zZWxlY3Rvci5pbmRleE9mKFwiOmJlZm9yZVwiKSA9PT0gLTEgJiYgY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YWZ0ZXJcIikgPT09IC0xKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIShcImNvbnRlbnRcIiBpbiBjc3NbaV0udmFsdWVzKSB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkubGVuZ3RoID09PSAwIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXFwiXFxcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiXFwnXFwnXCIgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIm5vbmVcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiYXR0cih4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiYXR0cih5KVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgc3BlY2lhbCBydWxlcyBpbiB0aGUgc3R5bGVzaGVldHNcbiAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQG1lZGlhIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVjayAnaWYgKHN0eWxlUnVsZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZSknIGRvZXNuJ3Qgd29yayB3aGVuIHJ1biBpbiBLYXJtYShidXQgd29ya3MgaW4gREFQKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGxldCdzIGFjY2VzcyB0aGUgdHlwZSBkaXJlY3RseSBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZUltcG9ydFJ1bGU6IENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IENTU1J1bGUuTUVESUFfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZU1lZGlhUnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSBzdHlsZU1lZGlhUnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW3JJbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydCBydWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IENTU1J1bGUuSU1QT1JUX1JVTEUgJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IENTU1J1bGUuTUVESUFfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKGltcG9ydGVkUnVsZSBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYVJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1JbmRleCA9IDA7IG1JbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBtSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1ttSW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgZXh0ZXJuYWwgc3R5bGVzIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsaW5rXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKS50cmltKCkubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQG1lZGlhIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IENTU1J1bGUuTUVESUFfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAocnVsZUZyb21MaW5rIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1JbmRleCA9IDA7IHBhc3NlZCAmJiBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1ttSW5kZXhdIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVTZWxUeHQgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlU2VsVHh0LmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlU2VsVHh0LmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgTm9kZVdhbGtlciwgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBzdHlsZV9jb2xvcl9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfY29sb3JfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOmZvbnRbY29sb3JdLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0NvbG9yU2VtYW50aWNzMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tYmluZSBjb2xvciBhbmQgZGVzY3JpcHRpdmUgbWFya3VwIHRvIGNvbnZleSBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBjb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIxLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZUltcG9ydFJ1bGU6IENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSBDU1NSdWxlLklNUE9SVF9SVUxFICYmIChzdHlsZUltcG9ydFJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTSW1wb3J0UnVsZSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IGltcG9ydFJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpUnVsZSA9IGltcG9ydFJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gaVJ1bGUuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiAvL2NoZWNrIGV4dGVybmFsIHN0eWxlc1xuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gcnVsZXNbckluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gRGVmZWN0IDEwMjI6IEZpbmQgdXNlcyBvZiAnY29sb3InIGFuZCAnKmJhY2tncm91bmQqJyBvbmx5XG4gICAgICAgIGxldCBpc0JnVXNlZCA9IHN0eWxlVGV4dC5tYXRjaCgvXFxiYmFja2dyb3VuZFxcYi9pKTtcblxuICAgICAgICBsZXQgdGhlQ29sb3JTdHlsZVRvQ2hlY2sgPSBzdHlsZVRleHQucmVwbGFjZSgvLWNvbG9yL2csIFwiXCIpO1xuICAgICAgICBsZXQgaXNDb2xvclVzZWQgPSB0aGVDb2xvclN0eWxlVG9DaGVjay5tYXRjaCgvXFxiY29sb3JcXGIvaSk7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvbG9yXCIpIHx8IGlzQ29sb3JVc2VkIHx8IGlzQmdVc2VkKSB7XG4gICAgICAgICAgICBsZXQgZ29vZFRhZ05hbWVzID0ge1xuICAgICAgICAgICAgICAgIFwiZW1cIjogXCJcIiwgXCJzdHJvbmdcIjogXCJcIiwgXCJjaXRlXCI6IFwiXCIsIFwiZGZuXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IFwiXCIsIFwic2FtcFwiOiBcIlwiLCBcImtiZFwiOiBcIlwiLCBcInZhclwiOiBcIlwiLCBcImFiYnJcIjogXCJcIiwgXCJhY3JvbnltXCI6IFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbG9yIHVzZWQg77+9IGFyZSB0aGVyZSBzZW1hbnRpY3MgaW52b2x2ZWQ/XG4gICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSBpbiBnb29kVGFnTmFtZXMgfHxcbiAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBnb29kVGFnTmFtZXMpICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIGluIGdvb2RUYWdOYW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBvbmx5IG9uY2VcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCBmYWxzZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfZm9jdXNfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9mb2N1c192aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0hpbmRlckZvY3VzMVwiOiB7XG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBtdXN0IGJlIGhpZ2hseSB2aXNpYmxlIHdoZW4gZGVmYXVsdCBib3JkZXIgb3Igb3V0bGluZSBpcyBtb2RpZmllZCBieSBDU1NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDaGVjayB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIGhpZ2hseSB2aXNpYmxlIHdoZW4gdXNpbmcgQ1NTIGRlY2xhcmF0aW9uIGZvciAnYm9yZGVyJyBvciAnb3V0bGluZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC43XCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNraXBOb2Rlczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja1BhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJib3JkZXJcIiwgXCJib3JkZXItd2lkdGhcIiwgXCJib3JkZXItY29sb3JcIiwgXCJib3JkZXItc3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvdXRsaW5lXCIsIFwib3V0bGluZS13aWR0aFwiLCBcIm91dGxpbmUtY29sb3JcIiwgXCJvdXRsaW5lLXN0eWxlXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkgfHwgdmFsaWRhdGVQYXJhbXMuc2tpcE5vZGVzLnZhbHVlLmluY2x1ZGVzKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJyU3R5bGVzID0gW11cbiAgICAgICAgYXJyU3R5bGVzLnB1c2goZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCkpO1xuICAgICAgICBhcnJTdHlsZXMucHVzaChnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1c1wiKSk7XG4gICAgICAgIGFyclN0eWxlcy5wdXNoKGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFwiOmZvY3VzLXZpc2libGVcIikpO1xuICAgICAgICBhcnJTdHlsZXMucHVzaChnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1cy13aXRoaW5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGFyclN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiB2YWxpZGF0ZVBhcmFtcy5jaGVja1BhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbiBzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgLy8gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcmVkKTtcbiAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgaWYgKHBhc3MyKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzNcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwxKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMikgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgaWYgKHBvdGVudGlhbDMpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIHdoZW4gdmlld3BvcnQgdW5pdHMgYXJlIHVzZWQgZm9yIGZvbnQgc2l6ZS5cbiAqIE9yaWdpbjogVmFyaW91c1xuICovXG5leHBvcnQgbGV0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIxLjQuNFwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRoZVBhdHRlcm4gPSAvXFxkKyh2d3x2aHx2bWlufHZtYXgpL2dpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXRcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IENTU1J1bGUuU1RZTEVfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHJ1bGUgYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IENTU1J1bGUuSU1QT1JUX1JVTEUgJiYgKHJ1bGUgYXMgQ1NTSW1wb3J0UnVsZSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFJ1bGUgPSBydWxlIGFzIENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBpbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgPyBpbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgOiBpbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0ZWRSdWxlID0gcnVsZXNbckluZGV4XSBhcyBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkUnVsZS50eXBlICYmIGltcG9ydGVkUnVsZS50eXBlID09PSBDU1NSdWxlLlNUWUxFX1JVTEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9udFNpemUgPSBpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZvbnRTaXplLm1hdGNoKHRoZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZS5sZW5ndGggJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IENTU1J1bGUuU1RZTEVfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0eWxlVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZVBhdHRlcm4gPSAvZm9udC1zaXplOlxccypcXGQrKHZ3fHZofHZtaW58dm1heCkvZ2k7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc3R5bGVWYWx1ZS5tYXRjaChzdHlsZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBpc1RhYmxlRGVzY2VuZGFudCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dGFibGUgZG9tOnRyW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0aFtyb2xlXSwgYXJpYTp0YWJsZSBkb206dGRbcm9sZV0sIGFyaWE6Z3JpZCBkb206dHJbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGhbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGRbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRyW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dGRbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFibGUgc3RydWN0dXJlIGVsZW1lbnRzIGNhbm5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0ICdyb2xlJyB3aXRoaW4gdGFibGUgY29udGFpbmVyc1wiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwiQW4gZXhwbGljaXQgQVJJQSAncm9sZScgaXMgbm90IHZhbGlkIGZvciA8ezB9PiBlbGVtZW50IHdpdGhpbiBhIEFSSUEgcm9sZSAnezF9JyBwZXIgdGhlIEFSSUEgaW4gSFRNTCBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50OyBcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBpc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAvLyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBudWxsIHx8IHBhcmVudFJvbGUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImV4cGxpY2l0X3JvbGVcIiwgW2NvbnRleHRbXCJkb21cIl0ubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnRSb2xlWzBdLnJvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX2NhcHRpb25fZW1wdHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9lbXB0eVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhcHRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfQ2FwdGlvbl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHRhYmxlPiBlbGVtZW50IGhhcyBhbiBlbXB0eSA8Y2FwdGlvbj4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGNhcHRpb24+IGVsZW1lbnQgZm9yIGEgPHRhYmxlPiBlbGVtZW50IG11c3QgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9jYXB0aW9uX25lc3RlZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhcHRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfQ2FwdGlvbl9JblRhYmxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8Y2FwdGlvbj4gZWxlbWVudCBpcyBub3QgbmVzdGVkIGluc2lkZSBhIDx0YWJsZT4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8Y2FwdGlvbj4gZWxlbWVudCBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgdGhlIGFzc29jaWF0ZWQgPHRhYmxlPiBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpICE9IG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX2hlYWRlcnNfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206dGFibGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9UYWJsZV9EYXRhSGVhZGluZ3NBcmlhXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfaGVhZGVyc19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUYWJsZSBoYXMgbm8gaGVhZGVycyBpZGVudGlmaWVkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRGF0YSB0YWJsZSBtdXN0IGlkZW50aWZ5IGhlYWRlcnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBsYXlvdXQgdGFibGUgb3IgdGhlcmUgYXJlIG5vIHJvd3MsIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghUlBUVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkgfHwgcm93cyA9PSBudWxsIHx8IHJvd3MubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmxlSGVhZGVySW5GaXJzdFJvd09yQ29sdW1uKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfaGVhZGVyc19yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtoZWFkZXJzXSwgZG9tOnRoW2hlYWRlcnNdXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIGluIHRoaXMgZG9jdW1lbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgcmVmZXJzIHRvIGl0c2VsZlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW4gdGhlIHNhbWUgdGFibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgZG9lcyBub3QgcmVmZXIgdG8gYSBjZWxsIGluZGljYXRlZCB3aXRoIDx0aD4gb3IgYSByb2xlIG9mIFxcXCJjb2x1bW5oZWFkZXJcXFwiIG9yIFxcXCJyb3doZWFkZXJcXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgc2hvdWxkIHJlZmVyIHRvIGEgdmFsaWQgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW1wiYTI1ZjQ1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudFRhYmxlKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciBhIHNpbXBsZSB0YWJsZSB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgaWYgKHBhcmVudFRhYmxlID09IG51bGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwYXJlbnRUYWJsZSkgfHwgIVtcInRhYmxlXCIsIFwiZ3JpZFwiXS5pbmNsdWRlcyhwYXJlbnRSb2xlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgdmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGlkcyA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGludmFsaWRIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVOb2RlSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGxldCBzYW1lVGFibGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGludmFsaWRFbGVtSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoaWQudHJpbSgpID09PSAnJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlmICghZWxlbSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAoRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgc2FtZU5vZGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmICghRE9NVXRpbC5pc0luU2FtZVRhYmxlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lVGFibGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1OYW1lICE9PSAndGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyb2xlcy5pbmNsdWRlcygnY29sdW1uaGVhZGVyJykgJiYgIXJvbGVzLmluY2x1ZGVzKCdyb3doZWFkZXInKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgIGlmIChpbnZhbGlkSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lTm9kZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMlwiLCBbc2FtZU5vZGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVUYWJsZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfM1wiLCBbc2FtZVRhYmxlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfNFwiLCBbaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcblxuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfaGVhZGVyc19yZWxhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkLCBkb206dGhcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfVGFibGVfRGF0YUNlbGxSZWxhdGlvbnNoaXBzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDb21wbGV4IHRhYmxlIGRvZXMgbm90IGhhdmUgaGVhZGVycyBmb3IgZWFjaCBjZWxsIHByb3Blcmx5IGRlZmluZWQgd2l0aCAnaGVhZGVyJyBvciAnc2NvcGUnXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRm9yIGEgY29tcGxleCBkYXRhIHRhYmxlLCBhbGwgPHRoPiBhbmQgPHRkPiBlbGVtZW50cyBtdXN0IGJlIHJlbGF0ZWQgdmlhICdoZWFkZXInIG9yICdzY29wZScgYXR0cmlidXRlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciBhIHNpbXBsZSB0YWJsZSB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgaWYgKHBhcmVudFRhYmxlID09IG51bGwgfHwgIVJQVFV0aWwuaXNDb21wbGV4RGF0YVRhYmxlKHBhcmVudFRhYmxlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcHJlcHJvY2Vzc2VkLCBwcm9jZXNzIGl0LlxuICAgICAgICBpZiAoZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBCdWlsZCBhIGdyaWQgdGhhdCdzIGFjdHVhbGx5IHVzYWJsZSAocm93c3BhbiBhbmQgY29sc3BhbiBlbGVtZW50cyBhcmUgZHVwbGljYXRlZClcbiAgICAgICAgICAgIC8vIFRoaXMgYnVpbGRzIGEgcmVhbCAyZCB0YWJsZSBhcnJheS5cbiAgICAgICAgICAgIGxldCBncmlkID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudFRhYmxlLnJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93ID0gcGFyZW50VGFibGUucm93c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWdyaWRbaV0pIGdyaWRbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbCA9IHJvdy5jZWxsc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUoY2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgaSArIFwiOlwiICsgaik7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGVpZ2h0KSBoZWlnaHQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ1ggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JpZFtpXVtnWF0pIGdYICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGVpZ2h0OyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpICsga10pIGdyaWRbaSArIGtdID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgd2lkdGg7ICsrbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRbaSArIGtdW2dYICsgbF0gPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRhYmxlIGdyaWQgYW5kIHJlY29yZCBoZWFkZXJzIHRoYXQgcG9pbnQgdG8gY2VsbHMgYW5kXG4gICAgICAgICAgICAvLyBjZWxscyB0aGF0IGFyZSBwb2ludGVkIHRvIGJ5IGhlYWRlcnNcbiAgICAgICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHt9XG4gICAgICAgICAgICBsZXQgc2NvcGVkQ29scyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvd1Njb3BlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ3JpZFtpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZENlbGwgPSBncmlkW2ldW2pdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZE5vZGVOYW1lID0gZ3JpZENlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U2NvcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcImNvbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkQ29sc1tqXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBheGlzIGF0dHJpYnV0ZSwgaXQgbXVzdCBiZSByZWZlcnJlZCB0byBieSBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjb3BlIGlzIG5vdCBlbm91Z2guXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGdyaWRDZWxsLCBcImF4aXNcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtnZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlYWRlcnMgY2FuIHJlZmVyIHRvIG90aGVyIGhlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGdyaWRDZWxsLCBcImhlYWRlcnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGRycyA9IGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRycy5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaGRyc1trXS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZEVsZW0gJiYgUlBUVXRpbC5nZXRBbmNlc3RvcihoZWFkRWxlbSwgXCJ0YWJsZVwiKSA9PSBwYXJlbnRUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtnZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhkcnMgPSBncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhkcnMubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRFbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGhkcnNba10udHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRFbGVtICYmIFJQVFV0aWwuZ2V0QW5jZXN0b3IoaGVhZEVsZW0sIFwidGFibGVcIikgPT0gcGFyZW50VGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtnZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtnZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKHBhcmVudFRhYmxlLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBsb29rdXApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJjSW5mbyA9IGdldENhY2hlKHJ1bGVDb250ZXh0LCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKTtcbiAgICAgICAgbGV0IHRJbmZvID0gZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICE9PSBudWxsICYmIHRJbmZvICE9PSBudWxsICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChnZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgZmFsc2UpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfbGF5b3V0X2xpbmVhcml6ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RhYmxlX0xheW91dFRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRhYmxlIGlzIG5vdCBiZWluZyB1c2VkIHRvIGZvcm1hdCB0ZXh0IGNvbnRlbnQgaW4gY29sdW1ucyB1bmxlc3MgdGhlIHRhYmxlIGNhbiBiZSBsaW5lYXJpemVkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXZvaWQgdXNpbmcgdGFibGVzIHRvIGZvcm1hdCB0ZXh0IGRvY3VtZW50cyBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFSUFRVdGlsLmlzTGF5b3V0VGFibGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfc3RydWN0dXJlX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206dGFibGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UYWJsZV9TdHJ1Y3R1cmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3RydWN0dXJlX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfc3RydWN0dXJlX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggXFxcInByZXNlbnRhdGlvblxcXCIgcm9sZSBvciBcXFwibm9uZVxcXCIgcm9sZSBoYXMgc3RydWN0dXJhbCBlbGVtZW50KHMpIGFuZC9vciBhdHRyaWJ1dGUocykgJ3sxfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJsZSBlbGVtZW50cyB3aXRoICdyb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiIG9yICdyb2xlPVxcXCJub25lXFxcIiBzaG91bGQgbm90IGhhdmUgc3RydWN0dXJhbCBlbGVtZW50cyBvciBhdHRyaWJ1dGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEpDSCAtIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAoUlBUVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVJbkdyaWQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZXJyb3JOb2RlcyA9IFtdO1xuICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzdW1tYXJ5XCIpKVxuICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgY2FwdGlvbkVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhcHRpb25FbGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IoY2FwdGlvbkVsZW1zW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNhcHRpb25FbGVtc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKGNhcHRpb25FbGVtc1tpXSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IGFjdHVhbGx5IG1ha2luZyB1c2Ugb2YgdGhlc2VzIGVycm9yTm9kZXMgZXZlbiB0aG91Z2ggdGhleSBhcmUgcGFzc2VkIGFsb25nIHdpdGhcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0aW9uUmVzdWx0LCB3ZSBkbyBub3QgbmVlZCB0byBrZWVwIGxvb3Bpbmcgb3ZlciBhbmQgZ2V0dGluZyBldmVyeSBzaW5nbGUgdmlvbGF0aW5nIG5vZGUgdW5kZXJcbiAgICAgICAgICAgICAgICAvLyB0aGUgcnVsZSBjb250ZXh0LiBUaGlzIGNhbiBiZSBhIGZ1dHVyZSBlbmhhbmNlbm1lbnQgd2hlcmUgd2UgYWN0dWFsbHkgbWFrZSB1c2Ugb2YgdGhlIGVycm9yIG5vZGVzIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIGFsb25nLiBBZGRpbmcgdGhpcyBicmVhayB0byBzcGVlZCB1cCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBrZWVwIGFkZGluZyB0aGUgZXJyb3Igbm9kZXMsIHN0b3AgYWZ0ZXIgZmluZGluZyB0aGUgZmlyc3Qgb25lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGhOb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhOb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IodGhOb2Rlc1tpXSwgXCJ0YWJsZVwiKSA9PSBydWxlQ29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGFuZCBpZiB0aGUgbm9kZSBpc1Zpc2libGUgb3JcbiAgICAgICAgICAgICAgICAvLyBub3QuXG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih0aE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2godGhOb2Rlc1tpXSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IGFjdHVhbGx5IG1ha2luZyB1c2Ugb2YgdGhlc2VzIGVycm9yTm9kZXMgZXZlbiB0aG91Z2ggdGhleSBhcmUgcGFzc2VkIGFsb25nIHdpdGhcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0aW9uUmVzdWx0LCB3ZSBkbyBub3QgbmVlZCB0byBrZWVwIGxvb3Bpbmcgb3ZlciBhbmQgZ2V0dGluZyBldmVyeSBzaW5nbGUgdmlvbGF0aW5nIG5vZGUgdW5kZXJcbiAgICAgICAgICAgICAgICAvLyB0aGUgcnVsZSBjb250ZXh0LiBUaGlzIGNhbiBiZSBhIGZ1dHVyZSBlbmhhbmNlbm1lbnQgd2hlcmUgd2UgYWN0dWFsbHkgbWFrZSB1c2Ugb2YgdGhlIGVycm9yIG5vZGVzIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIGFsb25nLiBBZGRpbmcgdGhpcyBicmVhayB0byBzcGVlZCB1cCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBrZWVwIGFkZGluZyB0aGUgZXJyb3Igbm9kZXMsIHN0b3AgYWZ0ZXIgZmluZGluZyB0aGUgZmlyc3Qgb25lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRkTm9kZXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRkXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRkTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICgodGROb2Rlc1tpXS5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSB8fCB0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikpICYmXG4gICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih0ZE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRkTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0ZE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lIGZvciB0aGUgcnVsZSBjb250ZXh0IGVsZW1lbnQgaW4gdGhpcyBjYXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRhYmxlXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudFRva2VuID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBuZXcgYXJyYXkgd2hpY2ggd2lsbCBjb250YW4gb25seSB0aGUgZWxlbWVudCB0YWcgZm9yIHRoZSB2aW9sYXRpb24gZWxlbWVudHNcbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGEgc2VlbiBoYXNoIHRoYXQgd2lsbCBrZWVwIHRyYXNrIG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdCB3ZXJlIGFscmVhZHkgYWRkZWQgdG8gdGhlIHRva2VuIGFycmF5LCB0byBtYWtlIHN1cmVcbiAgICAgICAgLy8gd2UgZG8gbm90IGR1cGxpY2F0ZSBhbnkgb2YgdGhlIGVsZW1lbnRzLiBEdXBsaWNhdGUgZWxlbWVudCB0YWdzIGluIHRoZSB0b2tlbiBtZXNzYWdlIGxvb2tzIGJhZCBhbmQgY29uZnVzaW5nLlxuICAgICAgICBsZXQgc2VlbiA9IHt9O1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHZpb2xhdGluZyBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBleHRyYWN0IHRoZSBlbGVtZW50IHRhZyB0byBiZSB1c2VkIGFzIGEgdG9rZW5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcnJvck5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgbmFtZSAodGFnIG5hbWUpIGZvciB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudFxuICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gZXJyb3JOb2Rlc1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IG5lZWQgdG8gYWRkIHRoZSB2aW9sYXRpbmcgZWxlbWVudCBvbmNlXG4gICAgICAgICAgICBpZiAoIXNlZW4uaGFzT3duUHJvcGVydHkobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGFkZGluZyB0aGUgdG9rZW4gYXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2UgbmVlZCB0byBoYW5kbGVcbiAgICAgICAgICAgICAgICAvLyB0aGUgc3VtbWFyeSBhdHRyaWJ1dGUgb24gdGhlIHJ1bGVDb250ZXh0ICh0YWJsZSkuIFdlIG9ubHkgYWRkIHN1bW1hcnkgb25jZSwgc2FtZSBhc1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50cyB0byBhdm9pZCBkdXBsaWNhdGlvbiBpbiB0aGUgbWVzc2FnZS4gKFN1bW1hcnkgc2hvdWxkIG5vdCBkdXBsaWNhdGUsIGJ1dCBqdXN0IGluIGNhc2UpXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwidGFibGVcIiAmJiAhc2Vlbi5oYXNPd25Qcm9wZXJ0eVtcInN1bW1hcnlcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGlzIGFzIGEgbmV3IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBzZWVuW1wic3VtbWFyeVwiXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChcInN1bW1hcnlcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGlzIGFzIGEgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgc2Vlbltub2RlTmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgdmlvbGF0aW5nIGVsZW1lbnQgYWRkIGl0IHRvIHRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnQgdG9rZW5zIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zLnB1c2gobm9kZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSB0aGUgYXJyYXkgb2Ygc3RydWN0dXJhbCBlbGVtZW50cyBhbmQgam9pbiB0aGVtIHdpdGggYSBjb21tYSBhbmQgYSBzcGFjZSB0byBtYWtlIGdyYW1tYXRpY2FsIGNvcnJlY3QgaW5cbiAgICAgICAgLy8gdGhlIG1lc3NhZ2UuXG4gICAgICAgIGxldCBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vuc1N0ciA9IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zLmpvaW4oXCIsIFwiKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChlcnJvck5vZGVzLmxlbmd0aCA9PSAwLCBlcnJvck5vZGVzLCAnJywgJycsIFtjdXJyZW50RWxlbWVudFRva2VuLCBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vuc10pO1xuICAgICAgICBpZiAoZXJyb3JOb2Rlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtjdXJyZW50RWxlbWVudFRva2VuLCBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vuc1N0cl0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX3N1bW1hcnlfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206dGFibGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UYWJsZV9DYXBTdW1tUmVkdW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdGFibGUgc3VtbWFyeSBkdXBsaWNhdGVzIHRoZSBjYXB0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgbXVzdCBub3QgZHVwbGljYXRlIHRoZSBjYXB0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwb2ZJZDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBzdW1TdHI7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdW1tYXJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDA7XG4gICAgICAgICAgICBzdW1TdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdW1tYXJ5XCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikpIHtcbiAgICAgICAgICAgIHBvZklkID0gMTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUlkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlQ29uY2F0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VtbWFyeU5vZGVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZCA9IHN1bW1hcnlOb2RlSWRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBzdW1tYXJ5Tm9kZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5Tm9kZUNvbmNhdCArPSBcIiBcIiArIFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHN1bW1hcnlOb2RlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1bVN0ciA9IHN1bW1hcnlOb2RlQ29uY2F0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3VtU3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjYXBFbGVtcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY2FwdGlvblwiKTtcbiAgICAgICAgICAgIGlmIChjYXBFbGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FwU3RyID0gUlBUVXRpbC5nZXRJbm5lclRleHQoY2FwRWxlbXNbMF0pLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICghc3VtU3RyLmluY2x1ZGVzKGNhcFN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IHRleHRfYmxvY2tfaGVhZGluZzogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTpwLCBkb206ZGl2LCBkb206YnJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja19TaG91bGRCZUhlYWRpbmdcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgaWYgdGhpcyB0ZXh0IHNob3VsZCBiZSBtYXJrZWQgdXAgYXMgYSBoZWFkaW5nOiB7MH1cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgbXVzdCB1c2UgYSBoZWFkaW5nIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbnVtV29yZHM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBudW1Xb3JkcyA9IHZhbGlkYXRlUGFyYW1zLm51bVdvcmRzLnZhbHVlO1xuICAgICAgICBsZXQgd29yZHNTZWVuID0gMDtcbiAgICAgICAgbGV0IHdvcmRTdHI6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlbXBoYXNpemVkVGV4dCA9IGZhbHNlO1xuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiZcbiAgICAgICAgICAgIG53Lm5vZGUgIT09IHJ1bGVDb250ZXh0ICYmXG4gICAgICAgICAgICBudy5ub2RlICE9PSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCkgJiZcbiAgICAgICAgICAgICFbXCJiclwiLCBcImRpdlwiLCBcInBcIl0uaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgLy8gRG9uJ3QgcmVwb3J0IHR3aWNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBud05hbWUgPSBudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoKG53TmFtZSA9PSBcImJcIiB8fCBud05hbWUgPT0gXCJlbVwiIHx8IG53TmFtZSA9PSBcImlcIiB8fFxuICAgICAgICAgICAgICAgIG53TmFtZSA9PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PSBcInVcIiB8fCBud05hbWUgPT0gXCJmb250XCIpICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgIGxldCB3YyA9IFJQVFV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgIGlmICh3YyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd29yZFN0ci5wdXNoKG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRzU2VlbiArPSB3YztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIG5vZGUgYmVjYXVzZSBpdCdzIGVtcGhhc2l6ZWRcbiAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobndOYW1lID09IFwiYXBwbGV0XCIgfHwgbndOYW1lID09IFwiZW1iZWRcIiB8fCBud05hbWUgPT0gXCJpbWdcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChud05hbWUgPT09IFwiaW5wdXRcIiAmJiBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PSBcImltYWdlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfHwgKG53TmFtZSA9PT0gXCIjdGV4dFwiICYmIG53Lm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAvLyBHaXZlIHRoZW0gdGhlIGJlbmVmaXQgb2YgdGhlIGRvdWJ0IGlmIHRoZXJlJ3MgYSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIHx8IChud05hbWUgPT09IFwiYVwiICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJocmVmXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod29yZHNTZWVuID09IDApIHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb2xvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbi8vaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGdldFdlaWdodE51bWJlciwgZ2V0Rm9udEluUGl4ZWxzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgbGV0IHRleHRfY29udHJhc3Rfc3VmZmljaWVudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsX3NhbWVfY29sb3JcIlxuICAgICAgICB9LFxuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQV9QVlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3RleHRfc2hhZG93XCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRleHQgd2l0aCBpdHMgYmFja2dyb3VuZCBtdXN0IG1lZXQgV0NBRyAyLjEgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgY29udHJhc3Qgb2YgezB9IHdpdGggaXRzIGJhY2tncm91bmQgaXMgbGVzcyB0aGFuIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3NhbWVfY29sb3JcIjogXCJUaGUgZm9yZWdyb3VuZCB0ZXh0IGFuZCBpdHMgYmFja2dyb3VuZCBjb2xvciBhcmUgYm90aCBkZXRlY3RlZCBhcyB7M30uIFZlcmlmeSB0aGUgdGV4dCBtZWV0cyB0aGUgV0NBRyAyLjEgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgMi4xIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3RleHRfc2hhZG93XCI6IFwiVmVyaWZ5IHRoZSBjb250cmFzdCByYXRpbyBvZiB0aGUgdGV4dCB3aXRoIHNoYWRvdyBtZWV0cyB0aGUgV0NBRyAyLjEgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS40LjNcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFsnYWZ3NGY3J10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgZWxlbWVudHMgdGhhdCBhcmUgbm90IHZpc2libGVcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8XG4gICAgICAgICAgICAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9UT0RPID8gc2hvdWxkIG9ubHkgY29uc2lkZXIgbmF0aXZlIGRpc2FibGVkLCBpZ25vcmUgYXJpYS1kaXNhYmxlZFxuICAgICAgICAvL3NraXAgZGlzYWJsZWQgZWxlbWVudFxuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IFJQVFV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChSUFRVdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIFJQVFV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCByZWdleCA9IC9bXihhLXpBLVpcXGRcXHMpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNoaWxkU3RyLnRyaW0oKS5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZC50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW0gPSBydWxlQ29udGV4dDtcbiAgICAgICAgLy8gdGhlIGNoaWxkIGVsZW1lbnRzIChyYXRoZXIgdGhhbiBzaGFkb3cgcm9vdCkgb2YgYSBzaGFkb3cgaG9zdCBpcyBlaXRoZXIgcmUtYXNzaWduZWQgdG8gdGhlIHNoYWRvdyBzbG90IGlmIHRoZSBzbG90IGV4aXN0cyBcbiAgICAgICAgLy8gb3Igbm90IGRpc3BsYXllZCwgc28gc2hvdWxkbid0IGJlIGNoZWNrZWQgZnJvbSB0aGUgbGlnaHQgRE9NLCByYXRoZXIgaXQgc2hvdWxkIGJlIGNoZWNrZWQgYXMgcmVhc3NnaW5nZWQgc2xvdCBlbGVtZW50KHMpIGluIHRoZSBzaGFkb3cgRE9NLlxuICAgICAgICBpZiAoUlBUVXRpbC5pc1NoYWRvd0hvc3RFbGVtZW50KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gaWYgaXQncyBkaXJlY3QgdGV4dCBvZiBhIHNoYWRvdyBob3N0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGU9cnVsZUNvbnRleHQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZT1ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlPT0zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIG11bHRpcGxlIHRleHRzIGV4aXN0LCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IChub2RlIGFzIFRleHQpLmFzc2lnbmVkU2xvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0gPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIFxuICAgICAgICAvLyBKQ0ggY2xpcCBJTkZPOlxuICAgICAgICAvLyAgICAgIFRoZSBjbGlwIHByb3BlcnR5IGxldHMgeW91IHNwZWNpZnkgYSByZWN0YW5nbGUgdG8gY2xpcCBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudC4gXG4gICAgICAgIC8vICAgICAgVGhlIHJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgZm91ciBjb29yZGluYXRlcywgYWxsIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlwcGVkLlxuICAgICAgICAvLyAgICAgIFByb3BlcnR5IHZhbHVlczpcbiAgICAgICAgLy8gICAgICAgICAgbm9uZSAgICAgICAgVGhpcyBpcyBkZWZhdWx0LiBObyBjbGlwcGluZyBpcyBkb25lXG4gICAgICAgIC8vICAgICAgICAgIGF1dG8gICAgICAgIE5vIGNsaXBwaW5nIHdpbGwgYmUgZG9uZVxuICAgICAgICAvLyAgICAgICAgICBzaGFwZSAgICAgICBUaGUgb25seSB2YWxpZCB2YWx1ZSBpczogcmVjdCAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBjbGlwOiByZWN0KDEwcHgsIDIwcHgsIDMwcHgsIDQwcHgpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0aGUgZm91ciB2YWx1ZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIG1hcmdpbi9wYWRkaW5nXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWN0IHZhbHVlcyBhcmUgcG9zaXRpdmUgcGl4ZWwgdmFsdWVzLCBlLmcuLCAxMHB4LCBldGMuXG4gICAgICAgIC8vICAgICAgICAgIG1hcmdpbi1ib3ggIFVzZXMgdGhlIG1hcmdpbiBib3ggYXMgdGhlIHJlZmVyZW5jZSBib3hcbiAgICAgICAgLy8gICAgICAgICAgYm9yZGVyLWJveCAgVXNlcyB0aGUgYm9yZGVyIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBwYWRkaW5nLWJveCBVc2VzIHRoZSBwYWRkaW5nIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBjb250ZW50LWJveFxuICAgICAgICAvLyAgICAgICAgICBmaWxsLWJveFxuICAgICAgICAvLyAgICAgICAgICBzdHJva2UtYm94XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIENTUyBjbGlwIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWRcbiAgICAgICAgLy8gICAgICBBbHNvOiBjbGlwIG9ubHkgd29ya3MgaWYgdGhlIGVsZW1lbnQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFuZCBjYW4gb25seSBkbyByZWN0YW5nbGVzXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICBsZXQgdmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmIChzdHlsZS53aWR0aCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgIT09IFwiMFwiICYmXG4gICAgICAgICAgICBzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiZcbiAgICAgICAgICAgIHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmXG4gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIC8vIGxlZnQgYW5kIHJpZ2h0IHdvcmsgd2l0aCBhbGwgYWJzb2x1dGUgdW5pdHNcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUubGVmdC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpICYmXG4gICAgICAgICAgICAoc3R5bGUubGVmdCA9PT0gXCJhdXRvXCIgfHwgKHN0eWxlLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnICYmIHBhcnNlSW50KHN0eWxlLnRvcC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpKSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBJUyB2aXNpYmxlXCIpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDSEVDSyBDT0xPUiBDT05UUkFTVCB1bmxlc3MgdG8gc21hbGxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsZW1lbnQgTk9UIHZpc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgY2xpcEhlaWdodCA9IC0xO1xuICAgICAgICBpZiAoc3R5bGUuY2xpcCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIGxldCBjbGlwU3RyaW5nID0gc3R5bGUuY2xpcC50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJyZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0T2ZUZXh0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcsICcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3VuZEFycltcIixpLFwiXSA9IFwiLGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJsaXN0T2ZUZXh0ID0gXCIsbGlzdE9mVGV4dCk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gcGFyc2VJbnQobGlzdE9mVGV4dFswXS5yZXBsYWNlKC9weC9nLCAnJykpIC0gcGFyc2VJbnQobGlzdE9mVGV4dFsyXS5yZXBsYWNlKC9weC9nLCAnJykpO1xuICAgICAgICAgICAgY2xpcEhlaWdodCA9IE1hdGguYWJzKGNsaXBIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSkNIIGNsaXAtcGF0aCBJTkZPOlxuICAgICAgICAvLyAgICAgIEV4Y2VsbGVudCBhcnRpY2xlIG9uIGNsaXAtcGF0aDogaHR0cHM6Ly9pc2hhZGVlZC5jb20vYXJ0aWNsZS9jbGlwLXBhdGgvXG4gICAgICAgIC8vICAgICAgY2xpcC1wYXRoIGlzIGEgdG90YWxseSBkaWZmZXJlbnQgYW5pbWFsIHdpdGggbWFueSwgbWFueSBkaWZmZXJlbnQgdmFyaWF0aW9uc1xuICAgICAgICAvLyAgICAgIFRoZSBnb2FsIHdhcyBmb3IgaXQgdG8gbm90IGJlIGFzIGxpbWl0ZWQgYXMgY2xpcFxuICAgICAgICAvLyAgICAgIFRoZSBzeW50YXggaXMgbW9yZSBjb21wbGljYXRlZCAoYXMgaXQgZG9lcyBtb3JlKSBhbmQgaXQgaXMgZGlmZmVyZW50IGZyb20gY2xpcCxcbiAgICAgICAgLy8gICAgICBlLmcuLCB0aGUgYWJvdmUgY2xpcCByZWN0YW5nbGUgd291bGQgYmUgY2xpcC1wYXRoOiBpbnNldCgxMHB4IDIwcHggMzBweCA0MHB4KTtcbiAgICAgICAgLy8gICAgICBOb3RlOiB0aGVyZSBhcmUgbm8gY29tbWFzXG4gICAgICAgIC8vICAgICAgQWxzbywgaXQgY2FuIHRha2Ugc2luZ2xlIHZhbHVlcyB0byBtYWtlIGFsbCBzaWRlcyB0aGUgc2FtZSwgb3IgMiB2YWx1ZXMgKHZlcnQvaG9yaSkuXG4gICAgICAgIC8vICAgICAgb3IgMyB2YWx1ZXMgKHRvcC9ob3JpL2JvdHRvbSlcbiAgICAgICAgLy8gICAgICBBbmQgcGVyY2VudGFnZXMgY2FuIHdvcmtzIGFzIHdlbGwgYXMgcHhcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBBbHRob3VnaCB0aGVyZSBhcmUgZml2ZSBkaWZmZXJlbnQgc2hhcGVzOiBpbnNldCAodGVybSB1c2VkIGZvciByZWN0YW5nbGUpLCBjaXJjbGUsXG4gICAgICAgIC8vICAgICAgICAgIGVsbGlwc2UsIHBvbHlnb24sIHBhdGggLSB3ZSB3aWxsIG9ubHkgY29uY2VybiBvdXJzZWx2ZXMgd2l0aCBpbnNldFxuICAgICAgICAvLyAgICAgIFRoZXJlIGFyZSA3IGJveCB2YWx1ZXM6IG1hcmdpbi1ib3gsIGJvcmRlci1ib3gsIHBhZGRpbmctYm94LCBjb250ZW50LWJveCwgZmlsbC1ib3gsIHN0cm9rZS1ib3gsIHZpZXctYm94XG4gICAgICAgIC8vICAgICAgQm94IGFuZCBzaGFwZSB2YWx1ZXMgbWF5IGJlIGNvbWJpbmVkOiBjbGlwLXBhdGg6IHBhZGRpbmctYm94IGNpcmNsZSg1MHB4IGF0IDAgMTAwcHgpO1xuICAgICAgICAvLyAgICAgIE5PVEU6IHRoZSBib3ggdmFsdWVzIGFyZSBOT1QgaW50dWl0aXZlLCBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2hhcGVzL0Zyb21fYm94X3ZhbHVlcyNtYXJnaW4tYm94XG4gICAgICAgIC8vICAgICAgXG4gICAgICAgIC8vICAgICAgU28gdGhlIGtleSBxdWVzdGlvbiBpcyB3aGF0IGFtb3VudCBvZiBlZmZvcnQgZG8gd2Ugd2FudCB0byBpbnZlc3QgaW50byBjbGlwLXBhdGhcbiAgICAgICAgLy8gXG5cbiAgICAgICAgLy8gSkNIIGRvbid0IGRvIGNsaXAtcGF0aCBub3cgXG4gICAgICAgIGxldCBjbGlwUGF0aEhlaWdodCA9IC0xO1xuICAgICAgICAvLyBpZiAoc3R5bGUuY2xpcFBhdGggIT09IFwiYXV0b1wiKSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoID0gXCIsc3R5bGUuY2xpcFBhdGgpO1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJzdHlsZS5jbGlwUGF0aC50b1N0cmluZyA9IFwiLHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCkpO1xuICAgICAgICAvLyAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwUGF0aC50b1N0cmluZygpO1xuICAgICAgICAvLyAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJpbnNldFwiKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciByZUJyYWNrZXRzID0gL1xcKCguKilcXCkvZztcbiAgICAgICAgLy8gICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgLy8gICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmRBcnIgPSBmb3VuZFsxXS5zcGxpdCgnICcpO1xuICAgICAgICAvLyAgICAgICBmb3IgKGxldCBpPTA7IGk8Zm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAvLyAgICAgICAgIGxpc3RPZlRleHQucHVzaChmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgIH07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgIC8vIGNsaXBQYXRoSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlwUGF0aEhlaWdodCA9IFwiLCBjbGlwUGF0aEhlaWdodCk7XG5cbiAgICAgICAgLy8gaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgc3R5bGUuY2xpcCA9PT0gXCJyZWN0KDBweCwgMHB4LCAwcHgsIDBweClcIiAmJiBzdHlsZS5vdmVyZmxvdyAhPT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgLy8gSkNIIGFyYml0cmFyaWx5IHVzZSBsZXNzIHRoYXQgN3B4IGZvciBjbGlwSGVpZ2h0XG4gICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiICYmIGNsaXBIZWlnaHQgPCA3ICYmIGNsaXBIZWlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVCBiZWNhdXNlIHRvbyBzbWFsbFwiKTtcbiAgICAgICAgICAgIC8vIENvcm5lciBjYXNlIHdoZXJlIGl0ZW0gaXMgaGlkZGVuIChhY2Nlc3NpYmlsaXR5IGhpZGluZyB0ZWNobmlxdWUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRmlyc3QgZGV0ZXJtaW5lIHRoZSBjb2xvciBjb250cmFzdCByYXRpb1xuICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKGVsZW0pO1xuICAgICAgICBpZiAoY29sb3JDb21ibyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy9zb21lIGV4Y2VwdGlvbiBvY2N1cnJlZCwgb3Igbm90IGFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBlbGVtZW50OiBcIiArIGVsZW0ubm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmZyA9IGNvbG9yQ29tYm8uZmc7XG4gICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgIGxldCByYXRpbyA9IGZnLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICBsZXQgd2VpZ2h0ID0gZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlLmZvbnRXZWlnaHQpO1xuICAgICAgICBsZXQgc2l6ZSA9IGdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmF0aW8gPj0gNC41IHx8IChyYXRpbyA+PSAzICYmIGlzTGFyZ2VTY2FsZSk7XG4gICAgICAgIGxldCBoYXNCYWNrZ3JvdW5kID0gY29sb3JDb21iby5oYXNCR0ltYWdlIHx8IGNvbG9yQ29tYm8uaGFzR3JhZGllbnQ7XG4gICAgICAgIGxldCB0ZXh0U2hhZG93ID0gY29sb3JDb21iby50ZXh0U2hhZG93O1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQoZWxlbSk7XG4gICAgICAgIGlmICghaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBSUFRVdGlsLmdldENvbnRyb2xPZkxhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gUlBUVXRpbC5pc05vZGVEaXNhYmxlZChjb250cm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIG5vZGVOYW1lID09PSAnbGFiZWwnICYmIFJQVFV0aWwuaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW0pKSB7XG4gICAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaXNhYmxlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBSUFRVdGlsLmlzRGlzYWJsZWRCeVJlZmVycmluZ0VsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiRVhUX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIiwge1xuICAgICAgICAgICAgXCJyYXRpb1wiOiByYXRpbyxcbiAgICAgICAgICAgIFwiaXNMYXJnZVNjYWxlXCI6IGlzTGFyZ2VTY2FsZSxcbiAgICAgICAgICAgIFwid2VpZ2h0XCI6IHdlaWdodCxcbiAgICAgICAgICAgIFwic2l6ZVwiOiBzaXplLFxuICAgICAgICAgICAgXCJoYXNCYWNrZ3JvdW5kXCI6IGhhc0JhY2tncm91bmQsXG4gICAgICAgICAgICBcImlzRGlzYWJsZWRcIjogaXNEaXNhYmxlZFxuICAgICAgICB9KTsqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgZWxlbWVudCBvciBwYXJlbnQgaXMgZGlzYWJsZWQsIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSAoYnV0IG1heSBiZSAzOjEgaW4gZnV0dXJlKVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCBvbiBhbiBpbWFnZSBvciBncmFkaWVudCBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgdGV4dCBsb2NhdGlvbiBvbiB0aGUgZ3JhZGllbnQgb3IgaW1hZ2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dFNoYWRvdykge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCB3aXRoIHNoYWRvdyBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgc2hhZG93IGVmZmZlY3RzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfdGV4dF9zaGFkb3dcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZnLnRvSGV4KCkgPT09IGJnLnRvSGV4KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfc2FtZV9jb2xvclwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGV4dF9zZW5zb3J5X21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keSwgZG9tOmJvZHkgZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9UZXh0X1NlbnNvcnlSZWZlcmVuY2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSWYgdGhlIHdvcmQocykgJ3swfScgaXMgcGFydCBvZiBpbnN0cnVjdGlvbnMgZm9yIHVzaW5nIHBhZ2UgY29udGVudCwgY2hlY2sgaXQgaXMgc3RpbGwgdW5kZXJzdGFuZGFibGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIG9yIHNoYXBlIGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW5zdHJ1Y3Rpb25zIG11c3QgYmUgbWVhbmluZ2Z1bCB3aXRob3V0IHNoYXBlIG9yIGxvY2F0aW9uIHdvcmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNlbnNvcnlUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInRvcC1sZWZ0XCIsIFwidG9wLXJpZ2h0XCIsIFwiYm90dG9tLXJpZ2h0XCIsIFwiYm90dG9tLWxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyb3VuZFwiLCBcInNxdWFyZVwiLCBcInNoYXBlXCIsIFwicmVjdGFuZ2xlXCIsIFwidHJpYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJhYm92ZVwiLCBcImJlbG93XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidXBwZXJcIiwgXCJsb3dlclwiLCBcImNvcm5lclwiLCBcImJlc2lkZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBub2RlTmFtZSBvZiB0aGUgY29udGV4dCBub2RlXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBpcyBhIHN0eWxlIG9yIGxpbmsgZWxlbWVudCwgc2tpcCB0cmlnZ2VyaW5nIHJ1bGUgYXMgd2UgZG8gbm90IHdhbnQgdG8gc2NhblxuICAgICAgICAvLyBDU1MgZm9yIHNlbnNvcnkgd29yZHMsIGFzIHRoZXJlIGNhbiBiZSBDU1Mga2V5cyB3aGljaCBjb250YWluIHRoZXNlcyBzZW5zb3J5IHRleHQgdGhhdCBpcyBtYXRjaGluZy5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIgfHwgbm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0QXJyYXkgPSBudWxsO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgbGV0IHNlbnNvcnlSZWdleCA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLCBudWxsKTtcbiAgICAgICAgaWYgKHNlbnNvcnlSZWdleCA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtcy5zZW5zb3J5VGV4dC52YWx1ZTtcbiAgICAgICAgICAgIGxldCByZWdleFN0ciA9IFwiKFwiICsgc2Vuc29yeVRleHRbMF07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKVxuICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9IFwifFwiICsgc2Vuc29yeVRleHRbal07XG4gICAgICAgICAgICByZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLCBzZW5zb3J5UmVnZXgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0QXJyYXkgPSB0eHRWYWwubWF0Y2goc2Vuc29yeVJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpb2xhdGVkdGV4dEFycmF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge30sIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4ZW1wdFdvcmRzID0gW1wicmlnaHQtY2xpY2tcIiwgXCJsZWZ0LWNsaWNrXCIsIFwicmlnaHQtY2xpY2tpbmdcIiwgXCJyaWdodC1jbGlja3NcIiwgXCJsZWZ0LWNsaWNraW5nXCIsIFwibGVmdC1jbGlja3NcIl07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHNwbGl0KC9bXFxuXFxyIF0rLykgd2lsbCBzcHJlYWQgdGhlIHN0cmluZyBpbnRvIGdyb3VwIG9mIHdvcmRzIHVzaW5nIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmVmZWVkIGFzIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRzID0gdHh0VmFsLnNwbGl0KC9bXFxuXFxyIF0rLykucmVkdWNlKGZ1bmN0aW9uIChtYXAsIHdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vuc29yeVRleHRBcnIgPSB2YWxpZGF0ZVBhcmFtcy5zZW5zb3J5VGV4dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZFdvVHJhaWxpbmdQdW5jID0gd29yZC5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXSskLywgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgc2Vuc29yeVRleHRBcnIubGVuZ3RoOyBjb3VudGVyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBsY1dvcmRXb1B1bmMuaW5kZXhPZihzZW5zb3J5VGV4dEFycltjb3VudGVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiID0gZXhlbXB0V29yZHMuaW5kZXhPZihsY1dvcmRXb1B1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vuc29yeVdvcmRMZW4gPSBzZW5zb3J5VGV4dEFycltjb3VudGVyXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyRm9sbG93U2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KHNlbnNvcnlXb3JkTGVuICsgYSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2NlZWQgdG8gdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gZm9yIG5leHQgc2Vuc29yeVRleHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhIDwgMCkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1B1bmNmb2xsb3dpbmcgPSAoKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXD8nKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcKCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcKScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCcnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFxcXCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXScpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNQdW5jUHJlY2VkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KGEgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHVuY1ByZWNlZGluZyA9ICgoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw/JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOicpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXDsnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwnJykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnLlxcYCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChsY1dvcmRXb1B1bmMubGVuZ3RoID09IHNlbnNvcnlXb3JkTGVuKSB8fCAoaXNQdW5jZm9sbG93aW5nID09IHRydWUpIHx8IChpc1B1bmNQcmVjZWRpbmcgPT0gdHJ1ZSkpICYmIChiIDwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KHdvcmRXb1RyYWlsaW5nUHVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHdvcmRXb1RyYWlsaW5nUHVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRlZHRleHQgPSByZXN1bHQuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCIsIFwic2NyaXB0XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IChjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbdmlvbGF0ZWR0ZXh0XSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMsIGdldENvbXB1dGVkU3R5bGUsIGNvbnZlcnRWYWx1ZTJQaXhlbHMgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGV4dF9zcGFjaW5nX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfc3BhY2luZ192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkNTUyAhaW1wb3J0YW50IGlzIG5vdCB1c2VkIGluIGlubGluZSBzdHlsZSB0byBjb250cm9sIGxldHRlciBvciB3b3JkIHNwYWNpbmcgb3IgbGluZSBoZWlnaHRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJhsZXR0ZXItc3BhY2luZ+KAmSBzdHlsZVwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYd29yZC1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxpbmUtaGVpZ2h04oCZIHN0eWxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFtdLCAvLyBSZW1vdmUgZnJvbSBydWxlc2V0cyB0ZW1wb3JhcnkgLSBwZXJmb3JtYW5jZSBpc3N1ZVxuICAgIC8vIHJ1bGVzZXRzOiBbe1xuICAgIC8vICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAvLyAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgIC8vICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAvLyAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIC8vIH1dLFxuICAgIGFjdDpbJzllNDVlYycsICcyNGFmYzInLCAnNzhmZDMyJ10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBib3VuZHMgPSBjb250ZXh0W1wiZG9tXCJdLmJvdW5kcztcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgbm8taHRtbCBlbGVtZW50XG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgY2hpbGRyZW4gd2l0aCBhY3R1YWwgdGV4dC5cbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFN0ciArPSBjaGlsZE5vZGVzW2ldLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRTdHIudHJpbSgpLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9mb250IHNpemUgYWx3YXlzIHJlc29sdmVkIHRvICdweCcgICAgXG4gICAgICAgIGNvbnN0IGZvbnRfc2l6ZV9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpO1xuICAgICAgICBsZXQgZm9udF9zaXplID0gcGFyc2VGbG9hdChmb250X3NpemVfc3R5bGUpOyBcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVzKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vbm90ZSB0aGF0IENTUyB1bml0IGlzIHJlcXVpcmVkIGZvciBub24temVybyB2YWx1ZXMsIG90aGVyd2lzZSBpdCdzIGlnbm9yZWRcbiAgICAgICAgbGV0IHJldCA9IFtdOyBcbiAgICAgICAgLy8gbWF0Y2hlZCBzdHJpbmc6IG9yaWdpbmFsIHN0eWxlLCB0aGUgc3R5bGUgdmFsdWUgYW5kIHVuaXRcbiAgICAgICAgY29uc3QgcmVnZXggPSAvKC0/W1xcZC5dKykoW2EteiVdKikvO1xuICAgICAgICBsZXQgd29yZF9zdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkX3N0eWxlKSB7XG4gICAgICAgICAgICBpZiAod29yZF9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgd29yZF9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2xvc2V0IGFuY2VzdG9yJ3Mgd29yZC1zcGFjaW5nXG4gICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwge1wid29yZC1zcGFjaW5nXCI6IFtcIipcIl19LCBbJ2luaGVyaXQnLCAndW5zZXQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSBnZXREZWZpbmVkU3R5bGVzKGFuY2VzdG9yKVsnd29yZC1zcGFjaW5nJ107ICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmRfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JkX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KFwid29yZC1zcGFjaW5nXCIpID09PSAnaW1wb3J0YW50Jykge1xuICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSB3b3JkX3N0eWxlLnN1YnN0cmluZygwLCB3b3JkX3N0eWxlLmxlbmd0aCAtIFwiIWltcG9ydGFudFwiLmxlbmd0aCAtMSk7XG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgc3BhY2UgaXMgMCBmb3IgJ25vcm1hbCcgb3IgJ2luaXRpYWwnLlxuICAgICAgICAgICAgICAgIGlmICh3b3JkX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgd29yZF9zdHlsZSA9PT0gJ25vcm1hbCcpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkU3BhY2luZyA9IHBhcnNlRmxvYXQod29yZF9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4od29yZFNwYWNpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gd29yZF9zdHlsZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFsyXSAhPT0gJycgJiYgcGFyc2VkWzFdICE9PSAwKSB7IC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaXhlbHMgPSBjb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyAhPSBudWxsICYmIHBpeGVscy9mb250X3NpemUgPCAwLjE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgIFxuICAgICAgICB9IFxuXG4gICAgICAgIGxldCBsZXR0ZXJfc3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107IFxuICAgICAgICBpZiAobGV0dGVyX3N0eWxlKSB7XG4gICAgICAgICAgICBpZiAobGV0dGVyX3N0eWxlLnN0YXJ0c1dpdGgoJ2luaGVyaXQnKSB8fCBsZXR0ZXJfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNsb3NldCBhbmNlc3RvcidzIHdvcmQtc3BhY2luZ1xuICAgICAgICAgICAgICAgIGxldCBhbmNlc3RvciA9IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoU3R5bGVzKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQsIHtcImxldHRlci1zcGFjaW5nXCI6IFtcIipcIl19LCBbJ2luaGVyaXQnLCAndW5zZXQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldHRlcl9zdHlsZSA9IGdldERlZmluZWRTdHlsZXMoYW5jZXN0b3IpWydsZXR0ZXItc3BhY2luZyddOyAgXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZXR0ZXJfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJfc3R5bGUgPSBcImluaXRpYWxcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShcImxldHRlci1zcGFjaW5nXCIpID09PSAnaW1wb3J0YW50Jykge1xuICAgICAgICAgICAgICAgIGxldHRlcl9zdHlsZSA9IGxldHRlcl9zdHlsZS5zdWJzdHJpbmcoMCwgbGV0dGVyX3N0eWxlLmxlbmd0aCAtIFwiIWltcG9ydGFudFwiLmxlbmd0aCAtMSk7XG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgc3BhY2UgaXMgMCBmb3IgJ25vcm1hbCcgb3IgJ2luaXRpYWwnLlxuICAgICAgICAgICAgICAgIGlmIChsZXR0ZXJfc3R5bGUgPT09ICdpbml0aWFsJyB8fCBsZXR0ZXJfc3R5bGUgPT09ICdub3JtYWwnKVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgIGVsc2UgeyAgICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IHBhcnNlRmxvYXQobGV0dGVyX3N0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihsZXR0ZXJTcGFjaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZCA9IGxldHRlcl9zdHlsZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFsyXSAhPT0gJycgJiYgcGFyc2VkWzFdICE9PSAwKSB7IC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaXhlbHMgPSBjb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyAhPSBudWxsICYmIHBpeGVscy9mb250X3NpemUgPCAwLjEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICB9IFxuXG4gICAgICAgIGxldCBsaW5lX3N0eWxlID0gc3R5bGVzWydsaW5lLWhlaWdodCddO1xuICAgICAgICBsZXQgb3ZlcmZsb3cgPSB7XCJvdmVyZmxvd1wiOlsnYXV0bycsICdzY3JvbGwnXSwgXCJvdmVyZmxvdy14XCI6WydhdXRvJywgJ3Njcm9sbCddLCBcIm92ZXJmbG93LXlcIjpbJ2F1dG8nLCAnc2Nyb2xsJ119O1xuICAgICAgICBpZiAobGluZV9zdHlsZSAmJiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhydWxlQ29udGV4dCwgb3ZlcmZsb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobGluZV9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgbGluZV9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2xvc2V0IGFuY2VzdG9yJ3Mgd29yZC1zcGFjaW5nXG4gICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwge1wibGluZS1oZWlnaHRcIjogW1wiKlwiXX0sIFsnaW5oZXJpdCcsICd1bnNldCddKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9zdHlsZSA9IGdldERlZmluZWRTdHlsZXMoYW5jZXN0b3IpWydsaW5lLWhlaWdodCddOyAgXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9zdHlsZSA9IFwiaW5pdGlhbFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoXCJsaW5lLWhlaWdodFwiKSA9PT0gJ2ltcG9ydGFudCcpIHtcbiAgICAgICAgICAgICAgICBsaW5lX3N0eWxlID0gbGluZV9zdHlsZS5zdWJzdHJpbmcoMCwgbGluZV9zdHlsZS5sZW5ndGggLSBcIiFpbXBvcnRhbnRcIi5sZW5ndGggLTEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIHNwYWNlIGlzIDAgZm9yICdub3JtYWwnIG9yICdpbml0aWFsJy5cbiAgICAgICAgICAgICAgICBpZiAobGluZV9zdHlsZSA9PT0gJ2luaXRpYWwnIHx8IGxpbmVfc3R5bGUgPT09ICdub3JtYWwnKVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgIGVsc2UgeyAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBwYXJzZUZsb2F0KGxpbmVfc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGxpbmVIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gbGluZV9zdHlsZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFsyXSA9PT0gJycpIHsgLy9saW5lLWhlaWdodCBhcmUgYWxsb3dlZCB1bml0bGVzcyB3aGVuIHRoZSB2YWxpZSBpcyBtdWx0aXBsZSAob3IgZnJhY3Rpb24pIG9mIHRoZSBmb250IHNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkWzFdIDwgMS41KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpeGVscyA9IGNvbnZlcnRWYWx1ZTJQaXhlbHMocGFyc2VkWzJdLCBwYXJzZWRbMV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxzICE9IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDEuNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgXG4gICAgICAgIH0gXG4gICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgXG4gICAgICAgIHJldHVybiBudWxsOyAgLy9pbXBsaWNhYmxlIG9yIGlnbm9yZVxuICAgICAgICBcbiAgICB9ICAgIFxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB3aWRnZXRfdGFiYmFibGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6bGluayxhcmlhOnNwaW5idXR0b24sYXJpYTp0YWJsaXN0LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudSxhcmlhOnJhZGlvZ3JvdXAsYXJpYTp0cmVlLGFyaWE6Y2hlY2tib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOnNjcm9sbGJhcixhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfVGFiYmFibGVcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiZmFpbF9ub190YWJiYWJsZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vIHNraXAgdGhlIGNvdW50IGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKGNvdW50IDwgMSAmJiAhUlBUVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgICAgICB3aGlsZSAoY291bnQgPCAxICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09IDEgJiYgIW53LmJFbmRUYWcgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSBjb3VudCA+PSAxO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbm9fdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB3aWRnZXRfdGFiYmFibGVfc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRhYmxpc3QsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51LGFyaWE6cmFkaW9ncm91cCxhcmlhOnRyZWUsYXJpYTpjaGVja2JveCxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRleHRib3gsYXJpYTpjb2x1bW5oZWFkZXIsYXJpYTpyb3doZWFkZXIsYXJpYTpzbGlkZXIsYXJpYTp0YWJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfTXVsdGlUYWJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcIkNvbXBvbmVudCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNlcnRhaW4gY29tcG9uZW50cyBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy9za2lwIHRoZSBjb3VudCBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChjb3VudCA8IDIgJiYgIVJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgJiYgcnVsZUNvbnRleHQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgMiAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PSAxICYmICFudy5iRW5kVGFnICYmIFJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gY291bnQgPCAyO1xuICAgICAgICBpZiAoIXBhc3NlZClcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIiwgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlc2V0IH0gZnJvbSBcIi4vY2hlY2tlci9DaGVja2VyXCI7XG5pbXBvcnQgeyBlUnVsZUNhdGVnb3J5LCBlUnVsZXNldFR5cGUgfSBmcm9tIFwiLi4vdjIvYXBpL0lFbmdpbmVcIjtcbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmNvbnN0IFNDcyA9IFtdO1xuZm9yIChjb25zdCBrZXkgaW4gU0NVUkxzKSB7XG4gICAgU0NzLnB1c2goU0NVUkxzW2tleV0pO1xufVxuXG5jb25zdCBzdW1tYXJpZXMgPSB7XG4gICAgXCIxLjEuMVwiOiBcIkFsbCBub24tdGV4dCBjb250ZW50IHRoYXQgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBzZXJ2ZXMgdGhlIGVxdWl2YWxlbnQgcHVycG9zZS5cIixcbiAgICBcIjEuMi4xXCI6IFwiRm9yIHByZXJlY29yZGVkIGF1ZGlvLW9ubHkgb3IgdmlkZW8tb25seSBtZWRpYSwgYW4gYWx0ZXJuYXRpdmUgcHJvdmlkZXMgZXF1aXZhbGVudCBpbmZvcm1hdGlvbi5cIixcbiAgICBcIjEuMi4yXCI6IFwiQ2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBhbGwgcHJlcmVjb3JkZWQgYXVkaW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuM1wiOiBcIkFuIGFsdGVybmF0aXZlIGZvciB0aW1lLWJhc2VkIG1lZGlhIG9yIGF1ZGlvIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVyZWNvcmRlZCB2aWRlbyBjb250ZW50IGlzIHByb3ZpZGVkIGZvciBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuNFwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIGxpdmUgYXVkaW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuNVwiOiBcIkF1ZGlvIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGZvciBhbGwgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjMuMVwiOiBcIkluZm9ybWF0aW9uLCBzdHJ1Y3R1cmUsIGFuZCByZWxhdGlvbnNoaXBzIGNvbnZleWVkIHRocm91Z2ggcHJlc2VudGF0aW9uIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgb3IgYXJlIGF2YWlsYWJsZSBpbiB0ZXh0LlwiLFxuICAgIFwiMS4zLjJcIjogXCJXaGVuIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCBjb250ZW50IGlzIHByZXNlbnRlZCBhZmZlY3RzIGl0cyBtZWFuaW5nLCBhIGNvcnJlY3QgcmVhZGluZyBzZXF1ZW5jZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMS4zLjNcIjogXCJJbnN0cnVjdGlvbnMgcHJvdmlkZWQgZm9yIHVuZGVyc3RhbmRpbmcgYW5kIG9wZXJhdGluZyBjb250ZW50IGRvIG5vdCByZWx5IHNvbGVseSBvbiBzZW5zb3J5IGNoYXJhY3RlcmlzdGljcyBvZiBjb21wb25lbnRzIHN1Y2ggYXMgc2hhcGUsIHNpemUsIHZpc3VhbCBsb2NhdGlvbiwgb3JpZW50YXRpb24sIG9yIHNvdW5kLlwiLFxuICAgIFwiMS4zLjRcIjogXCJDb250ZW50IGRvZXMgbm90IHJlc3RyaWN0IGl0cyB2aWV3IGFuZCBvcGVyYXRpb24gdG8gYSBzaW5nbGUgZGlzcGxheSBvcmllbnRhdGlvbiwgc3VjaCBhcyBwb3J0cmFpdCBvciBsYW5kc2NhcGUuXCIsXG4gICAgXCIxLjMuNVwiOiBcIlRoZSBwdXJwb3NlIG9mIGVhY2ggaW5wdXQgZmllbGQgdGhhdCBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHdoZW4gdGhlIGZpZWxkIHNlcnZlcyBhIGNvbW1vbiBwdXJwb3NlLlwiLFxuICAgIFwiMS40LjFcIjogXCJDb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uLCBpbmRpY2F0aW5nIGFuIGFjdGlvbiwgcHJvbXB0aW5nIGEgcmVzcG9uc2UsIG9yIGRpc3Rpbmd1aXNoaW5nIGEgdmlzdWFsIGVsZW1lbnQuXCIsXG4gICAgXCIxLjQuMlwiOiBcIklmIGFueSBhdWRpbyBwbGF5cyBhdXRvbWF0aWNhbGx5IGZvciBtb3JlIHRoYW4gMyBzZWNvbmRzLCBlaXRoZXIgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIHBhdXNlIG9yIHN0b3AgdGhlIGF1ZGlvLCBvciBhIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgdG8gY29udHJvbCBhdWRpbyB2b2x1bWUgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBvdmVyYWxsIHN5c3RlbSB2b2x1bWUgbGV2ZWwuXCIsXG4gICAgXCIxLjQuM1wiOiBcIlRoZSB2aXN1YWwgcHJlc2VudGF0aW9uIG9mIHRleHQgYW5kIGltYWdlcyBvZiB0ZXh0IGhhcyBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDQuNToxLCB3aXRoIGEgMzoxIHJhdGlvIGZvciBsYXJnZS1zY2FsZSB0ZXh0LlwiLFxuICAgIFwiMS40LjRcIjogXCJUZXh0IGNhbiBiZSByZXNpemVkIHdpdGhvdXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgdXAgdG8gMjAwIHBlcmNlbnQgd2l0aG91dCBsb3NzIG9mIGNvbnRlbnQgb3IgZnVuY3Rpb25hbGl0eS5cIixcbiAgICBcIjEuNC41XCI6IFwiSWYgdGhlIHRlY2hub2xvZ2llcyBiZWluZyB1c2VkIGNhbiBhY2hpZXZlIHRoZSB2aXN1YWwgcHJlc2VudGF0aW9uLCB0ZXh0IHNob3VsZCBub3QgYmUgdXNlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gcmF0aGVyIHRoYW4gaW1hZ2VzIG9mIHRleHQuXCIsXG4gICAgXCIxLjQuMTBcIjogXCJDb250ZW50IGNhbiByZWZsb3cgd2l0aG91dCBsb3NzIG9mIGluZm9ybWF0aW9uIG9yIGZ1bmN0aW9uYWxpdHksIGFuZCB3aXRob3V0IHJlcXVpcmluZyBzY3JvbGxpbmcgaW4gdHdvIGRpbWVuc2lvbnMuXCIsXG4gICAgXCIxLjQuMTFcIjogXCJUaGUgcGFydHMgb2YgZ3JhcGhpY2FsIG9iamVjdHMgcmVxdWlyZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGVudCwgYW5kIHRoZSB2aXN1YWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaWRlbnRpZnkgVUkgY29tcG9uZW50cyBhbmQgc3RhdGVzLCBoYXZlIGEgY29udHJhc3QgcmF0aW8gb2YgYXQgbGVhc3QgMzoxIGFnYWluc3QgYWRqYWNlbnQgY29sb3JzLlwiLFxuICAgIFwiMS40LjEyXCI6IFwiTm8gbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkgb2NjdXJzIHdoZW4gdXNlcnMgY2hhbmdlIGxldHRlciwgd29yZCBhbmQgcGFyYWdyYXBoIHNwYWNpbmcsIGFzIHdlbGwgYXMgbGluZSBoZWlnaHQuXCIsXG4gICAgXCIxLjQuMTNcIjogXCJXaGVyZSBob3ZlciBvciBmb2N1cyBhY3Rpb25zIGNhdXNlIGFkZGl0aW9uYWwgY29udGVudCB0byBiZWNvbWUgdmlzaWJsZSBhbmQgaGlkZGVuLCB0aGUgYWRkaXRpb25hbCBjb250ZW50IGlzIGRpc21pc3NhYmxlLCBob3ZlcmFibGUgYW5kIHBlcnNpc3RlbnQuXCIsXG4gICAgXCIyLjEuMVwiOiBcIkFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBjb250ZW50IGlzIG9wZXJhYmxlIHRocm91Z2ggYSBrZXlib2FyZCBpbnRlcmZhY2Ugd2l0aG91dCByZXF1aXJpbmcgc3BlY2lmaWMgdGltaW5ncyBmb3IgaW5kaXZpZHVhbCBrZXlzdHJva2VzLlwiLFxuICAgIFwiMi4xLjJcIjogXCJJZiBrZXlib2FyZCBmb2N1cyBjYW4gYmUgbW92ZWQgdG8gYSBjb21wb25lbnQgdXNpbmcgYSBrZXlib2FyZCBpbnRlcmZhY2UsIHRoZW4gZm9jdXMgY2FuIGJlIG1vdmVkIGF3YXkgZnJvbSB0aGF0IGNvbXBvbmVudCB1c2luZyBvbmx5IGEga2V5Ym9hcmQgaW50ZXJmYWNlLCBhbmQsIGlmIGl0IHJlcXVpcmVzIG1vcmUgdGhhbiB1bm1vZGlmaWVkIGFycm93IG9yIHRhYiBrZXlzIG9yIG90aGVyIHN0YW5kYXJkIGV4aXQgbWV0aG9kcywgdGhlIHVzZXIgaXMgYWR2aXNlZCBvZiB0aGUgbWV0aG9kIGZvciBtb3ZpbmcgZm9jdXMgYXdheS5cIixcbiAgICBcIjIuMS40XCI6IFwiSWYgYSBrZXlib2FyZCBzaG9ydGN1dCBpcyBpbXBsZW1lbnRlZCB1c2luZyBvbmx5IGxldHRlciwgcHVuY3R1YXRpb24sIG51bWJlciBvciBzeW1ib2wgY2hhcmFjdGVycywgdGhlbiB0aGUgc2hvcnRjdXQgY2FuIGJlIHR1cm5lZCBvZmYsIHJlbWFwcGVkIG9yIGFjdGl2YXRlZCBvbmx5IG9uIGZvY3VzLlwiLFxuICAgIFwiMi4yLjFcIjogXCJGb3IgZWFjaCB0aW1lIGxpbWl0IHRoYXQgaXMgc2V0IGJ5IHRoZSBjb250ZW50LCB0aGUgdXNlciBjYW4gdHVybiBvZmYsIGFkanVzdCwgb3IgZXh0ZW5kIHRoZSBsaW1pdC5cIixcbiAgICBcIjIuMi4yXCI6IFwiRm9yIG1vdmluZywgYmxpbmtpbmcsIHNjcm9sbGluZywgb3IgYXV0by11cGRhdGluZyBpbmZvcm1hdGlvbiwgdGhlIHVzZXIgY2FuIHBhdXNlLCBzdG9wLCBoaWRlIG9yIGFkanVzdCB0aGUgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIyLjMuMVwiOiBcIkNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyB0aGF0IGZsYXNoZXMgbW9yZSB0aGFuIHRocmVlIHRpbWVzIGluIGFueSBvbmUgc2Vjb25kIHBlcmlvZCwgb3IgdGhlIGZsYXNoIGlzIGJlbG93IHRoZSBnZW5lcmFsIGZsYXNoIGFuZCByZWQgZmxhc2ggdGhyZXNob2xkcy5cIixcbiAgICBcIjIuNC4xXCI6IFwiQSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXMuXCIsXG4gICAgXCIyLjQuMlwiOiBcIldlYiBwYWdlcywgbm9uLXdlYiBkb2N1bWVudHMsIGFuZCBzb2Z0d2FyZSBoYXZlIHRpdGxlcyB0aGF0IGRlc2NyaWJlIHRvcGljIG9yIHB1cnBvc2UuXCIsXG4gICAgXCIyLjQuM1wiOiBcIklmIGNvbnRlbnQgY2FuIGJlIG5hdmlnYXRlZCBzZXF1ZW50aWFsbHkgYW5kIHRoZSBuYXZpZ2F0aW9uIHNlcXVlbmNlcyBhZmZlY3QgbWVhbmluZyBvciBvcGVyYXRpb24sIGZvY3VzYWJsZSBjb21wb25lbnRzIHJlY2VpdmUgZm9jdXMgaW4gYW4gb3JkZXIgdGhhdCBwcmVzZXJ2ZXMgbWVhbmluZyBhbmQgb3BlcmFiaWxpdHkuXCIsXG4gICAgXCIyLjQuNFwiOiBcIlRoZSBwdXJwb3NlIG9mIGVhY2ggbGluayBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsaW5rIHRleHQgYWxvbmUgb3IgZnJvbSB0aGUgbGluayB0ZXh0IHRvZ2V0aGVyIHdpdGggaXRzIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCBsaW5rIGNvbnRlbnQuXCIsXG4gICAgXCIyLjQuNVwiOiBcIk1vcmUgdGhhbiBvbmUgd2F5IGlzIGF2YWlsYWJsZSB0byBsb2NhdGUgYSBXZWIgcGFnZSB3aXRoaW4gYSBzZXQgb2YgV2ViIHBhZ2VzLCBleGNlcHQgd2hlcmUgdGhlIFdlYiBQYWdlIGlzIHRoZSByZXN1bHQgb2YsIG9yIGEgc3RlcCBpbiwgYSBwcm9jZXNzLlwiLFxuICAgIFwiMi40LjZcIjogXCJIZWFkaW5ncyBhbmQgbGFiZWxzIGRlc2NyaWJlIHRvcGljIG9yIHB1cnBvc2UuXCIsXG4gICAgXCIyLjQuN1wiOiBcIkFueSBrZXlib2FyZCBvcGVyYWJsZSB1c2VyIGludGVyZmFjZSBoYXMgYSBtb2RlIG9mIG9wZXJhdGlvbiB3aGVyZSB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUuXCIsXG4gICAgXCIyLjUuMVwiOiBcIkFsbCBmdW5jdGlvbmFsaXR5IHRoYXQgdXNlcyBtdWx0aXBvaW50IG9yIHBhdGgtYmFzZWQgZ2VzdHVyZXMgZm9yIG9wZXJhdGlvbiBjYW4gYmUgb3BlcmF0ZWQgd2l0aCBhIHNpbmdsZSBwb2ludGVyIHdpdGhvdXQgYSBwYXRoLWJhc2VkIGdlc3R1cmUuXCIsXG4gICAgXCIyLjUuMlwiOiBcIkZvciBmdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIHVzaW5nIGEgc2luZ2xlIHBvaW50ZXIsIGNvbXBsZXRpb24gb2YgdGhlIGZ1bmN0aW9uIGlzIG9uIHRoZSB1cC1ldmVudCB3aXRoIGFuIGFiaWxpdHkgdG8gYWJvcnQsIHVuZG8gb3IgcmV2ZXJzZSB0aGUgb3V0Y29tZS5cIixcbiAgICBcIjIuNS4zXCI6IFwiRm9yIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgd2l0aCBsYWJlbHMgdGhhdCBpbmNsdWRlIHRleHQgb3IgaW1hZ2VzIG9mIHRleHQsIHRoZSBhY2Nlc3NpYmxlIG5hbWUgY29udGFpbnMgdGhlIHRleHQgdGhhdCBpcyBwcmVzZW50ZWQgdmlzdWFsbHkuXCIsXG4gICAgXCIyLjUuNFwiOiBcIkZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgb3BlcmF0ZWQgYnkgbW90aW9uIGNhbiBhbHNvIGJlIG9wZXJhdGVkIGJ5IHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMsIGFuZCB0aGUgbW90aW9uIHRyaWdnZXIgY2FuIGJlIGRpc2FibGVkLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCI0LjEuMVwiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgZWxlbWVudHMgaGF2ZSBjb21wbGV0ZSBzdGFydCBhbmQgZW5kIHRhZ3MsIGVsZW1lbnRzIGFyZSBuZXN0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb25zLCBlbGVtZW50cyBkbyBub3QgY29udGFpbiBkdXBsaWNhdGUgYXR0cmlidXRlcywgYW5kIGFueSBJRHMgYXJlIHVuaXF1ZSwgZXhjZXB0IHdoZXJlIHRoZSBzcGVjaWZpY2F0aW9ucyBhbGxvdyB0aGVzZSBmZWF0dXJlcy5cIixcbiAgICBcIjQuMS4yXCI6IFwiRm9yIGFsbCB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZm9ybSBlbGVtZW50cywgbGlua3MgYW5kIGNvbXBvbmVudHMgZ2VuZXJhdGVkIGJ5IHNjcmlwdHMpLCB0aGUgbmFtZSBhbmQgcm9sZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkOyBzdGF0ZXMsIHByb3BlcnRpZXMsIGFuZCB2YWx1ZXMgdGhhdCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IHNldDsgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIHRvIHRoZXNlIGl0ZW1zIGlzIGF2YWlsYWJsZSB0byB1c2VyIGFnZW50cywgaW5jbHVkaW5nIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMuXCIsXG4gICAgXCI0LjEuM1wiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgc3RhdHVzIG1lc3NhZ2VzIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgdGhyb3VnaCByb2xlIG9yIHByb3BlcnRpZXMgc3VjaCB0aGF0IHRoZXkgY2FuIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHdpdGhvdXQgcmVjZWl2aW5nIGZvY3VzLlwiLFxufVxuXG5leHBvcnQgbGV0IGExMXlSdWxlc2V0czogUnVsZXNldFtdID0gW1xuICAgIC8vIHtcbiAgICAvLyAgICAgaWQ6IFwiREVCVUdcIixcbiAgICAvLyAgICAgbmFtZTogXCJERUJVRyBSdWxlc1wiLFxuICAgIC8vICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgIC8vICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgZGVidWdnaW5nXCIsXG4gICAgLy8gICAgIGNoZWNrcG9pbnRzOiBbe1xuICAgIC8vICAgICAgICAgbnVtOiBcIjFcIixcbiAgICAvLyAgICAgICAgIG5hbWU6IFwiRGVidWcgQ1AgMVwiLFxuICAgIC8vICAgICAgICAgd2NhZ0xldmVsOiBcIkFcIixcbiAgICAvLyAgICAgICAgIHN1bW1hcnk6IFwiUnVsZXMgZm9yIERlYnVnXCJcbiAgICAvLyAgICAgfV1cbiAgICAvLyB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiRVhURU5TSU9OU1wiLFxuICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBSdWxlc1wiLFxuICAgICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgZW5hYmxpbmcgdGhlIGJyb3dzZXIgZXh0ZW5zaW9uc1wiLFxuICAgICAgICB0eXBlOiBlUnVsZXNldFR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eVwiLFxuICAgICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQUEgcGx1cyBhZGRpdGlvbmFsIElCTSBjaGVja2xpc3Qgc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzFcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMSAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBXQ0FHIDIuMSBBQS4gVGhpcyBpcyB0aGUgY3VycmVudCBXM0MgcmVjb21tZW5kYXRpb24uIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMSBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4wLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMFwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4wIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVSdWxlQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEFBLiBSZWZlcmVuY2VkIGJ5IFVTIFNlY3Rpb24gNTA4LCBidXQgbm90IHRoZSBsYXRlc3QgVzNDIHJlY29tbWVuZGF0aW9uLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9XG5dXG5cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudHlwZSBQc2V1ZG9DbGFzcyA9IFwiOmhvdmVyXCIgfCBcIjphY3RpdmVcIiB8IFwiOmZvY3VzXCIgfCBcIjpmb2N1cy12aXNpYmxlXCIgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoc2VsZWN0b3IudHJpbSgpID09PSBcIlwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5tYXRjaGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5tYXRjaGVzU2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOYXRpdmUgZnVuY3Rpb25zIG5vdCB0aGVyZSwgZmFsbGJhY2tcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAoZWxlbWVudC5kb2N1bWVudCB8fCBlbGVtZW50Lm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBtYXRjaGVzLmxlbmd0aCAmJiBtYXRjaGVzW2ldICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgICArK2k7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaSA8IG1hdGNoZXMubGVuZ3RoO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBCYWQgc2VsZWN0b3I/IERvZXNuJ3QgbWF0Y2ggdGhlbi4uLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAqIEBwYXJhbSBlbGVtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICBjb25zdCBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3Qgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0eWxlIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudFxuICogXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgY29tcHV0ZWQgc3R5bGUgaW4gdGhhdCB0aGUgY29tcHV0ZWQgc3R5bGUgd2lsbCByZXR1cm5cbiAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gKiBhcHBsaWNhdGlvblxuICogaWYgcm90YXRpb24gdHJhbnNmb3JtIGlzIHVzZWQsIHRoZSBjb21wdXRlZCBzdHlsZSByZXR1cm5zIHRoZSByZXNvbHZlZCBtYXRyaXhcbiAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKSBcbiAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKScgXG4gKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJyAgXG4gKiBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAqIHRoYW4gd2hlbiB0aGUgcHNldWRvQ2xhc3MgZG9lcyBub3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZpbmVkU3R5bGVzKGVsZW06IEhUTUxFbGVtZW50LCBwc2V1ZG9DbGFzcz86IFBzZXVkb0NsYXNzKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJGdW5jdGlvbjogZ2V0RGVmaW5lZFN0eWxlc1wiKTtcbiAgICBsZXQgZGVmaW5lZFN0eWxlcyA9IHt9XG4gICAgbGV0IGRlZmluZWRTdHlsZVBzZXVkbyA9IHt9XG5cbiAgICBmdW5jdGlvbiBmaWxsU3R5bGUobWFwcywgc3R5bGUpIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4PTA7IHNJbmRleCA8IHN0eWxlLmxlbmd0aDsgKytzSW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChzdHlsZVtzSW5kZXhdID09PSBcImFsbFwiICYmIHN0eWxlW3N0eWxlW3NJbmRleF1dKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtYXBba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVbc0luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSBpbiBtYXAgJiYgbWFwW2tleV0uZW5kc1dpdGgoXCIhaW1wb3J0YW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5ID09PSAnaW1wb3J0YW50JyAmJiAhbWFwW2tleV0uc3RhcnRzV2l0aChcImluaGVyaXRcIikgJiYgIW1hcFtrZXldLnN0YXJ0c1dpdGgoXCJ1bnNldFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL292ZXJyaWRlICFpbXBvcnRhbnQgb25seSBpZiBpdCBpcyBhbHNvICFpbXBvcnRhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlICFpbXBvcnRhbnQgaWYgaXQgaXMgbm90ICFpbXBvcnRhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NyZWF0ZS9vdmVyaWRlIGFueXdheVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSBzdHlsZVtrZXldICsgKHByaW9yaXR5ID09PSAnaW1wb3J0YW50JyA/IFwiICFpbXBvcnRhbnRcIiA6IFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gICAgXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgZm9yIChsZXQgc3NJbmRleCA9IDA7IHNzSW5kZXggPCBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5jc3NSdWxlcykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiR290IHNoZWV0XCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJHb3QgcnVsZTogXCIsIHNoZWV0LmNzc1J1bGVzW3JJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlID0gc2hlZXQuY3NzUnVsZXNbckluZGV4XSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxSdWxlU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBzZXVkb01hdGNoID0gZnVsbFJ1bGVTZWxlY3Rvci5tYXRjaCgvXiguKikoOlthLXpBLVotXSopJC8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFBzZXVkbyA9IGhhc1BzZXVkb0NsYXNzID8gcHNldWRvTWF0Y2hbMl0gOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FtZVBzZXVkb0NsYXNzID0gc2VsUHNldWRvID09PSBwc2V1ZG9DbGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9DbGFzcyAmJiBwc2V1ZG9DbGFzcyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZSgvKFsgPl1bXit+ID5dKyk6Zm9jdXMtd2l0aGluL2csIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBzdHlsZXMgb2Ygbm9uLXBzZXVkbyBzZWxlY3RvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzUHNldWRvQ2xhc3MgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZShbZGVmaW5lZFN0eWxlcywgZGVmaW5lZFN0eWxlUHNldWRvXSwgcnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lUHNldWRvQ2xhc3MgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZShbZGVmaW5lZFN0eWxlUHNldWRvXSwgcnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlZCB0aGUgc3R5bGVzaGVldHMsIG5vdyBoYW5kbGUgdGhlIGVsZW1lbnQgZGVmaW5lZCBzdHlsZXNcbiAgICBmaWxsU3R5bGUoW2RlZmluZWRTdHlsZXMsIGRlZmluZWRTdHlsZVBzZXVkb10sIGVsZW0uc3R5bGUpO1xuXG4gICAgLyoqXG4gICAgICogJ2luaXRpYWwnIHNldHMgdGhlIHN0eWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmluZWRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZWRTdHlsZXNba2V5XSA9PT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lZFN0eWxlUHNldWRvKSB7XG4gICAgICAgIGlmIChkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XSA9PT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqL1xuXG4gICAgaWYgKCFwc2V1ZG9DbGFzcykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltERUJVRzogQ1NTVXRpbDo6Z2V0RGVmaW5lZFN0eWxlc11cIiwgZWxlbS5ub2RlTmFtZSwgcHNldWRvQ2xhc3MsIEpTT04uc3RyaW5naWZ5KGRlZmluZWRTdHlsZXMsIG51bGwsIDIpKTtcbiAgICAgICAgcmV0dXJuIGRlZmluZWRTdHlsZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lZFN0eWxlUHNldWRvKSB7XG4gICAgICAgICAgICBpZiAoZGVmaW5lZFN0eWxlUHNldWRvW2tleV0gPT09IGRlZmluZWRTdHlsZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltERUJVRzogQ1NTVXRpbDo6Z2V0RGVmaW5lZFN0eWxlc11cIiwgZWxlbS5ub2RlTmFtZSwgcHNldWRvQ2xhc3MsIEpTT04uc3RyaW5naWZ5KGRlZmluZWRTdHlsZVBzZXVkbywgbnVsbCwgMikpO1xuICAgICAgICByZXR1cm4gZGVmaW5lZFN0eWxlUHNldWRvO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAqIFxuICogXG4gKiBAcGFyYW0ge0RvY3VtZW50fSBkb2MgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0ge31cbiAgICBcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzdHlsZXNoZWV0cyBhbmQgcnVsZXNcbiAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICBjb25zdCBzaGVldCA9IGRvYy5zdHlsZVNoZWV0c1tzc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgc2hlZXQuY3NzUnVsZXMubGVuZ3RoOyArK3JJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGVldFJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ1NTUnVsZS5NRURJQV9SVUxFID09PSBzaGVldFJ1bGUuTUVESUFfUlVMRSkgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldFJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhTGlzdCA9IHJ1bGUubWVkaWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWRpYUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1fdHJhbnNmb3JtcyA9IG9yaWVudGF0aW9uVHJhbnNmb3Jtc1ttZWRpYUxpc3QuaXRlbShpKS50b0xvY2FsZUxvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtX3RyYW5zZm9ybXMpIGVsZW1fdHJhbnNmb3JtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENTU1J1bGUuU1RZTEVfUlVMRSA9PT0gc3R5bGVSdWxlc1tpXS5TVFlMRV9SVUxFKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbaV0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3R5bGVSdWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gc3R5bGVSdWxlLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzdHlsZXMubGVuZ3RoOyArK3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHN0eWxlc1tzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRyYW5zZm9ybXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fdHJhbnNmb3Jtc1tzZWxlY3Rvcl0gPSB0cmFuc2Zvcm1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvblRyYW5zZm9ybXNbbWVkaWFMaXN0Lml0ZW0oaSkudG9Mb2NhbGVMb3dlckNhc2UoKV0gPSBlbGVtX3RyYW5zZm9ybXM7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIkNhbm5vdCBhY2Nlc3MgcnVsZXNcIikgJiYgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiU2VjdXJpdHlFcnJvcjpcIikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uVHJhbnNmb3Jtcztcbn1cblxuLyoqXG4gKiBjb252ZXJ0IGdpdmVuIHJvdGF0aW9uIHRyYW5zZm9ybSBmdW5jdGlvbnMgdG8gdGhlIGRlZ3JlZSB0cmFuc2Zvcm1lZC4gXG4gKiBJZiBtdWx0aXBsZSBmdW5jdGlvbnMgYXJlIGdpdmVuLCB0aGVuIHRoZSBmdW5jdGlvbnMgYXJlIGFwcGxpZWQgbGluZWFybHkgaW4gdGhlIG9yZGVyLiBcbiAqICAgcm90YXRpb25fdHJhbnNmb3JtIGZ1bmN0aW9uIGV4YW1wbGU6ICByb3RhdGUoNDVkZWcpLCByb3RhdGUoMnR1cm4pLCByb3RhdGUoMnJhZCksIHJvdGF0ZTNkKDEsIDEsIDEsIDQ1ZGVnKSxcbiAqICAgICAgICByb3RhdGUoMnJhZCkgcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpXG4gKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb25EZWdyZWUocm90YXRpb25fdHJhbnNmb3JtKSB7XG4gICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyb3RhdGlvbl90cmFuc2Zvcm0pIHJldHVybiBkZWdyZWU7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgIHJvdGF0aW9uX3RyYW5zZm9ybSA9IHJvdGF0aW9uX3RyYW5zZm9ybS5yZXBsYWNlQWxsKFwiLCBcIiwgXCIsXCIpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1fZnVuY3Rpb25zID0gcm90YXRpb25fdHJhbnNmb3JtLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9MDsgaSA8IHRyYW5zZm9ybV9mdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbiA9IHRyYW5zZm9ybV9mdW5jdGlvbnNbaV0udHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSByb3RhdGlvbi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInJhZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMTgwL01hdGguUEk7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVwiKSB8fCB0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVpcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUoNDVkZWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSByb3RhdGlvbi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDM2MDsgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDE4MC9NYXRoLlBJOyBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhsZWZ0KzEsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoel9hbmdsZSAqIDE4MC9NYXRoLlBJKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJtYXRyaXhcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhsZWZ0KzEsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1sxXSwgdmFsdWVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoel9hbmdsZSAqIDE4MC9NYXRoLlBJKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2Fubm90IHJldHJpZXZlIHJvdGF0aW9uIGRlZ3JlZTogXCIgKyBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfSBcbiAgICByZXR1cm4gZGVncmVlOyBcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENTUyBzdHlsZSBzdHJpbmcgdmFsdWVzIHRvIHBpeGVscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgc3R5bGUgdmFsdWUgaW4gc3RyaW5nLCBzdWNoIGFzIDNyZW0sIDIzMHB4IGV0Yy5cbiAqIEBwYXJhbSB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gZ2V0UGl4ZWxzRnJvbVN0eWxlKHZhbHVlLCBlbGVtICkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICBsZXQgcGFyc2VkID0gdmFsdWUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICBpZiAocGFyc2VkWzJdID09PSAnJyB8fCBwYXJzZWRbMV0gPT09IDApIFxuICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgIHJldHVybiAwO1xuICAgIFxuICAgIGNvbnN0IHBpeGVscyA9IGNvbnZlcnRWYWx1ZTJQaXhlbHMocGFyc2VkWzJdLCBwYXJzZWRbMV0sIGVsZW0pO1xuICAgIHJldHVybiBwaXhlbHMgPT09IG51bGwgPyBwaXhlbHMgOiBwYXJzZUZsb2F0KHBpeGVscyk7XG59XG5cbi8qKlxuICogQ29udmVydCBhYnNvbHV0ZSBDU1MgbnVtZXJpY2FsIHZhbHVlcyB0byBwaXhlbHMuXG4gKlxuICogQHBhcmFtIHVuaXRWYWx1ZSBpbiBzdHJpbmdcbiAqIEBwYXJhbSB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSApIHtcbiAgICBpZiAodW5pdFZhbHVlID09IDApIHJldHVybiAwO1xuICAgIGNvbnN0IHN1cHBvcnRlZFVuaXRzID0ge1xuICAgICAgICAvLyBhYnNvbHV0ZSB1bml0XG4gICAgICAgICdweCc6IHZhbHVlID0+IHZhbHVlLFxuICAgICAgICAnY20nOiB2YWx1ZSA9PiB2YWx1ZSAqIDM3LjgsXG4gICAgICAgICdtbSc6IHZhbHVlID0+IHZhbHVlICogMy43OCxcbiAgICAgICAgJ3EnOiB2YWx1ZSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICdpbic6IHZhbHVlID0+IHZhbHVlICogOTYsXG4gICAgICAgICdwYyc6IHZhbHVlID0+IHZhbHVlICogMTYsXG4gICAgICAgICdwdCc6IHZhbHVlID0+IHZhbHVlICogMS4zMyxcbiAgICAgICAgXG4gICAgICAgIC8vIHJlbGF0aXZlIHVuaXRcbiAgICAgICAgJ3JlbSc6IHZhbHVlID0+IHZhbHVlICogcGFyc2VGbG9hdCggZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKSApLFxuICAgICAgICAnZW0nOiB2YWx1ZSA9PiB2YWx1ZSAqIHBhcnNlRmxvYXQoIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpLFxuICAgICAgICAndncnOiB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lcldpZHRoLFxuICAgICAgICAndmgnOiB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCxcbiAgICAgICAgJyUnOiAgdmFsdWUgPT4gdmFsdWUgLyAxMDAgKiBwYXJzZUZsb2F0KCBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKVxuICAgIH07XG5cbiAgICBpZiAoIHVuaXQgaW4gc3VwcG9ydGVkVW5pdHMgKVxuICAgICAgICByZXR1cm4gc3VwcG9ydGVkVW5pdHNbIHVuaXQgXSggdW5pdFZhbHVlICk7XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG59XG4gLypcbiAqIFJldHVybnMgaWYgdGhlIGZvbnQgZm9yIHZpc2libGUgdGV4dCBvZiB0aGUgZWxlbWVudCBpcyBkZWZpbmVkIGJ5IG1hdGVyaWFsIGljb25zXG4gKiAgXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBleGlzdGVuY2UgbWF0ZXJpYWwgaWNvbnMgdXNpbmcgZmV0Y2ggaW4gbm9kZSAxOCtcbiAgICAvLyBmb3Igbm93IChub2RlIDE2KSBqdXN0IGRlcnRlcm1pbmUgaWYgdGhlIHN0eWxlc2hlZXQgZm9yIHRoZSAnTWF0ZXJpYWwgSWNvbnMnIGV4aXN0cyBzdGF0aWNhbGx5LiBub3RlIHRoYXQgdGhlIGxvYWRpbmcgb2YgdGhlIGZvbnQgc3R5bGVzaGVldCBvY2N1cnMgYXQgcnVuIHRpbWUuXG4gICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICBjb25zdCBrbm93bl9pY29ucyA9IHtcbiAgICAgICAgJ01hdGVyaWFsIEljb25zJyA6IFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXG4gICAgfTtcbiAgICBjb25zdCBrbm93bl9jc3NfY2xhc3NlcyA9IHtcbiAgICAgICAgJ21hdGVyaWFsLWljb25zJyA6IFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXG4gICAgfTtcblxuICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgbGV0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMoZWxlbSk7XG4gICAgbGV0IGZvbnRGYW1pbHkgPSBzdHlsZXNbJ2ZvbnQtZmFtaWx5J107XG4gICAgXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgLy8gZm9udC1mYW1pbHkgc3BlY2lmaWVzIGEgcHJpb3JpdGl6ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBmb250IGZhbWlseSBuYW1lcyBcbiAgICBpZiAoZm9udEZhbWlseSAmJiBmb250RmFtaWx5LnNwbGl0KFwiLFwiKVswXS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpLnRyaW0oKSBpbiBrbm93bl9pY29ucylcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgIGxldCBsaXN0ID0gIGVsZW0uY2xhc3NMaXN0O1xuICAgICAgIGZvciAobGV0IGNzc19jbGFzcyBpbiBrbm93bl9jc3NfY2xhc3Nlcykge1xuICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgfSBcbiAgICAgICB9XG4gICAgfSAgICBcbiAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgIGxldCBzaGVldHMgPSBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBzaGVldHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgaWYgKHNoZWV0cyAmJiBzaGVldHMubGVuZ3RoID4gMCAmJiBPYmplY3QudmFsdWVzKGtub3duX2ljb25zKS5pbmRleE9mKHNoZWV0c1tzXS5ocmVmKSA+IC0xKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gXG4gICAgfSAgICAgICBcbiAgICByZXR1cm4gcGFzc2VkO1xuIH1cblxuIGV4cG9ydCBmdW5jdGlvbiBnZXRXZWlnaHROdW1iZXIoc3R5bGVWYWwpIHtcbiAgICBsZXQgbWFwID0ge1xuICAgICAgICBcImxpZ2h0XCI6IDEwMCxcbiAgICAgICAgXCJib2xkXCI6IDcwMFxuICAgIH07XG4gICAgbGV0IHJldFZhbCA9IHBhcnNlSW50KHN0eWxlVmFsKTtcbiAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgIGlmIChzdHlsZVZhbCBpbiBtYXApXG4gICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgIHJldHVybiA0MDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250SW5QaXhlbHMoc3R5bGVWYWwsIGVsZW0pIHtcbiAgICBsZXQgbWFwID0ge1xuICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICBcIngtc21hbGxcIjogMTAsXG4gICAgICAgIFwic21hbGxcIjogMTMsXG4gICAgICAgIFwibWVkaXVtXCI6IDE2LFxuICAgICAgICBcImxhcmdlXCI6IDE4LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMzJcbiAgICB9O1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVWYWwpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgfVxuICAgIGxldCB1bml0cyA9IHN0eWxlVmFsLnN1YnN0cmluZygoXCJcIiArIHZhbHVlKS5sZW5ndGgpO1xuICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgIHJldHVybiBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSApO1xuICAgXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENTU1N0eWxlKGVsZW1lbnQpIHtcbiAgICBsZXQgc3R5bGVUZXh0ID0gXCJcIjtcbiAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgIGlmIChzdHlsZVRleHQgPT09IHVuZGVmaW5lZCB8fCBzdHlsZVRleHQudHJpbSgpID09PSBcIlwiKVxuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgIGlmIChzdHlsZVRleHQgPT09IG51bGwgfHwgc3R5bGVUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAvL3JlbW92ZSBjb21tZW50IGJsb2Nrc1xuICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgIGxldCBzdWJzdCA9ICcgJztcbiAgICBzdHlsZVRleHQgPSBzdHlsZVRleHQucmVwbGFjZShyZSwgc3Vic3QpO1xuICAgIC8vIEZpbmQgYWxsIFwia2V5IDogdmFsO1wiIHBhaXJzIHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgIC8vIEZpbmQgYWxsIFwic2VsZWN0b3IgeyBjc3NrZXl2YWxzIH0gd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgbGV0IHJTZWxlY3RvcnMgPSAvXFxzKihbXntdKil7KFtefV0qKX0vZztcbiAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuXG4gICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgIGxldCBtO1xuICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleVZhbHNbbVsxXV0gPSBtWzJdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSBbe1xuICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHNcbiAgICAgICAgfV07XG4gICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBsZXQgbTtcbiAgICAgICAgbGV0IG0yO1xuICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fVxuICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICBsZXQgc2VsVmFsID0gbVsyXTtcblxuICAgICAgICAgICAgd2hpbGUgKChtMiA9IHJLZXlWYWxzLmV4ZWMoc2VsVmFsKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXRWYWwucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVEb2N1bWVudCBleHRlbmRzIERvY3VtZW50IHtcbiAgICBhY2VDYWNoZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBhY2VDYWNoZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufVxuXG4vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBnbG9iYWwgdmFyaWFibGVcbiAgICAgKiB3aXRoIGl0cyBpbml0aWFsIHZhbHVlIGFzIGdpdmVuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGUoY2FjaGVTcG90OiBFbGVtZW50IHwgRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LCBrZXlOYW1lLCBpbml0VmFsdWUpIHtcbiAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgIH1cbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9IGluaXRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZShjYWNoZVNwb3Q6IERvY3VtZW50IHwgRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQgfCBTaGFkb3dSb290LCBnbG9iYWxOYW1lLCB2YWx1ZSkgOiBhbnkge1xuICAgIGxldCBjYWNoZU9iaiA9IChjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovIHx8IGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSA/IGNhY2hlU3BvdCBhcyBDYWNoZURvY3VtZW50IDogY2FjaGVTcG90IGFzIENhY2hlRWxlbWVudDtcbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgfVxuICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNhY2hlcyhjYWNoZVJvb3QgOiBOb2RlKSA6IHZvaWQge1xuICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihjYWNoZVJvb3QpO1xuICAgIGRvIHtcbiAgICAgICAgZGVsZXRlIChudy5ub2RlIGFzIENhY2hlRWxlbWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICB9IHdoaWxlIChudy5uZXh0Tm9kZSgpKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHtSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG5leHBvcnQgZnVuY3Rpb24gYXJlUm9sZXNEZWZpbmVkKHJvbGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTApIHJldHVybiBudWxsO1xuICAgIFxuICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIFxuICAgICAgICBpZiAoIShyb2xlLnRvTG93ZXJDYXNlKCkgaW4gZGVzaWduUGF0dGVybnMpKSBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKiBcbiAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAqIHJldHVybjogbnVsbCBpZiBubyBleHBsaWNpdCByb2xlIGlzIGRlZmluZWQsIFxuICogICAgICAgICB0cnVlIGlmIHRoZSByb2xlKHMpIGFyZSBkZWZpbmVkIGluIEFSSUFcbiAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICBsZXQgZG9tUm9sZXM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICBcbiAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBjaGVjayB0aGUgJ2dlbmVyaWMnIHJvbGUgZmlyc3RcbiAgICBpZiAoZG9tUm9sZXMgJiYgZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG4gICAgXG4gICAgLy8gRmFpbGluZyByb2xlc1xuICAgIGxldCBmYWlsUm9sZVRva2VucyA9IFtdO1xuICAgIC8vIFBhc3Npbmcgcm9sZXNcbiAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgbGV0IGFsbG93ZWRSb2xlcyA9IFJQVFV0aWwuZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgdGFnUHJvcGVydHkpO1xuICAgIGlmICghYWxsb3dlZFJvbGVzICYmIGFsbG93ZWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBkb21Sb2xlcztcbiAgICBcbiAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICBpZiAoYWxsb3dlZFJvbGVzICYmIGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbVJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkgJiYgIWludmFsaWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkpXG4gICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICByZXR1cm4gaW52YWxpZFJvbGVzOyAgICAgICAgXG59XG5cbi8qIFxuICogdGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIGV4cGxpY2l0IHJvbGVzLCBpZiBubyBleHBsaWNpdCByb2xlLCBpdCB3aWxsIGNoZWNrIHRoZSBpbXBsaWNpdCByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gKiAgICAgICAgIGEgbGlzdCBvZiBpbnZhbGlkIGF0dHJpYnV0ZXNcbiAqICAgICAgICAgZW1wdHkgbGlzdCBpZiBhbGwgYXR0cmlidXRlcyBhcmUgdmFsaWQsIG9yIG5vIGFyaWEgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICBcbiAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAvLyBmb3IgbXV0aXBsZSByb2xlcywgc2tpcCBpZiBhbnkgcm9sZSBpcyBpbnZhbGlkXG4gICAgbGV0IGRlZmluZWQgPSBhcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgIGlmIChkZWZpbmVkICE9PW51bGwgJiYgIWRlZmluZWQpIFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBcbiAgICBsZXQgYXR0cnMgPSBbXTtcbiAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICByb2xlcyA9ICBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgXG4gICAgbGV0IGFyaWFfYXR0cnM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTsgIFxuICAgIFxuICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgLy8gQXR0cmlidXRlcyBhbGxvd2VkIG9uIHRoaXMgbm9kZVxuICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgdGFnUHJvcGVydHkpO1xuICAgIFxuICAgIGlmIChhcmlhX2F0dHJzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYV9hdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cblxuLyogXG4gKiBnZXQgY29uZmxpY3QgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGVzXG4gKiByZXR1cm46IGEgbGlzdCBvZiBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZSBwYWlycyB0aGF0IGFyZSBjb25mbGljdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhlbGVtOiBFbGVtZW50KSB7XG4gICAgXG4gICAgbGV0IGFyaWFBdHRycyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgbGV0IGh0bWxBdHRycyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgXG4gICAgbGV0IHJldCA9IFtdO1xuICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFJQVFV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICBpZiAoZXhhbWluZWRIdG1sQXRyTmFtZXMgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaCh7J2FyaWFBdHRyJzogYXJpYUF0dHJzW2ldWyduYW1lJ10sICdodG1sQXR0cic6IGl0ZW1bJ2F0dHInXX0pO1xuICAgICAgICAgICAgfSk7ICAgIFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5leHBvcnQgZnVuY3Rpb24gaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIHtcbiAgICBpZiAoIWNvbnRleHRIaWVyYXJjaGllcykgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgcmV0dXJuIGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0uZmlsdGVyKGhpZXIgPT4gW1widGFibGVcIiwgXCJncmlkXCIsIFwidHJlZWdyaWRcIl0uaW5jbHVkZXMoaGllci5yb2xlKSk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4vdjIvY29uZmlnL0NvbmZpZ1wiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPSBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggfHwgZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc3RyKSA9PT0gMDtcbn1cblN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgPSBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzID0gQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuLypcbmZ1bmN0aW9uIHNpbURlbW8odGltZW91dD86IG51bWJlcikge1xuICAgIGlmICghdGltZW91dCkgdGltZW91dCA9IDA7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IHNpbSA9IG5ldyBTaW11bGF0b3IoKTtcbiAgICAgICAgbGV0IHMgPSBzaW0ucmVuZGVySXRlbShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICBjb25zb2xlLmdyb3VwKFwiLS0tIEl0ZW0gVmlldyAtLS1cIik7XG4gICAgICAgIGNvbnNvbGUubG9nKHMpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXAoXCItLS0gTGluayBWaWV3IC0tLVwiKTtcbiAgICAgICAgcyA9IHNpbS5yZW5kZXJMaW5rKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHMpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfSwgdGltZW91dCk7XG59XG4qL1xuZnVuY3Rpb24gY2hlY2tEZW1vKHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRpbWVvdXQpIHRpbWVvdXQgPSAwO1xuICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIoKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjaGVja2VyLmNoZWNrKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fRGVzaWduXCJdKVxuICAgICAgICAudGhlbihmdW5jdGlvbihyZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcG9ydCk7XG4gICAgICAgICAgICBjb25zdCB2YWxzID0ge1xuICAgICAgICAgICAgICAgIFwiRkFJTFwiOiAwLFxuICAgICAgICAgICAgICAgIFwiUE9URU5USUFMXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJNQU5VQUxcIjogMixcbiAgICAgICAgICAgICAgICBcIlBBU1NcIjogM1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxyZXBvcnQucmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5yZXN1bHRzW2lkeF0udmFsdWVbMV0gPT09IFwiUEFTU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydC5yZXN1bHRzLnNwbGljZShpZHgtLSwxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zb3J0KChhLGIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS5jYXRlZ29yeSAhPSBiLmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmNhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5jYXRlZ29yeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhLnBhdGhbXCJhcmlhXCJdID09PSBiLnBhdGhbXCJhcmlhXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxzW2EudmFsdWVbMV1dLXZhbHNbYi52YWx1ZVsxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhLnBhdGhbXCJhcmlhXCJdLmxvY2FsZUNvbXBhcmUoYi5wYXRoW1wiYXJpYVwiXSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgbGV0IGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjYXRlZ29yeSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gcmVzdWx0LmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gcmVzdWx0LmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKHJlc3VsdC5jYXRlZ29yeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5wYXRoW1wiYXJpYVwiXSAhPSBsYXN0UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0UGF0aCA9IHJlc3VsdC5wYXRoW1wiYXJpYVwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwicGFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAobGFzdFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC52YWx1ZSwgcmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9KTtcbiAgICB9LCB0aW1lb3V0KTtcbn1cblxuZXhwb3J0IHsgQ2hlY2tlciwgQ29udGV4dCwgQVJJQU1hcHBlciwgY2hlY2tEZW1vLCBDb25maWcvKiwgc2ltRGVtbyovLCBET01XYWxrZXIgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/rule-server/src/static/archives/2023.05.26/js/ace-node-debug.js b/rule-server/src/static/archives/2023.05.26/js/ace-node-debug.js
new file mode 100644
index 000000000..4598780cd
--- /dev/null
+++ b/rule-server/src/static/archives/2023.05.26/js/ace-node-debug.js
@@ -0,0 +1,28333 @@
+/*!
+ * Copyright:: 2016,2017,2019,2020- IBM, Inc
+ *
+ * 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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******/ (() => { // webpackBootstrap
+/******/ "use strict";
+/******/ var __webpack_modules__ = ({
+
+/***/ 9077:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.eRulePolicy = exports.eRuleConfidence = void 0;
+var eRuleConfidence;
+(function (eRuleConfidence) {
+ eRuleConfidence["PASS"] = "PASS";
+ eRuleConfidence["FAIL"] = "FAIL";
+ eRuleConfidence["POTENTIAL"] = "POTENTIAL";
+ eRuleConfidence["MANUAL"] = "MANUAL";
+})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {}));
+var eRulePolicy;
+(function (eRulePolicy) {
+ eRulePolicy["VIOLATION"] = "VIOLATION";
+ eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION";
+ eRulePolicy["INFORMATION"] = "INFORMATION";
+})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {}));
+var eToolkitLevel;
+(function (eToolkitLevel) {
+ eToolkitLevel["LEVEL_ONE"] = "1";
+ eToolkitLevel["LEVEL_TWO"] = "2";
+ eToolkitLevel["LEVEL_THREE"] = "3";
+ eToolkitLevel["LEVEL_FOUR"] = "4";
+})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {}));
+var eRuleCategory;
+(function (eRuleCategory) {
+ eRuleCategory["ACCESSIBILITY"] = "Accessibility";
+ eRuleCategory["DESIGN"] = "Design";
+ eRuleCategory["OTHER"] = "Other";
+})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {}));
+var eRulesetType;
+(function (eRulesetType) {
+ eRulesetType["DEFAULT"] = "default";
+ eRulesetType["EXTENSION"] = "extension";
+})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {}));
+function RulePass(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RulePass = RulePass;
+function RuleRender(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS],
+ reasonId: 0,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleRender = RuleRender;
+function RuleFail(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleFail = RuleFail;
+function RulePotential(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RulePotential = RulePotential;
+function RuleManual(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleManual = RuleManual;
+
+
+/***/ }),
+
+/***/ 8235:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ARIADefinitions = void 0;
+var ARIADefinitions = /** @class */ (function () {
+ function ARIADefinitions() {
+ }
+ ARIADefinitions.nameFromContent = function (role) {
+ return (role in ARIADefinitions.designPatterns)
+ && ARIADefinitions.designPatterns[role].nameFrom
+ && ARIADefinitions.designPatterns[role].nameFrom.includes("contents");
+ };
+ /*
+ * array of WAI-ARIA global states and properties
+ * @see https://www.w3.org/TR/wai-aria-1.2/#global_states
+ */
+ ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby",
+ "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts",
+ "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription"
+ // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role
+ ,
+ 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'
+ ];
+ // deprecated roles
+ ARIADefinitions.globalDeprecatedRoles = [
+ 'directory'
+ ];
+ // the following are deprecated in ARIA 1.1 for all the roles
+ ARIADefinitions.globalDeprecatedProperties = [
+ 'aria-grabbed', 'aria-dropeffect'
+ ];
+ /*
+ * XSD data types for all WAI-ARIA properties
+ * along with valid values when the data type is NMTOKEN
+ * WAI-ARIA properties data types explaned:
+ * type: Used to identify the type of values allowed for the WAI-ARIA property
+ * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken
+ * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID
+ * true: refers to WAI-ARIA property supports hidden ID references
+ * false: refers to WAI-ARIA property does not support hidden ID references
+ * Default value will be set to false, if not specified.
+ */
+ ARIADefinitions.propertyDataTypes = {
+ "aria-activedescendant": {
+ type: "http://www.w3.org/2001/XMLSchema#idref",
+ hiddenIDRefSupported: true
+ },
+ "aria-atomic": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-autocomplete": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty
+ },
+ "aria-busy": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-checked": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "mixed", "undefined"]
+ },
+ "aria-colcount": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-colindex": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-colspan": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-controls": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-current": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value
+ },
+ "aria-describedby": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-details": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs"
+ },
+ "aria-disabled": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-dropeffect": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtokens",
+ values: ["copy", "move", "link", "execute", "popup", "none"]
+ },
+ "aria-errormessage": {
+ type: "http://www.w3.org/2001/XMLSchema#idref",
+ hiddenIDRefSupported: true
+ },
+ "aria-expanded": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-flowto": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: false
+ },
+ "aria-grabbed": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-haspopup": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"]
+ },
+ "aria-hidden": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-invalid": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value
+ },
+ "aria-keyshortcuts": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-label": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-labelledby": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-level": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-live": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["off", "polite", "assertive"]
+ },
+ "aria-modal": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-multiline": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-multiselectable": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-orientation": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["horizontal", "vertical", "undefined"]
+ },
+ "aria-owns": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-placeholder": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-posinset": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-pressed": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "mixed", "undefined"]
+ },
+ "aria-readonly": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-relevant": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtokens",
+ values: ["additions", "removals", "text", "all"]
+ },
+ "aria-required": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-roledescription": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-rowcount": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-rowindex": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-rowspan": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-selected": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-setsize": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-sort": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["ascending", "descending", "other", "none"]
+ },
+ "aria-valuemax": {
+ type: "http://www.w3.org/2001/XMLSchema#decimal"
+ },
+ "aria-valuemin": {
+ type: "http://www.w3.org/2001/XMLSchema#decimal"
+ },
+ "aria-valuenow": {
+ type: "http://www.w3.org/2001/XMLSchema#decimal"
+ },
+ "aria-valuetext": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ }
+ };
+ /*
+ * design patterns for concrete WAI-ARIA roles
+ * legitimate keys for each role include:
+ *
+ * - container: appropriate container(s) for that role
+ * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above)
+ * - reqProps: required states or properties for this role
+ * - reqChildren: required children for this role
+ * - htmlEquiv: HTML equivalent for this role
+ * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization)
+ * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.)
+ * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.)
+ * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s)
+ */
+ ARIADefinitions.designPatterns = {
+ "alert": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "alertdialog": {
+ container: null,
+ props: ["aria-modal"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "window",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "application": {
+ container: null,
+ props: ["aria-activedescendant", "aria-expanded"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "article": {
+ container: null,
+ props: ["aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "banner": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "blockquote": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "button": {
+ container: null,
+ props: ["aria-expanded", "aria-pressed"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "button | input[@type='button']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "caption": {
+ container: ["figure", "grid", "table", "treegrid"],
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "cell": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "td",
+ roleType: "structure",
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "checkbox": {
+ container: null,
+ props: ["aria-expanded", "aria-readonly", "aria-required"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: "input[@type='checkbox']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-haspopup']
+ },
+ "code": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "columnheader": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "th[@scope='col']",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "combobox": {
+ container: null,
+ props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"],
+ reqProps: ["aria-expanded"],
+ reqChildren: [],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "complementary": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "contentinfo": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "definition": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "deletion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "dialog": {
+ container: null,
+ props: ["aria-modal"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "window",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "directory": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecated: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "doc-abstract": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-acknowledgments": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-afterword": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-appendix": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-backlink": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-biblioentry": {
+ container: ["list"],
+ props: ["aria-level", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "li",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-bibliography": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-biblioref": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-chapter": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-colophon": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-conclusion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-cover": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "img",
+ roleType: "structure",
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "doc-credit": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-credits": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-dedication": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-endnote": {
+ container: ["list"],
+ props: ["aria-level", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "li",
+ roleType: "structure",
+ nameFrom: ["author"]
+ },
+ "doc-endnotes": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-epigraph": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-epilogue": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-errata": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-example": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-footnote": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-foreword": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-glossary": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-glossref": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-index": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"]
+ },
+ "doc-introduction": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-noteref": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-notice": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"]
+ },
+ "doc-pagebreak": {
+ container: null,
+ props: ["aria-orientation"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "doc-pagelist": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"]
+ },
+ "doc-part": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-preface": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-prologue": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-pullquote": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"]
+ },
+ "doc-qna": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-subtitle": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"]
+ },
+ "doc-tip": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"]
+ },
+ "doc-toc": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"]
+ },
+ "document": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "emphasis": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "feed": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: ["article"],
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "figure": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "form": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "form",
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "generic": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "div | span",
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "graphics-document": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "graphics-object": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ nameRequired: false,
+ nameFrom: ["contents", "author"]
+ },
+ "graphics-symbol": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "grid": {
+ container: null,
+ props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"],
+ reqProps: null,
+ reqChildren: ["row", "rowgroup"],
+ htmlEquiv: "table",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "gridcell": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "td",
+ roleType: "widget",
+ nameFrom: ["author", "contents"]
+ },
+ "group": {
+ container: null,
+ props: ["aria-activedescendant"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "heading": {
+ container: null,
+ props: null,
+ reqProps: ["aria-level"],
+ reqChildren: null,
+ htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "img": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "img",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "insertion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "link": {
+ container: null,
+ props: ["aria-expanded"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "list": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: ["listitem"],
+ htmlEquiv: "ol | ul",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "listbox": {
+ container: null,
+ props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: ["group", "option"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "listitem": {
+ container: ["list"],
+ props: ["aria-level", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "li",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "log": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "main": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "marquee": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "math": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ presentationalChildren: false,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "menu": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation"],
+ reqProps: null,
+ reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "menubar": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation"],
+ reqProps: null,
+ reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "menuitem": {
+ container: ["group", "menu", "menubar"],
+ props: ["aria-expanded", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "menuitemcheckbox": {
+ container: ["group", "menu", "menubar"],
+ props: ["aria-expanded", "aria-posinset", "aria-setsize"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "menuitemradio": {
+ container: ["group", "menu", "menubar"],
+ props: ["aria-expanded", "aria-posinset", "aria-setsize"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "meter": {
+ container: null,
+ props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"],
+ reqProps: ["aria-valuenow"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "navigation": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "none": {
+ container: null,
+ props: [],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "note": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "option": {
+ container: ["group", "listbox"],
+ props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "option",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "paragraph": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "presentation": {
+ container: null,
+ props: [],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "progressbar": {
+ container: null,
+ props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "radio": {
+ container: null,
+ props: ["aria-posinset", "aria-setsize"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: "input[@type='radio']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "radiogroup": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: ["radio"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "region": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "row": {
+ container: ["grid", "rowgroup", "table", "treegrid"],
+ props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"],
+ reqProps: null,
+ reqChildren: ["cell", "columnheader", "gridcell", "rowheader"],
+ htmlEquiv: "tr",
+ roleType: "structure",
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "rowgroup": {
+ container: ["grid", "table", "treegrid"],
+ props: [],
+ reqProps: null,
+ reqChildren: ["row"],
+ htmlEquiv: "tbody | tfoot | thead",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "rowheader": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "th[@scope='row']",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "scrollbar": {
+ container: null,
+ props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"],
+ reqProps: ["aria-controls", "aria-valuenow"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "search": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "searchbox": {
+ container: null,
+ props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "input[@type='search']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "separator": {
+ container: null,
+ props: ["aria-orientation"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "slider": {
+ container: null,
+ props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"],
+ reqProps: ["aria-valuenow"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "spinbutton": {
+ container: null,
+ props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "status": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "strong": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "subscript": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "superscript": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "switch": {
+ container: null,
+ props: ["aria-expanded", "aria-readonly", "aria-required"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-haspopup']
+ },
+ "tab": {
+ container: ["tablist"],
+ props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "table": {
+ container: null,
+ props: ["aria-colcount", "aria-rowcount"],
+ reqProps: null,
+ reqChildren: ["row", "rowgroup"],
+ htmlEquiv: "table",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tablist": {
+ container: null,
+ props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"],
+ reqProps: null,
+ reqChildren: ["tab"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tabpanel": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "term": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "dfn",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "textbox": {
+ container: null,
+ props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "input[@type='text']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "time": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "timer": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "toolbar": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tooltip": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tree": {
+ container: null,
+ props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"],
+ reqProps: null,
+ reqChildren: ["group", "treeitem"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "treegrid": {
+ container: null,
+ props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"],
+ reqProps: null,
+ reqChildren: ["row", "rowgroup"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "treeitem": {
+ container: ["group", "tree"],
+ props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ }; // end designPatterns
+ // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements
+ // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary
+ ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element
+ ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types
+ ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types
+ /* https://www.w3.org/TR/html-aria/#docconformance
+ * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value
+ * documentConformanceRequirementSpecialTags contains those tags that require special considerations
+ */
+ ARIADefinitions.documentConformanceRequirement = {
+ "abbr": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "address": {
+ implicitRole: ["group"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "article": {
+ implicitRole: ["article"],
+ validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"],
+ globalAriaAttributesValid: true
+ },
+ "aside": {
+ implicitRole: ["complementary"],
+ validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"],
+ globalAriaAttributesValid: true
+ },
+ "audio": {
+ implicitRole: null,
+ validRoles: ["application"],
+ globalAriaAttributesValid: true
+ },
+ "b": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "base": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "bdi": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "bdo": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "blockquote": {
+ implicitRole: ["blockquote"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "body": {
+ implicitRole: ["generic"],
+ validRoles: null,
+ otherDisallowedAriaAttributes: ['aria-hidden'],
+ globalAriaAttributesValid: true
+ },
+ "br": {
+ implicitRole: null,
+ validRoles: ["none", "presentation"],
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden"]
+ },
+ "button": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "canvas": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "caption": {
+ implicitRole: ['caption'],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ allowAttributesFromImplicitRole: false
+ },
+ "cite": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "code": {
+ implicitRole: ["code"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "col": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "colgroup": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "data": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "datalist": {
+ implicitRole: ["listbox"],
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ allowAttributesFromImplicitRole: false
+ },
+ "dd": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "del": {
+ implicitRole: ["deletion"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "details": {
+ implicitRole: ["group"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "dfn": {
+ implicitRole: ["term"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "dialog": {
+ implicitRole: ["dialog"],
+ validRoles: ["alertdialog"],
+ globalAriaAttributesValid: true
+ },
+ "dl": {
+ implicitRole: null,
+ validRoles: ["group", "list", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "dt": {
+ implicitRole: ["term"],
+ validRoles: ["listitem"],
+ globalAriaAttributesValid: true
+ },
+ "em": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "embed": {
+ implicitRole: null,
+ validRoles: ["application", "document", "img", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "fieldset": {
+ implicitRole: ["group"],
+ validRoles: ["none", "presentation", "radiogroup"],
+ globalAriaAttributesValid: true
+ },
+ "figcaption": {
+ implicitRole: null,
+ validRoles: ["group", "none", "presentation"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "form": {
+ implicitRole: ["form"],
+ validRoles: ["none", "presentation", "search"],
+ globalAriaAttributesValid: true
+ },
+ "head": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "hgroup": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "h1": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h2": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h3": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h4": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h5": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h6": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "hr": {
+ implicitRole: ["separator"],
+ validRoles: ["doc-pagebreak", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "html": {
+ implicitRole: ["document"],
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ allowAttributesFromImplicitRole: false
+ },
+ "i": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "iframe": {
+ implicitRole: null,
+ validRoles: ["application", "document", "img", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "ins": {
+ implicitRole: ["insertion"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "kbd": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "label": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "legend": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "link": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "main": {
+ implicitRole: ["main"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "map": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "mark": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "math": {
+ implicitRole: ["math"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "menu": {
+ implicitRole: ["list"],
+ validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"],
+ globalAriaAttributesValid: true
+ },
+ "meta": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "meter": {
+ implicitRole: ["meter"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'],
+ allowAttributesFromImplicitRole: false
+ },
+ "nav": {
+ implicitRole: ["navigation"],
+ validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "noscript": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "object": {
+ implicitRole: null,
+ validRoles: ["application", "document", "img"],
+ globalAriaAttributesValid: true
+ },
+ "ol": {
+ implicitRole: ["list"],
+ validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"],
+ globalAriaAttributesValid: true
+ },
+ "optgroup": {
+ implicitRole: ["group"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "option": {
+ implicitRole: ["option"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-selected"]
+ },
+ "output": {
+ implicitRole: ["status"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "p": {
+ implicitRole: ["paragraph"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "param": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "picture": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden"]
+ },
+ "pre": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "progress": {
+ implicitRole: ["progressbar"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-valuemax"]
+ },
+ "q": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "rp": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "rt": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "ruby": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "s": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "samp": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "script": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "search": {
+ implicitRole: ['search'],
+ validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'],
+ globalAriaAttributesValid: true
+ },
+ "slot": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "small": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "source": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "span": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "strong": {
+ implicitRole: ["strong"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "style": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "sub": {
+ implicitRole: ["subscript"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "sup": {
+ implicitRole: ["superscript"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "svg": {
+ implicitRole: ["graphics-document"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "table": {
+ implicitRole: ["table"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "template": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "textarea": {
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "tfoot": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "thead": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "time": {
+ implicitRole: ["time"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "title": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "track": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "u": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "ul": {
+ implicitRole: ["list"],
+ validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"],
+ globalAriaAttributesValid: true
+ },
+ "var": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "video": {
+ implicitRole: null,
+ validRoles: ["application"],
+ globalAriaAttributesValid: true
+ },
+ "wbr": {
+ implicitRole: null,
+ validRoles: ["none", "presentation"],
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden"]
+ }
+ }; // end documentConformanceRequirement
+ ARIADefinitions.documentConformanceRequirementSpecialTags = {
+ "a": {
+ "with-href": {
+ implicitRole: ["link"],
+ //roleCondition: " when non-empty href attribute is present",
+ validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-disabled=true"]
+ },
+ "without-href": {
+ implicitRole: ["generic"],
+ //roleCondition: " when href attribute is not present",
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "area": {
+ "with-href": {
+ implicitRole: ["link"],
+ //roleCondition: " when non-empty href attribute is present",
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "without-href": {
+ implicitRole: ["generic"],
+ //roleCondition: " when href attribute is not present",
+ validRoles: ["button", "link"],
+ globalAriaAttributesValid: true
+ }
+ },
+ // TODO
+ // "autonomous custom element": {
+ // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."],
+ // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"],
+ // globalAriaAttributesValid: true
+ // },
+ "div": {
+ "child-dl": {
+ implicitRole: ["generic"],
+ validRoles: ["presentation", "none"],
+ globalAriaAttributesValid: true
+ },
+ "no-child-dl": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "figure": {
+ "child-figcaption": {
+ implicitRole: ["figure"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "no-child-figcaption": {
+ implicitRole: ["figure"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "footer": {
+ "des-section-article-aside-main-nav": {
+ implicitRole: ["generic"],
+ //roleCondition: " when descendant of an article, aside, main, nav or section element",
+ validRoles: ["doc-footnote", "group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "other": {
+ implicitRole: ["contentinfo"],
+ //roleCondition: " when not a descendant of an article, aside, main, nav or section element",
+ validRoles: ["doc-footnote", "group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ }
+ },
+ // TODO
+ // "form-associated custom element": {
+ // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."],
+ // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"],
+ // globalAriaAttributesValid: true
+ // },
+ "header": {
+ "des-section-article-aside-main-nav": {
+ implicitRole: ["generic"],
+ //roleCondition: " when descendant of an article, aside, main, nav or section element",
+ validRoles: ["group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "other": {
+ implicitRole: ["banner"],
+ //roleCondition: " when not a descendant of an article, aside, main, nav or section element",
+ validRoles: ["group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "img": {
+ "img-with-alt-text": {
+ implicitRole: ["img"],
+ //roleCondition: " when alt attribute has text (is not empty)",
+ validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "img-with-empty-alt": {
+ implicitRole: ["presentation"],
+ //roleCondition: " when alt attribute is empty",
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden=true"]
+ },
+ "img-without-alt": {
+ implicitRole: ["img"],
+ //roleCondition: " when alt attribute, aria-label, or aria-labelledby are not present",
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden=true"]
+ }
+ },
+ "input": {
+ "button": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "checkbox-with-aria-pressed": {
+ implicitRole: ["checkbox"],
+ //roleCondition: " with type=checkbox and aria-pressed attribute is present",
+ validRoles: ["button"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ otherDisallowedAriaAttributes: ["aria-checked"]
+ },
+ "checkbox-without-aria-pressed": {
+ implicitRole: ["checkbox"],
+ //roleCondition: " with type=checkbox and aria-pressed attribute is not present",
+ validRoles: ["menuitemcheckbox", "option", "switch"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ otherDisallowedAriaAttributes: ["aria-checked"]
+ },
+ "color": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "date": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "datetime-local": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "email-no-list": {
+ implicitRole: ["textbox"],
+ //roleCondition: " with type=email and no list attribute is present",
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "email-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "file": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ },
+ "hidden": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "image": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "month": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "number": {
+ implicitRole: ["spinbutton"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"],
+ },
+ "password": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "radio": {
+ implicitRole: ["radio"],
+ validRoles: ["menuitemradio"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ otherDisallowedAriaAttributes: ["aria-checked"]
+ },
+ "range": {
+ implicitRole: ["slider"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"]
+ },
+ "reset": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "search-no-list": {
+ implicitRole: ["searchbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "search-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "submit": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "tel-no-list": {
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "tel-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "text-no-list": {
+ implicitRole: ["textbox"],
+ validRoles: ["combobox", "searchbox", "spinbutton"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "text-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule
+ },
+ "time": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "url-no-list": {
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "url-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "week": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "default-with-list": {
+ // input with a missing or invalid type, with a list attribute
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "default-no-list": {
+ // input with a missing or invalid type, with a list attribute
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ }
+ },
+ "li": {
+ "child-of-list-role": {
+ implicitRole: ['listitem'],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "no-child-of-list-role": {
+ implicitRole: ['listitem'],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "section": {
+ "with-name": {
+ implicitRole: ["region"],
+ validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"],
+ globalAriaAttributesValid: true
+ },
+ "without-name": {
+ implicitRole: null,
+ validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "select": {
+ "no-multiple-attr-size-gt1": {
+ //roleCondition: " with a multiple attribute or a size attribute having value greater than 1"
+ implicitRole: ["combobox"],
+ validRoles: ["menu"],
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-multiselectable"]
+ },
+ "multiple-attr-size-gt1": {
+ //roleCondition: " with no multiple attribute and no size attribute having value greater than 1"
+ implicitRole: ["listbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-multiselectable"]
+ }
+ },
+ "summary": {
+ "first-summary-of-detail": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"]
+ },
+ "no-first-summary-of-detail": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "tbody": {
+ "des-table": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "des-grid": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "des-treegrid": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "td": {
+ "des-table": {
+ implicitRole: ["cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-grid": {
+ implicitRole: ["gridcell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-treegrid": {
+ implicitRole: ["gridcell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "th": {
+ "des-table-grid-treegrid-row-scope": {
+ implicitRole: ["rowheader", "cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-table-grid-treegrid-column-scope": {
+ implicitRole: ["columnheader", "cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "tr": {
+ "des-table": {
+ implicitRole: ["row"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-grid": {
+ implicitRole: ["row"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-treegrid": {
+ implicitRole: ["row"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "default": {
+ implicitRole: null,
+ //roleCondition: "",
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ }; // end of documentConformanceRequirementSpecialTags
+ // map aria attribute to the corresponding native attribute, apply to any element applicable
+ // note this mapping is for the related attributes in the same element without checking the parent tree.
+ // refer to https://w3c.github.io/html-aria/
+ ARIADefinitions.relatedAriaHtmlAttributes = {
+ "aria-checked": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["checked"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["checked"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-disabled": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["disabled"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["disabled"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-hidden": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["hidden"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["hidden"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-placeholder": {
+ conflict: {
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["placeholder"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-valuemax": {
+ conflict: {
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["max"],
+ htmlAttributeValues: null
+ }
+ //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead.
+ },
+ "aria-valuemin": {
+ conflict: {
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["min"],
+ htmlAttributeValues: null
+ }
+ ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead.
+ },
+ "aria-readonly": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"],
+ htmlAttributeValues: [null, "false", "false"]
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"],
+ htmlAttributeValues: [null, "true", "true"]
+ }
+ },
+ "aria-required": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["required"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["required"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-colspan": {
+ conflict: {
+ // conflict occurs if both values are different
+ ariaAttributeValue: "VALUE",
+ htmlAttributeNames: ["colspan"],
+ htmlAttributeValues: ["VALUE"]
+ },
+ overlapping: {
+ // overlap occurs if both exists
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["colspan"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-rowspan": {
+ conflict: {
+ // conflict occurs if both values are different
+ ariaAttributeValue: "VALUE",
+ htmlAttributeNames: ["rowspan"],
+ htmlAttributeValues: ["VALUE"]
+ },
+ overlapping: {
+ // overlap occurs if both exists
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["rowspan"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-autocomplete": {
+ conflict: {
+ // conflict occurs if both values are conflict
+ ariaAttributeValue: "none",
+ htmlAttributeNames: ["autocomplete"],
+ htmlAttributeValues: ["on"]
+ }
+ }
+ };
+ ARIADefinitions.containers = [];
+ return ARIADefinitions;
+}());
+exports.ARIADefinitions = ARIADefinitions;
+;
+var containerArray = [];
+for (var roleDesign in ARIADefinitions.designPatterns) {
+ var containers = ARIADefinitions.designPatterns[roleDesign].container;
+ if (containers !== null) {
+ for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) {
+ var container = containers_1[_i];
+ if (containerArray.indexOf(container) == -1) {
+ containerArray.push(container);
+ }
+ }
+ }
+}
+ARIADefinitions.containers = containerArray;
+
+
+/***/ }),
+
+/***/ 4944:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ARIAMapper = void 0;
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CommonMapper_1 = __webpack_require__(1794);
+var DOMUtil_1 = __webpack_require__(295);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var ARIAWalker_1 = __webpack_require__(8015);
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper = /** @class */ (function (_super) {
+ __extends(ARIAMapper, _super);
+ function ARIAMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ ARIAMapper.prototype.childrenCanHaveRole = function (node, role) {
+ // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ // const elem = node as Element;
+ // if (elem.getAttribute("aria-hidden") === "true") {
+ // return false;
+ // }
+ // }
+ return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren);
+ };
+ ARIAMapper.prototype.getRole = function (node) {
+ var role = ARIAMapper.nodeToRole(node);
+ return role;
+ };
+ ARIAMapper.prototype.getNamespace = function () {
+ return "aria";
+ };
+ ARIAMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem_1 = node;
+ for (var idx = 0; idx < elem_1.attributes.length; ++idx) {
+ var attrInfo = elem_1.attributes[idx];
+ var name_1 = attrInfo.name.toLowerCase();
+ if (name_1.startsWith("aria-")) {
+ retVal[name_1.substring(5)] = attrInfo.nodeValue;
+ }
+ }
+ var applyAttrRole = function (nodeName) {
+ if (!(nodeName in ARIAMapper.elemAttrValueCalculators))
+ return;
+ for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) {
+ if (!(attr in retVal)) {
+ var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr];
+ if (typeof value != "undefined" && value !== null) {
+ if (typeof value !== typeof "") {
+ value = value(elem_1);
+ }
+ retVal[attr] = value;
+ }
+ }
+ }
+ };
+ applyAttrRole("global");
+ applyAttrRole(node.nodeName.toLowerCase());
+ }
+ else if (node.nodeType === 3 /* Node.TEXT_NODE */) {
+ for (var attr in ARIAMapper.textAttrValueCalculators) {
+ var val = ARIAMapper.textAttrValueCalculators[attr](node);
+ if (typeof val != "undefined" && val !== null) {
+ retVal[attr] = val;
+ }
+ }
+ }
+ return retVal;
+ };
+ ARIAMapper.getAriaOwnedBy = function (elem) {
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(elem);
+ if (!(0, CacheUtil_1.getCache)(doc, "ARIAMapper::precalcOwned", false)) {
+ var owners = doc.querySelectorAll("[aria-owns]");
+ for (var iOwner = 0; iOwner < owners.length; ++iOwner) {
+ var owner = owners[iOwner];
+ var ownIds = owner.getAttribute("aria-owns").split(/ +/g);
+ for (var iId = 0; iId < ownIds.length; ++iId) {
+ var owned = doc.getElementById(ownIds[iId]);
+ if (owned) {
+ (0, CacheUtil_1.setCache)(owned, "aria-owned", owner);
+ }
+ }
+ }
+ (0, CacheUtil_1.setCache)(doc, "ARIAMapper::precalcOwned", true);
+ }
+ return (0, CacheUtil_1.getCache)(elem, "aria-owned", null);
+ };
+ ARIAMapper.prototype.getNodeHierarchy = function (node) {
+ if (!node)
+ return [];
+ if (node.nodeType !== 1) {
+ var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node));
+ var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : {
+ role: "",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ var nodeHierarchy = [];
+ // Set hierarchy
+ for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) {
+ var item = parentHierarchy_1[_i];
+ nodeHierarchy.push(item);
+ }
+ nodeHierarchy.push({
+ attributes: {},
+ bounds: this.getBounds(node),
+ namespace: this.getNamespace(),
+ node: node,
+ role: this.getRole(node) || "none",
+ rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || "none"),
+ roleCount: {},
+ childrenCanHaveRole: parentInfo.childrenCanHaveRole
+ });
+ return nodeHierarchy;
+ }
+ else {
+ var elem = node;
+ var nodeHierarchy = (0, CacheUtil_1.getCache)(elem, "ARIAMapper::getNodeHierarchy", null);
+ if (!nodeHierarchy) {
+ // This element hasn't been processed yet - but ::reset processes them all in the right order
+ // Get details about the correct parent first
+ var parent_1 = ARIAMapper.getAriaOwnedBy(elem);
+ if (!parent_1) {
+ parent_1 = DOMWalker_1.DOMWalker.parentElement(elem);
+ }
+ while (parent_1 && parent_1.nodeType !== 1) {
+ parent_1 = DOMWalker_1.DOMWalker.parentElement(elem);
+ }
+ var parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : [];
+ var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : {
+ role: "",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ while (parentInfo.role === "none" || parentInfo.role === "/none") {
+ parent_1 = ARIAMapper.getAriaOwnedBy(parent_1) || DOMWalker_1.DOMWalker.parentElement(parent_1);
+ parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : [];
+ parentInfo = parentHierarchy[parentHierarchy.length - 1];
+ }
+ // Set initial node info
+ var nodeInfo = {
+ attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {},
+ bounds: this.getBounds(elem),
+ namespace: this.getNamespace(),
+ node: elem,
+ role: this.getRole(elem) || "none",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ // Adjust role if we're within a presentational container
+ var presentationalContainer = !parentInfo.childrenCanHaveRole;
+ if (presentationalContainer) {
+ nodeInfo.role = "none";
+ }
+ else {
+ nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole
+ && this.childrenCanHaveRole(elem, nodeInfo.role);
+ }
+ // Set the paths
+ if (nodeInfo.role !== "none") {
+ parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1;
+ nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]";
+ }
+ else {
+ nodeInfo.rolePath = parentInfo.rolePath;
+ }
+ // Set hierarchy
+ nodeHierarchy = [];
+ for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) {
+ var item = parentHierarchy_2[_a];
+ nodeHierarchy.push(item);
+ }
+ nodeHierarchy.push(nodeInfo);
+ (0, CacheUtil_1.setCache)(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy);
+ }
+ return nodeHierarchy;
+ }
+ };
+ ARIAMapper.prototype.reset = function (node) {
+ ARIAMapper.nameComputationId = 0;
+ this.hierarchyRole = [];
+ this.hierarchyResults = [];
+ this.hierarchyPath = [{
+ rolePath: "",
+ roleCount: {}
+ }];
+ // Get to the topmost node
+ var goodNode = node;
+ var next;
+ while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) {
+ goodNode = next;
+ }
+ ;
+ // Walk the tree and set the hierarchies in the right order
+ var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode);
+ do {
+ if (ariaWalker.node.nodeType === 1) {
+ this.getNodeHierarchy(ariaWalker.node);
+ }
+ } while (ariaWalker.nextNode());
+ };
+ ARIAMapper.prototype.openScope = function (node) {
+ if (this.hierarchyRole === null) {
+ this.reset(node);
+ }
+ this.pushHierarchy(node);
+ for (var idx = 0; idx < this.hierarchyResults.length; ++idx) {
+ if (this.hierarchyResults[idx].role[0] === "/") {
+ this.hierarchyResults[idx].role = this.hierarchyResults[idx].role.substring(1);
+ }
+ }
+ return this.hierarchyResults;
+ };
+ ARIAMapper.prototype.pushHierarchy = function (node) {
+ // If we're not an element, no special handling
+ var nodeHierarchy = [];
+ // Determine our node info
+ nodeHierarchy = this.getNodeHierarchy(node);
+ var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1];
+ this.hierarchyRole.push(nodeInfo.role);
+ if (nodeInfo.role !== "none") {
+ this.hierarchyPath.push(nodeInfo);
+ }
+ this.hierarchyResults = nodeHierarchy;
+ };
+ ARIAMapper.prototype.closeScope = function (node) {
+ var retVal = [];
+ for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) {
+ var res = _a[_i];
+ // const temp = res.node;
+ // res.node = null;
+ // let cloned = JSON.parse(JSON.stringify(res));
+ // cloned.node = res.node = temp;
+ // retVal.push(cloned);
+ retVal.push(res);
+ }
+ if (retVal.length > 0) {
+ retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role;
+ var parent_2 = DOMWalker_1.DOMWalker.parentElement(node);
+ this.hierarchyResults = parent_2 ? (0, CacheUtil_1.getCache)(parent_2, "ARIAMapper::getNodeInfo", []) : [];
+ }
+ return retVal;
+ };
+ ARIAMapper.computeName = function (cur) {
+ ++ARIAMapper.nameComputationId;
+ return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false);
+ };
+ ARIAMapper.computeNameHelp = function (walkId, cur, labelledbyTraverse, walkTraverse) {
+ // 2g. None of the other content applies to text nodes, so just do this first
+ if (cur.nodeType === 3 /* Node.TEXT_NODE */)
+ return cur.nodeValue;
+ if (cur.nodeType === 11)
+ return "";
+ if (cur.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ if (walkTraverse || labelledbyTraverse)
+ return "";
+ throw new Error("Can only compute name on Element and Text " + cur.nodeType);
+ }
+ var elem = cur;
+ // We've been here before - prevent recursion
+ if ((0, CacheUtil_1.getCache)(elem, "data-namewalk", null) === "" + walkId)
+ return "";
+ (0, CacheUtil_1.setCache)(elem, "data-namewalk", "" + walkId);
+ // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element
+ // 2a. Only show hidden content if it's referenced by a labelledby
+ if (!labelledbyTraverse && !DOMWalker_1.DOMWalker.isNodeVisible(cur)) {
+ return "";
+ }
+ // 2b. collect valid id references
+ if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) {
+ var labelledby = elem.getAttribute("aria-labelledby").split(" ");
+ var validElems = [];
+ for (var _i = 0, labelledby_1 = labelledby; _i < labelledby_1.length; _i++) {
+ var ref = labelledby_1[_i];
+ var refElem = fragment_1.FragmentUtil.getById(cur, ref);
+ if (refElem) {
+ validElems.push(refElem);
+ }
+ }
+ if (validElems.length > 0) {
+ var accumulated = "";
+ for (var _a = 0, validElems_1 = validElems; _a < validElems_1.length; _a++) {
+ var elem_2 = validElems_1[_a];
+ accumulated += " " + this.computeNameHelp(walkId, elem_2, true, false);
+ }
+ return accumulated.trim();
+ }
+ }
+ // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases
+ if (["section", "form"].includes(cur.nodeName.toLowerCase())) {
+ if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) {
+ // If I'm not an embedded control or I'm not recursing, return the aria-label
+ if (!labelledbyTraverse && !walkTraverse) {
+ return elem.getAttribute("aria-label").trim();
+ }
+ }
+ if (elem.hasAttribute("title")) {
+ return elem.getAttribute("title");
+ }
+ return "";
+ }
+ // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label
+ var role = ARIAMapper.nodeToRole(cur);
+ var isEmbeddedControl = [
+ "textbox", "button", "combobox", "listbox",
+ "progressbar", "scrollbar", "slider", "spinbutton"
+ ].includes(role);
+ if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) {
+ // If I'm not an embedded control or I'm not recursing, return the aria-label
+ if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) {
+ return elem.getAttribute("aria-label").trim();
+ }
+ }
+ // 2d.
+ if (role !== "presentation" && role !== "none") {
+ if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) {
+ return DOMUtil_1.DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim();
+ }
+ if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) {
+ var label = elem.ownerDocument.querySelector("label[for='" + elem.getAttribute("id") + "']");
+ if (label) {
+ if (label.hasAttribute("aria-label") || label.hasAttribute("aria-labelledby")) {
+ return this.computeNameHelp(walkId, label, false, false);
+ }
+ else {
+ return label.textContent;
+ }
+ }
+ }
+ if (cur.nodeName.toLowerCase() === "fieldset") {
+ if (cur.querySelector("legend")) {
+ var legend = cur.querySelector("legend");
+ return legend.innerText;
+ }
+ else {
+ return this.computeNameHelp(walkId, cur, false, false);
+ }
+ }
+ }
+ // 2e.
+ if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) {
+ // If the embedded control has role textbox, return its value.
+ if (role === "textbox") {
+ if (elem.nodeName.toLowerCase() === "input") {
+ if (elem.hasAttribute("value"))
+ return elem.getAttribute("value");
+ }
+ else {
+ walkTraverse = false;
+ }
+ }
+ // If the embedded control has role button, return the text alternative of the button.
+ if (role === "button") {
+ if (elem.nodeName.toLowerCase() === "input") {
+ var type = elem.getAttribute("type").toLowerCase();
+ if (["button", "submit", "reset"].includes(type)) {
+ if (elem.hasAttribute("value"))
+ return elem.getAttribute("value");
+ if (type === "submit")
+ return "Submit";
+ if (type === "reset")
+ return "Reset";
+ }
+ }
+ else {
+ walkTraverse = false;
+ }
+ }
+ // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option.
+ if (role === "combobox") {
+ if (elem.hasAttribute("aria-activedescendant")) {
+ var selected = fragment_1.FragmentUtil.getById(elem, "aria-activedescendant");
+ if (selected) {
+ return ARIAMapper.computeNameHelp(walkId, selected, false, false);
+ }
+ }
+ }
+ // If the embedded control has role range (e.g., a spinbutton or slider):
+ if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) {
+ // If the aria-valuetext property is present, return its value,
+ if (elem.hasAttribute("aria-valuetext"))
+ return elem.getAttribute("aria-valuetext");
+ // Otherwise, if the aria-valuenow property is present, return its value,
+ if (elem.hasAttribute("aria-valuenow"))
+ return elem.getAttribute("aria-valuenow");
+ // TODO: Otherwise, use the value as specified by a host language attribute.
+ }
+ }
+ // 2f. 2h.
+ if (walkTraverse || ARIADefinitions_1.ARIADefinitions.nameFromContent(role) || labelledbyTraverse) {
+ // 2fi. Set the accumulated text to the empty string.
+ var accumulated = "";
+ // 2fii. Check for CSS generated textual content associated with the current node and
+ // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2]
+ // can provide textual content for elements that have a content model.
+ // For :before pseudo elements, User agents MUST prepend CSS textual content, without
+ // a space, to the textual content of the current node.
+ // For :after pseudo elements, User agents MUST append CSS textual content, without a
+ // space, to the textual content of the current node.
+ var before = null;
+ before = elem.ownerDocument.defaultView.getComputedStyle(elem, "before").content;
+ if (before && before !== "none") {
+ before = before.replace(/^"/, "").replace(/"$/, "");
+ accumulated += before;
+ }
+ // 2fiii. For each child node of the current node:
+ // Set the current node to the child node.
+ // Compute the text alternative of the current node beginning with step 2. Set the result
+ // to that text alternative.
+ // Append the result to the accumulated text.
+ if (elem.nodeName.toUpperCase() === "SLOT") {
+ //if no assignedNode, check its own text
+ if (!elem.assignedNodes() || elem.assignedNodes().length === 0) {
+ var innerText = legacy_1.RPTUtil.getInnerText(elem);
+ if (innerText && innerText !== null && innerText.trim().length > 0)
+ accumulated += " " + innerText;
+ }
+ else {
+ // check text from all assigned nodes
+ for (var _b = 0, _c = elem.assignedNodes(); _b < _c.length; _b++) {
+ var slotChild = _c[_b];
+ var nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true);
+ accumulated += " " + nextChildContent;
+ }
+ }
+ }
+ else {
+ var walkChild = elem.firstChild;
+ while (walkChild) {
+ var nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true);
+ accumulated += " " + nextChildContent;
+ walkChild = walkChild.nextSibling;
+ }
+ }
+ var after = null;
+ try {
+ after = elem.ownerDocument.defaultView.getComputedStyle(elem, "after").content;
+ }
+ catch (e) { }
+ if (after && after !== "none") {
+ after = after.replace(/^"/, "").replace(/"$/, "");
+ accumulated += after;
+ }
+ // 2fiv. Return the accumulated text.
+ accumulated = accumulated.replace(/\s+/g, " ").trim();
+ if (accumulated.trim().length > 0) {
+ return accumulated;
+ }
+ }
+ // 2i. Otherwise, if the current node has a Tooltip attribute, return its value.
+ if (elem.hasAttribute("title")) {
+ return elem.getAttribute("title");
+ }
+ if (elem.tagName.toLowerCase() === "svg") {
+ var title = elem.querySelector("title");
+ if (title) {
+ return title.textContent || title.innerText;
+ }
+ }
+ return "";
+ };
+ /* if (role in ARIADefinitions.designPatterns
+ && ARIADefinitions.designPatterns[role].nameFrom
+ && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"))
+ {
+ name = elem.textContent;
+ }
+ if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) {
+ name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent;
+ }
+ if (elem.hasAttribute("aria-label")) {
+ name = elem.getAttribute("aria-label");
+ }
+ if (elem.hasAttribute("aria-labelledby")) {
+ name = "";
+ const ids = elem.getAttribute("aria-labelledby").split(" ");
+ for (const id of ids) {
+ name += FragmentUtil.getById(elem, id).textContent + " ";
+ }
+ name = name.trim();
+ }
+ return name;
+ }*/
+ ARIAMapper.nodeToRole = function (node) {
+ if (node.nodeType === 3 /* Node.TEXT_NODE */) {
+ return "text";
+ }
+ else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ return null;
+ }
+ var elem = node;
+ if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ return null;
+ }
+ if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) {
+ var roleStr = elem.getAttribute("role").trim();
+ var roles_2 = roleStr.split(" ");
+ for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) {
+ var role = roles_1[_i];
+ if (role === "presentation" || role === "none") {
+ // If element is focusable, then presentation roles are to be ignored
+ if (!legacy_1.RPTUtil.isFocusable(elem)) {
+ return null;
+ }
+ }
+ else if (role in ARIADefinitions_1.ARIADefinitions.designPatterns) {
+ return role;
+ }
+ }
+ }
+ //return this.elemToImplicitRole(elem);
+ var roles = legacy_1.RPTUtil.getImplicitRole(elem);
+ return !roles || roles.length === 0 ? null : roles[0];
+ };
+ ////////////////////////////////////////////////////////////////////////////
+ // Helper functions
+ ////
+ // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis
+ ARIAMapper.elemAttrValueCalculators = {
+ "global": {
+ "name": ARIAMapper.computeName
+ },
+ "datalist": {
+ // set to "true" if the datalist's selection model allows multiple option elements to be
+ // selected at a time, and "false" otherwise
+ "multiselectable": function (elem) {
+ var id = elem.getAttribute("id");
+ if (id && id.length > 0) {
+ var input = elem.ownerDocument.querySelector("input[list='" + id + "']");
+ return "" + (elem.getAttribute("multiple")
+ && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == ""));
+ }
+ return null;
+ }
+ },
+ "h1": {
+ "level": "1"
+ },
+ "h2": {
+ "level": "2"
+ },
+ "h3": {
+ "level": "3"
+ },
+ "h4": {
+ "level": "4"
+ },
+ "h5": {
+ "level": "5"
+ },
+ "h6": {
+ "level": "6"
+ },
+ "input": {
+ // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute
+ // is true, or "true" if the element's checkedness is true, or "false" otherwise
+ // - type="radio" state set to "true" if the element's checkedness is true, or "false"
+ // otherwise.
+ "checked": function (elem) {
+ if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("type") === "radio") {
+ return "" + elem.checked;
+ }
+ return null;
+ }
+ // - type="radio" and not in menu reflecting number of type=radio input elements
+ // within the radio button group
+ ,
+ "setsize": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ // - type="radio" and not in menu value reflecting the elements position
+ // within the radio button group."
+ ,
+ "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a
+ // suggestions source element) combobox role, with the aria-owns property set to the same
+ // value as the list attribute
+ ,
+ "owns": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ },
+ "keygen": {
+ "multiselectable": "false"
+ },
+ "li": {
+ // Number of li elements within the ol, ul, menu
+ "setsize": function (elem) {
+ var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]);
+ if (!parent)
+ return null;
+ var lis = parent.querySelectorAll("li");
+ var otherlis = parent.querySelectorAll("ol li, ul li, menu li");
+ return "" + (lis.length - otherlis.length);
+ }
+ // Position of li element within the ol, ul, menu
+ ,
+ "posinset": function (elem) {
+ var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]);
+ if (!parent)
+ return null;
+ var lis = parent.querySelectorAll("li");
+ var num = 0;
+ for (var idx = 0; idx < lis.length; ++idx) {
+ var li = lis[idx];
+ if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) {
+ return "" + num;
+ }
+ ++num;
+ }
+ return null;
+ }
+ },
+ "menuitem": {
+ // type = checkbox or radio, set to "true" if the checked attribute
+ // is present, and "false" otherwise
+ "checked": function (elem) { return "" + !!(elem.getAttribute("checked")
+ && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); }
+ },
+ "option": {
+ // set to "true" if the element's selectedness is true, or "false" otherwise.
+ "selected": function (elem) { return "" + !!(elem.getAttribute("selected")
+ && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); }
+ },
+ "progress": {
+ "valuemax": function (elem) { return elem.getAttribute("max") || "1"; },
+ "valuemin": function (elem) { return "0"; },
+ "valuenow": function (elem) { return elem.getAttribute("value"); }
+ }
+ };
+ ARIAMapper.textAttrValueCalculators = {
+ "name": function (node) { return node.nodeValue; }
+ };
+ ARIAMapper.nameComputationId = 0;
+ return ARIAMapper;
+}(CommonMapper_1.CommonMapper));
+exports.ARIAMapper = ARIAMapper;
+
+
+/***/ }),
+
+/***/ 8015:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ARIAWalker = void 0;
+var fragment_1 = __webpack_require__(482);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper_1 = __webpack_require__(4944);
+/**
+ * Walks in an ARIA order
+ *
+ * See also ../dom/DOMWalker
+ */
+var ARIAWalker = /** @class */ (function () {
+ function ARIAWalker(element, bEnd, root) {
+ this.root = root || element;
+ this.node = element;
+ this.bEndTag = (bEnd == undefined ? false : bEnd == true);
+ }
+ ARIAWalker.prototype.atRoot = function () {
+ if (this.ownerElement)
+ return false;
+ if (this.root === this.node) {
+ return true;
+ }
+ else if (this.root.isSameNode) {
+ return this.root.isSameNode(this.node);
+ }
+ else if (this.root.compareDocumentPosition) {
+ return this.root.compareDocumentPosition(this.node) === 0;
+ }
+ else {
+ // Not supported in this environment - try our best
+ return this.node.parentNode === null;
+ }
+ };
+ ARIAWalker.prototype.nextNode = function () {
+ var skipOwned = false;
+ do {
+ skipOwned = false;
+ // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id"));
+ if (!this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ var slotElement = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker_1.DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker_1.DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ //TODO: need to conside its own content, a slot may have its own content or assigned content
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 0;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.slotOwner) {
+ var slotOwner = this.node.slotOwner;
+ var nextSlotIndex = this.node.slotIndex + 1;
+ delete this.node.slotOwner;
+ delete this.node.slotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ skipOwned = true;
+ }
+ else if (this.node.parentNode) {
+ if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) {
+ var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g);
+ if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) {
+ this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]);
+ this.bEndTag = false;
+ }
+ else {
+ var idx = ownIds.indexOf(this.node.getAttribute("id"));
+ if (idx === ownIds.length - 1) {
+ // last one
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ // grab next
+ this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]);
+ this.bEndTag = false;
+ }
+ }
+ }
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")
+ || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node)));
+ return true;
+ };
+ ARIAWalker.prototype.prevNode = function () {
+ do {
+ if (this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker_1.DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker_1.DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.lastChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ }
+ else {
+ this.bEndTag = false;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ return ARIAWalker;
+}());
+exports.ARIAWalker = ARIAWalker;
+
+
+/***/ }),
+
+/***/ 9193:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.AncestorUtil = void 0;
+var AncestorUtil = /** @class */ (function () {
+ function AncestorUtil() {
+ }
+ AncestorUtil.isPresentationFrame = function (contextHierarchy) {
+ if (contextHierarchy && contextHierarchy.dom) {
+ // Skip current node because we want ancestry
+ for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) {
+ var elem = contextHierarchy.dom[idx].node;
+ if (elem.nodeType === 1
+ && elem.nodeName.toLowerCase() === "iframe"
+ && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ AncestorUtil.isFrame = function (contextHierarchy) {
+ if (contextHierarchy && contextHierarchy.dom) {
+ // Skip current node because we want ancestry
+ for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) {
+ var elem = contextHierarchy.dom[idx].node;
+ if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ return AncestorUtil;
+}());
+exports.AncestorUtil = AncestorUtil;
+
+
+/***/ }),
+
+/***/ 482:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.FragmentUtil = void 0;
+var FragmentUtil = /** @class */ (function () {
+ function FragmentUtil() {
+ }
+ FragmentUtil.getOwnerFragment = function (node) {
+ var n = node;
+ while (n.parentNode && (n = n.parentNode)) {
+ if (n.nodeType === 11) {
+ return n;
+ }
+ }
+ return node.ownerDocument;
+ };
+ FragmentUtil.getById = function (node, id) {
+ return this.getOwnerFragment(node).getElementById(id);
+ };
+ FragmentUtil.getAncestor = function (hierarchies, elemName) {
+ var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; });
+ return matches.length > 0 && matches[0].node || null;
+ };
+ FragmentUtil.getAncestorWithRole = function (hierarchies, role) {
+ var matches = hierarchies["aria"].filter(function (info) { return info.role === role; });
+ return matches.length > 0 && matches[0].node || null;
+ };
+ return FragmentUtil;
+}());
+exports.FragmentUtil = FragmentUtil;
+
+
+/***/ }),
+
+/***/ 2527:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2021- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.LangUtil = void 0;
+// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
+var validPrimaryLangs = [
+ ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"],
+ ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"],
+ ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"],
+ ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"],
+ ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"],
+ ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"],
+ ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"],
+ ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"],
+ ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"],
+ ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"],
+ ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"],
+ ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"],
+ ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"],
+ ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"],
+ ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"],
+ ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"],
+ ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"],
+ ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"],
+ ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"],
+ ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"],
+ ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"],
+ ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"],
+ ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"],
+ ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"],
+ ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"],
+ ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"]
+];
+var LangUtil = /** @class */ (function () {
+ function LangUtil() {
+ }
+ /* Determine if given string is a valid BCP 47 string */
+ LangUtil.isBcp47 = function (langStr) {
+ return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr);
+ };
+ LangUtil.validPrimaryLang = function (langStr) {
+ var primary = langStr.toLowerCase();
+ if (primary.includes("-")) {
+ primary = primary.split("-")[0];
+ }
+ if (!primary.match(/[a-z]{2,3}/))
+ return false;
+ // qaa..qtz
+ if (primary.length === 3
+ && primary.charAt(0) === "q"
+ && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116
+ && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) {
+ }
+ return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary);
+ };
+ LangUtil.matchPrimaryLang = function (lang1, lang2) {
+ var primary1 = lang1;
+ if (primary1.includes("-")) {
+ primary1 = primary1.split("-")[0];
+ }
+ var primary2 = lang2;
+ if (primary2.includes("-")) {
+ primary2 = primary2.split("-")[0];
+ }
+ return primary1.toLowerCase() === primary2.toLowerCase();
+ };
+ return LangUtil;
+}());
+exports.LangUtil = LangUtil;
+
+
+/***/ }),
+
+/***/ 8422:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.NodeWalker = exports.RPTUtil = void 0;
+var CacheUtil_1 = __webpack_require__(7788);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var ARIAMapper_1 = __webpack_require__(4944);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+var fragment_1 = __webpack_require__(482);
+var CSSUtil_1 = __webpack_require__(1775);
+var DOMUtil_1 = __webpack_require__(295);
+var RPTUtil = /** @class */ (function () {
+ function RPTUtil() {
+ }
+ RPTUtil.isDefinedAriaAttributeAtIndex = function (ele, index) {
+ var attrName = ele.attributes[index].name;
+ return RPTUtil.isDefinedAriaAttribute(ele, attrName);
+ };
+ /**
+ * this method returns user-defined aria attribute name from dom
+ * @param ele element
+ * @returns user defined aria attributes
+ */
+ RPTUtil.getUserDefinedAriaAttributes = function (elem) {
+ var ariaAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (isAria)
+ ariaAttributes.push(attrName);
+ }
+ }
+ return ariaAttributes;
+ };
+ /**
+ * this method returns user-defined html attribute name from dom
+ * @param ele element
+ * @returns user defined html attributes
+ */
+ RPTUtil.getUserDefinedHtmlAttributes = function (elem) {
+ var htmlAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (!isAria)
+ htmlAttributes.push(attrName);
+ }
+ }
+ return htmlAttributes;
+ };
+ /**
+ * this method returns user-defined aria attribute name-value pair from dom
+ * @param ele element
+ * @returns user defined aria attributes
+ */
+ RPTUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) {
+ var ariaAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var attrValue = elem.getAttribute(attrName);
+ if (attrValue === '')
+ attrValue = null;
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (isAria)
+ ariaAttributes.push({ name: attrName, value: attrValue });
+ }
+ }
+ return ariaAttributes;
+ };
+ /**
+ * this method returns user-defined html attribute name-value pair from dom
+ * @param ele element
+ * @returns user defined html attributes
+ */
+ RPTUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) {
+ var htmlAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var attrValue = elem.getAttribute(attrName);
+ if (attrValue === '')
+ attrValue = null;
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (!isAria)
+ htmlAttributes.push({ name: attrName, value: attrValue });
+ }
+ }
+ return htmlAttributes;
+ };
+ /**
+ * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true"
+ */
+ RPTUtil.getAriaAttribute = function (ele, attributeName) {
+ // If the attribute is defined, it takes precedence
+ var retVal = ele.getAttribute(attributeName);
+ if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check
+ return retVal;
+ }
+ // Then determine implicit values from other attributes
+ if (!retVal) {
+ var tag = ele.nodeName.toLowerCase();
+ if (attributeName in RPTUtil.ariaAttributeImplicitMappings) {
+ if (tag in RPTUtil.ariaAttributeImplicitMappings[attributeName]) {
+ retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName][tag];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ else if ("*" in RPTUtil.ariaAttributeImplicitMappings[attributeName]) {
+ retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName]["*"];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ }
+ }
+ // Check role-based defaults
+ if (!retVal) {
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele);
+ if (role in RPTUtil.ariaAttributeRoleDefaults && attributeName in RPTUtil.ariaAttributeRoleDefaults[role]) {
+ retVal = RPTUtil.ariaAttributeRoleDefaults[role][attributeName];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ }
+ // Still not defined? Check global defaults
+ if (!retVal && attributeName in RPTUtil.ariaAttributeGlobalDefaults) {
+ retVal = RPTUtil.ariaAttributeGlobalDefaults[attributeName];
+ }
+ return retVal;
+ };
+ RPTUtil.wordCount = function (str) {
+ str = str.trim();
+ if (str.length === 0)
+ return 0;
+ return str.split(/\s+/g).length;
+ };
+ /**
+ * Note that this only detects if the element itself is in the tab order.
+ * However, this element may delegate focus to another element via aria-activedescendant
+ * Also, focus varies by browser... sticking to things that are focusable on chrome and firefox
+ */
+ RPTUtil.isTabbable = function (element) {
+ // Using https://allyjs.io/data-tables/focusable.html
+ // Handle the explicit cases first
+ if (!VisUtil_1.VisUtil.isNodeVisible(element))
+ return false;
+ if (element.hasAttribute("tabindex")) {
+ return parseInt(element.getAttribute("tabindex")) >= 0;
+ }
+ // Explicit cases handled - now the implicit
+ var nodeName = element.nodeName.toLowerCase();
+ if (nodeName in RPTUtil.tabTagMap) {
+ var retVal = RPTUtil.tabTagMap[nodeName];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(element);
+ }
+ return retVal;
+ }
+ else {
+ return false;
+ }
+ };
+ RPTUtil.tabIndexLEZero = function (elem) {
+ if (RPTUtil.hasAttribute(elem, "tabindex")) {
+ if (elem.getAttribute("tabindex").match(/^-?\d+$/)) {
+ var tabindexValue = parseInt(elem.getAttribute("tabindex"));
+ return tabindexValue === 0 || tabindexValue === -1;
+ }
+ }
+ return false;
+ };
+ /**
+ * get number of tabbable children
+ * @param element
+ */
+ RPTUtil.getTabbableChildren = function (element) {
+ var count = 0;
+ // If node has children, look for tab stops in the children
+ if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") {
+ var nw = new NodeWalker(element);
+ while (nw.nextNode() && nw.node != element) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ return count;
+ };
+ //TODO: function does not handle equivalents for roles: row, link, header, button
+ // But it may not have to. Bug reports have been about radio buttons and checkboxes.
+ RPTUtil.isHtmlEquiv = function (node, htmlEquiv) {
+ var retVal = false;
+ if (node) {
+ var nodeName = node.nodeName.toLowerCase();
+ if (nodeName === "input") {
+ var type = node.getAttribute("type").toLowerCase();
+ if (type) {
+ if (htmlEquiv.indexOf("checkbox") != -1) {
+ retVal = type === "checkbox";
+ }
+ else if (htmlEquiv.indexOf("radio") != -1) {
+ retVal = type === "radio";
+ }
+ }
+ }
+ }
+ return retVal;
+ };
+ RPTUtil.isDefinedAriaAttribute = function (ele, attrName) {
+ var isDefinedAriaAttribute = false;
+ if (attrName.substring(0, 5) === 'aria-') {
+ // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute.
+ isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0;
+ }
+ return isDefinedAriaAttribute;
+ };
+ RPTUtil.normalizeSpacing = function (s) {
+ return s.trim().replace(/\s+/g, ' ');
+ };
+ ;
+ RPTUtil.nonExistantIDs = function (node, targetids) {
+ var returnnotfoundids = '';
+ if (RPTUtil.normalizeSpacing(targetids).length < 1)
+ return returnnotfoundids;
+ var targetArray = targetids.split(" ");
+ var doc = node.ownerDocument;
+ for (var i = 0; i < targetArray.length; i++) {
+ var xp = "//*[@id='" + targetArray[i] + "']";
+ var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r = xpathResult.iterateNext();
+ if (!r)
+ returnnotfoundids += targetArray[i] + ', ';
+ }
+ if (RPTUtil.normalizeSpacing(returnnotfoundids).length >= 2)
+ returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2);
+ else
+ returnnotfoundids = '';
+ return returnnotfoundids;
+ };
+ RPTUtil.getDocElementsByTag = function (elem, tagName) {
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(elem);
+ tagName = tagName.toLowerCase();
+ var cache = (0, CacheUtil_1.getCache)(doc, "RPT_DOCELEMSBYTAG", {});
+ if (!(tagName in cache)) {
+ cache[tagName] = doc.querySelectorAll(tagName);
+ (0, CacheUtil_1.setCache)(doc, "RPT_DOCELEMSBYTAG", cache);
+ }
+ return cache[tagName];
+ };
+ /**
+ * This function is responsible for get a list of all the child elemnts which match the tag
+ * name provided.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getChildByTagHidden
+ *
+ * @parm {element} parentElem - The parent element
+ * @parm {string} tagName - The tag to search for under the parent element
+ * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list
+ * false if the hidden elements should be added
+ *
+ * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getChildByTag = function (parentElem, tagName) {
+ return RPTUtil.getChildByTagHidden(parentElem, tagName, false, false);
+ };
+ /**
+ * This function is responsible for get a list of all the child elemnts which match the tag
+ * name provided.
+ *
+ * @parm {element} parentElem - The parent element
+ * @parm {string} tagName - The tag to search for under the parent element
+ * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list
+ * false if the hidden elements should be added
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ *
+ * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) {
+ // Variable Decleration
+ var retVal = [];
+ var child = parentElem.firstChild;
+ // Loop over all the child elements of the parent to build a list of all the elements that
+ // match the tagName provided
+ while (child != null) {
+ // Only include the children into the return array if they match with tagname.
+ if (child.nodeName.toLowerCase() === tagName) {
+ // In the case that ignorehidden was set to true, then perform a isNodeVisible check
+ // and in the case the node is not visilble we more to theses then move to the next node.
+ // Perform a couple of checks to determine if hidden elements should be ignored or not.
+ // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible
+ // 2. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ if ((ignoreHidden || (considerHiddenSetting && !RPTUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) {
+ // Move on to the next element
+ child = child.nextSibling;
+ continue;
+ }
+ // Push the element
+ retVal.push(child);
+ }
+ // Move to the next sibling element
+ child = child.nextSibling;
+ }
+ return retVal;
+ };
+ /**
+ * This function is responsible for finding a list of elements that match given roles(s).
+ * This function by defauly will not consider Check Hidden Setting at all.
+ * This function by defauly will not consider implicit roles.
+ * Note: This is a wrapper function to: RPTUtil.getElementsByRoleHidden
+ *
+ * @parm {document} doc - The document node
+ * @parm {list or string} roles - List or single role for which to return elements based on.
+ *
+ * @return {List} retVal - list of all the elements which matched the role(s) that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getElementsByRole = function (doc, roles) {
+ return RPTUtil.getElementsByRoleHidden(doc, roles, false, false);
+ };
+ /**
+ * This function is responsible for finding a list of elements that match given roles(s).
+ * This function aslo finds elements with implicit roles.
+ * This function will also consider elements that are hidden based on the if the Check
+ * Hidden Content settings should be considered or not.
+ *
+ * @parm {document} doc - The document node
+ * @parm {list or string} roles - List or single role for which to return elements based on.
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {List} retVal - list of all the elements which matched the role(s) that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) {
+ // In the case that the role to element assoication is already made, and available in the global hasAttribute
+ // we can just use that one instead of building a new one.
+ var roleToElems = null;
+ if (considerImplicitRoles) {
+ roleToElems = (0, CacheUtil_1.getCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", null);
+ }
+ else {
+ roleToElems = (0, CacheUtil_1.getCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE", null);
+ }
+ // Build the new role to element, this is where we loop through all the elements and extract all the
+ // elements bsaed on roles.
+ if (roleToElems === null) {
+ // Re-initialize the roleToElems hash
+ roleToElems = {};
+ // Get the body of the doc
+ var root = doc.body;
+ // Keep looping until we are at the very parent node of the entire page, so that we can loop through
+ // all the nodes.
+ while (DOMWalker_1.DOMWalker.parentNode(root) !== null) {
+ // Get the parentNode
+ root = DOMWalker_1.DOMWalker.parentNode(root);
+ }
+ // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes
+ // and build the roles to Element coralation
+ var nw = new NodeWalker(root);
+ // Loop over the entire doc/list of nodes to build the role to element map
+ // Note: This will build an roleToElems hash which is in the following format.
+ // roleToElems = {
+ // document: [{div},{abbr},{var}],
+ // main: [{div}],
+ // navigation: [{div}]
+ // }
+ while (nw.nextNode()) {
+ if (!nw.elem())
+ continue;
+ // Only check the elements which have the role attribute assiciated to them
+ if (!nw.bEndTag) {
+ var wRoles = [];
+ //check if the node has role attributes
+ if (nw.elem() && nw.elem().hasAttribute("role")) {
+ // Extract all the roles that are assigned to this element, can have multiple roles on one
+ // element split by space, so we need to extract all of them into an array.
+ wRoles = nw.elem().getAttribute("role").split(" ");
+ }
+ if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) {
+ //check if there are any implicit roles for this element.
+ var implicitRole = RPTUtil.getImplicitRole(nw.node);
+ if (implicitRole !== null && implicitRole.length > 0)
+ wRoles = implicitRole;
+ }
+ if (wRoles.length === 0) {
+ continue;
+ }
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ continue;
+ }
+ // Loop through all the roles and assigned this node to all thes roles
+ for (var i = 0; i < wRoles.length; ++i) {
+ // In the case that the role key is not already in the roleToElems hash, construct the
+ // add the key and assign empty array.
+ if (!(wRoles[i] in roleToElems)) {
+ roleToElems[wRoles[i]] = [];
+ }
+ // Add the node to the array for the role
+ roleToElems[wRoles[i]].push(nw.node);
+ }
+ }
+ }
+ // Set the roleToElems hash map as a global variable
+ if (considerImplicitRoles) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems);
+ }
+ else {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE", roleToElems);
+ }
+ }
+ // Initilize the return value
+ var retVal = [];
+ // Handle the cases where the provided role is a string and not an array,
+ // for this case we take the string and put it into an array
+ if (typeof (roles) === "string") {
+ var role = roles;
+ roles = [];
+ roles.push(role);
+ }
+ // Loop through the roles that were provided and find the list of elements for this roles
+ // and add them to the return value.
+ if (roles.length) {
+ // loop over all the roles
+ for (var i = 0; i < roles.length; ++i) {
+ // Extract the role from the array
+ var nextRole = roles[i];
+ // Fetch the list of all the elements for this role
+ var copyRoles = roleToElems[nextRole];
+ // If there are elements to copy to another array, then perform the copy
+ if (copyRoles) {
+ // Loop over all the elements which are to be copied
+ for (var j = 0; j < copyRoles.length; ++j) {
+ // Add this element to the return val
+ retVal.push(copyRoles[j]);
+ }
+ }
+ }
+ }
+ return retVal;
+ };
+ /**
+ * This function is responsible for retrieving user defined element's roles from dom.
+ * @parm {HTMLElement} ele - element for which to find role.
+ *
+ * @return {List} roles - list of user defined roles in the element role attribute.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getUserDefinedRoles = function (ele) {
+ return RPTUtil.getRoles(ele, false);
+ };
+ /**
+ * This function is responsible for retrieving element's roles.
+ * This function also finds implicit roles.
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {List} roles - list of attribute roles and implicit roles.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getRoles = function (ele, considerImplicitRoles) {
+ var roles = [];
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ var attrRoles = RPTUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" ");
+ for (var i = 0; i < attrRoles.length; ++i) {
+ roles.push(attrRoles[i]);
+ }
+ }
+ //check if implicit roles exist.
+ //Note: element can have multiple implicit roles
+ if (considerImplicitRoles) {
+ var implicitRole = RPTUtil.getImplicitRole(ele);
+ if (implicitRole !== null && implicitRole.length > 0) {
+ //add implicit roles to the attributes roles.
+ RPTUtil.concatUniqueArrayItemList(implicitRole, roles);
+ }
+ }
+ return roles;
+ };
+ /**
+ * Returns the implicit role of the elemement
+ * @parm {HTMLElement} ele - element for which to find role.
+ *
+ * @return the implicit role or [] if doesn't exist
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getImplicitRole = function (ele) {
+ if (!ele || ele.nodeType !== 1)
+ return [];
+ var implicitRoles = (0, CacheUtil_1.getCache)(ele, "RPTUtil_ImplicitRole", null);
+ if (!implicitRoles) {
+ var tagProperty = RPTUtil.getElementAriaProperty(ele);
+ // check if there are any implicit roles for this element.
+ if (tagProperty && tagProperty.implicitRole) {
+ if (tagProperty.implicitRole.includes("generic")) {
+ // the 'generic' role is only allowed if a valid aria attribute exists.
+ var domAriaAttributes_1 = RPTUtil.getUserDefinedAriaAttributes(ele);
+ if (domAriaAttributes_1.length === 0) {
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", []);
+ return [];
+ }
+ var roleAttributes = [];
+ var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic'];
+ if (pattern.reqProps && pattern.reqProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes);
+ if (tagProperty.globalAriaAttributesValid)
+ RPTUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes);
+ if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0)
+ RPTUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes);
+ // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes
+ if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) {
+ var implicit = RPTUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole);
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", implicit);
+ return implicit;
+ }
+ }
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", tagProperty.implicitRole);
+ return tagProperty.implicitRole;
+ }
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", []);
+ return [];
+ }
+ return implicitRoles;
+ };
+ /**
+ * Returns the required properties of the role
+ * @parm {string} role - the role
+ * @parm {HTMLElement} ele - element for which to find role.
+ *
+ * @return {List} properties - list of properties that are required by the role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getRoleRequiredProperties = function (role, ele) {
+ if (role === null) {
+ return null;
+ }
+ if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) {
+ var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps;
+ // handle special case of separator
+ if (role.toLowerCase() === "separator" && ele && RPTUtil.isFocusable(ele)) {
+ requiredAttributes = RPTUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []);
+ }
+ return requiredAttributes;
+ }
+ else {
+ return null;
+ }
+ };
+ /**
+ * Test if the ele node is focusable
+ */
+ RPTUtil.isFocusable = function (ele) {
+ if (ele === "undefined" || ele === null) {
+ return false;
+ }
+ return RPTUtil.isTabbable(ele);
+ };
+ /**
+ * This function is responsible for finding if a element has given role.
+ * This function aslo finds if element has given roles as implicit role.
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {list or string} roles - List or single role for which to find if element has these roles.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {List} retVal - true or false based on if th element has the specified role.
+ *
+ * @memberOf RPTUtil
+ *
+ * Consider to use hasRoleInSemantics() instead.
+ */
+ RPTUtil.hasRole = function (ele, role, considerImplicitRoles) {
+ var retVal = false;
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ if (typeof (role) != typeof ("")) {
+ var roles = ele.getAttribute("role").trim().split(" ");
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ retVal = roles[i] in role;
+ }
+ }
+ else {
+ var roles = ele.getAttribute("role").trim().split(" ");
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ retVal = roles[i] === role;
+ }
+ }
+ }
+ //if none of the the attribute roles matched with given role
+ //check if implicit roles matches.
+ //Note: element can have multiple implicit roles
+ if (!retVal && considerImplicitRoles) {
+ var wRoles = [];
+ //check if there are any implicit roles for this element.
+ var implicitRole = RPTUtil.getImplicitRole(ele);
+ if (implicitRole !== null && implicitRole.length > 0) {
+ RPTUtil.concatUniqueArrayItemList(implicitRole, wRoles);
+ //if role is array loop thru and see if any of the implicit role present in the array
+ if (typeof (role) != typeof ("")) {
+ for (var i = 0; !retVal && i < wRoles.length; ++i) {
+ retVal = wRoles[i] in role;
+ }
+ }
+ else {
+ for (var i = 0; !retVal && i < wRoles.length; ++i) {
+ retVal = wRoles[i] === role;
+ }
+ }
+ }
+ }
+ return retVal;
+ };
+ /**
+ * Checks if the element has the role, including the implied role if role is not explicitly specified.
+ *
+ * This function is replacing the hasRole function
+ *
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {list or string} roles - List or single role for which to find if element has these roles.
+ *
+ * @return {List} retVal - true or false based on if the element has the specified role.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.hasRoleInSemantics = function (ele, role) {
+ var retVal = false;
+ var roleSpecified = false;
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ if (typeof (role) != typeof ("")) {
+ var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ roleSpecified = true;
+ retVal = roles[i] in role;
+ }
+ }
+ else {
+ var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ roleSpecified = true;
+ retVal = roles[i] === role;
+ }
+ }
+ }
+ if (roleSpecified) {
+ return retVal;
+ }
+ //check if implicit roles matches.
+ //Note: element can have multiple implicit roles
+ //check if there are any implicit roles for this element.
+ var impRoles = RPTUtil.getImplicitRole(ele);
+ if (impRoles !== null && impRoles.length > 0) {
+ //if role is array loop thru and see if any of the implicit role present in the array
+ if (typeof (role) != typeof ("")) {
+ for (var i = 0; !retVal && i < impRoles.length; ++i) {
+ retVal = impRoles[i] in role;
+ }
+ }
+ else {
+ for (var i = 0; !retVal && i < impRoles.length; ++i) {
+ retVal = impRoles[i] === role;
+ }
+ }
+ }
+ return retVal;
+ };
+ /**
+ * This function is responsible for finding if a element has given role.
+ * This function also checks if element has given roles as implicit roles.
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {bool} retVal - true or false based on if the element has the specified role.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.hasAnyRole = function (ele, considerImplicitRoles) {
+ var retVal = false;
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ retVal = true;
+ }
+ //check if implicit roles exist.
+ //Note: element can have multiple implicit roles
+ if (!retVal && considerImplicitRoles) {
+ //check if there are any implicit roles for this element.
+ var impRoles = RPTUtil.getImplicitRole(ele);
+ if (impRoles !== null && impRoles.length > 0)
+ retVal = true;
+ }
+ return retVal;
+ };
+ RPTUtil.isDataTable = function (tableNode) {
+ return !(RPTUtil.hasRole(tableNode, "none") || RPTUtil.hasRole(tableNode, "presentation"));
+ };
+ /*
+ * A complex data table is a data table with any of the following characteristics:
+ *
+ * a thead element that contains two or more tr elements
+ * a table with more than one thead element
+ * a table with two or more tr elements that contain only th elements
+ * a th or td element with a rowspan or colspan attribute
+ * a tr element that contains at least one td element and two or more th elements
+ * a table with headers not located in the first row or first column
+ * a td element with a headers attribute value that contains more than two IDREFs
+ */
+ RPTUtil.isComplexDataTable = function (table) {
+ if ("RPTUtil_isComplexDataTable" in table) {
+ return !!table.RPTUtil_isComplexDataTable;
+ }
+ var isComplexTable = false;
+ if (table && RPTUtil.isDataTable(table)) {
+ var thNodes = null, tdNodes = null;
+ var trNodes = table.getElementsByTagName("tr");
+ var trNodeCount = trNodes.length;
+ var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0;
+ for (var i = 0; !isComplexTable && i < trNodeCount; ++i) {
+ thNodes = trNodes[i].getElementsByTagName("th");
+ tdNodes = trNodes[i].getElementsByTagName("td");
+ thNodeCount = thNodes.length;
+ tdNodeCount = tdNodes.length;
+ if (tdNodeCount !== 0) {
+ // a tr element that contains at least one td element and two or more th elements;
+ isComplexTable = thNodeCount > 1;
+ // a th element with a rowspan or colspan attribute
+ for (var j = 0; !isComplexTable && j < thNodeCount; ++j) {
+ isComplexTable = ((thNodes[j].hasAttribute("rowspan") ||
+ thNodes[j].hasAttribute("colspan")) &&
+ RPTUtil.getAncestor(thNodes[j], "table") === table);
+ }
+ // a td element with a rowspan or colspan attribute
+ // a td element with a headers attribute value that contains more than two IDREFs
+ for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) {
+ isComplexTable = ((tdNodes[k].hasAttribute("rowspan") ||
+ tdNodes[k].hasAttribute("colspan") ||
+ (tdNodes[k].hasAttribute("headers") && RPTUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) &&
+ RPTUtil.getAncestor(tdNodes[k], "table") === table);
+ }
+ }
+ else {
+ // two or more tr elements that contain only th elements
+ if (thNodeCount > 0) {
+ ++trNodesHavingOnlyThNodes;
+ }
+ isComplexTable = trNodesHavingOnlyThNodes === 2;
+ }
+ }
+ if (!isComplexTable) {
+ var theadNodes = table.getElementsByTagName("thead");
+ var theadNodesLength = theadNodes.length;
+ if (theadNodesLength > 0) {
+ // table has more than one thead element
+ isComplexTable = theadNodesLength > 1;
+ // a thead element that contains two or more tr elements
+ if (!isComplexTable) {
+ isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1;
+ }
+ }
+ }
+ if (!isComplexTable && trNodeCount !== 0) {
+ // a table with headers not located in the first row or first column
+ isComplexTable = thNodeCount > 0 && !RPTUtil.isTableHeaderInFirstRowOrColumn(table);
+ }
+ }
+ table.RPTUtil_isComplexDataTable = isComplexTable;
+ return isComplexTable;
+ };
+ // Return true if a table's header is in the first row or column
+ RPTUtil.isTableHeaderInFirstRowOrColumn = function (ruleContext) {
+ var passed = false;
+ var rows = ruleContext.rows;
+ // Check if the first row is all TH's
+ if (rows != null && rows.length > 0) {
+ var firstRow = rows[0];
+ passed = firstRow.cells.length > 0 && RPTUtil.getChildByTagHidden(firstRow, "td", false, true).length === 0;
+ // If the first row isn't a header row, try the first column
+ if (!passed) {
+ // Assume that the first column has all TH's unless we find a TD in the first column.
+ passed = true;
+ for (var i = 0; passed && i < rows.length; ++i) {
+ // If no cells in this row, that's okay too.
+ passed = !rows[i].cells ||
+ rows[i].cells.length === 0 ||
+ rows[i].cells[0].nodeName.toLowerCase() != "td";
+ }
+ }
+ if (!passed) {
+ // Special case - both first row and first column are headers, but they did not use
+ // a th for the upper-left cell
+ passed = true;
+ for (var i = 1; passed && i < firstRow.cells.length; ++i) {
+ passed = firstRow.cells[i].nodeName.toLowerCase() != "td";
+ }
+ for (var i = 1; passed && i < rows.length; ++i) {
+ // If no cells in this row, that's okay too.
+ passed = !rows[i].cells ||
+ rows[i].cells.length === 0 ||
+ rows[i].cells[0].nodeName.toLowerCase() != "td";
+ }
+ }
+ }
+ return passed;
+ };
+ RPTUtil.isNodeInGrid = function (node) {
+ return RPTUtil.getAncestorWithRole(node, "grid") != null;
+ };
+ RPTUtil.isLayoutTable = function (tableNode) {
+ return RPTUtil.hasRole(tableNode, "presentation") || RPTUtil.hasRole(tableNode, "none");
+ };
+ RPTUtil.getFileExt = function (url) {
+ var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);
+ if (m != null && m.length >= 2) {
+ return "." + m[1];
+ }
+ return "";
+ };
+ RPTUtil.getFileAnchor = function (url) {
+ var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/);
+ if (m != null && m.length >= 2) {
+ return m[1];
+ }
+ return "";
+ };
+ RPTUtil.checkObjEmbed = function (node, extTest, mimeTest) {
+ var nodeName = node.nodeName.toLowerCase();
+ if (nodeName != "object" && nodeName != "embed" &&
+ nodeName != "a" && nodeName != "area")
+ return false;
+ var retVal = false;
+ // Check mime type
+ if (!retVal && node.hasAttribute("type")) {
+ var mime = node.getAttribute("type").toLowerCase();
+ retVal = mimeTest(mime);
+ }
+ if (!retVal && node.hasAttribute("codetype")) {
+ var mime = node.getAttribute("codetype");
+ retVal = mimeTest(mime);
+ }
+ // Check the filename
+ if (!retVal) {
+ var filename = "";
+ if (nodeName === "embed") {
+ filename = node.getAttribute("src");
+ }
+ else if (nodeName === "a" || nodeName === "area") {
+ filename = node.getAttribute("href");
+ }
+ else if (node.hasAttribute("data")) {
+ filename = node.getAttribute("data");
+ }
+ if (filename === null)
+ filename = "";
+ var ext = RPTUtil.getFileExt(filename);
+ retVal = extTest(ext);
+ }
+ // Check for filenames in the params
+ if (!retVal && nodeName === "object") {
+ // In the case that Check Hidden Option is set then comply with that setting
+ var params = RPTUtil.getChildByTagHidden(node, "param", false, true);
+ for (var i = 0; !retVal && params != null && i < params.length; ++i) {
+ retVal = params[i].hasAttribute("value") &&
+ extTest(RPTUtil.getFileExt(params[i].getAttribute("value")));
+ }
+ }
+ return retVal;
+ };
+ RPTUtil.isAudioObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isAudioExt, function (mime) {
+ return mime.startsWith("audio");
+ });
+ };
+ RPTUtil.isAudioExt = function (ext) {
+ var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda",
+ ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med",
+ ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm",
+ ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul",
+ ".voc", ".wav", ".wma", ".wve"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), audio_extensions);
+ };
+ RPTUtil.isVideoObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isVideoExt, function (mime) {
+ return mime.startsWith("video") ||
+ mime.startsWith("application/x-shockwave-flash");
+ });
+ };
+ RPTUtil.isVideoExt = function (ext) {
+ var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov",
+ ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt",
+ ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb",
+ ".mvb"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), video_extensions);
+ };
+ RPTUtil.isImageObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isImgExt, function (mime) {
+ return mime.startsWith("image");
+ });
+ };
+ RPTUtil.isImgExt = function (ext) {
+ var image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"];
+ return RPTUtil.valInArray(ext.toLowerCase(), image_extensions);
+ };
+ RPTUtil.isHtmlExt = function (ext) {
+ var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm",
+ ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), html_extensions);
+ };
+ RPTUtil.isPresentationalElement = function (node) {
+ // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics,
+ // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn",
+ "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s",
+ "samp", "small", "span", "strong", "sub", "sup", "time", "u",
+ "var", "wbr", "a", "progress", "meter", "basefont", "big", "center",
+ "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6",
+ "hr", "blockquote", "p"
+ ];
+ return RPTUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements);
+ };
+ RPTUtil.hasTriggered = function (doc, id) {
+ return (0, CacheUtil_1.getCache)(doc, id, false);
+ };
+ RPTUtil.triggerOnce = function (doc, id, passed) {
+ if (passed)
+ return true;
+ var triggered = (0, CacheUtil_1.getCache)(doc, id, false);
+ (0, CacheUtil_1.setCache)(doc, id, true);
+ return triggered;
+ };
+ /* determine if the given value exists in the given array */
+ RPTUtil.valInArray = function (value, arr) {
+ for (var idx in arr) {
+ if (arr[idx] === value)
+ return true;
+ }
+ return false;
+ };
+ /**
+ * return the ancestor of the given element
+ * @param tagNames string, array, or dictionary containing the tags to search for
+ */
+ RPTUtil.getAncestor = function (element, tagNames) {
+ var walkNode = element;
+ while (walkNode !== null) {
+ var thisTag = walkNode.nodeName.toLowerCase();
+ if (typeof (tagNames) === "string") {
+ if (thisTag === tagNames.toLowerCase()) {
+ break;
+ }
+ }
+ else if (tagNames.length) {
+ for (var idx in tagNames) {
+ if (tagNames[idx] === thisTag)
+ return walkNode;
+ }
+ }
+ else if (thisTag in tagNames) {
+ break;
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return walkNode;
+ };
+ // return true if element1 and element2 are siblings
+ RPTUtil.isSibling = function (element1, element2) {
+ if (element1 && element2) {
+ var node = null;
+ if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) {
+ node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild;
+ }
+ while (node) {
+ if (node === element2)
+ return true;
+ node = node.nextSibling;
+ }
+ }
+ return false;
+ };
+ /**
+ * return the ancestor of the given element and role.
+ *
+ * @parm {element} element - The element to start the node walk on to find parent node
+ * @parm {string} role - The role to search for on an element under the provided element
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} walkNode - A parent node of the element passed in, which has the provided role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) {
+ var walkNode = DOMWalker_1.DOMWalker.parentNode(element);
+ while (walkNode !== null) {
+ if (considerImplicitRoles) {
+ if (RPTUtil.hasRoleInSemantics(walkNode, roleName)) {
+ break;
+ }
+ }
+ else {
+ if (RPTUtil.hasRole(walkNode, roleName, false)) {
+ break;
+ }
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return walkNode;
+ };
+ /**
+ * return the ancestor with the given style properties.
+ *
+ * @parm {element} element - The element to start the node walk on to find parent node
+ * @parm {[string]} styleProps - The style properties and values of the parent to search for.
+ * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']}
+ * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop.
+ * @parm {bool} excludedValues - style values that should be ignored.
+ * @return {node} walkNode - A parent node of the element, which has the style properties
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) {
+ if (excludedValues === void 0) { excludedValues = []; }
+ var walkNode = elem;
+ while (walkNode !== null) {
+ var styles = (0, CSSUtil_1.getDefinedStyles)(walkNode);
+ for (var style in styleProps) {
+ var value = styles[style];
+ if (value) {
+ value = value.split(" ")[0]; //get rid of !important
+ if (!excludedValues.includes(value)) {
+ if (styleProps[style].includes('*')) {
+ return walkNode;
+ }
+ else if (styleProps[style].includes(value))
+ return walkNode;
+ }
+ }
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ return null;
+ };
+ /**
+ * This function is responsible for finding a node which matches the role and is a sibling of the
+ * provided element.
+ *
+ * This function by default will not consider Check Hidden Setting at all.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getSiblingWithRoleHidden
+ *
+ * @parm {element} element - The element to start the node walk on to find sibling node
+ * @parm {string} role - The role to search for on an element under the provided element
+ *
+ * @return {node} walkNode - A sibling node of the element passed in, which has the provided role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getSiblingWithRole = function (element, role) {
+ return RPTUtil.getSiblingWithRoleHidden(element, role, false);
+ };
+ /**
+ * This function is responsible for finding a node which matches the role and is a sibling of the
+ * provided element.
+ *
+ * This function also considers implicit roles for the elements.
+ *
+ * This function will also consider elements that are hidden based on the if the Check
+ * Hidden Content settings should be considered or not.
+ *
+ * @parm {element} element - The element to start the node walk on to find sibling node
+ * @parm {string} role - The role to search for on an element under the provided element
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered.
+ *
+ * @return {node} walkNode - A sibling node of the element passed in, which has the provided role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) {
+ // Variable Declaration
+ var walkNode = null;
+ var hasRole = false;
+ // Only perform the check if element and role are both provided
+ if (element && role) {
+ // Fetch the next sibling element
+ walkNode = element.nextSibling;
+ // Keep looping over the next siblings to find element which matches
+ // the provided role.
+ while (walkNode !== null && !hasRole) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(walkNode)) {
+ // Move on to the next node
+ walkNode = walkNode.nextSibling;
+ continue;
+ }
+ // Check if this node has the role that we need to check exists
+ if (considerImplicitRole) {
+ hasRole = RPTUtil.hasRoleInSemantics(walkNode, role);
+ }
+ else {
+ hasRole = RPTUtil.hasRole(walkNode, role, false);
+ }
+ // Move on to the next node
+ walkNode = walkNode.nextSibling;
+ }
+ // If we still have not found a node that matches the role, start a reverse look up
+ if (!walkNode) {
+ // Fetch the previous Sibling of this element
+ walkNode = element.previousSibling;
+ // Keep looping over all the previous siblings to search for an element which
+ // matches the provided role.
+ while (walkNode !== null && !hasRole) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(walkNode)) {
+ // Move on to the next node
+ walkNode = walkNode.previousSibling;
+ continue;
+ }
+ // Check if this node has the role that we need to check exists
+ hasRole = RPTUtil.hasRole(walkNode, role, considerImplicitRole);
+ // Move on to the next node
+ walkNode = walkNode.previousSibling;
+ }
+ }
+ }
+ return walkNode;
+ };
+ RPTUtil.isDescendant = function (parent, child) {
+ var node = DOMWalker_1.DOMWalker.parentNode(child);
+ while (node != null) {
+ if (node === parent) {
+ return true;
+ }
+ node = DOMWalker_1.DOMWalker.parentNode(node);
+ }
+ return false;
+ };
+ //check if the first form control child is disabled
+ RPTUtil.isDisabledByFirstChildFormElement = function (element) {
+ var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"];
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (nw.nextNode()) {
+ if (formElements.includes(nw.node.nodeName.toLowerCase())) {
+ if (RPTUtil.isNodeDisabled(nw.node))
+ return true;
+ return false;
+ }
+ }
+ }
+ return false;
+ };
+ RPTUtil.isDisabledByReferringElement = function (element) {
+ var id = element.getAttribute("id");
+ var doc = element.ownerDocument;
+ var root = doc.body;
+ while (DOMWalker_1.DOMWalker.parentNode(root) !== null) {
+ // Get the parentNode
+ root = DOMWalker_1.DOMWalker.parentNode(root);
+ }
+ var nw = new NodeWalker(root);
+ while (nw.nextNode()) {
+ // check the element whose 'aria-describedby' equals to the id
+ if (nw.node && nw.node.nodeType === 1 && nw.elem()) {
+ var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" ");
+ if (AriaDescribedbyIDArray.includes(id) && RPTUtil.isNodeDisabled(nw.node)) {
+ return true;
+ }
+ }
+ }
+ };
+ /**
+ * This function is responsible for getting a descendant element with the specified role, under
+ * the element that was provided.
+ *
+ * Note by default this function will not consider the Check Hidden Content Setting.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getDescendantWithRoleHidden
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDescendantWithRole = function (element, roleName) {
+ return RPTUtil.getDescendantWithRoleHidden(element, roleName, false);
+ };
+ /**
+ * This function is responsible for getting a descendant element with the specified role, under
+ * the element that was provided. This function aslo finds elements with implicit roles.
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var descendant = null;
+ var nw = new NodeWalker(element);
+ // Loop over all the childrens of the element provided and check if the rolename provided exists
+ while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ continue;
+ }
+ // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ if (considerImplicitRoles ? RPTUtil.hasRoleInSemantics(nw.node, roleName) : RPTUtil.hasRole(nw.node, roleName, false)) {
+ descendant = nw.node;
+ break;
+ }
+ }
+ return descendant;
+ };
+ /**
+ * This function is responsible for getting All descendant elements with the specified role, under
+ * the element that was provided. This function aslo finds elements with implicit roles.
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var descendants = [];
+ var nw = new NodeWalker(element);
+ // Loop over all the childrens of the element provided and check if the rolename provided exists
+ while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) {
+ if (nw.bEndTag) {
+ continue;
+ }
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ continue;
+ }
+ // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ if (RPTUtil.hasRole(nw.node, roleName, considerImplicitRoles)) {
+ descendants.push(nw.node);
+ }
+ }
+ return descendants;
+ };
+ /**
+ * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation)
+ *
+ * @parm {element} element - parent element for which we will be checking children for
+ * @return {node} - The direct child elements in AT tree that has a role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDirectATChildren = function (element) {
+ var requiredChildRoles = RPTUtil.getRequiredChildRoles(element, true);
+ var direct = [];
+ RPTUtil.retrieveDirectATChildren(element, requiredChildRoles, direct);
+ return direct;
+ };
+ /**
+ * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation)
+ *
+ * @parm {element} element - parent element for which we will be checking children for
+ * @return {node} - The direct child elements in AT tree
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) {
+ var children = [];
+ if (element.children !== null && element.children.length > 0) {
+ for (var i = 0; i < element.children.length; i++) {
+ children.push(element.children[i]);
+ }
+ }
+ // if the element contains "aria-own" attribute, then the aria-owned children need to be included too
+ var owned = element.getAttribute("aria-owns");
+ if (owned) {
+ var doc = element.ownerDocument;
+ if (doc) {
+ var ownedIds = owned.split(" ");
+ for (var i = 0; i < ownedIds.length; i++) {
+ var ownedElem = doc.getElementById(ownedIds[i]);
+ if (ownedElem) {
+ children.push(ownedElem);
+ }
+ }
+ }
+ }
+ if (children.length > 0) {
+ for (var i = 0; i < children.length; i++) {
+ //ignore hidden and invisible child
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i]))
+ continue;
+ var roles = RPTUtil.getRoles(children[i], false);
+ if (roles === null || roles.length === 0) {
+ roles = RPTUtil.getImplicitRole(children[i]);
+ }
+ if (roles && roles !== null && roles.length > 0) {
+ //remove 'none' and 'presentation'
+ roles = roles.filter(function (role) {
+ return role !== "none" && role !== "presentation";
+ });
+ // a 'group' role is allowed but not required for some elements so remove it if exists
+ if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) {
+ roles = roles.filter(function (role) {
+ return role !== 'group';
+ });
+ }
+ }
+ if (roles && roles !== null && roles.length > 0) {
+ direct.push(children[i]);
+ }
+ else {
+ // recursive until get a return value,
+ RPTUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct);
+ }
+ }
+ return null;
+ }
+ else
+ return null;
+ };
+ /**
+ * this function returns null or required child roles for a given element with one more roles,
+ * return null if the role is 'none' or 'presentation'
+ * @param element
+ * @param includeImplicit include implicit roles if no role is explicitly provided
+ * @returns
+ */
+ RPTUtil.getRequiredChildRoles = function (element, includeImplicit) {
+ var roles = RPTUtil.getRoles(element, false);
+ // if explicit role doesn't exist, get the implicit one
+ if ((!roles || roles.length === 0) && includeImplicit) {
+ roles = RPTUtil.getImplicitRole(element);
+ }
+ /**
+ * ignore if the element doesn't have any explicit or implicit role
+ */
+ if (!roles || roles.length === 0) {
+ return null;
+ }
+ /**
+ * ignore if the element contains none or presentation role
+ */
+ var presentationRoles = ["none", "presentation"];
+ var found = roles.some(function (r) { return presentationRoles.includes(r); });
+ if (found)
+ return null;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var requiredChildRoles = new Array();
+ for (var j = 0; j < roles.length; ++j) {
+ if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) {
+ requiredChildRoles = RPTUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles);
+ }
+ }
+ return requiredChildRoles;
+ };
+ /**
+ * This function is responsible for getting an element referenced by aria-owns and has the
+ * role that was specified.
+ *
+ * Note by default this function will not consider the Check Hidden Content Setting.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getAriaOwnsWithRoleHidden
+ *
+ * @parm {element} element - Element to check for aria-owns
+ * @parm {string} roleName - The role to look for on the aria-owns element
+ *
+ * @return {node} - The element that is referenced by aria-owns and has role specified.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAriaOwnsWithRole = function (element, roleName) {
+ return RPTUtil.getAriaOwnsWithRoleHidden(element, roleName, false);
+ };
+ /**
+ * This function is responsible for getting an element referenced by aria-owns and has the
+ * role that was specified. This function aslo finds elements with implicit roles.
+ *
+ * @parm {element} element - Element to check for aria-owns
+ * @parm {string} roleName - The role to look for on the aria-owns element
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} - The element that is referenced by aria-owns and has role specified.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var referencedElement = null;
+ var referencedElemHasRole = false;
+ // In the case aria-owns is not on the element just break out of this function with null
+ if (RPTUtil.attributeNonEmpty(element, "aria-owns")) {
+ // Get the reference ID
+ var referenceID = element.getAttribute("aria-owns");
+ // Get the element for the reference ID
+ referencedElement = fragment_1.FragmentUtil.getById(element, referenceID);
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ if (considerHiddenSetting && referencedElement != null && RPTUtil.shouldNodeBeSkippedHidden(referencedElement)) {
+ referencedElemHasRole = null;
+ }
+ else {
+ referencedElemHasRole = RPTUtil.hasRole(referencedElement, roleName, considerImplicitRoles);
+ }
+ }
+ return referencedElemHasRole ? referencedElement : null;
+ };
+ /** get element containing label for the given element
+ * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead
+ */
+ RPTUtil.getInputLabel = function (element) {
+ return RPTUtil.getLabelForElement(element);
+ };
+ /**
+ * This function is responsible for getting the element containing the label for the given element.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getLabelForElementHidden
+ *
+ * @parm {element} element - The element for which to get the label element for.
+ *
+ * @return {element} element - return the element for the label, otherwise null
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getLabelForElement = function (element) {
+ return RPTUtil.getLabelForElementHidden(element, false);
+ };
+ /**
+ * This function is responsible for getting the element containing the label for the given element.
+ *
+ * This function will return null if the containing lable element is hidden, when the ignoreHidden option
+ * is set to true.
+ *
+ * @parm {element} element - The element for which to get the label element for.
+ * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list
+ * false if the hidden elements should be added
+ *
+ * @return {element} element - return the element for the label, otherwise null
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getLabelForElementHidden = function (element, ignoreHidden) {
+ // Check if the global RPTUtil_LABELS hash is available, as this will contain the label nodes based on
+ // for attribute.
+ //if (!getCache(element.ownerDocument,"RPTUtil_LABELS", null)) {
+ var root = element.getRootNode();
+ if (!(0, CacheUtil_1.getCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", null)) {
+ // Variable Decleration
+ var idToLabel = {};
+ // Get all the label elements in the entire doc
+ var labelNodes = RPTUtil.getDocElementsByTag(element, "label");
+ // Loop over all the label nodes, in the case the label node has a for attribute,
+ // extract that attribute and add this node to the hash if it is visible.
+ for (var i = 0; i < labelNodes.length; ++i) {
+ if (labelNodes[i].hasAttribute("for")) {
+ // If ignore hidden is specified and the node is not visible we do not add it to the
+ // labelNodes hash.
+ if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) {
+ continue;
+ }
+ idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i];
+ }
+ }
+ // Add the built hash to the ownerDocument (document), to be used later to fast retrival
+ //setCache(element.ownerDocument, "RPTUtil_LABELS", idToLabel);
+ (0, CacheUtil_1.setCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", idToLabel);
+ }
+ // If this element has an id attribute, get the corosponding label element
+ if (element.hasAttribute("id")) {
+ // Fetch the id attribute
+ var ctrlId = element.getAttribute("id");
+ // Return the corosponding label element.
+ // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden
+ if (ctrlId.trim().length > 0) {
+ //return getCache(element.getRootNode().ownerDocument,"RPTUtil_LABELS",{})[ctrlId];
+ return (0, CacheUtil_1.getCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", {})[ctrlId];
+ }
+ }
+ return null;
+ };
+ /* Return specified element attribute if present else return null */
+ RPTUtil.getElementAttribute = function (element, attr) {
+ return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null;
+ };
+ // Return true if the element has an ARIA label
+ RPTUtil.hasAriaLabel = function (element) {
+ // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element
+ return RPTUtil.attributeNonEmpty(element, "aria-label") || RPTUtil.attributeNonEmpty(element, "aria-labelledby");
+ };
+ // Return true if element has valid implicit label
+ RPTUtil.hasImplicitLabel = function (element) {
+ var parentNode = RPTUtil.getAncestor(element, "label");
+ // Test a) if the parent is a label which is the implicit label
+ // b) if the form element is the first child of the label
+ // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output"
+ // form elements that do not require implicit or explicit label element are:
+ // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later
+ if (parentNode && parentNode.tagName.toLowerCase() === "label" && RPTUtil.isFirstFormElement(parentNode, element)) {
+ var parentClone = parentNode.cloneNode(true);
+ // exclude all form elements from the label since they might also have inner content
+ parentClone = RPTUtil.removeAllFormElementsFromLabel(parentClone);
+ return RPTUtil.hasInnerContentHidden(parentClone);
+ }
+ else {
+ return false;
+ }
+ };
+ RPTUtil.isFirstFormElement = function (parentNode, element) {
+ var formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"];
+ if (parentNode.firstChild != null) {
+ var nw = new NodeWalker(parentNode);
+ while (nw.nextNode()) {
+ if (formElementsRequiringLabel.indexOf(nw.node.nodeName.toLowerCase()) !== -1) {
+ return nw.node === element;
+ }
+ }
+ }
+ return false;
+ };
+ // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored)
+ RPTUtil.isShadowHostElement = function (element) {
+ if (RPTUtil.isShadowElement(element))
+ return false;
+ var walkNode = element;
+ while (walkNode) {
+ if (walkNode.shadowRoot)
+ return true;
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ return false;
+ };
+ //check if an element is in a shadow tree
+ RPTUtil.isShadowElement = function (element) {
+ var root = element.getRootNode();
+ if (root.toString() === "[object ShadowRoot]")
+ return true;
+ return false;
+ };
+ RPTUtil.removeAllFormElementsFromLabel = function (element) {
+ var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"];
+ var childNodes = element.childNodes;
+ for (var i = 0; i < childNodes.length; i++) {
+ if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) {
+ element.removeChild(childNodes[i]);
+ }
+ }
+ return element;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels
+ RPTUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) {
+ if (elements.length === 0)
+ return false;
+ var doc = elements[0].ownerDocument;
+ var hasDuplicateLabels = false;
+ var uniqueAriaLabels = null;
+ if (isGlobal) {
+ uniqueAriaLabels = (0, CacheUtil_1.getCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", null);
+ }
+ if (uniqueAriaLabels === null) {
+ uniqueAriaLabels = {};
+ }
+ for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) {
+ if (elements[i].hasAttribute) {
+ if (elements[i].hasAttribute("aria-label")) {
+ var ariaLabel = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase();
+ hasDuplicateLabels = ariaLabel in uniqueAriaLabels;
+ uniqueAriaLabels[ariaLabel] = true;
+ }
+ else if (elements[i].hasAttribute("aria-labelledby")) {
+ var labelID = elements[i].getAttribute("aria-labelledby");
+ var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID);
+ var label = labelNode ? RPTUtil.getInnerText(labelNode) : "";
+ var normalizedLabel = RPTUtil.normalizeSpacing(label).toLowerCase();
+ hasDuplicateLabels = normalizedLabel in uniqueAriaLabels;
+ uniqueAriaLabels[normalizedLabel] = true;
+ }
+ else {
+ // Has no label at all
+ hasDuplicateLabels = true;
+ }
+ }
+ }
+ if (isGlobal) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels);
+ }
+ return !hasDuplicateLabels;
+ };
+ RPTUtil.getAriaLabel = function (ele) {
+ if (ele.hasAttribute) {
+ if (ele.hasAttribute("aria-labelledby")) {
+ var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" ");
+ var normalizedLabel = "";
+ for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) {
+ var labelID = labelIDs[j];
+ var labelNode = fragment_1.FragmentUtil.getById(ele, labelID);
+ var label = labelNode ? RPTUtil.getInnerText(labelNode) : "";
+ normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase();
+ }
+ return normalizedLabel.trim();
+ }
+ else if (ele.hasAttribute("aria-label")) {
+ return RPTUtil.normalizeSpacing(ele.getAttribute("aria-label")).toLowerCase().trim();
+ }
+ }
+ if (ele.nodeName.toLowerCase() === "input") {
+ //const label = RPTUtil.getLabelForElement(ele);
+ var label = RPTUtil.getLabelForElementHidden(ele, true);
+ if (!label)
+ return "";
+ return (RPTUtil.getAriaLabel(label) || label.innerText || "").trim();
+ }
+ return "";
+ };
+ RPTUtil.findAriaLabelDupes = function (elements) {
+ var dupeMap = {};
+ elements.forEach(function (ele) {
+ dupeMap[RPTUtil.getAriaLabel(ele)] = (dupeMap[RPTUtil.getAriaLabel(ele)] || 0) + 1;
+ });
+ return dupeMap;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels globally
+ RPTUtil.hasUniqueAriaLabels = function (elements) {
+ return RPTUtil.hasUniqueAriaLabelsLocally(elements, true);
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels
+ RPTUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) {
+ if (elements.length === 0)
+ return false;
+ var doc = elements[0].ownerDocument;
+ var hasDuplicateLabels = false;
+ var uniqueAriaLabels = null;
+ var duplicateLabelNameArray = new Array();
+ if (isGlobal) {
+ uniqueAriaLabels = (0, CacheUtil_1.getCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", null);
+ }
+ if (uniqueAriaLabels === null) {
+ uniqueAriaLabels = {};
+ }
+ for (var i = 0; i < elements.length; ++i) {
+ if (elements[i].hasAttribute) {
+ if (elements[i].hasAttribute("aria-label")) {
+ var ariaLabel = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase();
+ hasDuplicateLabels = ariaLabel in uniqueAriaLabels;
+ uniqueAriaLabels[ariaLabel] = true;
+ if (!(ariaLabel in duplicateLabelNameArray)) {
+ duplicateLabelNameArray[ariaLabel] = new Array();
+ }
+ duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase());
+ }
+ else if (elements[i].hasAttribute("aria-labelledby")) {
+ var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" ");
+ var normalizedLabel = "";
+ for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) {
+ var labelID = labelIDs[j];
+ var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID);
+ var label = labelNode ? RPTUtil.getInnerText(labelNode) : "";
+ normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase();
+ }
+ hasDuplicateLabels = normalizedLabel in uniqueAriaLabels;
+ uniqueAriaLabels[normalizedLabel] = true;
+ if (!(normalizedLabel in duplicateLabelNameArray)) {
+ duplicateLabelNameArray[normalizedLabel] = new Array();
+ }
+ duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase());
+ }
+ }
+ }
+ if (isGlobal) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels);
+ }
+ return duplicateLabelNameArray;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels globally
+ RPTUtil.hasDuplicateAriaLabels = function (elements) {
+ return RPTUtil.hasDuplicateAriaLabelsLocally(elements, true);
+ };
+ // Given an array of elements, return true if the elements have unique aria-labelledby attributes
+ RPTUtil.hasUniqueAriaLabelledby = function (elements) {
+ var hasDuplicateLabels = false;
+ var labelRefs = {};
+ for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) {
+ if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby")) {
+ var labelRef = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby"));
+ hasDuplicateLabels = labelRef in labelRefs;
+ labelRefs[labelRef] = true;
+ }
+ else {
+ hasDuplicateLabels = true;
+ }
+ }
+ return !hasDuplicateLabels;
+ };
+ /* Determine the node depth of the given element */
+ RPTUtil.nodeDepth = function (element) {
+ var depth = 0;
+ var walkNode = element;
+ while (walkNode !== null) {
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ depth = depth + 1;
+ }
+ return depth;
+ };
+ /* compare node order of the 2 given nodes */
+ /* returns
+ * 0 if the nodes are equal
+ * 1 if node b is before node a
+ * -1 if node a is before node b
+ * 2 if node a is nested in node b
+ * -2 if node b is nested in node a
+ * null if either node is null or their parent nodes are not equal
+ */
+ RPTUtil.compareNodeOrder = function (nodeA, nodeB) {
+ if (nodeA === nodeB)
+ return 0;
+ var aDepth = RPTUtil.nodeDepth(nodeA);
+ var bDepth = RPTUtil.nodeDepth(nodeB);
+ if (bDepth > aDepth) {
+ for (var i = 0; i < bDepth - aDepth; ++i)
+ nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB);
+ if (nodeA === nodeB) // Node B nested in Node A
+ return -2;
+ }
+ else if (aDepth > bDepth) {
+ for (var i = 0; i < aDepth - bDepth; ++i)
+ nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA);
+ if (nodeA === nodeB) // Node A nested in Node B
+ return 2;
+ }
+ while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) {
+ nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA);
+ nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB);
+ }
+ if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB))
+ return null;
+ while (nodeB != null && nodeB != nodeA)
+ nodeB = nodeB.previousSibling;
+ if (nodeB === null) // nodeB before nodeA
+ return 1;
+ else
+ return -1;
+ };
+ /**
+ * Determine if the given attribute of the given element is not empty
+ * @memberOf RPTUtil
+ */
+ RPTUtil.attributeNonEmpty = function (element, attrStr) {
+ return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0;
+ };
+ /* Return a pointer to the given frame, null if not found */
+ RPTUtil.getFrameByName = function (ruleContext, frameName) {
+ var window = ruleContext.ownerDocument.defaultView;
+ var frameList = [window];
+ var idx = 0;
+ while (idx < frameList.length) {
+ try {
+ if (frameList[idx].name === frameName)
+ return frameList[idx];
+ for (var i = 0; i < frameList[idx].frames.length; ++i) {
+ try {
+ // Ensure it's a real frame and avoid recursion
+ if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) {
+ frameList.push(frameList[idx].frames[i]);
+ }
+ }
+ catch (e) { }
+ }
+ }
+ catch (e) { }
+ ++idx;
+ }
+ return null;
+ };
+ RPTUtil.defaultNSResolver = function (prefix) {
+ var uri;
+ switch (prefix) {
+ case 'html':
+ uri = 'http://www.w3.org/1999/xhtml';
+ case 'x2':
+ uri = 'http://www.w3.org/TR/xhtml2';
+ case 'x':
+ uri = 'http://www.w3.org/1999/xhtml';
+ case 'xhtml':
+ uri = 'http://www.w3.org/1999/xhtml';
+ default:
+ uri = null;
+ }
+ return uri;
+ };
+ //checking if only the inner text is empty or not
+ RPTUtil.isInnerTextOnlyEmpty = function (element) {
+ // Get the innerText of the element
+ var text = element.innerText;
+ if (text === undefined && element.textContent !== undefined) {
+ // In headless mode, innerText is sometimes 'undefined'
+ // so we try textContent as a workaround
+ text = element.textContent;
+ }
+ var retVal = !(text !== null && text.trim().length > 0);
+ if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") {
+ //TODO: need to conside its own content, a slot may have its own content or assigned content
+ for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) {
+ var slotElem = _a[_i];
+ retVal = retVal && RPTUtil.isInnerTextEmpty(slotElem);
+ }
+ }
+ // Trim the inner text and verify that it is not empty.
+ return retVal;
+ };
+ /* Return the inner text of the given element */
+ RPTUtil.getInnerText = function (element) {
+ var retVal = element.innerText;
+ if (retVal === undefined || retVal.trim() === "")
+ retVal = element.textContent;
+ return retVal;
+ };
+ /** Return the text content of the given node
+ * this is different than innerText or textContent that return text content of a node and its descendants
+ */
+ RPTUtil.getNodeText = function (element) {
+ if (!element)
+ return "";
+ var text = "";
+ var childNodes = element.childNodes;
+ for (var i = 0; i < childNodes.length; ++i) {
+ if (childNodes[i].nodeType == 3) {
+ text += childNodes[i].nodeValue;
+ }
+ }
+ return text;
+ };
+ /**
+ * This function is responsible for checking if elements inner text is empty or not.
+ *
+ * @parm {element} node The node which should be checked it has inner text or not.
+ * @return {bool} true if element has empty inner text, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.isInnerTextEmpty = function (element) {
+ // Get the innerText of the element
+ var text = RPTUtil.getInnerText(element);
+ // Trim the inner text and verify that it is not empty.
+ return !(text != null && text.trim().length > 0);
+ };
+ RPTUtil.hasInnerContent = function (element) {
+ var text = RPTUtil.getInnerText(element);
+ var hasContent = (text != null && text.trim().length > 0);
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (!hasContent && nw.nextNode()) {
+ hasContent = (nw.node.nodeName.toLowerCase() === "img" &&
+ RPTUtil.attributeNonEmpty(nw.node, "alt"));
+ }
+ }
+ return hasContent;
+ };
+ /**
+ * This function is responsible for determine if an element has inner content.
+ * This function also considers cases where inner text is hidden, which now will
+ * be classified as does not have hidden content.
+ *
+ * @parm {element} node The node which should be checked it has inner text or not.
+ * @return {bool} true if element has empty inner text, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.hasInnerContentHidden = function (element) {
+ return RPTUtil.hasInnerContentHiddenHyperLink(element, false);
+ };
+ RPTUtil.svgHasName = function (element) {
+ return RPTUtil.attributeNonEmpty(element, "aria-label")
+ || RPTUtil.attributeNonEmpty(element, "aria-labelledby")
+ || !!element.querySelector(":scope > title");
+ };
+ RPTUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) {
+ if (!element)
+ return false;
+ // Variable Decleration
+ var childElement = element.firstElementChild;
+ var hasContent = false;
+ // In the case that the childElement is not null then we need to check each of the elements
+ // to make sure that the elements are not all hidden.
+ if (childElement != null) {
+ // Get the nodewalter of the element node, so that we can loop over it and verify
+ // that the elements under the element are not completly hidden.
+ var nw = new NodeWalker(element);
+ // Loop over all the nodes until there are no more nodes or we have determine that there is content under
+ // this parent element.
+ while (!hasContent && nw.nextNode() && nw.node != element) {
+ // Get the next node
+ var node = nw.node;
+ // In the case an img element is present with alt then we can mark this as pass
+ // otherwise keep checking all the other elements. Make sure that this image element is not hidden.
+ hasContent = (node.nodeName.toLowerCase() === "img"
+ && (RPTUtil.attributeNonEmpty(node, "alt") || RPTUtil.attributeNonEmpty(node, "title"))
+ && VisUtil_1.VisUtil.isNodeVisible(node)) || (node.nodeName.toLowerCase() === "svg"
+ && RPTUtil.svgHasName(node));
+ // Now we check if this node is of type element, visible
+ if (!hasContent && node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(node)) {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextOnlyEmpty(node);
+ if (!hasContent && hyperlink_flag === true) {
+ hasContent = RPTUtil.attributeNonEmpty(node, "aria-label") || RPTUtil.attributeNonEmpty(node, "aria-labelledby");
+ var doc = node.ownerDocument;
+ if (doc) {
+ var win = doc.defaultView;
+ if (win) {
+ var cStyle = win.getComputedStyle(node);
+ if (!hasContent && cStyle != null) {
+ // console.log(cStyle.backgroundImage);
+ // console.log(cStyle.content)
+ hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && RPTUtil.attributeNonEmpty(node, "alt");
+ }
+ }
+ }
+ }
+ }
+ // Check for cases where there is text node after an element under the parent
+ // In the case we detect nodetype as text node and the patent of the text node is
+ // the same element we are checking has Inner content for then get the inner content of this
+ // text node.
+ if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextEmpty(node);
+ }
+ }
+ }
+ // In the case there are no child elements then we can simply perform the check for only innertext
+ // the img with alt case will be covered in the above if, as img is considers as an element.
+ else {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextEmpty(element);
+ }
+ return hasContent;
+ };
+ RPTUtil.hasInnerContentOrAlt = function (element) {
+ var text = RPTUtil.getInnerText(element);
+ var hasContent = (text != null && text.trim().length > 0) || RPTUtil.attributeNonEmpty(element, "alt");
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (!hasContent && nw.nextNode() && nw.node != element) {
+ hasContent = (nw.node.nodeName.toLowerCase() === "img" &&
+ RPTUtil.attributeNonEmpty(nw.node, "alt"));
+ if (!hasContent
+ && (RPTUtil.hasRole(nw.node, "button", true) || RPTUtil.hasRole(nw.node, "textbox"))
+ && (RPTUtil.hasAriaLabel(nw.node) || RPTUtil.attributeNonEmpty(nw.node, "title") || RPTUtil.getLabelForElementHidden(nw.elem(), true))) {
+ hasContent = true;
+ }
+ }
+ }
+ return hasContent;
+ };
+ RPTUtil.concatUniqueArrayItem = function (item, arr) {
+ arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false;
+ return arr;
+ };
+ RPTUtil.concatUniqueArrayItemList = function (itemList, arr) {
+ for (var i = 0; itemList !== null && i < itemList.length; i++) {
+ arr = RPTUtil.concatUniqueArrayItem(itemList[i], arr);
+ }
+ return arr;
+ };
+ /**
+ * remove array items from a given array
+ * @param itemList items to be removed from arr
+ * @param arr the array
+ * @returns
+ */
+ RPTUtil.reduceArrayItemList = function (itemList, arr) {
+ if (arr && arr.length > 0 && itemList && itemList.length > 0) {
+ var result = arr.filter(function (value) {
+ return !itemList.includes(value);
+ });
+ return result;
+ }
+ return arr;
+ };
+ /**
+ * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML
+ * @param ruleContext the HTML element to be examined
+ * @returns
+ */
+ RPTUtil.getElementAriaProperty = function (ruleContext) {
+ var tagProperty = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_ElementAriaProperty", null);
+ if (!tagProperty) {
+ var tagName = null;
+ var name_1 = null;
+ if (ruleContext.tagName) {
+ tagName = ruleContext.tagName.toLowerCase();
+ }
+ else if (ruleContext.nodeName) {
+ tagName = ruleContext.nodeName.toLowerCase();
+ }
+ // check if the tagProperty exists in the documentConformanceRequirement hash.
+ tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName];
+ // The tag needs to check some special attributes
+ if (tagProperty === null || tagProperty === undefined) {
+ var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName];
+ switch (tagName) { // special cases
+ case "a":
+ RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"];
+ break;
+ case "area":
+ RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"];
+ break;
+ case "figure": {
+ var fcs = RPTUtil.getChildByTag(ruleContext, "figcaption");
+ fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"];
+ break;
+ }
+ case "footer":
+ case "header":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "article", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null
+ || RPTUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "region", true) !== null
+ || RPTUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null)
+ tagProperty = specialTagProperties["des-section-article-aside-main-nav"];
+ else
+ tagProperty = specialTagProperties["other"];
+ break;
+ case "img":
+ if (ruleContext.hasAttribute("alt")) {
+ ruleContext.getAttribute("alt").trim() === "" ? tagProperty = specialTagProperties["img-with-empty-alt"] : tagProperty = specialTagProperties["img-with-alt-text"];
+ }
+ else {
+ RPTUtil.hasAriaLabel(ruleContext) ? tagProperty = specialTagProperties["img-with-alt-text"] : tagProperty = specialTagProperties["img-without-alt"];
+ }
+ break;
+ case "input":
+ if (RPTUtil.attributeNonEmpty(ruleContext, "type")) {
+ var type = ruleContext.getAttribute("type").trim().toLowerCase();
+ tagProperty = specialTagProperties[type];
+ if (tagProperty === null || tagProperty === undefined) {
+ switch (type) {
+ case "checkbox":
+ RPTUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"];
+ break;
+ case "email":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"];
+ break;
+ case "search":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"];
+ break;
+ case "tel":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"];
+ break;
+ case "text":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"];
+ break;
+ case "url":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"];
+ break;
+ default:
+ // default
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"];
+ break;
+ }
+ }
+ }
+ else {
+ // default type is the same as type=text
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"];
+ }
+ break;
+ case "li":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"];
+ if (ruleContext.parentElement && RPTUtil.hasRoleInSemantics(ruleContext.parentElement, "list"))
+ tagProperty = specialTagProperties["child-of-list-role"];
+ else
+ tagProperty = specialTagProperties["no-child-of-list-role"];
+ break;
+ case "section":
+ name_1 = ARIAMapper_1.ARIAMapper.computeName(ruleContext);
+ if (name_1 && name_1.trim().length > 0) {
+ tagProperty = specialTagProperties["with-name"];
+ }
+ else {
+ tagProperty = specialTagProperties["without-name"];
+ }
+ break;
+ case "select":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"];
+ if (ruleContext.hasAttribute("multiple") ||
+ RPTUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1)
+ tagProperty = specialTagProperties["multiple-attr-size-gt1"];
+ else
+ tagProperty = specialTagProperties["no-multiple-attr-size-gt1"];
+ break;
+ case "summary":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"];
+ if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details'
+ && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext))
+ tagProperty = specialTagProperties["first-summary-of-detail"];
+ else
+ tagProperty = specialTagProperties["no-first-summary-of-detail"];
+ break;
+ case "tbody":
+ case "td":
+ case "tr":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null) {
+ tagProperty = specialTagProperties["des-table"];
+ }
+ else {
+ RPTUtil.getAncestorWithRole(ruleContext, "grid", true) || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"];
+ }
+ break;
+ case "th":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) {
+ var scope = RPTUtil.getScopeForTh(ruleContext);
+ if (scope === 'column')
+ tagProperty = specialTagProperties["des-table-grid-treegrid-column-scope"];
+ else
+ tagProperty = specialTagProperties["des-table-grid-treegrid-row-scope"];
+ }
+ else {
+ tagProperty = specialTagProperties["des-other"];
+ }
+ break;
+ case "div":
+ var prt = ruleContext.parentElement;
+ prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"];
+ break;
+ default:
+ tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"];
+ } //switch
+ }
+ }
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_ElementAriaProperty", tagProperty);
+ return tagProperty || null;
+ };
+ RPTUtil.getScopeForTh = function (element) {
+ /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics
+ * A header cell anchored at the slot with coordinate (x, y) with width width and height height is
+ * said to be a column header if any of the following conditions are true:
+ * * The cell's scope attribute is in the column state, or
+ * * The cell's scope attribute is in the auto state, and there are no data cells in any of
+ * the cells covering slots with y-coordinates y .. y+height-1.
+ * A header cell anchored at the slot with coordinate (x, y) with width width and height height is
+ * said to be a row header if any of the following conditions are true:
+ * * The cell's scope attribute is in the row state, or
+ * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are
+ * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1.
+ */
+ // Note: auto is default scope
+ // Easiest answer is if scope is specified
+ if (element.hasAttribute("scope")) {
+ var scope = element.getAttribute("scope").toLowerCase();
+ if (scope === "row" || scope === 'rowgroup')
+ return "row";
+ if (scope === "col" || scope === 'colgroup')
+ return "column";
+ }
+ // scope is auto, default (without a scope) or invalid value.
+ // if all the sibling elements are th, then return "columnheader"
+ var siblings = function (element) { return __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName != "TH"; }); };
+ if (siblings === null || siblings.length === 0)
+ return "column";
+ else
+ return "row";
+ };
+ RPTUtil.getAllowedAriaRoles = function (ruleContext, properties) {
+ var allowedRoles = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_AllowedAriaRoles", null);
+ if (!allowedRoles) {
+ allowedRoles = [];
+ var tagProperty = null;
+ if (properties !== null && properties !== undefined) {
+ tagProperty = properties;
+ }
+ else {
+ tagProperty = RPTUtil.getElementAriaProperty(ruleContext);
+ }
+ if (tagProperty !== null && tagProperty !== undefined) {
+ if (tagProperty.implicitRole !== null) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles);
+ }
+ if (tagProperty.validRoles !== null) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles);
+ }
+ var implicitRoles = RPTUtil.getImplicitRole(ruleContext);
+ if (implicitRoles && implicitRoles.length > 0) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles);
+ }
+ }
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_AllowedAriaRoles", allowedRoles);
+ }
+ return allowedRoles;
+ };
+ RPTUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) {
+ var allowedAttributes = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_AllowedAriaAttributes", null);
+ if (!allowedAttributes) {
+ allowedAttributes = [];
+ var permittedRoles = __spreadArray([], roles, true);
+ var tagName = ruleContext.tagName.toLowerCase();
+ var prohibitedAttributes = [];
+ // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html
+ if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) {
+ // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5.
+ allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes);
+ }
+ // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/
+ if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) {
+ // Use the aria-required attribute on any element that is allowed the required attribute in HTML5.
+ allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-required", allowedAttributes);
+ }
+ if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) {
+ // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5.
+ allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes);
+ }
+ var tagProperty = null;
+ if (properties != null && properties !== undefined)
+ tagProperty = properties;
+ else
+ tagProperty = RPTUtil.getElementAriaProperty(ruleContext);
+ if (tagProperty !== null && tagProperty !== undefined) {
+ // add the implicit role allowed attributes to the allowed role list if there is no specified role
+ // ignore if the element doesn't allow the attributes from the implicit roles
+ if (tagProperty.implicitRole !== null &&
+ (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0)
+ && tagProperty.allowAttributesFromImplicitRole === undefined) {
+ for (var i = 0; i < tagProperty.implicitRole.length; i++) {
+ var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]];
+ if (roleProperty !== null && roleProperty !== undefined) {
+ var properties_1 = roleProperty.props;
+ RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes);
+ properties_1 = RPTUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext);
+ RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes);
+ var prohibitedProps = roleProperty.prohibitedProps;
+ if (prohibitedProps && prohibitedProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes);
+ // special case of separator
+ if (tagProperty.implicitRole[i] === "separator" && RPTUtil.isFocusable(ruleContext)) {
+ RPTUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes);
+ }
+ }
+ }
+ }
+ // Adding the global properties to the valid attribute list
+ if (tagProperty.globalAriaAttributesValid) {
+ var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties
+ RPTUtil.concatUniqueArrayItemList(properties_2, allowedAttributes);
+ }
+ }
+ // adding the other role to the allowed roles for the attributes
+ if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0)
+ RPTUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles);
+ // adding the specified role properties to the allowed attribute list
+ for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) {
+ var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]];
+ if (roleProperties !== null && roleProperties !== undefined) {
+ // ignore the properties if the element doesn't allow attributes from the implicit role
+ if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) {
+ var properties_3 = roleProperties.props; // allowed properties
+ RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes);
+ properties_3 = RPTUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties
+ RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes);
+ }
+ var prohibitedProps = roleProperties.prohibitedProps;
+ if (prohibitedProps && prohibitedProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes);
+ // special case for separator
+ if (permittedRoles[i] === "separator" && RPTUtil.isFocusable(ruleContext)) {
+ RPTUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes);
+ }
+ }
+ }
+ // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid
+ if (permittedRoles.includes("row") && RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) {
+ var index = -1;
+ if ((index = allowedAttributes.indexOf("aria-level")) > -1)
+ allowedAttributes.splice(index, 1);
+ if ((index = allowedAttributes.indexOf("aria-setsize")) > -1)
+ allowedAttributes.splice(index, 1);
+ if ((index = allowedAttributes.indexOf("aria-posinset")) > -1)
+ allowedAttributes.splice(index, 1);
+ }
+ // add the other allowed attributes for the element
+ if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) {
+ // check attribute-value pair if exists
+ var allowed = [];
+ for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) {
+ var attr = tagProperty.otherAllowedAriaAttributes[p];
+ if (attr.includes("=")) {
+ var pair = attr.split("=");
+ if (ruleContext.getAttribute(pair[0]) === pair[1])
+ allowed.push(pair[0]);
+ }
+ else
+ allowed.push(attr);
+ }
+ if (allowed.length > 0)
+ RPTUtil.concatUniqueArrayItemList(allowed, allowedAttributes);
+ }
+ // add the other prohibitted attributes for the element
+ if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) {
+ // check attribute-value pair if exists
+ var disallowed = [];
+ for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) {
+ var attr = tagProperty.otherDisallowedAriaAttributes[p];
+ if (attr.includes("=")) {
+ var pair = attr.split("=");
+ if (ruleContext.getAttribute(pair[0]) === pair[1])
+ disallowed.push(pair[0]);
+ }
+ else
+ disallowed.push(attr);
+ }
+ if (disallowed.length > 0)
+ RPTUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes);
+ }
+ //exclude the prohibitedAttributes from the allowedAttributes
+ allowedAttributes = RPTUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes);
+ //exclude aria attribute for elements without implicit role and with 'Naming Prohibited'
+ if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole)
+ allowedAttributes = RPTUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes);
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_AllowedAriaAttributes", allowedAttributes);
+ }
+ return allowedAttributes;
+ };
+ /**
+ *
+ * @param ariaAttr
+ * @param htmlAttrs
+ * @type: conflict or overlapping
+ * @returns htmlAttrName, 'Pass' or null
+ * htmlAttrName that conflicts with the ariaAttr,
+ * 'Pass' with no conflict with the ariaAttr,
+ * or null where ariaAttr won't cause conflict
+ */
+ RPTUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) {
+ var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']];
+ if (exist) {
+ var examinedHtmlAtrNames = [];
+ var ariaAttrValue = '';
+ if (type === 'conflict') {
+ if (!exist.conflict)
+ return null;
+ ariaAttrValue = exist.conflict.ariaAttributeValue;
+ }
+ else if (type === 'overlapping') {
+ if (!exist.overlapping)
+ return null;
+ ariaAttrValue = exist.overlapping.ariaAttributeValue;
+ }
+ else
+ return null;
+ if (ariaAttrValue === null || ariaAttrValue === 'VALUE' || ariaAttrValue === ariaAttr['value']) {
+ var htmlAttrNames = [];
+ var htmlAttrValues = [];
+ if (type === 'conflict') {
+ htmlAttrNames = exist.conflict.htmlAttributeNames;
+ htmlAttrValues = exist.conflict.htmlAttributeValues;
+ }
+ else {
+ htmlAttrNames = exist.overlapping.htmlAttributeNames;
+ htmlAttrValues = exist.overlapping.htmlAttributeValues;
+ }
+ for (var i = 0; i < htmlAttrs.length; i++) {
+ var index = htmlAttrNames.indexOf(htmlAttrs[i]['name']);
+ if (index !== -1) {
+ if (htmlAttrValues === null
+ || (ariaAttrValue === 'VALUE' && htmlAttrValues[index] === 'VALUE' && htmlAttrs[i]['value'] !== ariaAttr['value'])
+ || htmlAttrs[i]['value'] === htmlAttrValues[index]) {
+ examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] });
+ continue;
+ }
+ else
+ examinedHtmlAtrNames.push({ result: 'Pass', 'attr': htmlAttrs[i]['name'] });
+ }
+ }
+ }
+ return examinedHtmlAtrNames;
+ }
+ else
+ return null;
+ };
+ RPTUtil.containsPresentationalChildrenOnly = function (elem) {
+ var roles = RPTUtil.getRoles(elem, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = RPTUtil.getImplicitRole(elem);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return false;
+ for (var i = 0; roles !== null && i < roles.length; i++) {
+ var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]];
+ if (roleProperties !== null && roleProperties !== undefined) {
+ var presentional = roleProperties.presentationalChildren;
+ if (presentional === true)
+ return true;
+ }
+ }
+ return false;
+ };
+ RPTUtil.shouldBePresentationalChild = function (element) {
+ var walkNode = DOMWalker_1.DOMWalker.parentElement(element);
+ while (walkNode) {
+ if (RPTUtil.containsPresentationalChildrenOnly(walkNode))
+ return true;
+ //aria-own case: if the element is referred by an aria-won
+ walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ return false;
+ };
+ /** moved to CSSUtil
+ public static CSS(element) {
+ let styleText = "";
+ if (element === null) return [];
+ if (element.IBM_CSS_THB) return element.IBM_CSS_THB;
+ let nodeName = element.nodeName.toLowerCase();
+ if (nodeName === "style") {
+ styleText = RPTUtil.getInnerText(element);
+ } else if (element.hasAttribute("style")) {
+ styleText = element.getAttribute("style");
+ } else return [];
+ if (styleText === null || styleText.trim().length === 0) return [];
+ //remove comment blocks
+ let re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.* /g;
+ let subst = ' ';
+ styleText = styleText.replace(re, subst);
+ // Find all "key : val;" pairs with various whitespace inbetween
+ let rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g;
+ // Find all "selector { csskeyvals } with various whitespace inbetween
+ let rSelectors = /\s*([^{]*){([^}]*)}/g;
+ if (styleText.indexOf("{") === -1) {
+
+ let keyVals = {};
+ let m;
+ while ((m = rKeyVals.exec(styleText)) != null) {
+ keyVals[m[1]] = m[2].trim().toLowerCase();
+ }
+ let retVal = [{
+ selector: null,
+ values: keyVals
+ }];
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ } else {
+ let retVal = [];
+ let m;
+ let m2;
+ while ((m = rSelectors.exec(styleText)) != null) {
+ let keyVals = {}
+ let selKey = m[1];
+ let selVal = m[2];
+
+ while ((m2 = rKeyVals.exec(selVal)) != null) {
+ keyVals[m2[1]] = m2[2].trim().toLowerCase();
+ }
+ retVal.push({
+ selector: selKey,
+ values: keyVals
+ });
+ }
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ }
+ }
+ */
+ RPTUtil.getControlOfLabel = function (node) {
+ // Handle the easy case of label -> for
+ var labelAncestor = RPTUtil.getAncestor(node, "label");
+ if (labelAncestor) {
+ if (labelAncestor.hasAttribute("for")) {
+ return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for"));
+ }
+ }
+ // Create a dictionary containing ids of parent nodes
+ var idDict = {};
+ var parentWalk = node;
+ while (parentWalk) {
+ if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var ancestor = parentWalk;
+ if (ancestor.hasAttribute("id")) {
+ idDict[ancestor.getAttribute("id")] = true;
+ }
+ }
+ parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk);
+ }
+ // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids
+ var inputsUsingLabelledBy = node.ownerDocument.querySelectorAll("*[aria-labelledby]");
+ for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) {
+ var inputUsingLabelledBy = inputsUsingLabelledBy[idx];
+ var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby");
+ var sp = ariaLabelledBy.split(" ");
+ for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) {
+ var id = sp_1[_i];
+ if (id in idDict) {
+ return inputUsingLabelledBy;
+ }
+ }
+ }
+ // Find the cases where we're within an aria labelledby
+ return null;
+ };
+ /**
+ * This function is responsible for checking if the node that is provied is
+ * disabled or not. Following is how the check is performed:
+ * 1. Check if the current node is disabled with the following options:
+ * attribute --> disabled
+ * Also needs to be "button", "input", "select", "textarea", "optgroup", "option",
+ * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled)
+ * attribute --> aria-disabled="true"
+ * 2. Check if any of the current nodes parents are disabled with the same
+ * options listed in 1.
+ *
+ * Note: If either current node or any of the parent nodes are disabled then this
+ * function will return true (node is disabled).
+ *
+ * @parm {HTMLElement} node - The node which should be checked if it is disabled or not.
+ * @return {bool} true if the node is disabled, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.isNodeDisabled = function (node) {
+ // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to
+ // true when we detect that the node is disabled. We have to set it to false so that we know
+ // the node has already been checked. Only set it to false if the setting is undefined or null
+ // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it
+ // to speed up the check.
+ var PT_NODE_DISABLED = (0, CacheUtil_1.getCache)(node, "PT_NODE_DISABLED", false);
+ // Check the nodeType of this node, if this node is a text node then
+ // we get the parentnode and set that as the node as a text nodes,
+ // disabled is directly related to the parent node.
+ if (node.nodeType === 3) {
+ node = DOMWalker_1.DOMWalker.parentNode(node);
+ }
+ // Variable Declaration
+ var nodeName = node.nodeName.toLowerCase();
+ // Get the disabled element property, disabled and aria-disabled attribute and check that it is true
+ var disabledAttribute = node.hasAttribute("disabled");
+ var disabledPropertyCustom = PT_NODE_DISABLED;
+ var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true';
+ // If this node has disabled attribute and the node allows disabled attribute, then return true.
+ // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset"
+ // In the case aria-disabled is set to true, then also return true
+ if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) {
+ PT_NODE_DISABLED = true;
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_DISABLED", PT_NODE_DISABLED);
+ return true;
+ }
+ // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have
+ // disabled attribute. Only keep checking until we are all the way back to the parentNode
+ // element.
+ var parentElement = DOMWalker_1.DOMWalker.parentNode(node);
+ // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check
+ // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not
+ // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with
+ // child node.
+ if (parentElement != null && parentElement.nodeType === 1) {
+ // Check upwards recursively, and save the results in an variable
+ var nodeDisabled = RPTUtil.isNodeDisabled(parentElement);
+ // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true.
+ // so that we can use this next time, to quickly determine if node is disabled or not.
+ // This is extra percaution, the isNodeDisabled function already sets this.
+ if (nodeDisabled) {
+ PT_NODE_DISABLED = true;
+ }
+ // Check upwards recursively
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_DISABLED", PT_NODE_DISABLED);
+ return nodeDisabled;
+ }
+ // Return false (node is not disabled)
+ return false;
+ };
+ /**
+ * This function is responsible for determine if hidden content should be checked
+ * in rules.
+ *
+ * @parm {element} node - A node so that the document can be accessed to check for the
+ * option. Can be document element or a simple node element.
+ * @return {bool} true if hidden content should be checked, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.shouldCheckHiddenContent = function (node) {
+ return false;
+ };
+ /**
+ * This function is responsible for determining if node should be skipped from checking or not, based
+ * on the Check Hidden Content settings and if the node is visible or not.
+ *
+ * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content
+ * setting.
+ *
+ * @return {bool} true if node should be skipped, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.shouldNodeBeSkippedHidden = function (node) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we
+ // return true to identify that the node should not be scanned/added to any hash/array.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (!RPTUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) {
+ return true;
+ }
+ return false;
+ };
+ RPTUtil.isfocusableByDefault = function (node) {
+ var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area'];
+ if (node.nodeName.toLowerCase() === "a" && RPTUtil.hasAttribute(node, 'href'))
+ return true;
+ if (node.nodeName.toLowerCase() === "area" && RPTUtil.hasAttribute(node, 'href'))
+ return true;
+ if (focusableElements.indexOf(node.nodeName.toLowerCase()) != -1)
+ return true;
+ return false;
+ };
+ /**
+ * This function check if a non-tabable node has valid tabable content.
+ * If it is tabable (the tabindex is not speicified or is not -1), returns false;
+ * If it is non-tabable, but a child is tabable and does not have element content, returns false;
+ * Otherwise, returns true.
+ */
+ RPTUtil.nonTabableChildCheck = function (element) {
+ if (!element.hasAttribute("tabindex") ||
+ (parseInt(element.getAttribute("tabindex")) != -1)) {
+ return false;
+ }
+ var nw = new NodeWalker(element);
+ while (nw.nextNode()) {
+ var child = nw.elem();
+ if (child === null) { // Text node. usually is a cartridge return.
+ continue;
+ }
+ if (child.hasAttribute("tabindex") &&
+ (parseInt(child.getAttribute("tabindex")) != -1) &&
+ !RPTUtil.hasInnerContent(child)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ RPTUtil.hasAttribute = function (element, attributeName) {
+ var hasAttribute = false;
+ if (element.hasAttribute) {
+ hasAttribute = element.hasAttribute(attributeName);
+ }
+ else if (element.attributes && element.attributes.getNamedItem) {
+ var attr = element.attributes.getNamedItem(attributeName);
+ hasAttribute = attr && attr.specified;
+ }
+ return hasAttribute;
+ };
+ // This list contains a list of elements tags which have display: none by default, since we have rules triggering
+ RPTUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index'];
+ // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden
+ // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always
+ // pass theses rules no matter what the Check Hidden Content Setting is.
+ RPTUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId'];
+ // https://www.w3.org/TR/wai-aria-1.1/#introstates
+ RPTUtil.ariaAttributeRoleDefaults = {
+ "alert": {
+ "aria-live": "assertive",
+ "aria-atomic": "true"
+ },
+ "combobox": {
+ "aria-haspopup": "listbox"
+ },
+ "listbox": {
+ "aria-orientation": "vertical"
+ },
+ "log": {
+ "aria-live": "polite"
+ },
+ "menu": {
+ "aria-orientation": "vertical"
+ },
+ "menubar": {
+ "aria-orientation": "horizontal"
+ },
+ "meter": {
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "option": {
+ "aria-selected": "false"
+ },
+ "progressbar": {
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "scrollbar": {
+ "aria-orientation": "vertical",
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "separator": {
+ "aria-orientation": "horizontal",
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "slider": {
+ "aria-orientation": "horizontal",
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "spinbutton": {
+ // Not sure how to encode min/max (or now in 1.2 - "has no value")
+ //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec
+ // Probably just delete spinbutton from this list completely and let user agents handle "defaults"
+ },
+ "status": {
+ "aria-live": "polite",
+ "aria-atomic": "true"
+ },
+ "tab": {
+ "aria-selected": "false"
+ },
+ "tablist": {
+ "aria-orientation": "horizontal"
+ },
+ "toolbar": {
+ "aria-orientation": "horizontal"
+ },
+ "tree": {
+ "aria-orientation": "vertical"
+ }
+ };
+ // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic
+ RPTUtil.ariaAttributeGlobalDefaults = {
+ "aria-atomic": "false",
+ "aria-autocomplete": "none",
+ "aria-busy": "false",
+ "aria-checked": undefined,
+ "aria-current": "false",
+ "aria-disabled": "false",
+ "aria-dropeffect": "none",
+ "aria-expanded": undefined,
+ "aria-grabbed": undefined,
+ "aria-haspopup": "false",
+ "aria-hidden": undefined,
+ "aria-invalid": "false",
+ "aria-live": "off",
+ "aria-modal": "false",
+ "aria-multiline": "false",
+ "aria-multiselectable": "false",
+ "aria-orientation": undefined,
+ "aria-pressed": undefined,
+ "aria-readonly": "false",
+ //"aria-relevant": "additions text", TODO: are multiple values supported?
+ "aria-required": "false",
+ "aria-selected": undefined,
+ "aria-sort": "none"
+ };
+ // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings
+ RPTUtil.ariaAttributeImplicitMappings = {
+ "aria-autocomplete": {
+ "form": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ },
+ "input": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ },
+ "select": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ },
+ "textarea": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ }
+ },
+ "aria-checked": {
+ "input": function (e) {
+ if (e.hasAttribute("indeterminate"))
+ return "mixed";
+ return "" + e.hasAttribute("checked");
+ },
+ "menuitem": function (e) {
+ if (e.hasAttribute("indeterminate"))
+ return "mixed";
+ return "" + e.hasAttribute("checked");
+ },
+ "*": function (e) {
+ if (e.hasAttribute("indeterminate"))
+ return "mixed";
+ },
+ },
+ "aria-disabled": {
+ "button": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "fieldset": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "input": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "optgroup": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "option": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "select": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "textarea": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ }
+ },
+ "aria-expanded": {
+ "details": function (e) {
+ return e.getAttribute("open");
+ },
+ "dialog": function (e) {
+ return e.getAttribute("open");
+ }
+ },
+ "aria-multiselectable": {
+ "select": function (e) {
+ if (e.hasAttribute("multiple"))
+ return "true";
+ return;
+ }
+ },
+ "aria-placeholder": {
+ "input": function (e) {
+ return e.getAttribute("placeholder");
+ },
+ "textarea": function (e) {
+ return e.getAttribute("placeholder");
+ }
+ },
+ "aria-required": {
+ "input": function (e) {
+ return e.getAttribute("required");
+ },
+ "select": function (e) {
+ return e.getAttribute("required");
+ },
+ "textarea": function (e) {
+ return e.getAttribute("required");
+ }
+ }
+ };
+ RPTUtil.tabTagMap = {
+ "button": function (element) {
+ return !element.hasAttribute("disabled");
+ },
+ "iframe": true,
+ "input": function (element) {
+ return element.getAttribute("type") !== "hidden" && !element.hasAttribute("disabled");
+ },
+ "select": function (element) {
+ return !element.hasAttribute("disabled");
+ },
+ "textarea": true,
+ "div": function (element) {
+ return element.hasAttribute("contenteditable");
+ },
+ "a": function (element) {
+ // xlink:href?? see svg
+ return element.hasAttribute("href");
+ },
+ "area": function (element) {
+ return element.hasAttribute("href");
+ },
+ "audio": function (element) {
+ return element.hasAttribute("controls");
+ },
+ "video": function (element) {
+ return element.hasAttribute("controls");
+ },
+ "summary": function (element) {
+ // first summary child of a details element is automatically focusable
+ return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details'
+ && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element);
+ },
+ "details": function (element) {
+ //details element without a direct summary child is automatically focusable
+ return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0;
+ }
+ };
+ return RPTUtil;
+}());
+exports.RPTUtil = RPTUtil;
+/** moved to CSSUtil
+export class RPTUtilStyle {
+ public static getWeightNumber(styleVal) {
+ let map = {
+ "light": 100,
+ "bold": 700
+ };
+ let retVal = parseInt(styleVal);
+ if (retVal) return retVal;
+ if (styleVal in map)
+ return map[styleVal];
+ return 400;
+ }
+
+ public static getFontInPixels = function (styleVal) {
+ let map = {
+ "xx-small": 16,
+ "x-small": 10,
+ "small": 13,
+ "medium": 16,
+ "large": 18,
+ "x-large": 24,
+ "xx-large": 32
+ };
+ let value = parseFloat(styleVal);
+ if (!value) {
+ return map[styleVal];
+ }
+ let units = styleVal.substring(("" + value).length);
+ if (units === "" || units === "px") return value;
+ if (units === "em") return value * 16;
+ if (units === "%") return value / 100 * 16;
+ if (units === "pt") return value * 4 / 3;
+ return Math.round(value);
+ }
+}
+*/
+/* Return a node walker for the given element.
+ * bEnd is optional and defaults to false
+ * but if true, indicates the node is the end node*/
+var NodeWalker = /** @class */ (function () {
+ function NodeWalker(node, bEnd) {
+ this.node = node;
+ this.bEndTag = (bEnd === undefined ? false : bEnd === true);
+ }
+ NodeWalker.prototype.elem = function () {
+ return this.node.nodeType === 1 && this.node || null;
+ };
+ NodeWalker.prototype.nextNode = function () {
+ if (!this.node) {
+ this.bEndTag = false;
+ return false;
+ }
+ if (!this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ var slotElement = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.nwOwnerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.nwOwnerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.nwSlotOwner = slotOwner;
+ this.node.nwSlotIndex = 0;
+ }
+ else if (this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ return this.nextNode();
+ }
+ }
+ else {
+ if (this.node.nwSlotOwner) {
+ var slotOwner = this.node.nwSlotOwner;
+ var nextSlotIndex = this.node.nwSlotIndex + 1;
+ delete this.node.nwSlotOwner;
+ delete this.node.nwSlotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.nwSlotOwner = slotOwner;
+ this.node.nwSlotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.nwOwnerElement) {
+ this.node = this.node.nwOwnerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+ };
+ NodeWalker.prototype.prevNode = function () {
+ if (this.bEndTag && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ this.bEndTag = true;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ if (this.bEndTag && (this.node.firstChild === null || typeof (this.node.firstChild) === 'undefined'))
+ this.bEndTag = false;
+ return true;
+ };
+ return NodeWalker;
+}());
+exports.NodeWalker = NodeWalker;
+
+
+/***/ }),
+
+/***/ 1794:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.CommonMapper = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var CommonMapper = /** @class */ (function () {
+ function CommonMapper() {
+ this.hierarchyRole = null;
+ this.hierarchyPath = null;
+ this.hierarchyResults = null;
+ }
+ CommonMapper.prototype.getBounds = function (node) {
+ return null;
+ };
+ CommonMapper.prototype.reset = function (node) {
+ this.hierarchyRole = [];
+ this.hierarchyResults = [];
+ this.hierarchyPath = [{
+ rolePath: "",
+ roleCount: {}
+ }];
+ var ancestors = [];
+ var parent = DOMWalker_1.DOMWalker.parentNode(node);
+ while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) {
+ ancestors.push(parent);
+ parent = DOMWalker_1.DOMWalker.parentNode(parent);
+ }
+ ancestors = ancestors.reverse();
+ for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) {
+ var ancestor = ancestors_1[_i];
+ var siblings = [];
+ var sibling = ancestor.previousSibling;
+ while (sibling) {
+ siblings.push(sibling);
+ sibling = sibling.previousSibling;
+ }
+ siblings = siblings.reverse();
+ for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) {
+ var sibling_1 = siblings_1[_a];
+ this.pushHierarchy(sibling_1);
+ this.popHierarchy();
+ }
+ this.pushHierarchy(ancestor);
+ }
+ };
+ CommonMapper.prototype.pushHierarchy = function (node) {
+ var role = this.getRole(node) || "none";
+ this.hierarchyRole.push(role);
+ if (role !== "none") {
+ var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1];
+ parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1;
+ this.hierarchyPath.push({
+ "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]",
+ "roleCount": {}
+ });
+ }
+ var attr = {};
+ if (node.nodeType === 1) {
+ attr = this.getAttributes(node);
+ }
+ this.hierarchyResults.push({
+ node: node,
+ namespace: this.getNamespace(),
+ role: role,
+ attributes: attr,
+ rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath,
+ bounds: this.getBounds(node)
+ });
+ };
+ CommonMapper.prototype.popHierarchy = function () {
+ var role = this.hierarchyRole.pop();
+ if (role !== "none") {
+ this.hierarchyPath.pop();
+ }
+ this.hierarchyResults.pop();
+ };
+ CommonMapper.prototype.openScope = function (node) {
+ if (this.hierarchyRole === null) {
+ this.reset(node);
+ }
+ this.pushHierarchy(node);
+ return this.hierarchyResults;
+ };
+ CommonMapper.prototype.closeScope = function (node) {
+ var retVal = [];
+ for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) {
+ var res = _a[_i];
+ // const temp = res.node;
+ // res.node = null;
+ // let cloned = JSON.parse(JSON.stringify(res));
+ // cloned.node = res.node = temp;
+ // retVal.push(cloned);
+ retVal.push(res);
+ }
+ retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role;
+ this.popHierarchy();
+ return retVal;
+ };
+ return CommonMapper;
+}());
+exports.CommonMapper = CommonMapper;
+
+
+/***/ }),
+
+/***/ 2306:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Context = exports.PartInfo = exports.AttrInfo = void 0;
+// Context that will cause this rule to execute.
+// Context syntax:
+// Triggers:
+// aria:role - Triggers on element with ARIA role role
+// aria:role[attribute] - Triggers on elements with the equivalent logical
+// aria- attribute (e.g., button[disabled] will trigger on
+// or )
+// role[attribute=value] - Similar to above, with case-sensitive match
+// to value
+// role[attribute~value] - Similar to above, with case-insensitive match
+// dom:element - Triggers on an element with the specified name
+// dom:element[attribute] - Triggers on a dom element with the specified attribute
+// dom:*[attribute] - Triggers on all elements with the specified attribute
+// Combining triggers:
+// trigger1 trigger2 - Triggers on elements with trigger2 within an
+// element with trigger1
+// !trigger1 trigger2 - Triggers on elements with trigger2 not within
+// element with trigger1
+// trigger1>trigger2 - Triggers on elements with trigger2 with an
+// an immediate parent with trigger1
+// trigger1+trigger2 - Triggers on elements with trigger2 with an
+// immediate previous sibling with trigger1
+// trigger1~trigger2 - Triggers on elements with trigger2 with an
+// some earlier sibling with trigger1
+// context,context - Triggers on elements with either context
+var AttrInfo = /** @class */ (function () {
+ function AttrInfo(inclusive, attr, eq, value) {
+ this.inclusive = inclusive;
+ this.attr = attr;
+ this.eq = eq;
+ this.value = value;
+ if (!inclusive
+ && ((typeof eq) !== "undefined" && eq.length > 0)) {
+ throw new Error("Cannot have !attr" + eq + " context");
+ }
+ if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) {
+ throw new Error("Cannot have equivalence check without a value");
+ }
+ }
+ AttrInfo.prototype.matches = function (context) {
+ var ruleAttrPart = this;
+ var elemAttrs = context.attributes;
+ if (!(ruleAttrPart.attr in elemAttrs)) {
+ return !ruleAttrPart.inclusive;
+ }
+ else if (!ruleAttrPart.inclusive) {
+ return false;
+ }
+ else if (!ruleAttrPart.eq) {
+ // inclusive match and I have that attribute and no equivalence defined
+ return true;
+ }
+ else {
+ // inclusive match and I have that attribute and equivalence defined
+ var attrValue = elemAttrs[ruleAttrPart.attr];
+ if (ruleAttrPart.eq === "=") {
+ return ruleAttrPart.value === attrValue;
+ }
+ else if (ruleAttrPart.eq === "!=") {
+ return ruleAttrPart.value !== attrValue;
+ }
+ else if (ruleAttrPart.eq === "~") {
+ return ruleAttrPart.value === attrValue;
+ }
+ else if (ruleAttrPart.eq === "!~") {
+ return ruleAttrPart.value !== attrValue;
+ }
+ else {
+ throw new Error("Context equivalence operator not supported");
+ }
+ }
+ };
+ return AttrInfo;
+}());
+exports.AttrInfo = AttrInfo;
+var PartInfo = /** @class */ (function () {
+ function PartInfo(inclusive, namespace, role, attrs, connector) {
+ this.inclusive = inclusive;
+ this.namespace = namespace;
+ this.role = role;
+ this.attrs = attrs;
+ this.connector = connector;
+ if (role === "*" && !inclusive) {
+ throw new Error("!* context not supported");
+ }
+ }
+ PartInfo.prototype.matches = function (contextHier, hierLevel) {
+ var rulePart = this;
+ var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel]
+ && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role
+ || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*");
+ if (ruleRoleMatch
+ && rulePart.role === "*"
+ && rulePart.namespace === "dom"
+ && (contextHier[rulePart.namespace][hierLevel].role === "#text"
+ || contextHier[rulePart.namespace][hierLevel].role === "/#text")) {
+ ruleRoleMatch = false;
+ }
+ if (rulePart.inclusive && !ruleRoleMatch)
+ return false;
+ if (!rulePart.inclusive && !ruleRoleMatch)
+ return true;
+ // Match the attributes
+ var ruleAttrs = rulePart.attrs;
+ var elemContext = contextHier[rulePart.namespace][hierLevel];
+ var match = true;
+ for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) {
+ var ruleAttrPart = ruleAttrs_1[_i];
+ match = match && ruleAttrPart.matches(elemContext);
+ }
+ if (!rulePart.inclusive)
+ match = !match;
+ return match;
+ };
+ return PartInfo;
+}());
+exports.PartInfo = PartInfo;
+var Context = /** @class */ (function () {
+ function Context(context) {
+ this.contextInfo = [];
+ var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);
+ var results = [];
+ for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) {
+ var part = contextHierMatches_1[_i];
+ var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/);
+ var attrInfo = [];
+ for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) {
+ var attrPart = _b[_a];
+ var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);
+ attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4]));
+ }
+ parts[2] = parts[2].toLowerCase();
+ var nsParts = parts[2].split(":");
+ var incl = parts[1] !== "!";
+ var ns = nsParts.shift();
+ var role = nsParts.join(":");
+ var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]);
+ results.push(partInfo);
+ }
+ this.contextInfo = results;
+ }
+ Context.cleanContext = function (context) {
+ context = context.toLowerCase().trim();
+ context = context.replace(/ +!/g, " !");
+ context = context.replace(/ +([>+~,])/g, "$1");
+ context = context.replace(/([>+~,]) +/g, "$1");
+ context = context.replace(/ +/g, " ");
+ return context.trim();
+ };
+ Context.parse = function (context) {
+ var contexts = Context.splitMultiple(Context.cleanContext(context));
+ var retVal = [];
+ for (var i = 0; i < contexts.length; ++i) {
+ var ctx = new Context(contexts[i]);
+ retVal.push(ctx);
+ }
+ return retVal;
+ };
+ /**
+ * Handles initial processing of splitting on comma - context,context
+ * @param context
+ */
+ Context.splitMultiple = function (context) {
+ var contexts = [];
+ if (context) {
+ if (context.indexOf(",") === -1) {
+ contexts.push(context);
+ }
+ else {
+ for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) {
+ var c = _a[_i];
+ contexts.push(c);
+ }
+ }
+ }
+ return contexts;
+ };
+ return Context;
+}());
+exports.Context = Context;
+
+
+/***/ }),
+
+/***/ 9324:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Engine = void 0;
+var IEngine_1 = __webpack_require__(9077);
+var DOMWalker_1 = __webpack_require__(7440);
+var Context_1 = __webpack_require__(2306);
+var Config_1 = __webpack_require__(3962);
+var DOMMapper_1 = __webpack_require__(5697);
+var DOMUtil_1 = __webpack_require__(295);
+var CacheUtil_1 = __webpack_require__(7788);
+var WrappedRule = /** @class */ (function () {
+ function WrappedRule(rule, parsedInfo) {
+ this.rule = rule;
+ this.parsedInfo = parsedInfo;
+ this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace;
+ Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo));
+ }
+ /**
+ * This function is responsible converting the node into a snippet which can be added to report.
+ *
+ * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this.
+ *
+ * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc...
+ *
+ * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only.
+ *
+ * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains,
+ * nodename and attributes. i.e.
+ *
+ * @memberOf this
+ */
+ WrappedRule.convertNodeToSnippet = function (node) {
+ // Variable Decleration
+ var nodeSnippet = '';
+ // Extract the node name and add it to the node snippet
+ nodeSnippet += '<' + node.nodeName.toLowerCase();
+ // Extract all the node attributes as an array
+ var nodeAttributes = node.attributes;
+ // In the case there are attributes on this node
+ if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') {
+ // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned
+ for (var i = nodeAttributes.length - 1; i >= 0; i--) {
+ if (nodeAttributes[i].name === "data-namewalk")
+ continue;
+ // Add the attribute name and value.
+ nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"';
+ }
+ }
+ // Close the node
+ nodeSnippet += '>';
+ // Return the node snippet
+ return nodeSnippet;
+ };
+ WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) {
+ var startTime = new Date().getTime();
+ var results;
+ try {
+ results = this.rule.run(context, options, contextHierarchies);
+ }
+ catch (e) {
+ var err = e;
+ console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack);
+ throw e;
+ }
+ var endTime = new Date().getTime();
+ if (!results)
+ results = [];
+ if (!(results instanceof Array)) {
+ results = [results];
+ }
+ var retVal = [];
+ for (var _i = 0, results_1 = results; _i < results_1.length; _i++) {
+ var result = results_1[_i];
+ var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs);
+ var path = {};
+ for (var ns in context) {
+ path[ns] = context[ns].rolePath;
+ }
+ var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1");
+ retVal.push({
+ ruleId: ruleId,
+ value: result.value,
+ node: context["dom"].node,
+ path: path,
+ ruleTime: endTime - startTime,
+ reasonId: result.reasonId,
+ message: message,
+ messageArgs: result.messageArgs,
+ apiArgs: result.apiArgs,
+ bounds: context["dom"].bounds,
+ snippet: WrappedRule.convertNodeToSnippet(context["dom"].node)
+ });
+ }
+ return retVal;
+ };
+ return WrappedRule;
+}());
+var Engine = /** @class */ (function () {
+ function Engine() {
+ this.mappers = {};
+ this.ruleMap = {};
+ this.wrappedRuleMap = {};
+ this.nlsMap = {};
+ this.helpMap = {};
+ this.inclRules = {};
+ this.exclRules = {};
+ // Need a DOM Mapper as a minimum
+ this.addMapper(new DOMMapper_1.DOMMapper());
+ }
+ Engine.getLanguages = function () {
+ var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env;
+ // If all else fails, default to US English
+ var nodeLang = "en-US";
+ if (env) {
+ nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES;
+ if (nodeLang) {
+ nodeLang = nodeLang.split(".")[0].replace(/_/g, "-");
+ }
+ }
+ return typeof navigator !== "undefined" && navigator.languages || [nodeLang];
+ };
+ Engine.prototype.run = function (root, options) {
+ if (root === null) {
+ return Promise.reject("null document");
+ }
+ if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) {
+ root = root.documentElement;
+ }
+ root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false);
+ (0, CacheUtil_1.clearCaches)(root);
+ var walker = new DOMWalker_1.DOMWalker(root);
+ var retVal = {
+ results: [],
+ numExecuted: 0,
+ ruleTime: 0,
+ totalTime: 0
+ };
+ var start = new Date().getTime();
+ // Reset the role mappers
+ for (var namespace in this.mappers) {
+ this.mappers[namespace].reset(root);
+ }
+ // Initialize the context detector
+ do {
+ // Get the context information from the rule mappers
+ var contextHierarchies = {};
+ for (var namespace in this.mappers) {
+ if (!walker.bEndTag) {
+ contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node);
+ // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ // const elem = walker.node as Element;
+ // let id;
+ // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) {
+ // if (root.ownerDocument.getElementById(id) === elem) {
+ // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']";
+ // }
+ // }
+ // }
+ }
+ else {
+ contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node);
+ }
+ }
+ if (walker.node.nodeType !== 11
+ && (DOMWalker_1.DOMWalker.isNodeVisible(walker.node)
+ // || walker.node.nodeName.toLowerCase() === "head"
+ || walker.node.nodeName.toLowerCase() === "meta"
+ || walker.node.nodeName.toLowerCase() === "style"
+ || walker.node.nodeName.toLowerCase() === "datalist"
+ || walker.node.nodeName.toLowerCase() === "param"
+ || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) {
+ var context = {};
+ for (var ns in contextHierarchies) {
+ var nsHier = contextHierarchies[ns];
+ var lastHier = nsHier[nsHier.length - 1];
+ context[ns] = lastHier;
+ }
+ var matchingRules = this.getMatchingRules(contextHierarchies);
+ var depMatch = {};
+ for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) {
+ var matchingRule = matchingRules_1[_i];
+ var fulfillsDependencies = true;
+ for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) {
+ var dep = _b[_a];
+ if (!depMatch[dep])
+ fulfillsDependencies = false;
+ }
+ if (fulfillsDependencies) {
+ var results = [];
+ try {
+ results = matchingRule.run(this, context, options, contextHierarchies);
+ }
+ catch (err) {
+ // Wrapper shows error in console. Skip this rule as N/A
+ // We don't want to kill the engine
+ }
+ // If out of scope, it fulfills the dependency
+ if (results.length === 0) {
+ depMatch[matchingRule.rule.id] = true;
+ }
+ for (var _c = 0, results_2 = results; _c < results_2.length; _c++) {
+ var result = results_2[_c];
+ retVal.results.push(result);
+ retVal.ruleTime += result.ruleTime;
+ retVal.numExecuted++;
+ if (result.value[1] === IEngine_1.eRuleConfidence.PASS) {
+ depMatch[result.ruleId] = true;
+ }
+ }
+ }
+ }
+ }
+ } while (walker.nextNode());
+ (0, CacheUtil_1.clearCaches)(root);
+ retVal.totalTime = new Date().getTime() - start;
+ return Promise.resolve(retVal);
+ };
+ Engine.prototype.enableRules = function (ruleIds) {
+ for (var ruleId in this.ruleMap) {
+ this.ruleMap[ruleId].enabled = false;
+ }
+ for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) {
+ var ruleId = _a[_i];
+ if (!(ruleId in this.ruleMap)) {
+ console.warn("WARNING: Rule Id", ruleId, "could not be enabled.");
+ }
+ else {
+ this.ruleMap[ruleId].enabled = true;
+ }
+ }
+ };
+ Engine.prototype.getRule = function (ruleId) {
+ return this.ruleMap[ruleId];
+ };
+ Engine.prototype.getRulesIds = function () {
+ var retVal = [];
+ for (var ruleId in this.ruleMap) {
+ retVal.push(ruleId);
+ }
+ return retVal;
+ };
+ Engine.prototype.addRules = function (rules) {
+ for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) {
+ var rule = rules_1[_i];
+ this.addRule(rule, true);
+ }
+ this._sortRules();
+ };
+ Engine.prototype.addRule = function (rule, skipSort) {
+ var ctxs = Context_1.Context.parse(rule.context);
+ var idx = 0;
+ var ruleId = rule.id;
+ if (ruleId in this.ruleMap) {
+ console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring...");
+ return;
+ }
+ this.ruleMap[ruleId] = rule;
+ for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) {
+ var ctx = ctxs_1[_i];
+ var wrapId = ruleId;
+ if (idx >= 1) {
+ wrapId = ruleId + "$$" + idx;
+ }
+ ++idx;
+ var wrappedRule = new WrappedRule(rule, ctx);
+ this.wrappedRuleMap[wrapId] = wrappedRule;
+ var parts = wrappedRule.parsedInfo.contextInfo;
+ var lastPart = parts[parts.length - 1];
+ var triggerRole = lastPart.namespace + ":" + lastPart.role;
+ if (lastPart.inclusive) {
+ this.inclRules[triggerRole] = this.inclRules[triggerRole] || [];
+ this.inclRules[triggerRole].push(wrappedRule);
+ }
+ else {
+ this.exclRules[triggerRole] = this.exclRules[triggerRole] || [];
+ this.exclRules[triggerRole].push(wrappedRule);
+ }
+ }
+ if (!skipSort) {
+ this._sortRules();
+ }
+ };
+ Engine.prototype._sortRules = function () {
+ for (var role in this.inclRules) {
+ this.inclRules[role].sort(function (ruleA, ruleB) {
+ var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0;
+ var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0;
+ // If B depends on A, sort A before B
+ if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id))
+ return -1;
+ // If A depends on B, sort B before A
+ if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id))
+ return 1;
+ // Otherwise, doesn't matter
+ return 0;
+ });
+ }
+ for (var role in this.exclRules) {
+ this.exclRules[role].sort(function (ruleA, ruleB) {
+ var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0;
+ var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0;
+ // If B depends on A, sort A before B
+ if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id))
+ return -1;
+ // If A depends on B, sort B before A
+ if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id))
+ return 1;
+ // Otherwise, doesn't matter
+ return 0;
+ });
+ }
+ };
+ Engine.prototype.addNlsMap = function (map) {
+ for (var key in map) {
+ this.nlsMap[key] = map[key];
+ }
+ };
+ Engine.prototype.addHelpMap = function (map) {
+ for (var key in map) {
+ this.helpMap[key] = map[key];
+ }
+ };
+ Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) {
+ var splitter = ruleId.indexOf("$$");
+ if (splitter >= 0) {
+ ruleId = ruleId.substring(0, splitter);
+ }
+ if (!(ruleId in this.nlsMap))
+ return ruleId;
+ var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0];
+ if (!messageTemplate)
+ return ruleId + "_" + ruleIdx;
+ return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; });
+ };
+ Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) {
+ if (!archiveId) {
+ // Set to the latest
+ archiveId = "latest";
+ }
+ return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId));
+ };
+ Engine.prototype.getHelpRel = function (ruleId, ruleIdx) {
+ var splitter = ruleId.indexOf("$$");
+ if (splitter >= 0) {
+ ruleId = ruleId.substring(0, splitter);
+ }
+ if (!(ruleId in this.helpMap))
+ return ruleId;
+ ruleIdx = ruleIdx || 0;
+ var helpStr = null;
+ if (ruleIdx in this.helpMap[ruleId]) {
+ helpStr = this.helpMap[ruleId][ruleIdx || 0];
+ }
+ else {
+ helpStr = this.helpMap[ruleId][0];
+ }
+ if (!helpStr)
+ return ruleId + "_" + ruleIdx;
+ return helpStr;
+ };
+ Engine.prototype.addMapper = function (mapper) {
+ this.mappers[mapper.getNamespace()] = mapper;
+ };
+ Engine.match = function (rule, contextHier) {
+ var ruleParts = rule.parsedInfo.contextInfo;
+ var partIdx = ruleParts.length - 1;
+ var curNS = ruleParts[partIdx].namespace;
+ var curHier = contextHier[curNS][contextHier[curNS].length - 1];
+ var contextNode = curHier.node;
+ // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match
+ if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) {
+ return false;
+ }
+ // If there was only one part, we have a match
+ if (ruleParts.length === 1) {
+ return true;
+ }
+ // Need to deal with parent parts. To walk the hierarchy, these need to be
+ // all in the same namespace. Confirm that is true.
+ curNS = ruleParts[0].namespace;
+ curHier = contextHier[curNS][contextHier[curNS].length - 1];
+ --partIdx;
+ if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) {
+ console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces"));
+ return false;
+ }
+ // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end
+ var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1);
+ while (hierIdx >= 0 && partIdx >= 0) {
+ var part = ruleParts[partIdx];
+ var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx);
+ if (part.connector === ">") {
+ if (!matchesPart) {
+ // Direct parent check and doesn't match
+ return false;
+ }
+ else {
+ // Direct parent check and does match
+ --partIdx;
+ --hierIdx;
+ }
+ }
+ else if (part.connector === " ") {
+ if (part.inclusive) {
+ // inclusive ancestor match
+ if (matchesPart) {
+ --partIdx;
+ }
+ // If doesn't match, just move up the role hierarchy
+ --hierIdx;
+ }
+ else if (!matchesPart) {
+ // exclusive ancestor match and current matches
+ return false;
+ }
+ else {
+ // exclusive ancestor match and current doesn't match - check for other ancestors
+ var parentMatch = false;
+ for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) {
+ parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx);
+ }
+ if (parentMatch)
+ return false;
+ else
+ --partIdx;
+ }
+ }
+ else {
+ throw new Error("Context connector " + part.connector + " is not supported");
+ }
+ }
+ return partIdx === -1;
+ };
+ Engine.prototype.getMatchingRules = function (ctxHier) {
+ var matches = [];
+ function addMatches(rules) {
+ for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) {
+ var rule = rules_2[_i];
+ if (rule.rule.enabled && Engine.match(rule, ctxHier)) {
+ matches.push(rule);
+ }
+ }
+ }
+ for (var ns in ctxHier) {
+ var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none");
+ if (role in this.inclRules) {
+ addMatches(this.inclRules[role]);
+ }
+ for (var xRole in this.exclRules) {
+ if (xRole !== role) {
+ addMatches(this.exclRules[xRole]);
+ }
+ }
+ if (role !== ns + ":none") {
+ if (role.startsWith(ns + ":/")) {
+ if (ns + ":/*" in this.inclRules) {
+ addMatches(this.inclRules[ns + ":/*"]);
+ }
+ }
+ else {
+ if (ns + ":*" in this.inclRules) {
+ addMatches(this.inclRules[ns + ":*"]);
+ }
+ }
+ }
+ }
+ return this.sortDeps(matches);
+ };
+ /**
+ * Sorts the rules in order to execute dependencies in the correct order
+ * @param inRules List of wrapped rules to sort
+ * @returns Sorted list of wrapped rules
+ */
+ Engine.prototype.sortDeps = function (inRules) {
+ var depRules = [];
+ for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) {
+ var rule = inRules_1[_i];
+ depRules.push(rule);
+ }
+ var retVal = [];
+ var idToRule = {};
+ // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list
+ // Repeat until no changes are made to the satisfied list
+ // If a rule cannot be satisfied, it will never execute, so it can be dropped.
+ var change = false;
+ do {
+ change = false;
+ for (var idx = 0; idx < depRules.length; ++idx) {
+ var depRule = depRules[idx];
+ if (depRule.rule.id in idToRule)
+ continue;
+ var allMatch = true;
+ if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) {
+ for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) {
+ var depId = _b[_a];
+ if (!(depId in idToRule)) {
+ allMatch = false;
+ }
+ }
+ }
+ if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) {
+ for (var _c = 0, _d = depRule.rule.prereqs; _c < _d.length; _c++) {
+ var depId = _d[_c];
+ if (!(depId in idToRule)) {
+ allMatch = false;
+ }
+ }
+ }
+ if (allMatch) {
+ change = true;
+ retVal.push(depRule);
+ idToRule[depRule.rule.id] = true;
+ depRules.splice(idx--, 1);
+ }
+ }
+ } while (change);
+ return retVal;
+ };
+ return Engine;
+}());
+exports.Engine = Engine;
+
+
+/***/ }),
+
+/***/ 3962:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Config = void 0;
+var Config = /** @class */ (function () {
+ function Config() {
+ }
+ Config.DEBUG = false;
+ Config.helpRoot = "https://able.ibm.com/rules/archives";
+ return Config;
+}());
+exports.Config = Config;
+
+
+/***/ }),
+
+/***/ 9831:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ColorObj = exports.ColorUtil = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var ColorUtil = /** @class */ (function () {
+ function ColorUtil() {
+ }
+ // Rewrite the color object to account for alpha
+ ColorUtil.Color = function (cssStyleColor) {
+ cssStyleColor = cssStyleColor.toLowerCase();
+ if (cssStyleColor === "transparent")
+ return new ColorObj(255, 255, 255, 0);
+ if (cssStyleColor in ColorUtil.CSSColorLookup)
+ cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor];
+ if (cssStyleColor.startsWith("rgb(")) {
+ var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ return new ColorObj(m[1], m[2], m[3]);
+ }
+ }
+ else if (cssStyleColor.startsWith("rgba(")) {
+ var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ return new ColorObj(m[1], m[2], m[3], m[4]);
+ }
+ }
+ else if (cssStyleColor.charAt(0) != "#") {
+ return null;
+ }
+ else {
+ if (cssStyleColor.length === 4) {
+ // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits
+ // (https://www.w3.org/TR/css-color-3/#rgb-color)
+ cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) +
+ cssStyleColor.charAt(2).repeat(2) +
+ cssStyleColor.charAt(3).repeat(2);
+ }
+ var thisRed = parseInt(cssStyleColor.substring(1, 3), 16);
+ var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16);
+ var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16);
+ return new ColorObj(thisRed, thisGreen, thisBlue);
+ }
+ // return null; // Unreachable
+ };
+ ;
+ ColorUtil.ColorCombo = function (ruleContext) {
+ try {
+ var doc = ruleContext.ownerDocument;
+ if (!doc) {
+ return null;
+ }
+ var win = doc.defaultView;
+ if (!win) {
+ return null;
+ }
+ var ancestors = [];
+ var walkNode = ruleContext;
+ while (walkNode) {
+ if (walkNode.nodeType === 1)
+ ancestors.push(walkNode);
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ var retVal = {
+ "hasGradient": false,
+ "hasBGImage": false,
+ "textShadow": false,
+ "fg": null,
+ "bg": null
+ };
+ // start
+ var cStyle = win.getComputedStyle(ruleContext);
+ var compStyleColor = cStyle.color;
+ if (!compStyleColor)
+ compStyleColor = "black";
+ var fg = ColorUtil.Color(compStyleColor);
+ var reColor = /transparent|rgba?\([^)]+\)/gi;
+ var guessGradColor = function (gradList, bgColor, fgColor) {
+ try {
+ // If there's only one color, return that
+ if (typeof gradList.length === "undefined")
+ return gradList;
+ var overallWorst = null;
+ var overallWorstRatio = null;
+ for (var iGrad = 1; iGrad < gradList.length; ++iGrad) {
+ var worstColor = gradList[iGrad - 1];
+ var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]);
+ var step = .1;
+ var idx = 0;
+ while (step > .0001) {
+ while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) {
+ worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor);
+ worstRatio = fgColor.contrastRatio(worstColor);
+ idx = idx + step;
+ }
+ while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) {
+ worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor);
+ worstRatio = fgColor.contrastRatio(worstColor);
+ idx = idx - step;
+ }
+ step = step / 10;
+ }
+ if (overallWorstRatio === null || overallWorstRatio > worstRatio) {
+ overallWorstRatio = worstRatio;
+ overallWorst = worstColor;
+ }
+ }
+ return overallWorst; // return the darkest color
+ }
+ catch (e) {
+ console.log(e);
+ }
+ return bgColor;
+ };
+ var priorStackBG = ColorUtil.Color("white");
+ var thisStackOpacity = null;
+ var thisStackAlpha = null;
+ var thisStackBG = null;
+ // Ancestors processed from the topmost parent toward the child
+ while (ancestors.length > 0) {
+ var procNext = ancestors.pop();
+ //var procNext = ancestors.splice(0, 1)[0];
+ // cStyle is the computed style of this layer
+ var cStyle = win.getComputedStyle(procNext);
+ if (cStyle === null)
+ continue;
+ // thisBgColor is the color of this layer or null if the layer is transparent
+ var thisBgColor = null;
+ if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") {
+ thisBgColor = ColorUtil.Color(cStyle.backgroundColor);
+ }
+ // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground
+ if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) {
+ var gradColors = cStyle.backgroundImage.match(reColor);
+ if (gradColors) {
+ var gradColorComp = [];
+ for (var i = 0; i < gradColors.length; ++i) {
+ if (!gradColors[i].length) {
+ gradColors.splice(i--, 1);
+ }
+ else {
+ var colorComp = ColorUtil.Color(gradColors[i]);
+ if (colorComp.alpha !== undefined && colorComp.alpha < 1) {
+ // mix the grdient bg color wit parent bg if alpha < 1
+ var compStackBg = thisStackBG || priorStackBG;
+ colorComp = colorComp.getOverlayColor(compStackBg);
+ }
+ gradColorComp.push(colorComp);
+ }
+ }
+ thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg);
+ }
+ }
+ // Handle non-solid opacity
+ if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) {
+ // New stack, reset
+ if (thisStackBG != null) {
+ // Overlay
+ thisStackBG.alpha = thisStackOpacity * thisStackAlpha;
+ priorStackBG = thisStackBG.getOverlayColor(priorStackBG);
+ }
+ thisStackOpacity = 1.0;
+ thisStackAlpha = null;
+ thisStackBG = null;
+ if (cStyle.opacity && cStyle.opacity.length > 0) {
+ thisStackOpacity = parseFloat(cStyle.opacity);
+ }
+ if (thisBgColor != null) {
+ thisStackBG = thisBgColor;
+ thisStackAlpha = thisStackBG.alpha || 1.0;
+ delete thisStackBG.alpha;
+ if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) {
+ retVal.hasBGImage = false;
+ retVal.hasGradient = false;
+ }
+ }
+ }
+ // Handle solid color backgrounds and gradient color backgrounds
+ else if (thisBgColor != null) {
+ // If this stack already has a background color, blend it
+ if (thisStackBG === null) {
+ thisStackBG = thisBgColor;
+ thisStackAlpha = thisStackBG.alpha || 1.0;
+ delete thisStackBG.alpha;
+ }
+ else {
+ thisStackBG = thisBgColor.getOverlayColor(thisStackBG);
+ //thisStackAlpha = thisBgColor.alpha || 1.0;
+ thisStackAlpha = thisStackBG.alpha || 1.0;
+ }
+ // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code
+ // We can't wipe out the gradient info if this layer was transparent
+ if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) {}
+ }
+ if (cStyle.backgroundImage && cStyle.backgroundImage != "none") {
+ if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) {
+ retVal.hasGradient = true;
+ }
+ else {
+ retVal.hasBGImage = true;
+ }
+ }
+ }
+ if (thisStackBG != null) {
+ fg = fg.getOverlayColor(thisStackBG);
+ delete fg.alpha;
+ }
+ fg.alpha = (fg.alpha || 1) * thisStackOpacity;
+ fg = fg.getOverlayColor(priorStackBG);
+ if (thisStackBG != null) {
+ thisStackBG.alpha = thisStackOpacity * thisStackAlpha;
+ priorStackBG = thisStackBG.getOverlayColor(priorStackBG);
+ }
+ retVal.fg = fg;
+ retVal.bg = priorStackBG;
+ if (cStyle.textShadow && cStyle.textShadow !== 'none')
+ retVal.textShadow = true;
+ return retVal;
+ }
+ catch (err) {
+ // something happened, then...
+ return null;
+ }
+ };
+ ;
+ ColorUtil.CSSColorLookup = {
+ "aliceblue": "#f0f8ff",
+ "antiquewhite": "#faebd7",
+ "aqua": "#00ffff",
+ "aquamarine": "#7fffd4",
+ "azure": "#f0ffff",
+ "beige": "#f5f5dc",
+ "bisque": "#ffe4c4",
+ "black": "#000000",
+ "blanchedalmond": "#ffebcd",
+ "blue": "#0000ff",
+ "blueviolet": "#8a2be2",
+ "brown": "#a52a2a",
+ "burlywood": "#deb887",
+ "cadetblue": "#5f9ea0",
+ "chartreuse": "#7fff00",
+ "chocolate": "#d2691e",
+ "coral": "#ff7f50",
+ "cornflowerblue": "#6495ed",
+ "cornsilk": "#fff8dc",
+ "crimson": "#dc143c",
+ "cyan": "#00ffff",
+ "darkblue": "#00008b",
+ "darkcyan": "#008b8b",
+ "darkgoldenrod": "#b8860b",
+ "darkgray": "#a9a9a9",
+ "darkgreen": "#006400",
+ "darkkhaki": "#bdb76b",
+ "darkmagenta": "#8b008b",
+ "darkolivegreen": "#556b2f",
+ "darkorange": "#ff8c00",
+ "darkorchid": "#9932cc",
+ "darkred": "#8b0000",
+ "darksalmon": "#e9967a",
+ "darkseagreen": "#8fbc8f",
+ "darkslateblue": "#483d8b",
+ "darkslategray": "#2f4f4f",
+ "darkturquoise": "#00ced1",
+ "darkviolet": "#9400d3",
+ "deeppink": "#ff1493",
+ "deepskyblue": "#00bfff",
+ "dimgray": "#696969",
+ "dodgerblue": "#1e90ff",
+ "firebrick": "#b22222",
+ "floralwhite": "#fffaf0",
+ "forestgreen": "#228b22",
+ "fuchsia": "#ff00ff",
+ "gainsboro": "#dcdcdc",
+ "ghostwhite": "#f8f8ff",
+ "gold": "#ffd700",
+ "goldenrod": "#daa520",
+ "gray": "#808080",
+ "green": "#008000",
+ "greenyellow": "#adff2f",
+ "honeydew": "#f0fff0",
+ "hotpink": "#ff69b4",
+ "indianred": "#cd5c5c",
+ "indigo": "#4b0082",
+ "ivory": "#fffff0",
+ "khaki": "#f0e68c",
+ "lavender": "#e6e6fa",
+ "lavenderblush": "#fff0f5",
+ "lawngreen": "#7cfc00",
+ "lemonchiffon": "#fffacd",
+ "lightblue": "#add8e6",
+ "lightcoral": "#f08080",
+ "lightcyan": "#e0ffff",
+ "lightgoldenrodyellow": "#fafad2",
+ "lightgrey": "#d3d3d3",
+ "lightgreen": "#90ee90",
+ "lightpink": "#ffb6c1",
+ "lightsalmon": "#ffa07a",
+ "lightseagreen": "#20b2aa",
+ "lightskyblue": "#87cefa",
+ "lightslategray": "#778899",
+ "lightsteelblue": "#b0c4de",
+ "lightyellow": "#ffffe0",
+ "lime": "#00ff00",
+ "limegreen": "#32cd32",
+ "linen": "#faf0e6",
+ "magenta": "#ff00ff",
+ "maroon": "#800000",
+ "mediumaquamarine": "#66cdaa",
+ "mediumblue": "#0000cd",
+ "mediumorchid": "#ba55d3",
+ "mediumpurple": "#9370d8",
+ "mediumseagreen": "#3cb371",
+ "mediumslateblue": "#7b68ee",
+ "mediumspringgreen": "#00fa9a",
+ "mediumturquoise": "#48d1cc",
+ "mediumvioletred": "#c71585",
+ "midnightblue": "#191970",
+ "mintcream": "#f5fffa",
+ "mistyrose": "#ffe4e1",
+ "moccasin": "#ffe4b5",
+ "navajowhite": "#ffdead",
+ "navy": "#000080",
+ "oldlace": "#fdf5e6",
+ "olive": "#808000",
+ "olivedrab": "#6b8e23",
+ "orange": "#ffa500",
+ "orangered": "#ff4500",
+ "orchid": "#da70d6",
+ "palegoldenrod": "#eee8aa",
+ "palegreen": "#98fb98",
+ "paleturquoise": "#afeeee",
+ "palevioletred": "#d87093",
+ "papayawhip": "#ffefd5",
+ "peachpuff": "#ffdab9",
+ "peru": "#cd853f",
+ "pink": "#ffc0cb",
+ "plum": "#dda0dd",
+ "powderblue": "#b0e0e6",
+ "purple": "#800080",
+ "red": "#ff0000",
+ "rosybrown": "#bc8f8f",
+ "royalblue": "#4169e1",
+ "saddlebrown": "#8b4513",
+ "salmon": "#fa8072",
+ "sandybrown": "#f4a460",
+ "seagreen": "#2e8b57",
+ "seashell": "#fff5ee",
+ "sienna": "#a0522d",
+ "silver": "#c0c0c0",
+ "skyblue": "#87ceeb",
+ "slateblue": "#6a5acd",
+ "slategray": "#708090",
+ "snow": "#fffafa",
+ "springgreen": "#00ff7f",
+ "steelblue": "#4682b4",
+ "tan": "#d2b48c",
+ "teal": "#008080",
+ "thistle": "#d8bfd8",
+ "tomato": "#ff6347",
+ "turquoise": "#40e0d0",
+ "violet": "#ee82ee",
+ "wheat": "#f5deb3",
+ "white": "#ffffff",
+ "whitesmoke": "#f5f5f5",
+ "yellow": "#ffff00",
+ "yellowgreen": "#9acd32",
+ "buttontext": "rgba(0, 0, 0, 0.847)",
+ "buttonface": "#ffffff",
+ "graytext": "rgba(0, 0, 0, 0.247)"
+ };
+ return ColorUtil;
+}());
+exports.ColorUtil = ColorUtil;
+var ColorObj = /** @class */ (function () {
+ function ColorObj(red, green, blue, alpha) {
+ function fixComponent(comp) {
+ if (typeof (comp) != typeof (""))
+ return comp;
+ var compStr = comp;
+ compStr = compStr.trim();
+ if (compStr[compStr.length - 1] != "%")
+ return parseInt(compStr);
+ return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55);
+ }
+ this.red = fixComponent(red);
+ this.green = fixComponent(green);
+ this.blue = fixComponent(blue);
+ if (typeof (alpha) != "undefined") {
+ this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha;
+ }
+ }
+ ColorObj.prototype.toHexHelp = function (value) {
+ var retVal = Math.round(value).toString(16);
+ if (retVal.length === 1)
+ return "0" + retVal;
+ return retVal;
+ };
+ ;
+ ColorObj.prototype.toHex = function () {
+ return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue);
+ };
+ ;
+ ColorObj.prototype.contrastRatio = function (bgColor) {
+ var fgColor = this;
+ if (typeof (this.alpha) != "undefined")
+ fgColor = this.getOverlayColor(bgColor);
+ var lum1 = fgColor.relativeLuminance();
+ if (!bgColor.relativeLuminance) {
+ var s = "";
+ for (var key in bgColor) {
+ s += key + "\n";
+ }
+ alert(bgColor);
+ alert(s);
+ }
+ var lum2 = bgColor.relativeLuminance();
+ var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05);
+ return ratio;
+ };
+ ;
+ ColorObj.prototype.relativeLuminance = function () {
+ var R = this.red / 255.0;
+ var G = this.green / 255.0;
+ var B = this.blue / 255.0;
+ R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4);
+ G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4);
+ B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4);
+ return 0.2126 * R + 0.7152 * G + 0.0722 * B;
+ };
+ ;
+ ColorObj.prototype.mix = function (color2, percThis) {
+ if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") {
+ return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue);
+ }
+ else {
+ var alphaThis = this.alpha ? this.alpha : 1;
+ var alphaOther = color2.alpha ? color2.alpha : 1;
+ return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther);
+ }
+ };
+ ;
+ ColorObj.prototype.getOverlayColor = function (bgColor) {
+ if (typeof (this.alpha) === "undefined" || this.alpha >= 1) {
+ // No mixing required - it's opaque
+ return this;
+ }
+ if (this.alpha < 0) {
+ // Haac.Error.logError("Invalid alpha value");
+ return null;
+ }
+ if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) {
+ // Haac.Error.logError("Cannot mix with a background alpha");
+ return null;
+ }
+ var retVal = this.mix(bgColor, this.alpha);
+ delete retVal.alpha;
+ return retVal;
+ };
+ ColorObj.fromCSSColor = function (cssStyleColor) {
+ var thisRed = -1;
+ var thisGreen = -1;
+ var thisBlue = -1;
+ cssStyleColor = cssStyleColor.toLowerCase();
+ if (cssStyleColor.startsWith("rgb(")) {
+ var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ thisRed = m[1];
+ thisGreen = m[2];
+ thisBlue = m[3];
+ }
+ }
+ else if (cssStyleColor.startsWith("rgba(")) {
+ var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ thisRed = m[1];
+ thisGreen = m[2];
+ thisBlue = m[3];
+ }
+ }
+ else {
+ if (cssStyleColor.charAt(0) != "#") {
+ if (cssStyleColor in ColorUtil.CSSColorLookup)
+ cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor];
+ else
+ return null;
+ }
+ var fromHex = function (val) {
+ var lookup = {
+ "a": 10,
+ "b": 11,
+ "c": 12,
+ "d": 13,
+ "e": 14,
+ "f": 15
+ };
+ var retVal = 0;
+ for (var i = 0; i < val.length; ++i) {
+ retVal = retVal * 16 +
+ parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i));
+ }
+ return retVal;
+ };
+ if (cssStyleColor.length === 4) {
+ // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits
+ // (https://www.w3.org/TR/css-color-3/#rgb-color)
+ cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) +
+ cssStyleColor.charAt(2).repeat(2) +
+ cssStyleColor.charAt(3).repeat(2);
+ }
+ thisRed = fromHex(cssStyleColor.substring(1, 3));
+ thisGreen = fromHex(cssStyleColor.substring(3, 5));
+ thisBlue = fromHex(cssStyleColor.substring(5, 7));
+ }
+ return new ColorObj(thisRed, thisGreen, thisBlue);
+ };
+ return ColorObj;
+}());
+exports.ColorObj = ColorObj;
+
+
+/***/ }),
+
+/***/ 5697:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMMapper = void 0;
+var CommonMapper_1 = __webpack_require__(1794);
+var DOMMapper = /** @class */ (function (_super) {
+ __extends(DOMMapper, _super);
+ function DOMMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ DOMMapper.prototype.getRole = function (node) {
+ return node.nodeName.toLowerCase();
+ };
+ DOMMapper.prototype.getNamespace = function () {
+ return "dom";
+ };
+ DOMMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem = node;
+ for (var idx = 0; idx < elem.attributes.length; ++idx) {
+ var attrInfo = elem.attributes[idx];
+ retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue;
+ }
+ }
+ return retVal;
+ };
+ DOMMapper.prototype.getBounds = function (node) {
+ if (node.nodeType === 1 /*Node.ELEMENT_NODE*/) {
+ var adjustment = 1;
+ if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) {
+ adjustment = node.ownerDocument.defaultView.devicePixelRatio;
+ }
+ var bounds = node.getBoundingClientRect();
+ // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function
+ if (bounds) {
+ var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0;
+ var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0;
+ return {
+ "left": Math.ceil((bounds.left + scrollX_1) * adjustment),
+ "top": Math.ceil((bounds.top + scrollY_1) * adjustment),
+ "height": Math.ceil(bounds.height * adjustment),
+ "width": Math.ceil(bounds.width * adjustment)
+ };
+ }
+ }
+ return null;
+ };
+ return DOMMapper;
+}(CommonMapper_1.CommonMapper));
+exports.DOMMapper = DOMMapper;
+
+
+/***/ }),
+
+/***/ 295:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMUtil = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var DOMUtil = /** @class */ (function () {
+ function DOMUtil() {
+ }
+ DOMUtil.hasParent = function (node, names) {
+ var p = DOMWalker_1.DOMWalker.parentElement(node);
+ while (p && !names.includes(p.nodeName)) {
+ p = DOMWalker_1.DOMWalker.parentElement(p);
+ }
+ return !!p;
+ };
+ DOMUtil.getAncestor = function (node, names) {
+ var p = DOMWalker_1.DOMWalker.parentElement(node);
+ while (p && !names.includes(p.nodeName.toLowerCase())) {
+ p = DOMWalker_1.DOMWalker.parentElement(p);
+ }
+ return p;
+ };
+ DOMUtil.sameNode = function (a, b) {
+ if (a === b) {
+ return true;
+ }
+ else if (a.isSameNode) {
+ return a.isSameNode(b);
+ }
+ else if (a.compareDocumentPosition) {
+ return a.compareDocumentPosition(b) === 0;
+ }
+ else {
+ // Not supported in this environment - try our best
+ return true;
+ }
+ };
+ DOMUtil.cleanWhitespace = function (s) {
+ var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " ");
+ return retVal;
+ };
+ DOMUtil.cleanSpace = function (s) {
+ var retVal = s.replace(/ +/g, " ");
+ return retVal;
+ };
+ // return true if element1 and element2 (cells) are in the same table
+ DOMUtil.isInSameTable = function (element1, element2) {
+ if (element1 && element2) {
+ var parentName = ['table'];
+ var parent1 = DOMUtil.getAncestor(element1, parentName);
+ var parent2 = DOMUtil.getAncestor(element2, parentName);
+ if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2))
+ return true;
+ }
+ return false;
+ };
+ DOMUtil.shadowRootNode = function (node) {
+ var nd = node;
+ while (nd != null && nd.nodeType !== Node.DOCUMENT_FRAGMENT_NODE)
+ nd = nd.parentNode;
+ return nd;
+ };
+ /**
+ * Copies objects, but retains Node attributes as references
+ * @param rhs
+ */
+ DOMUtil.objectCopyWithNodeRefs = function (rhs) {
+ if (!rhs)
+ return rhs;
+ if (typeof rhs !== "object") {
+ if (typeof rhs === "function") {
+ return rhs;
+ }
+ else {
+ return JSON.parse(JSON.stringify(rhs));
+ }
+ }
+ else if (rhs instanceof Node || !!rhs.nodeType) {
+ return rhs;
+ }
+ else {
+ var retVal = void 0;
+ if (rhs.constructor.name === "Array") {
+ retVal = [];
+ for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) {
+ var item = rhs_1[_i];
+ retVal.push(this.objectCopyWithNodeRefs(item));
+ }
+ }
+ else {
+ retVal = {};
+ for (var key in rhs) {
+ retVal[key] = this.objectCopyWithNodeRefs(rhs[key]);
+ }
+ }
+ return retVal;
+ }
+ };
+ DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) {
+ var walkNode = DOMWalker_1.DOMWalker.parentNode(element);
+ while (walkNode !== null) {
+ if (walkNode.nodeType === Node.ELEMENT_NODE && walkNode.getAttribute(attrName) === attrValue)
+ return walkNode;
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return null;
+ };
+ return DOMUtil;
+}());
+exports.DOMUtil = DOMUtil;
+
+
+/***/ }),
+
+/***/ 7440:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMWalker = void 0;
+/**
+ * Walks in a DOM order
+ *
+ * See also ../aria/ARIAWalker
+ */
+var DOMWalker = /** @class */ (function () {
+ function DOMWalker(element, bEnd, root) {
+ this.root = root || element;
+ this.node = element;
+ this.bEndTag = (bEnd == undefined ? false : bEnd == true);
+ }
+ DOMWalker.parentNode = function (node) {
+ if (node === null)
+ return null;
+ var p = node.parentNode;
+ if (node.slotOwner) {
+ p = node.slotOwner;
+ }
+ else if (node.ownerElement) {
+ p = node.ownerElement;
+ }
+ else if (p && p.nodeType === 11) {
+ if (p.host) {
+ p = p.host;
+ }
+ else {
+ p = null;
+ }
+ }
+ return p;
+ };
+ DOMWalker.parentElement = function (node) {
+ var elem = node;
+ do {
+ elem = DOMWalker.parentNode(elem);
+ } while (elem && elem.nodeType !== 1);
+ return elem;
+ };
+ DOMWalker.isNodeVisible = function (node) {
+ if (node === null)
+ return false;
+ try {
+ var vis = null;
+ while (node && node.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ node = DOMWalker.parentElement(node);
+ }
+ var elem = node;
+ var w = elem.ownerDocument.defaultView;
+ do {
+ var cs = w.getComputedStyle(elem);
+ if (cs.display === "none")
+ return false;
+ if (vis === null && cs.visibility) {
+ vis = cs.visibility;
+ if (vis === "hidden")
+ return false;
+ }
+ elem = DOMWalker.parentElement(elem);
+ } while (elem);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+ };
+ DOMWalker.prototype.atRoot = function () {
+ if (this.ownerElement)
+ return false;
+ if (this.root === this.node) {
+ return true;
+ }
+ else if (this.root.isSameNode) {
+ return this.root.isSameNode(this.node);
+ }
+ else if (this.root.compareDocumentPosition) {
+ return this.root.compareDocumentPosition(this.node) === 0;
+ }
+ else {
+ // Not supported in this environment - try our best
+ return this.node.parentNode === null;
+ }
+ };
+ DOMWalker.prototype.nextNode = function () {
+ do {
+ // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id"));
+ if (!this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ var slotElement = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 0;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.slotOwner) {
+ var slotOwner = this.node.slotOwner;
+ var nextSlotIndex = this.node.slotIndex + 1;
+ delete this.node.slotOwner;
+ delete this.node.slotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ DOMWalker.prototype.prevNode = function () {
+ do {
+ if (this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.lastChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ }
+ else {
+ this.bEndTag = false;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ return DOMWalker;
+}());
+exports.DOMWalker = DOMWalker;
+
+
+/***/ }),
+
+/***/ 8174:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.VisUtil = void 0;
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMUtil_1 = __webpack_require__(295);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil = /** @class */ (function () {
+ function VisUtil() {
+ }
+ /**
+ * This function is responsible for checking if the node that is provied is
+ * visible or not. Following is how the check is performed:
+ * 1. Check if the current node is hidden with the following options:
+ * CSS --> dislay: none
+ * CSS --> visibility: hidden
+ * attribute --> hidden
+ * 2. Check if the any of the current nodes parents are hidden with the same
+ * options listed in 1.
+ *
+ * Note: If either current node or any of the parent nodes are hidden then this
+ * function will return false (node is not visible).
+ *
+ * @parm {element} node The node which should be checked if it is visible or not.
+ * @return {bool} false if the node is NOT visible, true otherwise
+ *
+ * @memberOf VisUtil
+ */
+ VisUtil.isNodeVisible = function (nodeIn) {
+ // Check the nodeType if this node, if this node is a text node then
+ // we get the parentnode and set that as the node as a text nodes,
+ // visibility is directly related to the parent node.
+ if (nodeIn.nodeType === 3) {
+ nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn);
+ }
+ var node = nodeIn;
+ // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to
+ // true when we detect that the node is hidden. We have to set it to false so that we know
+ // the rules has already been checked.
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", (0, CacheUtil_1.getCache)(node, "PT_NODE_HIDDEN", false));
+ // We should only allow nodeType element, and TextNode all other nodesTypes
+ // we can return the visibility as visible.
+ // Following nodes will be returned as visable by default, since we can not
+ // actually change their visibility.
+ // Node.PROCESSING_INSTRUCTION_NODE --> 7
+ // Node.COMMENT_NODE --> 8
+ // 9 /* Node.DOCUMENT_NODE */ --> 9
+ // Node.DOCUMENT_TYPE_NODE --> 10
+ // Node.DOCUMENT_FRAGMENT_NODE --> 11
+ if (node.nodeType !== 1) {
+ return true;
+ }
+ // Make sure that the ownerDocument is present before moving forward
+ // in detecting if the node is visible or not. In the case that ownerDocument
+ // does not exist then we simply return node is visible by default.
+ if (!node.ownerDocument) {
+ return true;
+ }
+ // Variable Declaration
+ var compStyle;
+ var nodeName = node.nodeName.toLowerCase();
+ // In the case this node is a script, link or style node, right away return node is visible
+ // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan
+ // the elements everytime as they render content still which is still visible to users.
+ // script --> script elements have display: none by default
+ // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) {
+ return true;
+ }
+ // Check if this node is visible, we check couple of CSS properties and hidden attribute.
+ // area, param and audio elements we do not check if they are hidden as it does not apply to them.
+ // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not
+ // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element,
+ // and go stright to the parent node.
+ // Array check elements like:
+ // area --> area element is part of a map element and it can not be hidden because it is used to
+ // make an certian parts of an map interactive.
+ // param --> element can only be part of object elment and it cannot be hidden directly, it
+ // can only be hidden if the parent is hidden.
+ // audio --> If this element is hidden it will still play the music, so we should still trigger
+ // violations for this element.
+ // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all.
+ if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) {
+ // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle
+ // function to get the CSS style for the node.
+ if (node.ownerDocument.defaultView) {
+ // Run the getComputedStyle on this node to fetch the CSS compuation of the node
+ compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null);
+ }
+ // In the case that defaultView does not exists return true to identify that this
+ // node is visible, because were not able to detect if it was not.
+ else {
+ return true;
+ }
+ // Get the hidden element property and hidden attribute
+ var hiddenAttribute = node.getAttribute("hidden");
+ var hiddenPropertyCustom = (0, CacheUtil_1.getCache)(node, "PT_NODE_HIDDEN", undefined);
+ // To get the hidden property we need to perform a special check as in some cases the hidden property will not be
+ // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition.
+ // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element
+ // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to
+ // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356
+ var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false;
+ // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT
+ // hidden property then we can just return true (node visible) at this point.
+ if (!compStyle &&
+ !hiddenProperty && // this covers false, null, or undefined
+ (hiddenAttribute === null || hiddenAttribute === undefined) &&
+ !hiddenPropertyCustom // This covers false, null or undefined
+ ) {
+ return true;
+ }
+ // In the case that the compStyle is defined we check the following:
+ // CSS style display set to none
+ // CSS style visibility set to hidden
+ // Note: For this property since it is inherited, need to skip the check on parents as
+ // the parent can have hidden but the child can be visible. So we only check this property
+ // on child elements/elements that are passed to this function the first time.
+ // node hidden property set (node.hidden)
+ // node attribute hidden set (to any value)
+ // node custom hidden property ser (node.PT_NODE_HIDDEN)
+ // If any of the above conditions are true then we return false as this element is not visible
+ if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' ||
+ (!(0, CacheUtil_1.getCache)(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) ||
+ (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) {
+ // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses
+ // use this in the rules to determine if the node is hidden or not, if we need to.
+ // Use expandos property instead of a hash map which stores the elements, adding/checking expandos
+ // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate
+ // xpath it is more performance impact.
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", true);
+ return false;
+ }
+ }
+ // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have
+ // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode
+ // element.
+ var parentElement = DOMWalker_1.DOMWalker.parentNode(node);
+ // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check
+ // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not
+ // have to duplicate the logic for checking if the node is visible or not for all the parents starting with
+ // child node.
+ if (parentElement != null && parentElement.nodeType === 1) {
+ // When we have a parent element going through the isNodeVisible function we have to mark it as such
+ // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden
+ // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked
+ // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over.
+ (0, CacheUtil_1.setCache)(parentElement, "Visibility_Check_Parent", true);
+ // Check upwards recursively, and save the results in an variable
+ var nodeVisible = VisUtil.isNodeVisible(parentElement);
+ // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true.
+ // so that we can use this in the rules.
+ if (!nodeVisible) {
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", true);
+ }
+ // Check upwards recursively
+ return nodeVisible;
+ }
+ // Return true (node is visible)
+ return true;
+ };
+ /**
+ * return true if the node or its ancestor is natively hidden or aria-hidden = 'true'
+ * @param node
+ */
+ VisUtil.isNodeHiddenFromAT = function (node) {
+ if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true')
+ return true;
+ var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true");
+ if (ancestor)
+ return true;
+ return false;
+ };
+ // This list contains a list of element tags which can not be hidden, when hidden is
+ // added to theses elements it does not do anything at all.
+ // area --> area element is part of a map element and it can not be hidden because it is used to
+ // make an certian parts of an map interactive.
+ // param --> element can only be part of object elment and it cannot be hidden directly, it
+ // can only be hidden if the parent is hidden.
+ // audio --> If this element is hidden it will still play the music, so we should still trigger
+ // violations for this element.
+ // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check.
+ VisUtil.unhideableElements = ['area', 'param', 'audio'];
+ // This list contains a list of elements tags which have display: none by default, since we have rules triggering
+ // on theses elements we need to make then visible by default so that the rules can trigger regardless of the
+ // Check Hidden Content option in the tools.
+ // script --> script elements have display: none by default
+ // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ // head --> head elements have display: none by default, but it will still behave correct
+ // title --> title elements have display: none by default, but it will still display the title
+ // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to
+ // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to
+ // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to
+ // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content
+ // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template
+ // datalist --> datalist elements have display: none by default,
+ VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'title', 'meta', 'base', 'noscript', 'template', 'datalist'];
+ return VisUtil;
+}());
+exports.VisUtil = VisUtil;
+
+
+/***/ }),
+
+/***/ 1970:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.StyleMapper = void 0;
+var CommonMapper_1 = __webpack_require__(1794);
+var StyleMapper = /** @class */ (function (_super) {
+ __extends(StyleMapper, _super);
+ function StyleMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ StyleMapper.prototype.getRole = function (node) {
+ return "computed";
+ };
+ StyleMapper.prototype.getNamespace = function () {
+ return "css";
+ };
+ StyleMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem = node;
+ var style = elem.ownerDocument.defaultView.getComputedStyle(elem);
+ for (var idx = 0; idx < style.length; ++idx) {
+ var name_1 = style[idx].toLowerCase();
+ retVal[name_1] = style[name_1];
+ }
+ }
+ return retVal;
+ };
+ return StyleMapper;
+}(CommonMapper_1.CommonMapper));
+exports.StyleMapper = StyleMapper;
+
+
+/***/ }),
+
+/***/ 4377:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.eRulePolicy = exports.eRuleConfidence = void 0;
+var eRuleConfidence;
+(function (eRuleConfidence) {
+ eRuleConfidence["PASS"] = "PASS";
+ eRuleConfidence["FAIL"] = "FAIL";
+ eRuleConfidence["POTENTIAL"] = "POTENTIAL";
+ eRuleConfidence["MANUAL"] = "MANUAL";
+})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {}));
+var eRulePolicy;
+(function (eRulePolicy) {
+ eRulePolicy["VIOLATION"] = "VIOLATION";
+ eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION";
+ eRulePolicy["INFORMATION"] = "INFORMATION";
+})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {}));
+var eToolkitLevel;
+(function (eToolkitLevel) {
+ eToolkitLevel["LEVEL_ONE"] = "1";
+ eToolkitLevel["LEVEL_TWO"] = "2";
+ eToolkitLevel["LEVEL_THREE"] = "3";
+ eToolkitLevel["LEVEL_FOUR"] = "4";
+})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {}));
+var eRuleCategory;
+(function (eRuleCategory) {
+ eRuleCategory["ACCESSIBILITY"] = "Accessibility";
+ eRuleCategory["DESIGN"] = "Design";
+ eRuleCategory["OTHER"] = "Other";
+})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {}));
+var eRulesetType;
+(function (eRulesetType) {
+ eRulesetType["DEFAULT"] = "default";
+ eRulesetType["EXTENSION"] = "extension";
+})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {}));
+function RulePass(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RulePass = RulePass;
+function RuleRender(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS],
+ reasonId: 0,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleRender = RuleRender;
+function RuleFail(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleFail = RuleFail;
+function RulePotential(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RulePotential = RulePotential;
+function RuleManual(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleManual = RuleManual;
+
+
+/***/ }),
+
+/***/ 7884:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ 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
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Checker = void 0;
+var IEngine_1 = __webpack_require__(9077);
+var Engine_1 = __webpack_require__(9324);
+var ARIAMapper_1 = __webpack_require__(4944);
+var StyleMapper_1 = __webpack_require__(1970);
+var rulesets_1 = __webpack_require__(1070);
+var checkRulesV4 = __webpack_require__(8081);
+var checkRules = [];
+var checkNls = {};
+var checkHelp = {};
+function _initialize() {
+ var langs = Engine_1.Engine.getLanguages();
+ // Process V4 rules into the V2 format
+ for (var rulename in checkRulesV4) {
+ // Convert rule
+ var v4Rule = checkRulesV4[rulename];
+ checkRules.push(v4Rule);
+ for (var _i = 0, langs_1 = langs; _i < langs_1.length; _i++) {
+ var langId = langs_1[_i];
+ if (langId in v4Rule.messages) {
+ checkNls[v4Rule.id] = v4Rule.messages[langId];
+ checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group;
+ }
+ if (langId in v4Rule.help) {
+ checkHelp[v4Rule.id] = {};
+ for (var reasonId in v4Rule.help[langId]) {
+ checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]);
+ }
+ checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group;
+ }
+ }
+ // Convert RS
+ for (var _a = 0, _b = v4Rule.rulesets; _a < _b.length; _a++) {
+ var rsSection = _b[_a];
+ for (var _c = 0, _d = rulesets_1.a11yRulesets; _c < _d.length; _c++) {
+ var rs = _d[_c];
+ var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id;
+ if (checkRsIds.includes(rs.id)) {
+ for (var _e = 0, _f = rs.checkpoints; _e < _f.length; _e++) {
+ var cp = _f[_e];
+ var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num;
+ if (checkCPIds.includes(cp.num)) {
+ cp.rules = cp.rules || [];
+ cp.rules.push({
+ id: v4Rule.id,
+ level: rsSection.level,
+ toolkitLevel: rsSection.toolkitLevel
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+}
+_initialize();
+var Checker = /** @class */ (function () {
+ function Checker() {
+ this.rulesets = [];
+ this.rulesetIds = [];
+ this.rulesetRules = {};
+ this.ruleLevels = {};
+ this.ruleCategory = {};
+ var engine = this.engine = new Engine_1.Engine();
+ engine.addMapper(new ARIAMapper_1.ARIAMapper());
+ engine.addMapper(new StyleMapper_1.StyleMapper());
+ engine.addRules(checkRules);
+ engine.addNlsMap(checkNls);
+ engine.addHelpMap(checkHelp);
+ for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) {
+ var rs = a11yRulesets_1[_i];
+ this.addRuleset(rs);
+ }
+ }
+ Checker.prototype.addRuleset = function (rs) {
+ this.rulesets.push(rs);
+ this.rulesetIds.push(rs.id);
+ var ruleIds = [];
+ for (var _i = 0, _a = rs.checkpoints; _i < _a.length; _i++) {
+ var cp = _a[_i];
+ cp.rules = cp.rules || [];
+ for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) {
+ var rule = _c[_b];
+ ruleIds.push(rule.id);
+ this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {};
+ this.ruleLevels[rule.id][rs.id] = rule.level;
+ this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {};
+ this.ruleCategory[rule.id][rs.id] = rs.category;
+ }
+ }
+ this.rulesetRules[rs.id] = ruleIds;
+ };
+ Checker.prototype.check = function (node, rsIds) {
+ // Determine which rules to run
+ var ruleIds = [];
+ // Fix the input
+ if (!rsIds) {
+ ruleIds = this.engine.getRulesIds();
+ }
+ else {
+ if (typeof rsIds === "string") {
+ rsIds = [rsIds];
+ }
+ for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) {
+ var rsId = rsIds_1[_i];
+ if (rsId in this.rulesetRules) {
+ ruleIds = ruleIds.concat(this.rulesetRules[rsId]);
+ }
+ }
+ }
+ this.engine.enableRules(ruleIds);
+ // Add the report levels
+ var myThis = this;
+ return this.engine.run(node)
+ .then(function (report) {
+ report.nls = {};
+ for (var _i = 0, _a = report.results; _i < _a.length; _i++) {
+ var result = _a[_i];
+ if (result.ruleId in checkNls) {
+ report.nls[result.ruleId] = report.nls[result.ruleId] || {
+ 0: checkNls[result.ruleId][0]
+ };
+ if (result.reasonId in checkNls[result.ruleId]) {
+ report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId];
+ }
+ }
+ result.value[0] = myThis.getLevel(rsIds, result.ruleId);
+ result.category = myThis.getCategory(rsIds, result.ruleId);
+ delete result.path.css;
+ }
+ return report;
+ });
+ };
+ Checker.prototype.getLevel = function (rsIds, ruleId) {
+ if (!rsIds)
+ return IEngine_1.eRulePolicy.INFORMATION;
+ var rsInfo = this.ruleLevels[ruleId];
+ var retVal = null;
+ if (rsIds) {
+ if (!(ruleId in this.ruleLevels)) {
+ throw new Error("Rule triggered for which we have no rule level information: " + ruleId);
+ }
+ for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) {
+ var rsId = rsIds_2[_i];
+ if (rsId in rsInfo) {
+ if (rsInfo[rsId] === IEngine_1.eRulePolicy.VIOLATION) {
+ retVal = IEngine_1.eRulePolicy.VIOLATION;
+ }
+ else if (rsInfo[rsId] === IEngine_1.eRulePolicy.RECOMMENDATION && retVal === null) {
+ retVal = IEngine_1.eRulePolicy.RECOMMENDATION;
+ }
+ else if (retVal === null) {
+ retVal = IEngine_1.eRulePolicy.INFORMATION;
+ }
+ }
+ }
+ }
+ if (retVal === null) {
+ throw new Error("Rule triggered for which we have no rule level information: " + ruleId);
+ }
+ return retVal;
+ };
+ Checker.prototype.getCategory = function (rsIds, ruleId) {
+ var rsInfo = this.ruleCategory[ruleId];
+ var retVal = "";
+ if (!(ruleId in this.ruleCategory)) {
+ return IEngine_1.eRuleCategory.OTHER;
+ }
+ if (!rsIds) {
+ rsIds = this.rulesetIds;
+ }
+ for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) {
+ var rsId = rsIds_3[_i];
+ if (rsId in rsInfo) {
+ return rsInfo[rsId];
+ }
+ }
+ return IEngine_1.eRuleCategory.OTHER;
+ };
+ return Checker;
+}());
+exports.Checker = Checker;
+
+
+/***/ }),
+
+/***/ 8980:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a_target_warning = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.a_target_warning = {
+ id: "a_target_warning",
+ context: "dom:a[target],dom:area[target],dom:base[target]",
+ refactor: {
+ "WCAG20_A_TargetAndText": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "a_target_warning.html",
+ "Pass_0": "a_target_warning.html",
+ "Potential_1": "a_target_warning.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Users should be warned in advance if their input action will open a new window or otherwise change their context",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Inform the user when their input action will open a new window or otherwise change their context"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "3.2.2",
+ level: IRule_2.eRulePolicy.RECOMMENDATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // skip the rule if it's AT hidden and not tabbable
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !legacy_1.RPTUtil.isTabbable(ruleContext))
+ return null;
+ var params = {
+ paramWinText: {
+ value: ["new window", "new tab"],
+ type: "array"
+ }
+ };
+ var tStr = ruleContext.getAttribute("target");
+ var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || legacy_1.RPTUtil.getFrameByName(ruleContext, tStr) != null;
+ if (!passed) {
+ // Name is not part of this frameset – must have potential to create new window?
+ // See if a new window is mentioned
+ var textStr = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute("title"))
+ textStr += " " + ruleContext.getAttribute("title");
+ for (var i = 0; !passed && i < params.paramWinText.value.length; ++i)
+ if (textStr.indexOf(params.paramWinText.value[i]) != -1)
+ passed = true;
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3961:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a_text_purpose = void 0;
+var ARIAMapper_1 = __webpack_require__(4944);
+var IRule_1 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_2 = __webpack_require__(4377);
+exports.a_text_purpose = {
+ id: "a_text_purpose",
+ // doc-biblioref is a link
+ context: "aria:link,aria:doc-biblioref",
+ refactor: {
+ "WCAG20_A_HasText": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "a_text_purpose.html",
+ "Pass_0": "a_text_purpose.html",
+ "Fail_1": "a_text_purpose.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Hyperlinks must have a text description of their purpose",
+ "Pass_0": "Hyperlink has a description of its purpose",
+ "Fail_1": "Hyperlink has no link text, label or image with a text alternative"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.4.4",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: "c487ae",
+ run: function (context, options) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ // Rule only passes if an element has inner content,
+ // in the case that there is only hidden content under the the element it is a violation
+ var passed = ARIAMapper_1.ARIAMapper.computeName(ruleContext).trim().length > 0
+ || legacy_1.RPTUtil.nonTabableChildCheck(ruleContext);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1445:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.applet_alt_exists = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.applet_alt_exists = {
+ id: "applet_alt_exists",
+ context: "dom:applet",
+ refactor: {
+ "WCAG20_Applet_HasAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "applet_alt_exists.html",
+ "Pass_0": "applet_alt_exists.html",
+ "Fail_1": "applet_alt_exists.html",
+ "Fail_2": "applet_alt_exists.html",
+ "Fail_3": "applet_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": " elements must provide an 'alt' attribute and an alternative description",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "An element does not have an 'alt' attribute that provides a short text alternative",
+ "Fail_2": "The 'alt' attribute value for an element duplicates the 'code' attribute",
+ "Fail_3": "An element provides alternative text, but does not provide inner content"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "1.1.1",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // JCH - NO OUT OF SCOPE hidden in context
+ if (!legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt")) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ var alt = ruleContext.getAttribute("alt").trim();
+ if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ else if (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext)) {
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 876:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.application_content_accessible = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.application_content_accessible = {
+ id: "application_content_accessible",
+ context: "aria:application",
+ refactor: {
+ "HAAC_Application_Role_Text": {
+ 0: "HAAC_Application_Role_Text.html",
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ 0: "application_content_accessible.html",
+ "Pass_0": "application_content_accessible.html",
+ "Potential_1": "application_content_accessible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.1.1",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = true;
+ var children = ruleContext.childNodes;
+ for (var i = 0; passed && i < children.length; i++) {
+ if (children[i].nodeType === 1) {
+ if (VisUtil_1.VisUtil.isNodeVisible(children[i])) {
+ passed = legacy_1.RPTUtil.hasRoleInSemantics(children[i], "document") || legacy_1.RPTUtil.hasRoleInSemantics(children[i], "article");
+ }
+ }
+ else if (children[i].nodeType === 3) {
+ passed = children[i].nodeValue.trim().length === 0;
+ }
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2768:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.area_alt_exists = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.area_alt_exists = {
+ id: "area_alt_exists",
+ context: "dom:area",
+ refactor: {
+ "WCAG20_Area_HasAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "area_alt_exists.html",
+ "Pass_0": "area_alt_exists.html",
+ "Fail_1": "area_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": " elements in an image map must have a text alternative",
+ "Pass_0": "Rule Passed",
+ "Fail_1": " element in an image map has no text alternative"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "1.1.1",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // JCH - NO OUT OF SCOPE hidden in context
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt")) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7178:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_activedescendant_tabindex_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_activedescendant_tabindex_valid = {
+ id: "aria_activedescendant_tabindex_valid",
+ context: "dom:*[aria-activedescendant]",
+ refactor: {
+ "Rpt_Aria_InvalidTabindexForActivedescendant": {
+ "pass": "pass",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_activedescendant_tabindex_valid.html",
+ "Fail_1": "aria_activedescendant_tabindex_valid.html",
+ "group": "aria_activedescendant_tabindex_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",
+ "group": "Element using 'aria-activedescendant' property should be tabbable"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = false;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // Rule not supported on mobile
+ if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") {
+ return null;
+ }
+ // Handle the case where the element is hidden by disabled html5 attribute or aria-disabled:
+ // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed.
+ // 2. In the case that this element has a aria-disabled attribute then, we mark this rule as passed.
+ // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another.
+ if (legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ //check if the attribute 'aria-activedescendant' is valid for the role of the element
+ // If the tabindex attribute is provided then verify that it is 0 or -1
+ passed = legacy_1.RPTUtil.isTabbable(ruleContext);
+ // Build array for node token
+ var retToken1 = new Array();
+ retToken1.push(nodeName);
+ // Build array for id referenced by aria-activedescendant
+ var retToken2 = new Array();
+ retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", "));
+ //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9745:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_activedescendant_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_activedescendant_valid = {
+ id: "aria_activedescendant_valid",
+ context: "dom:*[aria-activedescendant]",
+ refactor: {
+ "HAAC_ActiveDescendantCheck": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3",
+ "Fail_4": "Fail_4"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_activedescendant_valid.html",
+ "Fail_1": "aria_activedescendant_valid.html",
+ "Fail_2": "aria_activedescendant_valid.html",
+ "Fail_3": "aria_activedescendant_valid.html",
+ "Fail_4": "aria_activedescendant_valid.html",
+ "group": "aria_activedescendant_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The 'aria-activedescendant' property is empty",
+ "Fail_2": "The 'aria-activedescendant' property references a hidden node",
+ "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant",
+ "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component",
+ "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // combobox active descendants handled by 'combobox_active_descendant'
+ if (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "combobox")) {
+ return null;
+ }
+ var descendant_id = legacy_1.RPTUtil.getAriaAttribute(ruleContext, "aria-activedescendant");
+ // POF1: The attribute is empty
+ if (!descendant_id || descendant_id.trim() === "") {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim());
+ if (!descendant) {
+ // The referenced element doesn't exist. We let 1077 to trigger the error
+ return null;
+ }
+ if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) {
+ // POF2: aria-activedescendant references a hidden node
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ // 1. The value of aria-activedescendant refers to an element that is either a descendant of
+ // the element with DOM focus
+ if (ruleContext.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ var pofId = 2;
+ // or is a logical descendant as indicated by the aria-owns attribute.
+ if (ruleContext.hasAttribute("aria-owns")) {
+ var owned_ids = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" ");
+ for (var i = 0; i < owned_ids.length; i++) {
+ var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]);
+ if (owned_ele.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+ // 2. The element with DOM focus is a textbox with aria-controls referring to an element that
+ // supports aria-activedescendant, and the value of aria-activedescendant specified for the
+ // textbox refers to either a descendant of the element controlled by the textbox or is a logical
+ // descendant of that controlled element as indicated by the aria-owns attribute.
+ //
+ if (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) {
+ pofId = 3;
+ var controlled_ids = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" ");
+ for (var i = 0; i < controlled_ids.length; i++) {
+ var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]);
+ if (controlled_ele.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ if (controlled_ele.hasAttribute("aria-owns")) {
+ var owns_ids = legacy_1.RPTUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" ");
+ for (var j = 0; j < owns_ids.length; j++) {
+ var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]);
+ if (owned_ele.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+ }
+ }
+ // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element
+ // that referenced it.
+ if (pofId == 3) {
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8019:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_application_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_application_label_unique = {
+ id: "aria_application_label_unique",
+ context: "aria:application",
+ refactor: {
+ "Rpt_Aria_MultipleApplicationLandmarks": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_application_label_unique.html",
+ "Fail_1": "aria_application_label_unique.html",
+ "group": "aria_application_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"application\" role do not have unique labels",
+ "group": "Each element with \"application\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "application", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_application_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_application_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6505:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_application_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_application_labelled = {
+ id: "aria_application_labelled",
+ context: "aria:application",
+ refactor: {
+ "Rpt_Aria_ApplicationLandmarkLabel": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_application_labelled.html",
+ "Fail_1": "aria_application_labelled.html",
+ "group": "aria_application_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"application\" role does not have a label",
+ "group": "An element with \"application\" role must have a label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext);
+ // return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8910:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_article_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_article_label_unique = {
+ id: "aria_article_label_unique",
+ context: "aria:article",
+ refactor: {
+ "Rpt_Aria_MultipleArticleRoles_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_article_label_unique.html",
+ "Fail_1": "aria_article_label_unique.html",
+ "group": "aria_article_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"article\" role do not have unique labels",
+ "group": "Each element with \"article\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "article", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_article_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_article_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1;
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3492:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_allowed = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_attribute_allowed = {
+ id: "aria_attribute_allowed",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_ValidProperty": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_allowed.html",
+ "Pass_0": "aria_attribute_allowed.html",
+ "Fail_1": "aria_attribute_allowed.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "ARIA attributes must be valid for the element's role",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "4.1.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "5f99a7",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var contextAttributes = ruleContext.attributes;
+ // This gets all elements with attributes so we still have some
+ // Out of Scope since not all attributes are aria
+ if (contextAttributes) {
+ var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes;
+ var failedProperties = "";
+ var testedProperties = 0;
+ for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) {
+ var attrName = contextAttributes[i].name;
+ if (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ testedProperties++;
+ // Now we just have aria attributes which can
+ // pass or fail based on whether there property is valid
+ var dataTypes = propertyDataTypes[attrName];
+ if (!dataTypes) { // if property is not in valid property list
+ // create failedProperties comma sep list
+ if (failedProperties.length == 0) {
+ failedProperties = attrName;
+ }
+ else {
+ failedProperties = failedProperties + ", " + attrName;
+ }
+ }
+ }
+ }
+ if (testedProperties == 0) {
+ return null;
+ }
+ else if (failedProperties.length != 0) {
+ return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]);
+ }
+ else {
+ //return RulePass(1);
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ else {
+ return null;
+ }
+ // JCH - passing is based on all attributes not just aria attributes
+ // leading to OVER COUNTING so moved pass up
+ //return RulePass(1);
+ }
+};
+
+
+/***/ }),
+
+/***/ 5316:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_conflict = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_attribute_conflict = {
+ id: "aria_attribute_conflict",
+ context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]"
+ + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]"
+ + ", dom:*[aria-rowspan]",
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_conflict.html",
+ "fail_conflict": "aria_attribute_conflict.html",
+ "group": "aria_attribute_conflict.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"",
+ "group": "An ARIA attribute must not conflict with the corresponding HTML attribute"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // dependency check: if the ARIA attribute is completely invalid, skip this check
+ var invalidAttributes = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (invalidAttributes && invalidAttributes.length > 0)
+ return null;
+ var ret = [];
+ var ariaAttributes = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ if (!ariaAttributes || ariaAttributes.length === 0)
+ return null;
+ var conflictAttributes = (0, CommonUtil_1.getConflictAriaAndHtmlAttributes)(ruleContext);
+ for (var i = 0; i < conflictAttributes.length; i++) {
+ ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']]));
+ if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr']))
+ legacy_1.RPTUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes);
+ }
+ for (var i = 0; i < ariaAttributes.length; i++)
+ ret.push((0, IRule_1.RulePass)("pass"));
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8412:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_deprecated = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+exports.aria_attribute_deprecated = {
+ id: "aria_attribute_deprecated",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_deprecated.html",
+ "fail_aria_role": "aria_attribute_deprecated.html",
+ "fail_aria_attr": "aria_attribute_deprecated.html",
+ "fail_role_attr": "aria_attribute_deprecated.html",
+ "group": "aria_attribute_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "The ARIA roles and attribute are used per specification",
+ "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification",
+ "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification",
+ "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification",
+ "group": "No deprecated ARIA role or attribute should be used"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var domAttributes = ruleContext.attributes;
+ var ariaAttrs = [];
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name;
+ if (attrName.substring(0, 5) === 'aria-')
+ ariaAttrs.push(attrName);
+ }
+ }
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ var ret = [];
+ if (roles && roles.length > 0) {
+ var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles;
+ var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties;
+ for (var i = 0; i < roles.length; i++) {
+ var passed = true;
+ if (globalDeprecatedRoles.includes(roles[i])) {
+ ret.push((0, IRule_1.RuleFail)('fail_aria_role', [roles[i]]));
+ passed = false;
+ }
+ var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]];
+ if (roleWithDeprecatedAttributes) {
+ var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps'];
+ if (deprecatedAttriNames && deprecatedAttriNames.length > 0) {
+ for (var i_1 = 0; i_1 < ariaAttrs.length; i_1++) {
+ if (globalDeprecatedAttributes.includes(ariaAttrs[i_1])) {
+ ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [ariaAttrs[i_1]]));
+ passed = false;
+ }
+ else if (deprecatedAttriNames.includes(ariaAttrs[i_1])) {
+ ret.push((0, IRule_1.RuleFail)('fail_role_attr', [ariaAttrs[i_1], roles[i_1]]));
+ passed = false;
+ }
+ }
+ }
+ }
+ if (passed)
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 172:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_attribute_exists = {
+ id: "aria_attribute_exists",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_EmptyPropertyValue": {
+ "pass": "pass",
+ "fail_empty_attribute": "fail_empty_attribute"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_exists.html",
+ "fail_empty_attribute": "aria_attribute_exists.html",
+ "group": "aria_attribute_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_empty_attribute": "The element attribute(s): '{0}' value is empty",
+ "group": "When specifying a required ARIA attribute, the value must not be empty"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["6a7281"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return;
+ var attrNameArr = new Array();
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var testedProperties = 0;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var j = 0; j < roles.length; ++j) {
+ if (designPatterns[roles[j]] && legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext) != null) {
+ var requiredRoleProps = legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext);
+ for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) {
+ var attribute = requiredRoleProps[i];
+ if (hasAttribute(ruleContext, attribute)) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i]));
+ if (nodeValue.length == 0)
+ attrNameArr.push(requiredRoleProps[i]);
+ }
+ else if (requiredRoleProps[i] == "aria-labelledby") {
+ if ((roles[i] == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-label"));
+ if (nodeValue.length == 0)
+ attrNameArr.push("aria-label");
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-valuenow") {
+ if ((roles[i] == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext"));
+ if (nodeValue.length == 0)
+ attrNameArr.push("aria-valuetext");
+ }
+ }
+ }
+ }
+ if (designPatterns[roles[j]]) {
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ var permittedRoles = [];
+ permittedRoles.push(roles[j]);
+ var allowedAttributes = legacy_1.RPTUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty);
+ for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) {
+ var attribute = allowedAttributes[i];
+ if (attribute == "aria-checked" || attribute == "aria-selected" ||
+ attribute == "aria-expanded" || attribute == "aria-orientation" ||
+ attribute == "aria-level") {
+ if (hasAttribute(ruleContext, attribute)) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute(attribute));
+ if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) {
+ attrNameArr.push(attribute);
+ }
+ }
+ }
+ }
+ }
+ }
+ var retMsg = new Array();
+ var passed = attrNameArr.length == 0;
+ retMsg.push(attrNameArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg);
+ if (testedProperties == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg);
+ }
+ else {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9844:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_redundant = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_attribute_redundant = {
+ id: "aria_attribute_redundant",
+ context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]"
+ + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]"
+ + ", dom:*[aria-rowspan]",
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_redundant.html",
+ "fail_redundant": "aria_attribute_redundant.html",
+ "group": "aria_attribute_redundant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"",
+ "group": "An ARIA attribute should not be used when there is a corresponding HTML attribute"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // dependency check: if the ARIA attribute is completely invalid, skip this check
+ var invalidAttributes = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (invalidAttributes && invalidAttributes.length > 0)
+ return null;
+ // if conflict already reported, ignore reporting overlap
+ var conflictAttributes = (0, CommonUtil_1.getConflictAriaAndHtmlAttributes)(ruleContext);
+ if (conflictAttributes && conflictAttributes.length > 0)
+ return null;
+ var domAttributes = ruleContext.attributes;
+ var ariaAttrs = [];
+ var htmlAttrs = [];
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var attrValue = ruleContext.getAttribute(attrName);
+ if (attrValue === '')
+ attrValue = null;
+ if (attrName.substring(0, 5) === 'aria-')
+ ariaAttrs.push({ name: attrName, value: attrValue });
+ else
+ htmlAttrs.push({ name: attrName, value: attrValue });
+ }
+ }
+ var ret = [];
+ var _loop_1 = function (i) {
+ var examinedHtmlAtrNames = legacy_1.RPTUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping');
+ if (examinedHtmlAtrNames === null)
+ return "continue";
+ examinedHtmlAtrNames.forEach(function (item) {
+ if (item['result'] === 'Pass') { //pass
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ else if (item['result'] === 'Failed') { //failed
+ ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']]));
+ }
+ });
+ };
+ for (var i = 0; i < ariaAttrs.length; i++) {
+ _loop_1(i);
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 9695:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_required = void 0;
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.aria_attribute_required = {
+ id: "aria_attribute_required",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_RequiredProperties": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_required.html",
+ "Pass_0": "aria_attribute_required.html",
+ "Fail_1": "aria_attribute_required.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "When using a ARIA role on an element, the required attributes for that role must be defined",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "An element with ARIA role '{0}' does not have the required ARIA attribute(s): '{1}'"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "4.1.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "4e8ab6",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var attrNameArr = new Array();
+ var roleNameArr = new Array();
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext);
+ var implicitRole = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var testedRoles = 0;
+ for (var j = 0, rolesLength = roles.length; j < rolesLength; ++j) {
+ if (implicitRole.length > 0 && implicitRole.includes(roles[j]))
+ continue;
+ if (designPatterns[roles[j]] && legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext) != null) {
+ var requiredRoleProps = legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext);
+ var roleMissingReqProp = false;
+ testedRoles++;
+ for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) {
+ if (!hasAttribute(ruleContext, requiredRoleProps[i])) {
+ // If an aria-labelledby isn't present, an aria-label will meet the requirement.
+ if (requiredRoleProps[i] == "aria-labelledby") {
+ if ((!hasAttribute(ruleContext, "aria-label")) || (roles[i] != "radiogroup")) {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-valuenow") {
+ if ((!hasAttribute(ruleContext, "aria-valuetext")) || (roles[i] != "progressbar")) {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-controls" && roles[j] == "combobox") {
+ // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input
+ }
+ else {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ }
+ if (roleMissingReqProp == true) {
+ roleNameArr.push(roles[j]);
+ }
+ }
+ }
+ var retToken = new Array();
+ var passed = attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE
+ retToken.push(roleNameArr.join(", "));
+ retToken.push(attrNameArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : retToken);
+ if (testedRoles === 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", retToken);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1699:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_value_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+exports.aria_attribute_value_valid = {
+ id: "aria_attribute_value_valid",
+ context: "dom:*",
+ dependencies: ["aria_attribute_allowed"],
+ refactor: {
+ "Rpt_Aria_ValidPropertyValue": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_value_valid.html",
+ "Pass_0": "aria_attribute_value_valid.html",
+ "Fail_1": "aria_attribute_value_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "ARIA property values must be valid",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "6a7281",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var valueArr = new Array();
+ var attrNameArr = new Array();
+ var dataTypeArr = new Array();
+ var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes;
+ var contextAttributes = ruleContext.attributes;
+ var testedPropertyValues = 0;
+ if (contextAttributes) {
+ for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) {
+ var attrName = contextAttributes[i].name;
+ if (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ var dataTypes = propertyDataTypes[attrName];
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(contextAttributes[i].nodeValue);
+ testedPropertyValues++;
+ if (dataTypes && dataTypes.values) {
+ if (dataTypes.values.indexOf(nodeValue) == -1) {
+ if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) {
+ //translate 'undefined' to mean ''
+ }
+ else {
+ // aria-relevant is represented as a space delimited list of the following values:
+ // additions, removals, text; or a single catch-all value all.
+ if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") {
+ var attrValues = contextAttributes[i].nodeValue.trim().split(" ");
+ // if the value all is specified, it cannot have any other value
+ if (attrValues.length > 1 && attrValues.includes("all")) {
+ valueArr.push(contextAttributes[i].nodeValue.split(" "));
+ attrNameArr.push(attrName);
+ dataTypeArr.push(dataTypes.values.toString());
+ }
+ else {
+ var hash = {};
+ for (var j = 0; j < attrValues.length; j++) {
+ // if the individual value is not in the list of allowed values
+ if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) {
+ if (!hash.hasOwnProperty(attrName)) {
+ hash[attrName] = true;
+ attrNameArr.push(attrName);
+ }
+ valueArr.push(attrValues[j]);
+ dataTypeArr.push(dataTypes.values.toString());
+ }
+ }
+ }
+ }
+ else {
+ valueArr.push(contextAttributes[i].nodeValue.split(" "));
+ attrNameArr.push(attrName);
+ dataTypeArr.push(dataTypes.values.toString());
+ }
+ }
+ }
+ }
+ else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") {
+ var iVal = parseInt(nodeValue);
+ if (isNaN(iVal) || ("" + iVal !== nodeValue)) {
+ valueArr.push(nodeValue);
+ attrNameArr.push(attrName);
+ }
+ }
+ else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") {
+ var fVal = parseFloat(nodeValue);
+ if (isNaN(fVal)) {
+ valueArr.push(nodeValue);
+ attrNameArr.push(attrName);
+ }
+ }
+ else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) {
+ var tmpV = nodeValue.trim().toLowerCase();
+ if (tmpV !== "true" && tmpV !== "false") {
+ valueArr.push(nodeValue);
+ attrNameArr.push(attrName);
+ }
+ }
+ else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) {
+ }
+ else {
+ testedPropertyValues--;
+ }
+ }
+ }
+ }
+ var retMsg = new Array();
+ var passed = attrNameArr.length == 0;
+ retMsg.push(valueArr.join(", "));
+ retMsg.push(attrNameArr.join(", "));
+ retMsg.push(ruleContext.nodeName.toLowerCase());
+ // retMsg.push (dataTypeArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg);
+ if (testedPropertyValues == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", retMsg);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4974:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_banner_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_banner_label_unique = {
+ id: "aria_banner_label_unique",
+ context: "aria:banner",
+ refactor: {
+ "Rpt_Aria_MultipleBannerLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_banner_label_unique.html",
+ "Fail_1": "aria_banner_label_unique.html",
+ "group": "aria_banner_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"banner\" role do not have unique labels",
+ "group": "Each element with \"banner\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "banner", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_banner_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_banner_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3054:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_banner_single = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_banner_single = {
+ id: "aria_banner_single",
+ context: "dom:*[role], dom:header",
+ refactor: {
+ "Rpt_Aria_OneBannerInSiblingSet_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_banner_single.html",
+ "Fail_1": "aria_banner_single.html",
+ "group": "aria_banner_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "There is more than one element with \"banner\" role on the page",
+ "group": "There must be only one element with \"banner\" role on the page"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "banner")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null;
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4649:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_child_tabbable = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_child_tabbable = {
+ id: "aria_child_tabbable",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_MissingFocusableChild": {
+ "pass": "pass",
+ "fail_missing_child": "fail_missing_child"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_child_tabbable.html",
+ "fail_missing_child": "aria_child_tabbable.html",
+ "group": "aria_child_tabbable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable",
+ "group": "UI component must have at least one tabbable descendant for keyboard access"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element requires presentational children only
+ if (legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) || legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ // An ARIA list is not interactive
+ if (legacy_1.RPTUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) {
+ return null;
+ }
+ // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled.
+ if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") {
+ return null;
+ }
+ // Determine if this is referenced by a combobox. If so, focus is controlled by the combobox
+ var id = ruleContext.getAttribute("id");
+ if (id && id.trim().length > 0) {
+ if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) {
+ return null;
+ }
+ }
+ var passed = true;
+ var doc = ruleContext.ownerDocument;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var roleNameArr = new Array();
+ var nodeName = "";
+ var inScope = false;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var j = 0; j < roles.length; ++j) {
+ if (ARIADefinitions_1.ARIADefinitions.containers.includes(roles[j])) {
+ var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : '';
+ if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren;
+ if (reqChildren) {
+ inScope = true;
+ passed = false;
+ var xp = "descendant::*[";
+ for (var i = 0; i < reqChildren.length; i++) {
+ xp += "@role='" + reqChildren[i] + "' or ";
+ }
+ xp = xp.substring(0, xp.length - 4) + ']';
+ var xpathResult = doc.evaluate(xp, ruleContext, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r = xpathResult.iterateNext();
+ while (r && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r)) {
+ r = xpathResult.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r);
+ // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex.
+ if (!passed) {
+ var xp2 = "descendant::*";
+ var xpathResult2 = doc.evaluate(xp2, r, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r2 = xpathResult2.iterateNext();
+ while (r2 && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r);
+ r2 = xpathResult2.iterateNext();
+ }
+ }
+ if (!passed) {
+ roleNameArr = r.getAttribute("role").trim().split(" ");
+ nodeName = r.nodeName.toLowerCase();
+ }
+ r = xpathResult.iterateNext();
+ }
+ }
+ }
+ }
+ }
+ // Variable Decleration
+ var retToken1 = new Array();
+ var retToken2 = new Array();
+ // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this
+ // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of
+ // updating the whole rule to switch from using passed in that way simply do the check at this point.
+ if (nodeName.length > 0 && roleNameArr.length > 0) {
+ retToken1.push(nodeName);
+ retToken2.push(roleNameArr.join(", "));
+ }
+ else {
+ passed = true;
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]);
+ if (!inScope) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4193:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_child_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_child_valid = {
+ id: "aria_child_valid",
+ //context: "dom:*[role]",
+ //dependencies: ["Rpt_Aria_ValidRole"],
+ context: "dom:*",
+ dependencies: ["aria_role_valid", "aria_descendant_valid"],
+ help: {
+ "en-US": {
+ "group": "aria_child_valid.html",
+ "Pass": "aria_child_valid.html",
+ "Fail_no_child": "aria_child_valid.html",
+ "Fail_invalid_child": "aria_child_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with a ARIA role must own a required child",
+ "Pass": "An element with a ARIA role owns a required child",
+ "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"",
+ "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Verify mapping
+ act: ["bc4a75"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element requires presentational children only
+ if (legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext))
+ return;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return null;
+ // ignore if the element contains none or presentation role
+ var presentationRoles = ["none", "presentation"];
+ var found = roles.some(function (r) { return presentationRoles.includes(r); });
+ if (found)
+ return null;
+ // For combobox, we have g1193 ... g1199 to check the values etc.
+ // We don't want to trigger 1152 again. So, we bypass it here.
+ if (roles.includes("combobox"))
+ return null;
+ var requiredChildRoles = legacy_1.RPTUtil.getRequiredChildRoles(ruleContext, true);
+ // a 'group' role is allowed but not required for some elements so remove it if exists
+ if (requiredChildRoles.includes('group')) {
+ var index = requiredChildRoles.indexOf('group');
+ if (index > -1)
+ requiredChildRoles.splice(index, 1);
+ }
+ /**
+ * ignore if a role doesn't require a child with any specific role
+ * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule
+ */
+ if (requiredChildRoles.length == 0)
+ return null;
+ // get all the children from accessibility tree,
+ // including ones with aria-owns
+ var directATChildren = legacy_1.RPTUtil.getDirectATChildren(ruleContext);
+ if (!directATChildren || directATChildren.length == 0) {
+ // the element with at least one required role dosen't contain any accessible child
+ /**
+ * When a widget is missing required owned elements due to script execution or loading,
+ * authors MUST mark a containing element with 'aria-busy' equal to true.
+ */
+ var busy = ruleContext.getAttribute("aria-busy");
+ if (!busy || busy !== 'true') {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(requiredChildRoles.join(", "));
+ return (0, IRule_1.RuleFail)("Fail_no_child", retToken);
+ }
+ // it's 'busy' loading, ignore it
+ return null;
+ }
+ var violateElemRoles = new Array();
+ for (var j = 0; j < directATChildren.length; j++) {
+ var childRoles = legacy_1.RPTUtil.getRoles(directATChildren[j], false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!childRoles || childRoles.length == 0)
+ childRoles = legacy_1.RPTUtil.getImplicitRole(directATChildren[j]);
+ if (childRoles && childRoles.length > 0) {
+ /**
+ * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected.
+ * the specification does not require an instance of each of the listed owned roles.
+ * therefore, the requirement is met if it has any one of the required roles.
+ */
+ var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); });
+ if (!found_1)
+ violateElemRoles.push(childRoles.join(", "));
+ }
+ else {
+ // ignore the element since it's not semantic, shouldn't happen
+ }
+ }
+ if (violateElemRoles.length > 0) {
+ var retValues = [];
+ for (var i = 0; i < violateElemRoles.length; i++) {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(violateElemRoles[i]);
+ retToken.push(requiredChildRoles.join(", "));
+ retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken));
+ }
+ return retValues;
+ }
+ return (0, IRule_1.RulePass)("Pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3188:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_complementary_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_complementary_label_unique = {
+ id: "aria_complementary_label_unique",
+ context: "aria:complementary",
+ refactor: {
+ "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_label_unique.html",
+ "Fail_1": "aria_complementary_label_unique.html",
+ "group": "aria_complementary_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"complementary\" role do not have unique labels",
+ "group": "Each element with \"complementary\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "complementary", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_complementary_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_complementary_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4176:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_complementary_label_visible = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_complementary_label_visible = {
+ id: "aria_complementary_label_visible",
+ context: "dom:*[role], dom:aside",
+ dependencies: ["aria_complementary_labelled"],
+ refactor: {
+ "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_label_visible.html",
+ "Fail_1": "aria_complementary_label_visible.html",
+ "group": "aria_complementary_label_visible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with \"complementary\" role does not have a visible label",
+ "group": "Each element with \"complementary\" role should have a visible label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "complementary")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-labelledby");
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7964:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_complementary_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_complementary_labelled = {
+ id: "aria_complementary_labelled",
+ context: "dom:*[role], dom:aside",
+ refactor: {
+ "Rpt_Aria_ComplementaryRequiredLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_labelled.html",
+ "Fail_1": "aria_complementary_labelled.html",
+ "group": "aria_complementary_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with \"complementary\" role does not have a label",
+ "group": "An element with \"complementary\" role must have a label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "complementary")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext);
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2554:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_content_in_landmark = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_content_in_landmark = {
+ id: "aria_content_in_landmark",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_OrphanedContent_Native_Host_Sematics": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_content_in_landmark.html",
+ "Fail_1": "aria_content_in_landmark.html",
+ "group": "aria_content_in_landmark.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Content is not within a landmark element",
+ "group": "All content must reside within an element with a landmark role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var params = (0, CacheUtil_1.getCache)(context.dom.node.ownerDocument, "aria_content_in_landmark", null);
+ if (!params) {
+ params = {
+ landmarks: {
+ value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"],
+ type: "array"
+ },
+ possibleOrphanedWidgets: {
+ value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list",
+ "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree",
+ "treegrid"
+ ],
+ type: "array"
+ },
+ possibleOrphanedElements: {
+ value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5",
+ "h6", "embed", "object", "area"
+ ],
+ type: "array"
+ },
+ noLandmarkedRoles: {
+ // These roles don't require landmarks
+ value: ["alert", "alertdialog", "dialog", "tooltip"],
+ type: "array"
+ },
+ mapLandmarks: {},
+ mapPossibleOrphanedWidgets: {},
+ mapPossibleOrphanedElements: {},
+ mapNoLandmarkedRoles: {}
+ };
+ // Convert arrays to maps
+ params.mapLandmarks = {};
+ for (var i = 0; i < params.landmarks.value.length; ++i) {
+ params.mapLandmarks[params.landmarks.value[i]] = true;
+ }
+ params.mapPossibleOrphanedWidgets = {};
+ for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) {
+ params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true;
+ }
+ params.mapPossibleOrphanedElements = {};
+ for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) {
+ params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true;
+ }
+ params.mapNoLandmarkedRoles = {};
+ for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) {
+ params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true;
+ }
+ (0, CacheUtil_1.setCache)(context.dom.node.ownerDocument, "aria_content_in_landmark", params);
+ }
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes
+ (VisUtil_1.VisUtil.hiddenByDefaultElements != null &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements != undefined &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"];
+ if (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content
+ elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ // Short circuit for layout tables
+ if (nodeName == "table" && legacy_1.RPTUtil.isLayoutTable(ruleContext)) {
+ return null;
+ }
+ // Check if it is a possible orphan
+ var passed = true;
+ var isPossibleOrphanedWidget = legacy_1.RPTUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true);
+ //exclude in the and (#608)
+ //having link in the head could cause lot of violaions
+ if (nodeName === 'link') {
+ isPossibleOrphanedWidget = false;
+ }
+ var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements;
+ if (isPossibleOrphanedWidget || isPossibleOrphanedElement) {
+ // See if ancestor has landmark roles or implicit land mark roles
+ var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; });
+ passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0;
+ if (!passed) {
+ // Don't fail elements when a parent or sibling has failed - causes too many messages.
+ var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext);
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement);
+ }
+ walkElement = ruleContext.nextElementSibling;
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = walkElement.nextElementSibling;
+ }
+ walkElement = ruleContext.previousElementSibling;
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = walkElement.previousElementSibling;
+ }
+ if (!passed) {
+ (0, CacheUtil_1.setCache)(ruleContext, "Rpt_Aria_OrphanedContent", true);
+ // Don't trigger rule if element is a stand-alone widget
+ passed = (0, CacheUtil_1.getCache)(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) ||
+ legacy_1.RPTUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) ||
+ legacy_1.RPTUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true);
+ if (passed) {
+ (0, CacheUtil_1.setCache)(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true);
+ return null;
+ }
+ }
+ else {
+ return null;
+ }
+ }
+ }
+ else {
+ return null;
+ }
+ //return new ValidationResult(passed, [ruleContext], '', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1229:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_contentinfo_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_contentinfo_label_unique = {
+ id: "aria_contentinfo_label_unique",
+ context: "aria:contentinfo",
+ refactor: {
+ "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_label_unique.html",
+ "Fail_1": "aria_contentinfo_label_unique.html",
+ "group": "aria_contentinfo_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"contentinfo\" role do not have unique labels",
+ "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "contentinfo", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_contentinfo_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_contentinfo_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8523:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_contentinfo_misuse = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_contentinfo_misuse = {
+ id: "aria_contentinfo_misuse",
+ context: "dom:*[role], dom:footer, dom:address",
+ refactor: {
+ "Rpt_Aria_ContentinfoWithNoMain_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_misuse.html",
+ "Fail_1": "aria_contentinfo_misuse.html",
+ "group": "aria_contentinfo_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with \"contentinfo\" role is present without an element with \"main\" role",
+ "group": "An element with \"contentinfo\" role is only permitted with an element with \"main\" role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //consider implicit role
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "contentinfo")) {
+ return null;
+ }
+ // Consider the Check Hidden Content setting that is set by the rules
+ var passed = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0;
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3781:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_contentinfo_single = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_contentinfo_single = {
+ id: "aria_contentinfo_single",
+ context: "dom:*[role], dom:footer, dom:address",
+ refactor: {
+ "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_single.html",
+ "Fail_1": "aria_contentinfo_single.html",
+ "group": "aria_contentinfo_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"contentinfo\" role found on a page",
+ "group": "A page, document or application should only have one element with \"contentinfo\" role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //find out if element has siblings as has implicit contentinfo role
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "contentinfo")) {
+ return null;
+ }
+ var passed = !legacy_1.RPTUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true);
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8509:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_descendant_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_descendant_valid = {
+ id: "aria_descendant_valid",
+ context: "dom:*",
+ dependencies: ["aria_role_valid"],
+ help: {
+ "en-US": {
+ "group": "aria_descendant_valid.html",
+ "pass": "aria_descendant_valid.html",
+ "potential_child_implicit_role": "aria_descendant_valid.html",
+ "fail_child_explicit_role": "aria_descendant_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",
+ "pass": "The element contains valid descendants",
+ "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers",
+ "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Verify mapping
+ act: ["307n5z"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element doesn't require presentational children only
+ if (!legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext))
+ return;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return null;
+ var tagName = ruleContext.tagName.toLowerCase();
+ // get all the children from accessibility tree,
+ // including ones with aria-owns
+ var directATChildren = legacy_1.RPTUtil.getDirectATChildren(ruleContext);
+ if (directATChildren && directATChildren.length > 0) {
+ // the element with at least one non-presentational children
+ var explicitRoles = new Array();
+ var implicitRoles = new Array();
+ for (var j = 0; j < directATChildren.length; j++) {
+ // ignore and
+ var tag = directATChildren[j].nodeName.toLowerCase();
+ if (tag === 'img' || tag === 'svg')
+ continue;
+ // get explicit role if exists
+ var childRoles = legacy_1.RPTUtil.getRoles(directATChildren[j], false);
+ if (childRoles && childRoles.length > 0) {
+ explicitRoles.push(childRoles.join(", "));
+ }
+ else {
+ // get implicit role if exists
+ childRoles = legacy_1.RPTUtil.getImplicitRole(directATChildren[j]);
+ if (childRoles && childRoles.length > 0)
+ implicitRoles.push(childRoles.join(", "));
+ }
+ }
+ if (explicitRoles.length > 0) {
+ var retValues = [];
+ for (var i = 0; i < explicitRoles.length; i++) {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(explicitRoles[i]);
+ retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken));
+ }
+ return retValues;
+ }
+ if (implicitRoles.length > 0) {
+ var retValues = [];
+ for (var i = 0; i < implicitRoles.length; i++) {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(implicitRoles[i]);
+ retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken));
+ }
+ return retValues;
+ }
+ }
+ else
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3234:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_document_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_document_label_unique = {
+ id: "aria_document_label_unique",
+ context: "aria:document",
+ refactor: {
+ "Rpt_Aria_MultipleDocumentRoles": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_document_label_unique.html",
+ "Fail_1": "aria_document_label_unique.html",
+ "group": "aria_document_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with a \"document\" role do not have unique labels",
+ "group": "All elements with a \"document\" role must have unique labels"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "document", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_document_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_document_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1;
+ // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5217:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_eventhandler_role_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_eventhandler_role_valid = {
+ id: "aria_eventhandler_role_valid",
+ context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",
+ refactor: {
+ "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_eventhandler_role_valid.html",
+ "Fail_1": "aria_eventhandler_role_valid.html",
+ "group": "aria_eventhandler_role_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified",
+ "group": "Elements with event handlers must have a valid ARIA role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Don't trigger this for SVG element for now until a determination is made (by Rich)
+ // to support SVG at a point when the SVG a11y spec is ready.
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, "svg")) {
+ return null;
+ }
+ //this rule is passed if a element has attribut role
+ //also, passed of element has any implicit roles.
+ if (legacy_1.RPTUtil.hasAnyRole(ruleContext, true)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ //pass if this element is received focus by default
+ if (legacy_1.RPTUtil.isfocusableByDefault(ruleContext)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ //validate if this element has any of the given event handler's
+ var retToken1 = new Array();
+ retToken1.push(ruleContext.nodeName.toLowerCase());
+ var eventArr = new Array();
+ // From WCAG20_Script_UseW3CDomFunctions
+ //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown",
+ // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout",
+ // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll",
+ // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"];
+ var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown",
+ "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout",
+ "onmouseover", "onresize"
+ ];
+ for (var i = 0; i < events.length; ++i) {
+ if (ruleContext.hasAttribute(events[i]))
+ eventArr.push(events[i]);
+ }
+ var retToken2 = new Array();
+ retToken2.push(eventArr.join(", "));
+ //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]);
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4050:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_form_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_form_label_unique = {
+ id: "aria_form_label_unique",
+ context: "aria:form",
+ refactor: {
+ "Rpt_Aria_MultipleFormLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_form_label_unique.html",
+ "Fail_1": "aria_form_label_unique.html",
+ "group": "aria_form_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"form\" role do not have unique labels",
+ "group": "Each element with \"form\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ // form element should only be considered if it has an aria label or title
+ if (ruleContext.getAttribute("role") === "form" ||
+ ruleContext.hasAttribute("aria-label") ||
+ ruleContext.hasAttribute("aria-labelledby") ||
+ ruleContext.hasAttribute("title")) {
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "form", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_form_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_form_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" &&
+ (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4275:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_graphic_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_graphic_labelled = {
+ id: "aria_graphic_labelled",
+ context: "aria:graphics-document,aria:graphics-symbol",
+ refactor: {
+ "HAAC_Aria_SvgAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_graphic_labelled.html",
+ "Pass_0": "aria_graphic_labelled.html",
+ "Fail_1": "aria_graphic_labelled.html",
+ "Fail_2": "aria_graphic_labelled.html",
+ "Fail_3": "aria_graphic_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with a graphics role must have a non-empty label",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"{0}\" graphics role has no label",
+ "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label",
+ "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [{
+ "7d6734": {
+ "Pass_0": "pass",
+ "Fail_1": "inapplicable",
+ "Fail_2": "fail",
+ "Fail_3": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-"))
+ return null;
+ /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation
+ if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){
+ return RulePass(1);
+ }*/
+ /* JCH - Points of failure
+ * 0. Missing alt attr with value
+ * 1. Missing aria-label or aria-labelledby
+ * 2. Missing title attr with value
+ */
+ // Skip an image with a structural role - img must be in the role list at least
+ if (ruleContext.getAttribute("aria-hidden") === "true")
+ return null;
+ // If role === img, you must use an aria label
+ //check attributes aria-label and aria-labelledby for other tags (e.g. ,
, etc)
+ var passed = legacy_1.RPTUtil.getAriaLabel(ruleContext).length > 0;
+ if (!passed && ruleContext.nodeName.toLowerCase() === "svg") {
+ var svgTitle = ruleContext.querySelector("title");
+ passed = svgTitle && legacy_1.RPTUtil.hasInnerContent(svgTitle);
+ }
+ if (!passed) {
+ //check title attribute
+ passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ // We should guide people to use alt or label - this is just a secondary approach to silence the rule.
+ // So, we should keep the POF from above.
+ // if (!passed) POF = "Fail_3";
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1465:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_hidden_nontabbable = void 0;
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.aria_hidden_nontabbable = {
+ id: "aria_hidden_nontabbable",
+ context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",
+ refactor: {
+ "aria_hidden_focus_misuse": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_hidden_nontabbable.html",
+ "Pass_0": "aria_hidden_nontabbable.html",
+ "Fail_1": "aria_hidden_nontabbable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "A focusable element should not be within the subtree of an element with 'aria-hidden' set to \"true\"",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: ["1.3.1", "4.1.2"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ // TODO: ACT: Handle testcase with focus jumping away
+ act: "6cfa84",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ return (0, IRule_1.RuleFail)("Fail_1", [nodeName]);
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+};
+
+
+/***/ }),
+
+/***/ 405:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_id_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_id_unique = {
+ id: "aria_id_unique",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_ValidIdRef": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_id_unique.html",
+ "Fail_1": "aria_id_unique.html",
+ "group": "aria_id_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",
+ "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be
+ // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset
+ // aligns with ACT.
+ act: ["59796f", "6a7281"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var pass = true;
+ var attrNameArr = new Array();
+ var nonExistantIDs = new Array();
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var contextAttributes = ruleContext.attributes;
+ var idTokens = new Array();
+ var testedReferences = 0;
+ if (contextAttributes) {
+ for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) {
+ pass = true;
+ var attrName = contextAttributes[i].name;
+ if (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName];
+ if (dataTypes && dataTypes.type) {
+ var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false;
+ //If the data type supports one or more id refs do error checking
+ if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) {
+ testedReferences++;
+ var nodeValueLength = legacy_1.RPTUtil.normalizeSpacing(contextAttributes[i].nodeValue).length;
+ var idArray = contextAttributes[i].nodeValue.split(" ");
+ // Check for an empty ID Ref
+ if (nodeValueLength < 1) {
+ pass = false;
+ idTokens.push("\"" + contextAttributes[i].nodeValue + "\"");
+ }
+ // check to see if too many IDRefs
+ else if (supportsOneIDRef) {
+ //If has too many IDRefs it is an error
+ if (nodeValueLength >= 1) {
+ if (idArray.length > 1) {
+ pass = false;
+ // Need to capture all the IDRefs for idTokens
+ for (var z = 0, length_1 = idArray.length; z < length_1; ++z) {
+ if (idArray[z] != "") {
+ idTokens.push(idArray[z]);
+ }
+ }
+ }
+ }
+ }
+ // check to see if id refs are invalid
+ if (pass && nodeValueLength >= 1) {
+ for (var j = 0, length_2 = idArray.length; j < length_2; ++j) {
+ if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other
+ // Get the element by Id
+ var elementById = ownerDocument.getElementById(idArray[j]);
+ // Pass if the element exists
+ pass = elementById != null;
+ // If the element exists and this is an aria attribute that doesn't support hidden ID reference
+ // then perform a isNodeVisible check, in the case the node is not visible then we return
+ // false and true otherwise.
+ if (pass && !dataTypes.hiddenIDRefSupported) {
+ pass = VisUtil_1.VisUtil.isNodeVisible(elementById);
+ }
+ if (!pass) {
+ if (idArray[j] != "") {
+ idTokens.push(idArray[j]);
+ }
+ }
+ // Only one of the id references need to be valid to mark the rule as passed.
+ // Therefore if we find a single visible element then stop checking and mark as
+ // passed.
+ else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (!pass)
+ attrNameArr.push(attrName);
+ }
+ }
+ }
+ var passed = attrNameArr.length == 0;
+ var retToken1 = new Array();
+ var retToken2 = new Array();
+ var retToken3 = new Array();
+ if (!passed) {
+ retToken2.push(attrNameArr.join(", "));
+ retToken3.push(ruleContext.nodeName.toLowerCase());
+ if (idTokens.length > 0) {
+ retToken1.push(idTokens.join(", "));
+ }
+ }
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]);
+ if (testedReferences == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9136:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_img_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_img_labelled = {
+ id: "aria_img_labelled",
+ context: "aria:img",
+ refactor: {
+ "HAAC_Aria_ImgAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_img_labelled.html",
+ "Pass_0": "aria_img_labelled.html",
+ "Fail_1": "aria_img_labelled.html",
+ "Fail_2": "aria_img_labelled.html",
+ "Fail_3": "aria_img_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with \"img\" role must have a non-empty label",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"img\" role has no label",
+ "Fail_2": "Element with \"img\" role has no label or an empty label",
+ "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["23a2a8", {
+ "7d6734": {
+ "Pass_0": "pass",
+ "Fail_1": "inapplicable",
+ "Fail_2": "fail",
+ "Fail_3": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ if (!ruleContext.hasAttribute("role")) {
+ // If no role, this is implicit, and covered by WCAG20_Img_HasAlt
+ return null;
+ }
+ /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation
+ if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){
+ return RulePass(1);
+ }*/
+ /* JCH - Points of failure
+ * 0. Missing alt attr with value
+ * 1. Missing aria-label or aria-labelledby
+ * 2. Missing title attr with value
+ */
+ // Skip an image with a structural role - img must be in the role list at least
+ if (ruleContext.getAttribute("aria-hidden") === "true")
+ return null;
+ // If role === img, you must use an aria label
+ //check attributes aria-label and aria-labelledby for other tags (e.g. ,
, etc)
+ var passed = legacy_1.RPTUtil.getAriaLabel(ruleContext).length > 0;
+ if (!passed && ruleContext.nodeName.toLowerCase() === "svg") {
+ var svgTitle = ruleContext.querySelector("title");
+ passed = svgTitle && legacy_1.RPTUtil.hasInnerContent(svgTitle);
+ }
+ if (!passed) {
+ //check title attribute
+ passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ // We should guide people to use alt or label - this is just a secondary approach to silence the rule.
+ // So, we should keep the POF from above.
+ // if (!passed) POF = "Fail_3";
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5117:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_keyboard_handler_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+exports.aria_keyboard_handler_exists = {
+ id: "aria_keyboard_handler_exists",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_MissingKeyboardHandler": {
+ "pass": "pass",
+ "potential_no_keyboard_access": "potential_no_keyboard_access"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_keyboard_handler_exists.html",
+ "potential_no_keyboard_access": "aria_keyboard_handler_exists.html",
+ "group": "aria_keyboard_handler_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access",
+ "group": "Interactive WAI_ARIA UI components must provide keyboard access"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = true;
+ var savedPassed = passed;
+ var doc = ruleContext.ownerDocument;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first,
+ // and the current rule should be ignored
+ if (nodeName === 'datalist' && roles && roles.includes("listbox"))
+ return null;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ // Composite user interface widget roles. They act as containers that manage other, contained widgets.
+ var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"];
+ var roleNameArr = new Array();
+ for (var j = 0; j < roles.length; ++j) {
+ var pattern = designPatterns[roles[j]];
+ if (roleContainers.indexOf(roles[j]) >= 0) {
+ var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : '';
+ if (!disabled) {
+ // See if there is a keyboard event handler on the parent element.
+ passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress"));
+ // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements.
+ if (!passed) {
+ if (!hasAttribute(ruleContext, 'aria-activedescendant')) {
+ var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren;
+ if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */
+ for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) {
+ var xp = "*[contains(@role,'" + reqChildren[i] + "')]";
+ var xpathResult = doc.evaluate(xp, ruleContext, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r = xpathResult.iterateNext();
+ while (r) {
+ passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress"));
+ if (!passed) {
+ // Child did not have a key handler. See if any of the grandchildren do.
+ var xp2 = "descendant::*";
+ var xpathResult2 = doc.evaluate(xp2, r, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r2 = xpathResult2.iterateNext();
+ while (r2 && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r2) &&
+ (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress"));
+ if (!passed) {
+ // Is this an action link?
+ if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) {
+ var href = r2.getAttribute("href");
+ // Action link must start with "javascript:", must not contain a "void" and
+ // must have a function name following "javascript:" (i.e., href.length > 11)
+ passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11);
+ }
+ }
+ r2 = xpathResult2.iterateNext();
+ }
+ }
+ if (!passed) {
+ // All the required children (or any descendants of the required children) must have keypress/keydown
+ // If not, it is a failure, no need to keep checking any more.
+ break;
+ }
+ r = xpathResult.iterateNext();
+ }
+ }
+ }
+ else {
+ // The current element failed the keydown/keypress, and it does not have required children, such as menubar.
+ // Let's check its descendants.
+ var xp2 = "descendant::*";
+ var xpathResult2 = doc.evaluate(xp2, ruleContext, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r2 = xpathResult2.iterateNext();
+ while (r2 && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r2) &&
+ (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress"));
+ if (!passed) {
+ // Is this an action link?
+ if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) {
+ var href = r2.getAttribute("href");
+ // Action link must start with "javascript:", must not contain a "void" and
+ // must have a function name following "javascript:" (i.e., href.length > 11)
+ passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11);
+ }
+ }
+ r2 = xpathResult2.iterateNext();
+ }
+ }
+ }
+ else {
+ // Attribute 'aria-activedescendant' is specified.
+ passed = true;
+ }
+ }
+ }
+ }
+ if (!passed) {
+ roleNameArr.push(roles[j]);
+ }
+ if (!passed && savedPassed) {
+ savedPassed = passed;
+ }
+ }
+ var retToken1 = new Array();
+ retToken1.push(ruleContext.nodeName.toLowerCase());
+ var retToken2 = new Array();
+ retToken2.push(roleNameArr.join(", "));
+ // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check
+ var id = ruleContext.getAttribute("id");
+ if (id && id.trim().length > 0) {
+ if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) {
+ return null;
+ }
+ }
+ return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 9062:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_landmark_name_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIAMapper_1 = __webpack_require__(4944);
+var DOMUtil_1 = __webpack_require__(295);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_landmark_name_unique = {
+ id: "aria_landmark_name_unique",
+ context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",
+ refactor: {
+ "landmark_name_unique": {
+ "Pass_0": "Pass_0",
+ "Fail_0": "Fail_0"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_landmark_name_unique.html",
+ "Fail_0": "aria_landmark_name_unique.html",
+ "group": "aria_landmark_name_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Multiple \"{0}\" landmarks with the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",
+ "Fail_0": "Multiple \"{0}\" landmarks with the same parent region are not distinguished from one another because they have the same \"{1}\" label",
+ "group": "Multiple landmarks should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent regions"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ var ruleContext = context["dom"].node;
+ // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it.
+ var copyOfRuleContext = ruleContext;
+ var parnetNodesOfRuleContext = [];
+ while (copyOfRuleContext) {
+ parnetNodesOfRuleContext.unshift(copyOfRuleContext);
+ copyOfRuleContext = copyOfRuleContext.parentElement;
+ }
+ parnetNodesOfRuleContext.forEach(function (elem) {
+ if (elem !== null) {
+ if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") {
+ return null; // Skipping checking landmarks that happen to be inside dialog elements
+ }
+ }
+ });
+ // Begining formCache work
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var formCache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_landmark_name_unique", null);
+ if (!formCache) {
+ // console.log("---------ENTERING FORM CACHE")
+ formCache = {
+ navigationNodes: [],
+ navigationNodesComputedLabels: [],
+ navigationNodesParents: [],
+ navigationNodesMatchFound: []
+ };
+ var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]');
+ var navigationNodes = Array.from(navigationNodesTemp);
+ var navigationNodesParents = [];
+ var navigationNodesMatchFound = [];
+ // This block of code filters out any nav elements that are under an dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page.
+ var navigationNodesWithoutDialogs = [];
+ for (var i = 0; i < navigationNodes.length; i++) {
+ var a = navigationNodes[i];
+ var dialogNodeFoundFlag = false;
+ while (a) {
+ a = a.parentElement;
+ if (a !== null) {
+ if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") {
+ dialogNodeFoundFlag = true;
+ }
+ }
+ }
+ if (!dialogNodeFoundFlag) {
+ navigationNodesWithoutDialogs.push(navigationNodes[i]);
+ }
+ }
+ navigationNodes = navigationNodesWithoutDialogs;
+ for (var i = 0; i < navigationNodes.length; i++) {
+ // Loop over all the landmark nodes
+ var els = [];
+ var a = navigationNodes[i].parentElement;
+ while (a) {
+ els.push(a);
+ a = a.parentElement;
+ }
+ for (var j = 0; j < els.length; j++) {
+ // Loop over all the parents of the landmark nodes
+ // Find nearest landmark parent based on the tagName or the role attribute
+ var tagNameTrigger = [
+ "ASIDE",
+ "FOOTER",
+ "FORM",
+ "HEADER",
+ "MAIN",
+ "NAV",
+ "SECTION",
+ ].includes(els[j].tagName);
+ var roleNameTrigger = false;
+ if (els[j].hasAttribute("role")) {
+ roleNameTrigger = [
+ "complementary",
+ "contentinfo",
+ "form",
+ "banner",
+ "main",
+ "navigation",
+ "region",
+ "search",
+ ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. E.g. role = "form banner". This is a improvment we might want to add in the future.
+ }
+ if (tagNameTrigger || roleNameTrigger) {
+ // Nearest parent-landmark found
+ navigationNodesParents.push(els[j]);
+ break;
+ }
+ if (j === els.length - 1) {
+ // This node is at the head of the file so it does not have a parent
+ navigationNodesParents.push(null);
+ break;
+ }
+ }
+ }
+ var navigationNodesComputedLabels = [];
+ for (var i = 0; i < navigationNodes.length; i++) {
+ // Loop over all the landmark nodes
+ navigationNodesComputedLabels.push(ARIAMapper_1.ARIAMapper.computeName(navigationNodes[i]));
+ }
+ for (var i = 0; i < navigationNodesParents.length; i++) {
+ // Loop over all the parents of the landmark nodes to find duplicates
+ var matchFound = false;
+ var pass_0_flag = false;
+ for (var j = 0; j < navigationNodesParents.length; j++) {
+ if (j === i) {
+ // We do not want to compare against ourselfs
+ continue;
+ }
+ // This if statement focus on the case where the parent landmark is null
+ if (navigationNodesParents[i] === null &&
+ navigationNodesParents[j] === null) {
+ // We are looking at two root nodes, so we should compare them.
+ if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) ===
+ ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) {
+ // Both nodes have the same role AND
+ if (navigationNodesComputedLabels[i] ===
+ navigationNodesComputedLabels[j]) {
+ // both have the same (computed) aria-label/aria-labelledby
+ // if (navigationNodesComputedLabels[i] === "") {
+ navigationNodesMatchFound.push("Fail_0"); // Fail 0
+ matchFound = true;
+ break;
+ // }
+ }
+ else {
+ // Same parents && same node roles BUT different computed aria-label/aria-labelledby
+ // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag.
+ pass_0_flag = true;
+ }
+ }
+ else {
+ // Same parents but different node roles // Not applicable
+ }
+ }
+ else if (navigationNodesParents[i] === null ||
+ navigationNodesParents[j] === null) {
+ // We are looking at a single root node
+ continue;
+ }
+ // This if statement focus on the case where the parent landmark is NOT null
+ if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) {
+ // We have the same parent-landmark AND
+ if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) ===
+ ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) {
+ // Both nodes have the same role AND
+ if (navigationNodesComputedLabels[i] ===
+ navigationNodesComputedLabels[j]) {
+ // both have the same (computed) aria-label/aria-labelledby
+ // if (navigationNodesComputedLabels[i] === "") {
+ navigationNodesMatchFound.push("Fail_0"); // Fail 0
+ matchFound = true;
+ break;
+ // }
+ }
+ else {
+ // Same parents && same node roles BUT different computed aria-label/aria-labelledby
+ // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag.
+ pass_0_flag = true;
+ }
+ }
+ else {
+ // Same parents but different node roles // Not applicable
+ }
+ }
+ else {
+ // Different parents // Not applicable
+ }
+ }
+ if (!matchFound) {
+ if (pass_0_flag) {
+ navigationNodesMatchFound.push("Pass_0");
+ }
+ else {
+ navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up.
+ }
+ }
+ }
+ formCache.navigationNodesComputedLabels =
+ navigationNodesComputedLabels;
+ formCache.navigationNodes = navigationNodes;
+ formCache.navigationNodesParents = navigationNodesParents;
+ formCache.navigationNodesMatchFound = navigationNodesMatchFound;
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache);
+ // TODO Add validation that all 3 arrays are the same length
+ // console.log("-------------End formCache")
+ } // End formCache
+ var indexToCheck = -1;
+ for (var i = 0; i < formCache.navigationNodes.length; i++) {
+ if (ruleContext.isSameNode(formCache.navigationNodes[i])) {
+ indexToCheck = i;
+ }
+ }
+ if (indexToCheck === -1) {
+ return null;
+ }
+ if (formCache.navigationNodesMatchFound[indexToCheck] === "Pass_0") {
+ return (0, IRule_1.RulePass)("Pass_0", [
+ ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]),
+ ]);
+ }
+ else if (formCache.navigationNodesMatchFound[indexToCheck] === "Fail_0") {
+ return (0, IRule_1.RuleFail)("Fail_0", [
+ ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]),
+ formCache.navigationNodesComputedLabels[indexToCheck],
+ ]);
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5746:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_main_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_main_label_unique = {
+ id: "aria_main_label_unique",
+ context: "aria:main",
+ refactor: {
+ "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_main_label_unique.html",
+ "Fail_1": "aria_main_label_unique.html",
+ "group": "aria_main_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"main\" role do not have unique labels",
+ "group": "Elements with \"main\" role must have unique labels"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var contextLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var parentDocRole = legacy_1.RPTUtil.getAncestorWithRole(ruleContext, "document", true);
+ var mains = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true);
+ var result = null;
+ for (var i = 0; i < mains.length; ++i) {
+ if (mains[i] === ruleContext)
+ continue;
+ result = (0, IRule_1.RulePass)("Pass_0");
+ var thisParentDocRole = legacy_1.RPTUtil.getAncestorWithRole(mains[i], "document", true);
+ if (thisParentDocRole === parentDocRole) {
+ if (legacy_1.RPTUtil.getAriaLabel(mains[i]) === contextLabel) {
+ result = (0, IRule_1.RuleFail)("Fail_1");
+ break;
+ }
+ }
+ }
+ return result;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8685:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_main_label_visible = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_main_label_visible = {
+ id: "aria_main_label_visible",
+ context: "dom:body",
+ refactor: {
+ "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_main_label_visible.html",
+ "Fail_1": "aria_main_label_visible.html",
+ "group": "aria_main_label_visible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels",
+ "group": "Each element with \"main\" role should have a unique visible label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ //call getElementsByRoleHidden with considerImplicit flag as true
+ //so that the method returs elements
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.hasUniqueAriaLabelledby(landmarks);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2678:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_navigation_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_navigation_label_unique = {
+ id: "aria_navigation_label_unique",
+ context: "aria:navigation",
+ refactor: {
+ "Rpt_Aria_MultipleNavigationLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_navigation_label_unique.html",
+ "Fail_1": "aria_navigation_label_unique.html",
+ "group": "aria_navigation_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"navigation\" role do not have unique labels",
+ "group": "Each element with \"navigation\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "navigation", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_navigation_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_navigation_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 971:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_parent_required = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_parent_required = {
+ id: "aria_parent_required",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_RequiredParent_Native_Host_Sematics": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_parent_required.html",
+ "Pass_0": "aria_parent_required.html",
+ "Fail_1": "aria_parent_required.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with an implicit or explicit role must be contained within a valid element",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with role \"{0}\" is not contained in or owned by an element with one of the following roles: \"{1}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Check Fail 3
+ act: "ff89c9",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ // ignore if the element contains none or presentation role
+ var presentationRoles = ["none", "presentation"];
+ var found = roles.some(function (r) { return presentationRoles.includes(r); });
+ if (found)
+ return null;
+ var passed = true;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roleNameArr = new Array();
+ var containerRoles = new Array();
+ var testedContainer = 0;
+ var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; });
+ var parentRole = ancestorRoles[ancestorRoles.length - 2];
+ var count = 2;
+ while (parentRole === 'none') {
+ count++;
+ parentRole = ancestorRoles[ancestorRoles.length - count];
+ }
+ for (var j = 0, length_1 = roles.length; j < length_1; ++j) {
+ if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) {
+ testedContainer++;
+ passed = false;
+ containerRoles = designPatterns[roles[j]].container;
+ for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) {
+ passed = parentRole === containerRoles[i];
+ if (passed)
+ break;
+ }
+ if (passed == false) {
+ roleNameArr.push(roles[j]);
+ }
+ }
+ }
+ var retToken1 = new Array();
+ retToken1.push(roleNameArr.join(", "));
+ var retToken2 = new Array();
+ retToken2.push(containerRoles.join(", "));
+ //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]);
+ if (testedContainer == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3709:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_region_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_region_label_unique = {
+ id: "aria_region_label_unique",
+ context: "aria:region",
+ refactor: {
+ "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_region_label_unique.html",
+ "Fail_1": "aria_region_label_unique.html",
+ "group": "aria_region_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"region\" role do not have unique labels",
+ "group": "Each element with a \"region\" role must have a unique label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ // form element should only be considered if it has an aria label or title
+ if (ruleContext.getAttribute("role") === "region" ||
+ ruleContext.hasAttribute("aria-label") ||
+ ruleContext.hasAttribute("aria-labelledby") ||
+ ruleContext.hasAttribute("title")) {
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "region", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_region_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_region_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" &&
+ (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6486:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_region_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_region_labelled = {
+ id: "aria_region_labelled",
+ context: "dom:*[role], dom:section",
+ refactor: {
+ "Rpt_Aria_RegionLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_region_labelled.html",
+ "Fail_1": "aria_region_labelled.html",
+ "Fail_2": "aria_region_labelled.html",
+ "group": "aria_region_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Section element with an implicit \"region\" role is not labeled with an 'aria-label' or 'aria-labelledby'",
+ "Fail_2": "The element with \"region\" role is not labeled with an 'aria-label' or 'aria-labelledby'",
+ "group": "Each element with \"region\" role must have a label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var tagName = ruleContext.tagName.toLowerCase();
+ if (tagName === "section" &&
+ !legacy_1.RPTUtil.hasRole(ruleContext, "region", false)) {
+ return null;
+ }
+ if (tagName !== "section" &&
+ !legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "region")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return tagName === "section" ? (0, IRule_1.RuleFail)("Fail_1") : (0, IRule_1.RuleFail)("Fail_2");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4151:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_role_allowed = void 0;
+var ARIADefinitions_1 = __webpack_require__(8235);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.aria_role_allowed = {
+ id: "aria_role_allowed",
+ context: "dom:*[role]",
+ refactor: {
+ "Rpt_Aria_ValidRole": {
+ "Pass_0": "Pass_0",
+ "Fail_2": "Fail_2",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_role_allowed.html",
+ "Pass_0": "aria_role_allowed.html",
+ "Fail_2": "aria_role_allowed.html",
+ "Potential_1": "aria_role_allowed.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Elements must have a valid 'role' per ARIA specification",
+ "Pass_0": "Rule Passed",
+ "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification",
+ "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "4.1.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Recheck
+ act: "674b10",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var roleStr = ruleContext.getAttribute("role").trim().toLowerCase();
+ if (roleStr.length === 0) {
+ return null;
+ }
+ if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") {
+ return null;
+ }
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roles = roleStr.split(/\s+/);
+ // now we have all role attributes
+ var invalidRoles = [];
+ for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) {
+ var role = roles_1[_i];
+ if (!(role.toLowerCase() in designPatterns)) {
+ invalidRoles.push(role);
+ }
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', [roles[i]]);
+ if (invalidRoles.length === roles.length) {
+ return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]);
+ }
+ else if (invalidRoles.length > 0) {
+ return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8545:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_role_redundant = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_role_redundant = {
+ id: "aria_role_redundant",
+ context: "dom:*[role]",
+ help: {
+ "en-US": {
+ "pass": "aria_role_redundant.html",
+ "fail_redundant": "aria_role_redundant.html",
+ "group": "aria_role_redundant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element",
+ "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>",
+ "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var elemName = ruleContext.tagName.toLowerCase();
+ var ariaRoles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ if (!ariaRoles || ariaRoles.length === 0)
+ return;
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ var role_defined = (0, CommonUtil_1.areRolesDefined)(ariaRoles);
+ if (!role_defined)
+ return null;
+ // dependency check: if it's already failed in the parent relation, then skip this check
+ if (["td", "th", "tr"].includes(elemName)) {
+ var parentRole = (0, CommonUtil_1.isTableDescendant)(contextHierarchies);
+ if (parentRole !== null && parentRole.length > 0)
+ return null;
+ }
+ var implicitRoles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ if (!implicitRoles || implicitRoles.length === 0)
+ return (0, IRule_1.RulePass)("pass");
+ var ret = [];
+ for (var i = 0; i < ariaRoles.length; i++) {
+ if (!implicitRoles.includes(ariaRoles[i]))
+ ret.push((0, IRule_1.RulePass)("pass"));
+ else
+ ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName]));
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8538:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_search_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_search_label_unique = {
+ id: "aria_search_label_unique",
+ context: "aria:search",
+ refactor: {
+ "Rpt_Aria_MultipleSearchLandmarks": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_search_label_unique.html",
+ "Fail_1": "aria_search_label_unique.html",
+ "group": "aria_search_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"search\" role do not have unique labels",
+ "group": "Each element with \"search\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "search", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_search_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_search_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1908:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_valid = exports.aria_role_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_role_valid = {
+ id: "aria_role_valid",
+ context: "dom:*",
+ dependencies: ["aria_attribute_allowed"],
+ refactor: {
+ "aria_semantics_role": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_role_valid.html",
+ "Fail_1": "aria_role_valid.html",
+ "Fail_2": "aria_role_valid.html",
+ "group": "aria_role_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>",
+ "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",
+ "group": "ARIA roles must be valid for the element to which they are assigned"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var tagName = ruleContext.tagName.toLowerCase();
+ // only chek element (1) and fragment nodes (11)
+ if (ruleContext.nodeType !== Node.ELEMENT_NODE)
+ return null;
+ // dependency check: if it's already failed, then skip
+ if (["td", "th", "tr"].includes(tagName)) {
+ var parentRole = (0, CommonUtil_1.isTableDescendant)(contextHierarchies);
+ if (parentRole !== null && parentRole.length > 0)
+ return null;
+ }
+ var domRoles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ if (!domRoles || domRoles.length === 0)
+ return null;
+ // check the 'generic' role first
+ if (domRoles.includes('generic'))
+ return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]);
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ var role_defined = (0, CommonUtil_1.areRolesDefined)(domRoles);
+ if (!role_defined)
+ return null;
+ var invalidRoles = (0, CommonUtil_1.getInvalidRoles)(ruleContext);
+ if (invalidRoles === null || invalidRoles.length === 0)
+ return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]);
+ if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && legacy_1.RPTUtil.isTabbable(ruleContext))
+ return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]);
+ if (invalidRoles.length > 0)
+ return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]);
+ if (domRoles.length > 0)
+ return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]);
+ return null;
+ }
+};
+// This rule is in the same file because there is a dependency that aria_role_valid runs first,
+// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular
+// dependency cannot be used
+exports.aria_attribute_valid = {
+ id: "aria_attribute_valid",
+ context: "dom:*",
+ // The the ARIA role is completely invalid, skip this check
+ dependencies: ["aria_attribute_deprecated", "aria_role_valid"],
+ refactor: {
+ "aria_attribute_allowed": {
+ "Pass": "Pass",
+ "Fail_invalid_role_attr": "Fail_invalid_role_attr",
+ "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_valid.html",
+ "Pass": "aria_attribute_valid.html",
+ "Fail_invalid_role_attr": "aria_attribute_valid.html",
+ "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "ARIA attributes must be valid for the element and ARIA role to which they are assigned",
+ "Pass": "ARIA attributes are valid for the element and ARIA role",
+ "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"",
+ "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // only chek element (1)
+ if (ruleContext.nodeType !== Node.ELEMENT_NODE)
+ return null;
+ // ignore if no aria attribute
+ var ariaAttributes = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ if (ariaAttributes === null || ariaAttributes.length === 0)
+ return null;
+ var roles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ var explicit = true;
+ if (roles && roles.length > 0) {
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ if (!(0, CommonUtil_1.areRolesDefined)(roles))
+ return null;
+ }
+ else {
+ //no explicit role defined
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ explicit = false;
+ }
+ var tagName = ruleContext.tagName.toLowerCase();
+ var failedAttributes = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (!failedAttributes || failedAttributes.length === 0)
+ return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]);
+ if (roles.length > 0) {
+ if (explicit)
+ return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]);
+ else
+ return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]);
+ }
+ return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 6360:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_toolbar_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_toolbar_label_unique = {
+ id: "aria_toolbar_label_unique",
+ context: "aria:toolbar",
+ refactor: {
+ "Rpt_Aria_MultipleToolbarUniqueLabel": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_toolbar_label_unique.html",
+ "Fail_1": "aria_toolbar_label_unique.html",
+ "group": "aria_toolbar_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple toolbar components do not have unique labels",
+ "group": "All toolbar components on a page must have unique labels specified"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_toolbar_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5386:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_widget_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIAMapper_1 = __webpack_require__(4944);
+var fragment_1 = __webpack_require__(482);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var DOMUtil_1 = __webpack_require__(295);
+exports.aria_widget_labelled = {
+ id: "aria_widget_labelled",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_WidgetLabels_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_widget_labelled.html",
+ "Pass_0": "aria_widget_labelled.html",
+ "Fail_1": "aria_widget_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Interactive component must have a programmatically associated name",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "m6b1q3",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */
+ if ((ruleContext.hasAttribute("type") &&
+ ruleContext.getAttribute("type") === "hidden") ||
+ (legacy_1.RPTUtil.getAncestorWithRole(ruleContext, "combobox") &&
+ !(legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "textbox") ||
+ legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "searchbox")))) {
+ // we need to diagnose that a combobox input textbox has a label(github issue #1104)
+ return null;
+ }
+ var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var tagName = ruleContext.nodeName.toLowerCase();
+ // Handled by input_label_exists
+ var skipRoles = [
+ "button",
+ "checkbox",
+ "combobox",
+ "listbox",
+ "menuitemcheckbox",
+ "menuitemradio",
+ "radio",
+ "searchbox",
+ "slider",
+ "spinbutton",
+ "switch",
+ "textbox",
+ "progressbar",
+ "link",
+ ];
+ if (skipRoles.includes(elemRole))
+ return null;
+ if (tagName === "output" ||
+ (tagName === "input" &&
+ ruleContext.getAttribute("type") === "file")) {
+ }
+ if (!ruleContext.hasAttribute("role")) {
+ // Form/input elements are checked by G41, we skip them from this rule. Github issue 449
+ var skipElements = [
+ "input",
+ "textarea",
+ "select",
+ "button",
+ "datalist",
+ "optgroup",
+ "option",
+ "keygen",
+ "output",
+ "progress",
+ "meter",
+ ];
+ if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) !=
+ -1) {
+ return null;
+ }
+ }
+ // avoid diagnosing the popup list of a combobox.
+ var rolesToCheck = ["listbox", "tree", "grid", "dialog"];
+ for (var j = 0; j < rolesToCheck.length; j++) {
+ if (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) {
+ var comboboxes = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true);
+ for (var k = 0; k < comboboxes.length; k++) {
+ var combobox = comboboxes[k];
+ var aria_owns = legacy_1.RPTUtil.getElementAttribute(combobox, "aria-owns");
+ if (aria_owns) {
+ var owns = legacy_1.RPTUtil.normalizeSpacing(aria_owns.trim()).split(" ");
+ for (var i = 0; i < owns.length; i++) {
+ var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]);
+ if (owned === ruleContext) {
+ return null;
+ }
+ }
+ }
+ }
+ }
+ }
+ var passed = true;
+ var prohibited = false;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ //get attribute roles as well as implicit roles.
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, true);
+ var numWidgetsTested = 0;
+ var interactiveRoleTypes = ["widget", "liveRegion", "window"];
+ for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) {
+ var pattern = designPatterns[roles[i]];
+ if (pattern &&
+ pattern.nameRequired &&
+ pattern.roleType &&
+ interactiveRoleTypes.includes(pattern.roleType)) {
+ ++numWidgetsTested;
+ // All widgets may have an author supplied accessible name.
+ // Title is legal, but don't advertise its use in documentation.
+ // Encourage use of aria-label, aria-labelledby or html label element.
+ passed =
+ legacy_1.RPTUtil.hasAriaLabel(ruleContext) ||
+ legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title") ||
+ legacy_1.RPTUtil.getLabelForElementHidden(ruleContext, true);
+ if (!passed &&
+ pattern.nameFrom &&
+ pattern.nameFrom.indexOf("contents") >= 0) {
+ // See if widget's accessible name is supplied by element's inner text
+ // nameFrom: ["author", "contents"]
+ passed = legacy_1.RPTUtil.hasInnerContentOrAlt(ruleContext);
+ }
+ if (!passed) {
+ // check if it has implicit label, like abc
+ passed = legacy_1.RPTUtil.hasImplicitLabel(ruleContext);
+ }
+ if (!passed &&
+ ruleContext.tagName.toLowerCase() === "img" &&
+ !ruleContext.hasAttribute("role") &&
+ ruleContext.hasAttribute("alt")) {
+ passed =
+ DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0;
+ }
+ if (pattern.nameFrom.indexOf("prohibited") >= 0) {
+ prohibited = true;
+ }
+ }
+ }
+ if (numWidgetsTested === 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [elemRole]);
+ }
+ else {
+ //TODO
+ // if (prohibited) {
+ // return RuleFail("Fail_2");
+ // } else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ // }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8752:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.asciiart_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.asciiart_alt_exists = {
+ id: "asciiart_alt_exists",
+ context: "dom:pre, dom:listing, dom:xmp, dom:plaintext",
+ refactor: {
+ "RPT_Pre_ASCIIArt": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "asciiart_alt_exists.html",
+ "Potential_1": "asciiart_alt_exists.html",
+ "group": "asciiart_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that ASCII art has a text alternative",
+ "group": "ASCII art must have a text alternative"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for
+ // in various places because of the weird way various browsers render
HtmlUnit:
+ // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases.
+ if (ruleContext.nodeName.toLowerCase() == "pre") {
+ if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") ||
+ ruleContext.getElementsByTagName("code").length > 0 ||
+ legacy_1.RPTUtil.getAncestor(ruleContext, "code")) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ var passed = true;
+ var txtValue = legacy_1.RPTUtil.getInnerText(ruleContext);
+ var nonAlphaNumericNorSpaceCount = 0;
+ var alphNumSameCharacterCount = 0;
+ var lastCharacter = "";
+ // Iterate through the text content
+ for (var idx = 0; passed && (idx < txtValue.length); ++idx) {
+ var chStr = txtValue.substr(idx, 1);
+ // Check if it is alphanumeric or punctuation
+ if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) {
+ // Detect same character sequence
+ if (lastCharacter == chStr) {
+ alphNumSameCharacterCount = alphNumSameCharacterCount + 1;
+ ;
+ }
+ else {
+ alphNumSameCharacterCount = 0;
+ }
+ }
+ else if (/\s/.test(chStr)) {
+ alphNumSameCharacterCount = 0;
+ }
+ else {
+ nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1;
+ alphNumSameCharacterCount = 0;
+ }
+ lastCharacter = chStr;
+ // Make the decision
+ if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) {
+ passed = false;
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 4392:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.blink_css_review = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.blink_css_review = {
+ id: "blink_css_review",
+ context: "dom:style, dom:*[style]",
+ refactor: {
+ "RPT_Blink_CSSTrigger1": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "blink_css_review.html",
+ "Pass_0": "blink_css_review.html",
+ "Potential_1": "blink_css_review.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.2.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var textValue = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute('style')) {
+ textValue = ruleContext.getAttribute('style');
+ }
+ var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1;
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 932:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.blink_elem_deprecated = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.blink_elem_deprecated = {
+ id: "blink_elem_deprecated",
+ context: "dom:blink",
+ refactor: {
+ "WCAG20_Blink_AlwaysTrigger": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "blink_elem_deprecated.html",
+ "Pass_0": "blink_elem_deprecated.html",
+ "Fail_1": "blink_elem_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Content that blinks persistently must not be used",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Content found that blinks persistently"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.2.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ // const ruleContext = context["dom"].node as Element;
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6255:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.blockquote_cite_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.blockquote_cite_exists = {
+ id: "blockquote_cite_exists",
+ context: "dom:blockquote",
+ refactor: {
+ "RPT_Blockquote_HasCite": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "blockquote_cite_exists.html",
+ "Potential_1": "blockquote_cite_exists.html",
+ "group": "blockquote_cite_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that should not be used only for quotations, not indentation",
+ "group": "Use only for quotations, not indentation"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "cite");
+ if (!passed) {
+ var citeElems = legacy_1.RPTUtil.getDocElementsByTag(ruleContext, "cite");
+ passed = citeElems != null && citeElems.length > 0;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 5743:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.canvas_content_described = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+exports.canvas_content_described = {
+ id: "canvas_content_described",
+ context: "dom:canvas",
+ refactor: {
+ "HAAC_Canvas": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "canvas_content_described.html",
+ "Manual_1": "canvas_content_described.html",
+ "group": "canvas_content_described.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Manual_1": "Verify accessibility of the element",
+ "group": "The element may not be accessible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1", "4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = ruleContext.innerHTML.trim().length > 0;
+ if (passed)
+ return (0, IRule_1.RulePass)(1);
+ if (!passed)
+ return (0, IRule_1.RuleManual)("Manual_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2671:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.caption_track_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.caption_track_exists = {
+ id: "caption_track_exists",
+ context: "dom:video",
+ refactor: {
+ "HAAC_Video_HasNoTrack": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "caption_track_exists.html",
+ "Potential_1": "caption_track_exists.html",
+ "group": "caption_track_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the element",
+ "group": "A element must have a text alternative for any meaningful audio content"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.2.1", "1.2.2", "1.2.4"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = false;
+ // ignore decorative video if user uses aria-hidden
+ if (ruleContext.getAttribute("aria-hidden") === "true") {
+ return null;
+ }
+ var tracks = ruleContext.getElementsByTagName("track");
+ for (var i = 0; i < tracks.length; ++i) {
+ passed = passed || tracks[i].getAttribute("kind") === 'captions';
+ }
+ // checks for addition of dynamic tracks
+ if (ruleContext.textTracks && ruleContext.textTracks.length > 0) {
+ for (var i = 0; i < ruleContext.textTracks.length; i++) {
+ passed = passed || ruleContext.textTracks[i].kind === 'captions';
+ }
+ }
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3974:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_active_descendant = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_active_descendant = {
+ id: "combobox_active_descendant",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ help: {
+ "en-US": {
+ "Pass": "combobox_active_descendant.html",
+ "Fail_missing": "combobox_active_descendant.html",
+ "Fail_not_in_popup": "combobox_active_descendant.html",
+ "Fail_active_role_invalid": "combobox_active_descendant.html",
+ "Fail_active_not_selected": "combobox_active_descendant.html",
+ "group": "combobox_active_descendant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "'aria-activedescendant' is used appropriately for this combobox",
+ "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist",
+ "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",
+ "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",
+ "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",
+ "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cachedElem = cache[context["dom"].rolePath];
+ if (!cachedElem)
+ return null;
+ var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId;
+ // If this isn't defined, the combobox is probably collapsed. A reference error is
+ // detected in combobox_popup_reference
+ if (!popupElement)
+ return null;
+ // This rule only applies if the activedescendant is specified
+ var activeId = ruleContext.getAttribute("aria-activedescendant");
+ if (!activeId || activeId.trim().length === 0) {
+ return null;
+ }
+ var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId);
+ if (!activeElem) {
+ return (0, IRule_1.RuleFail)("Fail_missing", [activeId]);
+ }
+ var found = false;
+ // examine the children
+ if (popupElement) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ found = nw.elem().getAttribute("id") === activeId;
+ }
+ }
+ }
+ var retVal = [];
+ if (!found) {
+ retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId]));
+ }
+ var activeRoles = legacy_1.RPTUtil.getRoles(activeElem, true);
+ var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); });
+ if (validRoles.length === 0) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")]));
+ }
+ if (activeElem.getAttribute("aria-selected") !== "true") {
+ retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId]));
+ }
+ if (retVal.length === 0) {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ else {
+ return retVal;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9881:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_autocomplete_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_autocomplete_valid = {
+ id: "combobox_autocomplete_valid",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ refactor: {
+ "combobox_autocomplete": {
+ "Pass": "Pass",
+ "Fail_1": "Fail_1",
+ "Fail_inline": "Fail_inline"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass": "combobox_autocomplete_valid.html",
+ "Fail_1": "combobox_autocomplete_valid.html",
+ "Fail_inline": "combobox_autocomplete_valid.html",
+ "group": "combobox_autocomplete_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",
+ "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",
+ "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",
+ "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cachedElem = cache[context["dom"].rolePath];
+ if (!cachedElem)
+ return null;
+ var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement;
+ var retVal = [];
+ if (ruleContext.getAttribute("aria-autocomplete") === "inline") {
+ retVal.push((0, IRule_1.RuleFail)("Fail_inline"));
+ }
+ var passed = true;
+ // examine the children
+ if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ // if popupElement itself has "aria-autocomplete"
+ passed = !popupElement.hasAttribute("aria-autocomplete");
+ // if any child of popupElement has "aria-autocomplete"
+ if (passed && popupElement.children && popupElement.children.length > 0) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (passed && nw.nextNode()) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ passed = !nw.elem().hasAttribute("aria-autocomplete");
+ if (nw.bEndTag && nw.node === popupElement.lastElementChild)
+ break;
+ }
+ }
+ }
+ }
+ if (!passed) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId]));
+ }
+ if (retVal.length > 0) {
+ return retVal;
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1226:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_design_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+function patternDetect(elem) {
+ // check 'explicit' role combobox and that it is not .
+ if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") {
+ return "implicit";
+ }
+ else if (elem.nodeName.toLowerCase() === "input"
+ && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text")
+ && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) {
+ // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow
+ return "1.0";
+ }
+ else if (elem.nodeName.toLowerCase() !== "input"
+ && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) {
+ // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid
+ return "1.1";
+ }
+ // Assume they're trying to do the latest, 1.2 pattern
+ return "1.2";
+}
+exports.combobox_design_valid = {
+ id: "combobox_design_valid",
+ context: "aria:combobox",
+ refactor: {
+ "combobox_version": {
+ "Pass_1.0": "Pass_1.0",
+ "Fail_1.1": "Fail_1.1",
+ "Pass_1.2": "Pass_1.2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_1.0": "combobox_design_valid.html",
+ "Fail_1.1": "combobox_design_valid.html",
+ "Pass_1.2": "combobox_design_valid.html",
+ "group": "combobox_design_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2",
+ "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2",
+ "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2",
+ "group": "The combobox design pattern must be valid for ARIA 1.2"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ var pattern = patternDetect(ruleContext);
+ // We don't assess native select elements here
+ if (pattern === "implicit") {
+ return null;
+ }
+ var tagName = ruleContext.tagName.toLowerCase();
+ var expanded = (legacy_1.RPTUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true";
+ var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text");
+ var key = context["dom"].rolePath;
+ if (key) {
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ cache[key] = {
+ "inputElement": editable ? ruleContext : null,
+ "pattern": pattern,
+ "expanded": expanded
+ };
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "combobox", cache);
+ }
+ else {
+ // No xpath?
+ return null;
+ }
+ if (pattern === "1.0") {
+ return (0, IRule_1.RulePass)("Pass_1.0");
+ }
+ else if (pattern === "1.1") {
+ return (0, IRule_1.RuleFail)("Fail_1.1");
+ }
+ else if (pattern === "1.2") {
+ return (0, IRule_1.RulePass)("Pass_1.2");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7369:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_focusable_elements = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_focusable_elements = {
+ id: "combobox_focusable_elements",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ help: {
+ "en-US": {
+ "Pass": "combobox_focusable_elements.html",
+ "Fail_not_tabbable": "combobox_focusable_elements.html",
+ "Fail_tabbable_child": "combobox_focusable_elements.html",
+ "group": "combobox_focusable_elements.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "DOM focus is allowed only on the combobox element as required",
+ "Fail_not_tabbable": "The combobox element does not allow DOM focus as required",
+ "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",
+ "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cachedElem = cache[context["dom"].rolePath];
+ if (!cachedElem)
+ return null;
+ var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded;
+ // If this isn't defined, the combobox is probably collapsed. A reference error is
+ // detected in combobox_popup_reference
+ if (!popupElement)
+ return null;
+ var popupRole = legacy_1.RPTUtil.getRoles(popupElement, true)[0];
+ var retVal = [];
+ if (!legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable"));
+ }
+ // Only makes sense to check the popup when expanded
+ // this does not apply to dialogs, return pass since the main element was focusable above
+ if (expanded === false || popupRole === "dialog") {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ var passed = true;
+ // examine the children
+ if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ // if popupElement itself has "aria-activedescendant"
+ passed = !legacy_1.RPTUtil.isTabbable(popupElement) && !legacy_1.RPTUtil.getAriaAttribute(popupElement, "aria-activedescendant");
+ ;
+ // if any child of popupElement has "aria-autocomplete"
+ if (passed && popupElement.children && popupElement.children.length > 0) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (passed && nw.nextNode()) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ passed = !legacy_1.RPTUtil.isTabbable(nw.node) &&
+ !legacy_1.RPTUtil.getAriaAttribute(nw.node, "aria-activedescendant");
+ if (nw.bEndTag && nw.node === popupElement.lastElementChild)
+ break;
+ }
+ }
+ }
+ }
+ if (!passed) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child"));
+ }
+ if (retVal.length === 0) {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ else {
+ return retVal;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2633:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_haspopup_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.combobox_haspopup_valid = {
+ id: "combobox_haspopup_valid",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ refactor: {
+ "combobox_haspopup": {
+ "Pass": "Pass",
+ "Fail_popup_role_invalid": "Fail_popup_role_invalid",
+ "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass": "combobox_haspopup_valid.html",
+ "Fail_popup_role_invalid": "combobox_haspopup_valid.html",
+ "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html",
+ "group": "combobox_haspopup_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",
+ "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"",
+ "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",
+ "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cacheKey = context["dom"].rolePath;
+ var cachedElem = cache[cacheKey];
+ if (!cachedElem)
+ return null;
+ var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId;
+ // If this isn't defined, the combobox is probably collapsed. A reference error is
+ // detected in combobox_popup_reference
+ if (!popupElement)
+ return null;
+ // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox
+ var popupRoles = legacy_1.RPTUtil.getRoles(popupElement, true);
+ var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); });
+ if (validRoles.length === 0) {
+ return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]);
+ }
+ else {
+ var popupRole = validRoles[0];
+ var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox";
+ // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined
+ if (haspopupVal !== popupRole) {
+ if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) {
+ return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]);
+ }
+ }
+ }
+ return (0, IRule_1.RulePass)("Pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2429:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_popup_reference = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_popup_reference = {
+ id: "combobox_popup_reference",
+ context: "aria:combobox",
+ dependencies: ["combobox_design_valid"],
+ help: {
+ "en-US": {
+ "group": "combobox_popup_reference.html",
+ "Pass_1.0_expanded": "combobox_popup_reference.html",
+ "Pass_1.0_collapsed": "combobox_popup_reference.html",
+ "Pass_1.2_expanded": "combobox_popup_reference.html",
+ "Pass_1.2_collapsed": "combobox_popup_reference.html",
+ "Fail_1.0_missing_owns": "combobox_popup_reference.html",
+ "Fail_1.2_missing_controls": "combobox_popup_reference.html",
+ "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html",
+ "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html",
+ "Fail_combobox_expanded_hidden": "combobox_popup_reference.html",
+ "Fail_combobox_collapsed_visible": "combobox_popup_reference.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value",
+ "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible",
+ "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required",
+ "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible",
+ "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required",
+ "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing",
+ "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing",
+ "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",
+ "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",
+ "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",
+ "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [{
+ "4e8ab6": {
+ "Pass_1.0_expanded": "fail",
+ "Pass_1.0_collapsed": "fail",
+ "Pass_1.2_expanded": "pass",
+ "Pass_1.2_collapsed": "pass",
+ "Fail_1.0_missing_owns": "inapplicable",
+ "Fail_1.2_missing_controls": "fail",
+ "Fail_1.0_popup_reference_missing": "inapplicable",
+ "Fail_1.2_popup_reference_missing": "fail",
+ "Fail_combobox_expanded_hidden": "inapplicable",
+ "Fail_combobox_collapsed_visible": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cacheKey = context["dom"].rolePath;
+ var cachedElem = cache[cacheKey];
+ if (!cachedElem)
+ return null;
+ var pattern = cachedElem.pattern, expanded = cachedElem.expanded;
+ var popupId;
+ var popupElement;
+ if (pattern === "1.0") {
+ if (!ruleContext.hasAttribute("aria-owns")) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns");
+ }
+ popupId = ruleContext.getAttribute("aria-owns");
+ popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId);
+ if (!popupElement) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]);
+ }
+ }
+ else if (pattern === "1.2") {
+ if (!ruleContext.hasAttribute("aria-controls")) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls");
+ }
+ popupId = ruleContext.getAttribute("aria-controls");
+ popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId);
+ if (!popupElement) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]);
+ }
+ }
+ else {
+ return null;
+ }
+ // We have an element, stick it in the cache and then check its role
+ cachedElem.popupId = popupId;
+ cachedElem.popupElement = popupElement;
+ if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden");
+ }
+ else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible");
+ }
+ if (pattern === "1.0") {
+ return (0, IRule_1.RulePass)(expanded ? "Pass_1.0_expanded" : "Pass_1.0_collapsed");
+ }
+ else {
+ return (0, IRule_1.RulePass)(expanded ? "Pass_1.2_expanded" : "Pass_1.2_collapsed");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7874:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.debug_paths = void 0;
+var IRule_1 = __webpack_require__(4377);
+exports.debug_paths = {
+ id: "debug_paths",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ rulesets: [{
+ id: ["DEBUG"],
+ num: "1",
+ level: IRule_1.eRulePolicy.INFORMATION,
+ toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ ruleContext.setAttribute("domPath", context["dom"].rolePath);
+ ruleContext.setAttribute("ariaPath", context["aria"].rolePath);
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 3334:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.detector_tabbable = void 0;
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.detector_tabbable = {
+ id: "detector_tabbable",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ rulesets: [{
+ id: ["EXTENSIONS"],
+ num: "1",
+ level: IRule_2.eRulePolicy.INFORMATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ return null;
+ }
+ var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1];
+ return (0, IRule_1.RulePass)("Pass_0", [], [{
+ name: hierContext.attributes.name,
+ role: hierContext.role,
+ tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0")
+ }]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4298:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.dir_attribute_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.dir_attribute_valid = {
+ id: "dir_attribute_valid",
+ context: "dom:*[dir]",
+ refactor: {
+ "Valerie_Elem_DirValid": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "dir_attribute_valid.html",
+ "Fail_1": "dir_attribute_valid.html",
+ "group": "dir_attribute_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Invalid value used for the 'dir' attribute",
+ "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var dirStr = ruleContext.getAttribute("dir").toLowerCase();
+ var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto";
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4435:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.download_keyboard_controllable = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.download_keyboard_controllable = {
+ id: "download_keyboard_controllable",
+ context: "dom:a[href],dom:area[href]",
+ refactor: {
+ "HAAC_Media_DocumentTrigger2": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "download_keyboard_controllable.html",
+ "Manual_1": "download_keyboard_controllable.html",
+ "group": "download_keyboard_controllable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap",
+ "group": "File download mechanisms should be keyboard-operable and preserve page focus location"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var href = ruleContext.getAttribute("href");
+ var ext = legacy_1.RPTUtil.getFileExt(href);
+ var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext);
+ if (passed)
+ return null;
+ if (!passed)
+ return (0, IRule_1.RuleManual)("Manual_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6313:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_accesskey_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var DOMWalker_1 = __webpack_require__(7440);
+exports.element_accesskey_labelled = {
+ id: "element_accesskey_labelled",
+ context: "dom:*[accesskey]",
+ refactor: {
+ "HAAC_Accesskey_NeedLabel": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "element_accesskey_labelled.html",
+ "Potential_1": "element_accesskey_labelled.html",
+ "group": "element_accesskey_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "The HTML element with an assigned 'accesskey' attribute does not have an associated label",
+ "group": "An HTML element with an assigned 'accesskey' attribute must have an associated label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.3.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = false;
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title")) {
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-label")) {
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.getLabelForElementHidden(ruleContext, true)) { // ignore hidden
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) {
+ // assume the validity of the id (of aria-labelledby) is checked by a different rule
+ passed = true;
+ }
+ else if (ruleContext.nodeName.toLowerCase() === "input"
+ && DOMWalker_1.DOMWalker.parentNode(ruleContext).nodeName.toLowerCase() === "label") {
+ // assume the validity of the label, e.g. empty label, is checked by a different rule
+ passed = true;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9109:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_accesskey_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.element_accesskey_unique = {
+ id: "element_accesskey_unique",
+ context: "dom:*[accesskey]",
+ refactor: {
+ "WCAG20_Elem_UniqueAccessKey": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "element_accesskey_unique.html",
+ "Fail_1": "element_accesskey_unique.html",
+ "group": "element_accesskey_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "'accesskey' attribute value on the element is not unique",
+ "group": "'accesskey' attribute values on each element must be unique for the page"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var map = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "element_accesskey_unique", {});
+ var key = ruleContext.getAttribute("accesskey");
+ var passed = !(key in map);
+ map[key] = true;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9918:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_attribute_deprecated = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var DEPRECATED_ELEMENTS = [
+ /** original */
+ "applet", "basefont", "center", "dir", "font", "isindex", "listing",
+ "plaintext", "spacer", "s", "strike", "u", "xmp",
+ /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */
+ "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt",
+];
+var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [
+ /** original */
+ "align", "link", "archive", "background", "bgcolor", "clear", "code", "color",
+ "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object",
+ "prompt", "start", "text", "version", "vlink", "vspace"
+];
+var DEPRECATED_ELEMENT_ATTRIBUTES = {
+ /** original */
+ "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"],
+ "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"],
+ "li": ["type", "value", "type"],
+ "ul": ["type", "compact"],
+ "pre": ["width"],
+ /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */
+ "meta": ["http-equiv"],
+ "a": ["charset", "coords", "shape", "rev", "scheme"],
+ "link": ["rev", "charset", "target"],
+ "img": ["name", "longdesc", "align", "hspace", "vspace", "border"],
+ "area": ["nohref"],
+ "head": ["profile"],
+ "html": ["version"],
+ "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"],
+ "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"],
+ "param": ["type", "valuetype"],
+ "script": ["language"],
+ "body": ["alink", "background", "bgcolor", "link", "text", "vlink"],
+ "br": ["clear"],
+ "caption": ["align"],
+ "col": ["align", "char", "charoff", "valign", "width"],
+ "div": ["align"],
+ "dl": ["compact"],
+ "hr": ["align", "noshade", "size", "width", "align"],
+ "h2": ["align"],
+ "h3": ["align"],
+ "h4": ["align"],
+ "h5": ["align"],
+ "h6": ["align"],
+ "input": ["align", "usemap"],
+ "legend": ["align"],
+ "menu": ["compact"],
+ "ol": ["compact", "type", "type"],
+ "p": ["align"],
+ "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"],
+ "tbody": ["align", "char", "valign", "charoff"],
+ "tfoot": ["align", "charoff", "char", "valign"],
+ "thead": ["char", "charoff", "valign", "align"],
+ "tr": ["align", "bgcolor", "char", "charoff", "valign"]
+};
+function arrayToContextStr(obj, type) {
+ var str = "";
+ for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) {
+ var prop = obj_1[_i];
+ if (str !== '' && !str.endsWith(', '))
+ str += ", ";
+ if (type === 'HTML_ELEMENTS')
+ str += 'dom:' + prop;
+ else if (type === 'HTML_ATTRIBUTES')
+ str += 'dom:*[' + prop + "]";
+ }
+ return str;
+}
+function objToContextStr(obj, type) {
+ var str = "";
+ for (var prop in obj) {
+ if (str !== '' && !str.endsWith(', '))
+ str += ", ";
+ if (type === 'HTML_ELEMENT_ATTRIBUTES') {
+ for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) {
+ var item = _a[_i];
+ if (str !== '' && !str.endsWith(", "))
+ str += ", ";
+ str += 'dom:' + prop + '[' + item + ']';
+ }
+ }
+ }
+ return str;
+}
+exports.element_attribute_deprecated = {
+ id: "element_attribute_deprecated",
+ context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",
+ help: {
+ "en-US": {
+ "pass": "element_attribute_deprecated.html",
+ "fail_elem": "element_attribute_deprecated.html",
+ "fail_attr": "element_attribute_deprecated.html",
+ "fail_elem_attr": "element_attribute_deprecated.html",
+ "group": "element_attribute_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_elem": "The <{0}> element is deprecated in HTML 5",
+ "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5",
+ "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5",
+ "group": "Avoid use of obsolete features if possible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing!
+ if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ if (ruleContext.nodeName.includes("-")) {
+ // This is a webcomponent element, HTML doesn't define what's deprecated
+ return null;
+ }
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var ret = [];
+ // check if it's a deprecated element
+ if (DEPRECATED_ELEMENTS.includes(nodeName)) {
+ return (0, IRule_1.RuleFail)("fail_elem", [nodeName]);
+ }
+ // check if it's a deprecated HTML global attribute
+ var attrs = ruleContext.getAttributeNames();
+ var violations = '';
+ for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) {
+ var attr = attrs_1[_i];
+ if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) {
+ if (violations !== '')
+ violations += ', ';
+ violations += attr;
+ }
+ }
+ if (violations !== '') {
+ return (0, IRule_1.RuleFail)("fail_attr", [violations]);
+ }
+ // check if it's a deprecated HTML element & attribute
+ violations = '';
+ if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) {
+ for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) {
+ var attr = attrs_2[_a];
+ if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) {
+ if (violations !== '')
+ violations += ', ';
+ violations += attr;
+ }
+ }
+ if (violations !== '') {
+ return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]);
+ }
+ }
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 8105:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_id_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+exports.element_id_unique = {
+ id: "element_id_unique",
+ context: "dom:*[id]",
+ refactor: {
+ "RPT_Elem_UniqueId": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "element_id_unique.html",
+ "Pass_0": "element_id_unique.html",
+ "Fail_1": "element_id_unique.html",
+ "Fail_2": "element_id_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Element 'id' attribute values must be unique within a document",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element has the id \"{1}\" that is empty",
+ "Fail_2": "The <{0}> element has the id \"{1}\" that is already in use"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [{
+ "3ea0c8": {
+ "Pass_0": "pass",
+ "Fail_1": "pass",
+ "Fail_2": "fail"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // JCH - NO OUT OF SCOPE hidden in context
+ var id = ruleContext.getAttribute("id");
+ // In the case that id is empty we should trigger a violation right away with out checking
+ // for uniqueness.
+ if (id === "") {
+ //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]);
+ return (0, IRule_1.RuleFail)("Fail_1", [ruleContext.nodeName.toLowerCase(), id]);
+ }
+ var element = fragment_1.FragmentUtil.getById(ruleContext, id);
+ var passed = element === ruleContext;
+ //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.nodeName.toLowerCase(), id]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8687:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_lang_valid = exports.html_lang_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var lang_1 = __webpack_require__(2527);
+var VisUtil_1 = __webpack_require__(8174);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper_1 = __webpack_require__(4944);
+var validateLang = function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (ruleContext.hasAttribute("lang")) {
+ if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") {
+ // It's okay to have a lang="" if not on html
+ }
+ else {
+ var langStr = ruleContext.getAttribute("lang");
+ if (!lang_1.LangUtil.validPrimaryLang(langStr)) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ if (!lang_1.LangUtil.isBcp47(langStr)) {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ }
+ }
+ if (ruleContext.hasAttribute("xml:lang")) {
+ if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") {
+ // It's okay to have a lang="" if not on html
+ }
+ else {
+ var langStr = ruleContext.getAttribute("xml:lang");
+ if (!lang_1.LangUtil.validPrimaryLang(langStr)) {
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ if (!lang_1.LangUtil.isBcp47(langStr)) {
+ return (0, IRule_1.RuleFail)("Fail_4");
+ }
+ }
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+};
+exports.html_lang_valid = {
+ id: "html_lang_valid",
+ context: "dom:html[lang], dom:html[xml:lang]",
+ help: {
+ "en-US": {
+ "Pass_0": "html_lang_valid.html",
+ "Fail_1": "html_lang_valid.html",
+ "Fail_2": "html_lang_valid.html",
+ "Fail_3": "html_lang_valid.html",
+ "Fail_4": "html_lang_valid.html",
+ "group": "html_lang_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Lang has a valid primary lang and conforms to BCP 47",
+ "Fail_1": "Specified 'lang' attribute does not include a valid primary language",
+ "Fail_2": "Specified 'lang' attribute does not conform to BCP 47",
+ "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language",
+ "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47",
+ "group": "The default human language of the page must be valid and specified in accordance with BCP 47"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [{
+ "b5c3f8": {
+ "Pass_0": "pass",
+ "Fail_1": "fail",
+ "Fail_2": "inapplicable",
+ "Fail_3": "inapplicable",
+ "Fail_4": "inapplicable"
+ },
+ "bf051a": {
+ "Pass_0": "pass",
+ "Fail_1": "fail",
+ "Fail_2": "pass",
+ "Fail_3": "fail",
+ "Fail_4": "inapplicable"
+ },
+ // TODO: ACT: Mismatch because they don't check the html element in the same rule
+ // "de46e4": {
+ // "Pass_0": "pass",
+ // "Fail_1": "fail",
+ // "Fail_2": "pass",
+ // "Fail_3": "inapplicable",
+ // "Fail_4": "inapplicable"
+ // }
+ }],
+ run: validateLang
+};
+exports.element_lang_valid = {
+ id: "element_lang_valid",
+ context: "dom:*[lang], dom:*[xml:lang]",
+ help: {
+ "en-US": {
+ "Pass_0": "element_lang_valid.html",
+ "Fail_1": "element_lang_valid.html",
+ "Fail_2": "element_lang_valid.html",
+ "Fail_3": "element_lang_valid.html",
+ "Fail_4": "element_lang_valid.html",
+ "group": "element_lang_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Lang has a valid primary lang and conforms to BCP 47",
+ "Fail_1": "Specified 'lang' attribute does not include a valid primary language",
+ "Fail_2": "Specified 'lang' attribute does not conform to BCP 47",
+ "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language",
+ "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47",
+ "group": "The change in language of specific content must be valid and specified in accordance with BCP 47"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [{
+ // "b5c3f8": {
+ // "Pass_0": "pass",
+ // "Fail_1": "fail",
+ // "Fail_2": "inapplicable",
+ // "Fail_3": "inapplicable",
+ // "Fail_4": "inapplicable"
+ // },
+ // "bf051a": {
+ // "Pass_0": "pass",
+ // "Fail_1": "fail",
+ // "Fail_2": "pass",
+ // "Fail_3": "fail",
+ // "Fail_4": "inapplicable"
+ // },
+ // TODO: ACT: Mismatch because they don't check the html element in the same rule
+ "de46e4": {
+ "Pass_0": "pass",
+ "Fail_1": "fail",
+ "Fail_2": "pass",
+ "Fail_3": "inapplicable",
+ "Fail_4": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ // If it's the HTML node, that's handled by html_lang_valid
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (nodeName === "html")
+ return null;
+ var retVal = validateLang(context, options, contextHierarchies);
+ if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) {
+ // Ensure that there's actually content of this element - skip subtrees that have other lang attributes
+ var hasContent = false;
+ if (ruleContext.firstChild !== null) {
+ var nw = new DOMWalker_1.DOMWalker(ruleContext);
+ while (!hasContent && nw.nextNode()) {
+ // Skip hidden
+ if (nw.node.nodeType === 1) {
+ var element = nw.node;
+ if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) {
+ nw.bEndTag = true;
+ }
+ else {
+ hasContent = hasContent
+ || element.nodeName.toLowerCase() === "img" && ARIAMapper_1.ARIAMapper.computeName(element).trim().length > 0;
+ }
+ }
+ else {
+ hasContent = hasContent
+ || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0;
+ }
+ }
+ }
+ if (!hasContent)
+ return null;
+ }
+ return retVal;
+ }
+};
+
+
+/***/ }),
+
+/***/ 2150:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_mouseevent_keyboard = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.element_mouseevent_keyboard = {
+ id: "element_mouseevent_keyboard",
+ context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",
+ refactor: {
+ "RPT_Elem_EventMouseAndKey": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "element_mouseevent_keyboard.html",
+ "Manual_1": "element_mouseevent_keyboard.html",
+ "group": "element_mouseevent_keyboard.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",
+ "group": "All interactive content with mouse event handlers must have equivalent keyboard access"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var passed = ruleContext.hasAttribute("href") ||
+ (!ruleContext.hasAttribute("ondblclick") &&
+ !ruleContext.hasAttribute("onmousemove") &&
+ (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) &&
+ (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) &&
+ (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) &&
+ (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) &&
+ (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") ||
+ nodeName == "a" || nodeName == "button"));
+ var failedMouseEvents = new Array();
+ if (!passed) {
+ //store and display event name and node name in the tokens
+ if (ruleContext.hasAttribute("ondblclick")) {
+ failedMouseEvents.push("ondblclick");
+ }
+ if (ruleContext.hasAttribute("onmousemove")) {
+ failedMouseEvents.push("onmousemove");
+ }
+ if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) {
+ failedMouseEvents.push("onmousedown");
+ }
+ if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) {
+ failedMouseEvents.push("onmouseup");
+ }
+ if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) {
+ failedMouseEvents.push("onmouseover");
+ }
+ if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) {
+ failedMouseEvents.push("onmouseout");
+ }
+ if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) {
+ if (!(nodeName == "a" || nodeName == "button"))
+ failedMouseEvents.push("onclick");
+ }
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4557:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_orientation_unlocked = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CSSUtil_1 = __webpack_require__(1775);
+var VisUtil_1 = __webpack_require__(8174);
+var CacheUtil_1 = __webpack_require__(7788);
+var fragment_1 = __webpack_require__(482);
+var legacy_1 = __webpack_require__(8422);
+exports.element_orientation_unlocked = {
+ id: "element_orientation_unlocked",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "element_orientation_unlocked.html",
+ "fail_locked": "element_orientation_unlocked.html",
+ "group": "element_orientation_unlocked.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property",
+ "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",
+ "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.4"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: ['b33eff'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip invisible element
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext))
+ return null;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["script", "meta", "title"]))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // cache the orientation ressult for all the elements in the page
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var orientationTransforms = (0, CacheUtil_1.getCache)(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null);
+ if (!orientationTransforms) {
+ orientationTransforms = (0, CSSUtil_1.getMediaOrientationTransform)(doc);
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms);
+ }
+ // find if the element matches orientation selector(s)
+ var media_transforms = [];
+ Object.keys(orientationTransforms).forEach(function (key) {
+ Object.keys(orientationTransforms[key]).forEach(function (tag) {
+ if (Object.keys(orientationTransforms[key][tag]).length > 0 && (0, CSSUtil_1.selectorMatchesElem)(ruleContext, tag))
+ media_transforms.push(orientationTransforms[key][tag].transform);
+ });
+ });
+ // no match, the elemenet is not in media orientation transform
+ if (media_transforms.length === 0)
+ return null;
+ var ret = [];
+ var _loop_1 = function (i) {
+ var media_transform = media_transforms[i];
+ var containsRotation = false;
+ ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) {
+ if (media_transform.includes(rotation))
+ containsRotation = true;
+ });
+ // no rotation transform, skip
+ if (!containsRotation)
+ return "continue";
+ var degree = (0, CSSUtil_1.getRotationDegree)(media_transform);
+ // no or 360n degree rotation
+ if (degree === 0) {
+ ret.push((0, IRule_1.RulePass)("pass"));
+ return "continue";
+ }
+ /**
+ * calculate the original page rotation transformation, example
+ * html { transform: rotate(2.5deg); }
+ */
+ var definedStyle = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ /**
+ * compensate the media orientation with the page orientation
+ */
+ if (definedStyle['transform']) {
+ var page_degree = (0, CSSUtil_1.getRotationDegree)(definedStyle['transform']);
+ degree -= page_degree;
+ }
+ // allow 1 degree floating range for the right angle
+ if ((degree > 89 && degree < 91) || (degree > -91 && degree < -89))
+ ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName]));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ };
+ for (var i = 0; i < media_transforms.length; i++) {
+ _loop_1(i);
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 4721:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_scrollable_tabbable = void 0;
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+var CSSUtil_1 = __webpack_require__(1775);
+exports.element_scrollable_tabbable = {
+ id: "element_scrollable_tabbable",
+ context: "dom:*",
+ dependencies: [],
+ help: {
+ "en-US": {
+ "group": "element_scrollable_tabbable.html",
+ "pass_tabbable": "element_scrollable_tabbable.html",
+ "pass_interactive": "element_scrollable_tabbable.html",
+ "fail_scrollable": "element_scrollable_tabbable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Scrollable elements should be tabbable or contain tabbable content",
+ "pass_tabbable": "The scrollable element is tabbable",
+ "pass_interactive": "The scrollable element has tabbable content",
+ "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ num: ["2.1.1"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["ossw9k"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta"]))
+ return null;
+ //skip if no visible content
+ if (!legacy_1.RPTUtil.hasInnerContent(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var styles = (0, CSSUtil_1.getComputedStyle)(ruleContext);
+ // not scrollable, inapplicable
+ if ((styles.overflowX === 'visible' || styles.overflowX === 'hidden')
+ && (styles.overflowY === 'visible' || styles.overflowY === 'hidden'))
+ return null;
+ // ignore if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen
+ if (Math.max(ruleContext.offsetWidth, ruleContext.offsetHeight) < 30 || Math.min(ruleContext.offsetWidth, ruleContext.offsetHeight) < 15)
+ return null;
+ // ignore if both x and y scroll distances < element's horizontal/vertical padding
+ var padding_x = (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingLeft, ruleContext) + (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingRight, ruleContext);
+ var padding_y = (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingTop, ruleContext) + (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingBottom, ruleContext);
+ if (ruleContext.scrollWidth - ruleContext.clientWidth < 1 + padding_x
+ && ruleContext.scrollHeight - ruleContext.clientHeight < 1 + padding_y)
+ return null;
+ // pass iframe element has a tabindex attribute value that is not negative
+ if (ruleContext.hasAttribute("tabindex") && parseInt(ruleContext.getAttribute("tabindex")) >= 0)
+ return (0, IRule_1.RulePass)("pass_tabbable");
+ // check if element content is tabbable
+ var count = legacy_1.RPTUtil.getTabbableChildren(ruleContext);
+ if (count > 0)
+ return (0, IRule_1.RulePass)("pass_interactive");
+ // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator)
+ if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1)
+ return null;
+ return (0, IRule_1.RuleFail)("fail_scrollable", [nodeName]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 2814:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_tabbable_role_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CSSUtil_1 = __webpack_require__(1775);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+exports.element_tabbable_role_valid = {
+ id: "element_tabbable_role_valid",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "element_tabbable_role_valid.html",
+ "fail_invalid_role": "element_tabbable_role_valid.html",
+ "group": "element_tabbable_role_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "The tabbable element has a widget role",
+ "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role",
+ "group": "A tabbable element must have a valid widget role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (legacy_1.RPTUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it
+ if (nodeName in legacy_1.RPTUtil.tabTagMap) {
+ var value = legacy_1.RPTUtil.tabTagMap[nodeName];
+ if (typeof (value) === "function") {
+ value = value(ruleContext);
+ }
+ if (value)
+ return null;
+ }
+ // handle the case: no tabindex or tabindex < 0
+ if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0)
+ return null;
+ // ignore elements with CSS overflow: scroll or auto
+ var styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ if (styles['overflow-x'] === 'scroll' || styles['overflow-y'] === 'scroll'
+ || styles['overflow-x'] === 'auto' || styles['overflow-y'] === 'auto')
+ return null;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application
+ if (roles && roles.includes("application"))
+ return null;
+ // elements whose roles allow no descendants that are interactive or with a tabindex >= 0
+ // this case should be handled in widget_tabbable_single and aria_child_tabbable
+ var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio",
+ "option", "radio", "switch", "tab"];
+ if (!roles || roles.length === 0) {
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ }
+ var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext);
+ var parent_roles = legacy_1.RPTUtil.getRoles(parent, true);
+ // ignore if one of the parent roles is in roles_no_interactive_child
+ for (var i = 0; i < parent_roles.length; i++) {
+ if (roles_no_interactive_child.includes(parent_roles[i]))
+ return null;
+ }
+ // handle the case: tabindex >= 0 to examine whether a widget role is setup or not
+ // pass if one of the roles is a widget type
+ for (var i = 0; i < roles.length; i++) {
+ // Row is weird. It's structure, but can also be widget
+ if (roles[i] === "row" || ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]].roleType === 'widget') {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ // Focusable separators are widgets
+ if (roles[i] === "separator") {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+ return (0, IRule_1.RuleFail)("fail_invalid_role", [roles.length === 0 ? 'none' : roles.join(', ')]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 7601:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_tabbable_visible = void 0;
+var legacy_1 = __webpack_require__(8422);
+var CSSUtil_1 = __webpack_require__(1775);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.element_tabbable_visible = {
+ id: "element_tabbable_visible",
+ context: "dom:*",
+ dependencies: [],
+ help: {
+ "en-US": {
+ "group": "element_tabbable_visible.html",
+ "pass": "element_tabbable_visible.html",
+ "potential_visible": "element_tabbable_visible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "A tabbable element should be visible on the screen when it has keyboard focus",
+ "pass": "The tabbable element is visible on the screen",
+ "potential_visible": "Confirm the element should be tabbable, and is visible on the screen when it has keyboard focus"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ num: ["2.4.7"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.isTabbable(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLocaleLowerCase();
+ var bounds = context["dom"].bounds;
+ //in case the bounds not available
+ if (!bounds)
+ return null;
+ // defined styles only give the styles that changed
+ var defined_styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ var onfocus_styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext, ":focus");
+ if (bounds['height'] === 0 || bounds['width'] === 0
+ || (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)'
+ && !onfocus_styles['clip']))
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ if (bounds['top'] >= 0 && bounds['left'] >= 0)
+ return (0, IRule_1.RulePass)("pass");
+ var default_styles = (0, CSSUtil_1.getComputedStyle)(ruleContext);
+ var top = bounds['top'];
+ var left = bounds['left'];
+ if (Object.keys(onfocus_styles).length === 0) {
+ // no onfocus position change, but could be changed from js
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ }
+ else {
+ // with onfocus position change
+ var positions = ['absolute', 'fixed'];
+ if (typeof onfocus_styles['top'] !== 'undefined') {
+ if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) {
+ top = onfocus_styles['top'].replace(/\D/g, '');
+ }
+ else {
+ // the position is undefined and the parent's position is 'relative'
+ top = Number.MIN_VALUE;
+ }
+ }
+ if (typeof onfocus_styles['left'] !== 'undefined') {
+ if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) {
+ left = onfocus_styles['left'].replace(/\D/g, '');
+ }
+ else {
+ // the position is undefined and the parent's position is 'relative'
+ left = Number.MIN_VALUE;
+ }
+ }
+ }
+ if (top >= 0 && left >= 0)
+ return (0, IRule_1.RulePass)("pass");
+ else
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4497:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.embed_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.embed_alt_exists = {
+ id: "embed_alt_exists",
+ context: "dom:embed",
+ refactor: {
+ "RPT_Embed_HasAlt": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "embed_alt_exists.html",
+ "Potential_1": "embed_alt_exists.html",
+ "group": "embed_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the element has alternative content",
+ "group": "Provide alternative content for elements"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt");
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 152:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.embed_noembed_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.embed_noembed_exists = {
+ id: "embed_noembed_exists",
+ context: "dom:embed",
+ refactor: {
+ "WCAG20_Embed_HasNoEmbed": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "embed_noembed_exists.html",
+ "Potential_1": "embed_noembed_exists.html",
+ "group": "embed_noembed_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the element is immediately followed by a non-embedded element",
+ "group": " elements should be immediately followed by a non-embedded element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = ruleContext.getElementsByTagName("noembed").length > 0;
+ if (!passed) {
+ var walkNode = ruleContext.nextSibling;
+ while (!passed && walkNode !== null) {
+ if (walkNode.nodeName.toLowerCase() == "noembed")
+ passed = true;
+ else if (walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0)
+ break;
+ else if (walkNode.nodeType == 1)
+ break;
+ walkNode = walkNode.nextSibling;
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 935:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.emoticons_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.emoticons_alt_exists = {
+ id: "emoticons_alt_exists",
+ context: "dom:*",
+ refactor: {
+ "WCAG20_Text_Emoticons": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "emoticons_alt_exists.html",
+ "Potential_1": "emoticons_alt_exists.html",
+ "group": "emoticons_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that emoticons have a text alternative",
+ "group": "Emoticons must have a short text alternative that describes their purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ emoticons: {
+ value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:",
+ ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[",
+ "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P",
+ ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O",
+ "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|",
+ "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(",
+ "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)",
+ "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<",
+ "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.\\m/", "\\o/", "\\o o/",
+ "o/\\o", ":&", ":u"
+ ],
+ type: "[string]"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var emoticons = validateParams.emoticons.value;
+ var passed = true;
+ var testText = "";
+ var walkNode = ruleContext.firstChild;
+ while (walkNode) {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName == "#text") {
+ testText += " " + walkNode.nodeValue;
+ }
+ walkNode = walkNode.nextSibling;
+ }
+ if (testText.trim().length > 0) {
+ for (var j = 0; passed && j < emoticons.length; ++j) {
+ var emotIdx = testText.indexOf(emoticons[j]);
+ var eLngth = emoticons[j].length;
+ while (passed && emotIdx != -1) {
+ // Passes if: the emoticon is not preceded by whitespace,
+ // or the emoticon is not followed by whitespace unless it's punctuation,
+ // or it's in a pre, code, or script
+ passed =
+ (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) ||
+ (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) &&
+ !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)));
+ // Allow usage of (: stuff :) since this is a comment in some languages
+ passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText));
+ passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText));
+ emotIdx = testText.indexOf(emoticons[j], emotIdx + 1);
+ }
+ }
+ }
+ if (!passed) {
+ // Don't trigger if we're not in the body or if we're in a script, pre, code
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]);
+ passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body";
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9719:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.error_message_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var VisUtil_1 = __webpack_require__(8174);
+exports.error_message_exists = {
+ id: "error_message_exists",
+ context: "dom:*[aria-invalid=true]",
+ refactor: {
+ "HAAC_Aria_ErrorMessage": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "error_message_exists.html",
+ "Fail_1": "error_message_exists.html",
+ "Fail_2": "error_message_exists.html",
+ "group": "error_message_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Custom error message has invalid reference 'id' value",
+ "Fail_2": "Custom error message is not visible",
+ "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var aria_errMsgId = legacy_1.RPTUtil.getAriaAttribute(ruleContext, "aria-errormessage");
+ // If aria-errormessage is not provided, then OUT_OF_SCOPE
+ if (!aria_errMsgId) {
+ return null;
+ }
+ var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId);
+ // POF0: Invalid id reference
+ if (!msg_ele) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ // POF1: Referenced element is not visible
+ if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+};
+
+
+/***/ }),
+
+/***/ 5625:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.fieldset_label_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIAMapper_1 = __webpack_require__(4944);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.fieldset_label_valid = {
+ id: "fieldset_label_valid",
+ context: "aria:group",
+ refactor: {
+ "group_withInputs_hasName": {
+ "Pass_1": "Pass_1",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_1": "fieldset_label_valid.html",
+ "Fail_1": "fieldset_label_valid.html",
+ "Fail_2": "fieldset_label_valid.html",
+ "group": "fieldset_label_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name",
+ "Fail_1": "Group/Fieldset does not have an accessible name",
+ "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group",
+ "group": "Groups with nested inputs must have unique accessible name"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1", "3.3.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var formCache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "landmark_group_input", null);
+ if (!formCache) {
+ formCache = {
+ groupsWithInputs: [],
+ groupsWithInputsComputedLabels: [],
+ };
+ var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]');
+ var allGroups = Array.from(allGroupsTemp);
+ var groupsWithInputs = [];
+ for (var i = 0; i < allGroups.length; i++) {
+ // Loop over all the group nodes
+ if (allGroups[i].querySelector("input")) {
+ groupsWithInputs.push(allGroups[i]);
+ }
+ }
+ var groupsWithInputsComputedLabels = [];
+ for (var i = 0; i < groupsWithInputs.length; i++) {
+ // Loop over all the landmark nodes
+ groupsWithInputsComputedLabels.push(ARIAMapper_1.ARIAMapper.computeName(groupsWithInputs[i]));
+ }
+ formCache.groupsWithInputs = groupsWithInputs;
+ formCache.groupsWithInputsComputedLabels =
+ groupsWithInputsComputedLabels;
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "landmark_group_input", formCache);
+ }
+ // formCache.groupsWithInputs.forEach(element => {
+ // console.log("formCache.groupsWithInputs: " +element.id)
+ // });
+ // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels)
+ // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length)
+ var ruleContextFoundIngroupsWithInputsFlag = false;
+ var computedName = "";
+ if (!formCache.groupsWithInputs) {
+ // We do not have any groups with inputs. Therefore we should skip this rule trigger.
+ return null;
+ }
+ for (var i = 0; i < formCache.groupsWithInputs.length; i++) {
+ if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) {
+ // We have found our ruleContext in the cache
+ ruleContextFoundIngroupsWithInputsFlag = true;
+ if (formCache.groupsWithInputsComputedLabels[i] === "" ||
+ formCache.groupsWithInputsComputedLabels[i] === null) {
+ // console.log("Fail_1")
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ var foundSameNameFlag = false;
+ for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) {
+ if (i == j) {
+ continue;
+ } // We do not want to compare against ourselfs
+ if (formCache.groupsWithInputsComputedLabels[i] ===
+ formCache.groupsWithInputsComputedLabels[j]) {
+ foundSameNameFlag = true;
+ }
+ }
+ if (foundSameNameFlag) {
+ // console.log("Fail_2")
+ return (0, IRule_1.RuleFail)("Fail_2", [
+ formCache.groupsWithInputsComputedLabels[i],
+ ]);
+ }
+ computedName = formCache.groupsWithInputsComputedLabels[i];
+ }
+ }
+ if (!ruleContextFoundIngroupsWithInputsFlag) {
+ // console.log("null return")
+ return null;
+ }
+ // console.log("Pass_1")
+ return (0, IRule_1.RulePass)("Pass_1", [computedName]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 9115:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.fieldset_legend_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.fieldset_legend_valid = {
+ id: "fieldset_legend_valid",
+ context: "dom:fieldset",
+ refactor: {
+ "WCAG20_Fieldset_HasLegend": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "fieldset_legend_valid.html",
+ "Fail_1": "fieldset_legend_valid.html",
+ "Fail_2": "fieldset_legend_valid.html",
+ "Fail_3": "fieldset_legend_valid.html",
+ "group": "fieldset_legend_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": " element does not have a ",
+ "Fail_2": " element has more than one ",
+ "Fail_3": " element is empty",
+ "group": " elements must have a single, non-empty as a label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // In the case a legend is hidden, we should still trigger a violations for this
+ var legends = legacy_1.RPTUtil.getChildByTagHidden(ruleContext, "legend", true, false);
+ if (legends.length === 0) {
+ // Fieldset has NO Legend
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else if (legends.length > 1) {
+ // Fieldset has more than one legend
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ else if (legacy_1.RPTUtil.getInnerText(legends[0]).trim().length === 0) {
+ // Fieldset has legend but legend is empty
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6072:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.figure_label_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+exports.figure_label_exists = {
+ id: "figure_label_exists",
+ context: "dom:figure",
+ refactor: {
+ "HAAC_Figure_label": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "figure_label_exists.html",
+ "Fail_1": "figure_label_exists.html",
+ "group": "figure_label_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element does not have an associated label",
+ "group": "A element must have an associated label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = false;
+ var figures = ruleContext.getElementsByTagName("figcaption");
+ // Loop over all the figcaption elements to make sure there is at least one that is not empty and not hidden.
+ for (var i = 0; !passed && i < figures.length; ++i) {
+ // Mark this rule as passed if any one of the figurecaption element has content and is visible
+ if (figures[i].innerHTML.trim().length > 0 && VisUtil_1.VisUtil.isNodeVisible(figures[i])) {
+ passed = true;
+ }
+ }
+ if (!passed) {
+ // we only check if the "aria-labelledby" is there. There is a different rule to check if the id is valid.
+ passed = ruleContext.hasAttribute("aria-labelledby") && ruleContext.getAttribute("aria-labelledby").trim().length > 0;
+ }
+ //return new ValidationResult(passed, [ruleContext], '', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", []);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6923:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_font_color = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.form_font_color = {
+ id: "form_font_color",
+ context: "dom:form",
+ refactor: {
+ "RPT_Font_ColorInForm": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_font_color.html",
+ "Potential_1": "form_font_color.html",
+ "group": "form_font_color.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check color is not used as the only visual means to convey which fields are required",
+ "group": "Combine color and descriptive markup to indicate required form fields"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = true;
+ var fonts = ruleContext.getElementsByTagName("font");
+ if (fonts != null) {
+ for (var i = 0; i < fonts.length; ++i) {
+ passed = !fonts[i].hasAttribute("color");
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9015:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_interaction_review = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.form_interaction_review = {
+ id: "form_interaction_review",
+ context: "dom:form[target]",
+ refactor: {
+ "WCAG20_Form_TargetAndText": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_interaction_review.html",
+ "Potential_1": "form_interaction_review.html",
+ "group": "form_interaction_review.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user",
+ "group": "User should be informed in advance when interacting with content causes a change of context"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.2.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ paramWinText: {
+ value: ["new window"],
+ type: "array"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var tStr = ruleContext.getAttribute("target");
+ var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || legacy_1.RPTUtil.getFrameByName(ruleContext, tStr) != null;
+ if (!passed) {
+ // Name is not part of this frameset – must have potential to create new window?
+ // See if a new window is mentioned
+ var textStr = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute("title"))
+ textStr += " " + ruleContext.getAttribute("title");
+ for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i)
+ if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1)
+ passed = true;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3611:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.form_label_unique = {
+ id: "form_label_unique",
+ context: "dom:label[for]",
+ refactor: {
+ "RPT_Label_UniqueFor": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_label_unique.html",
+ "Fail_1": "form_label_unique.html",
+ "group": "form_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Form control has more than one label",
+ "group": "Form controls should have exactly one label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // JCH - NO OUT OF SCOPE hidden in context
+ var labelIds = (0, CacheUtil_1.getCache)(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {});
+ var id = ruleContext.getAttribute("for");
+ var passed = !(id in labelIds);
+ labelIds[id] = true;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4846:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ 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
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_submit_button_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.form_submit_button_exists = {
+ id: "form_submit_button_exists",
+ context: "dom:form",
+ refactor: {
+ "WCAG20_Form_HasSubmit": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_submit_button_exists.html",
+ "Potential_1": "form_submit_button_exists.html",
+ "group": "form_submit_button_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify the