UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

307 lines (303 loc) 39 kB
"use strict"; require("core-js/modules/es.symbol.js"); require("core-js/modules/es.symbol.description.js"); require("core-js/modules/es.symbol.iterator.js"); require("core-js/modules/es.array.from.js"); require("core-js/modules/es.array.is-array.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.array.slice.js"); require("core-js/modules/es.date.to-string.js"); require("core-js/modules/es.object.define-property.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.regexp.to-string.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/web.dom-collections.iterator.js"); Object.defineProperty(exports, "__esModule", { value: true }); exports.parseTexte = parseTexte; require("core-js/modules/es.array.includes.js"); require("core-js/modules/es.function.name.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.string.includes.js"); require("core-js/modules/es.string.match.js"); require("core-js/modules/es.string.replace.js"); require("core-js/modules/es.string.trim.js"); var _assert = _interopRequireDefault(require("assert")); var _jsdom = require("jsdom"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function parseHeader(header) { var headersMapping = [{ regex: /^(RAPPORT_)?ANNEXE(_|$)|^ETAT_/, level: 0, name: "Annexe" }, { regex: /^TOME_/, level: 1, name: "Tome" }, { regex: /^PARTIE_|^(PREMIERE|SECONDE|DEUXIEME|TROISIEME|QUATRIEME)_PARTIE(_|$)/, level: 2, name: "Partie" }, { regex: /^LIVRE_/, level: 3, name: "Livre" }, { regex: /^TITRE_/, level: 4, name: "Titre" }, { regex: /^SOUSTITRE_/, level: 5, name: "SousTitre" }, { regex: /^CHAPITRE_/, level: 6, name: "Chapitre" }, { regex: /^SECTION_/, level: 7, name: "Section" }, { regex: /^SOUSSECTION_/, level: 8, name: "SousSection" }, { regex: /^ARTICLES?_/, level: 9, name: "Article" }, { regex: /^EXPOSE_DES_MOTIFS$/, level: 9, name: "ExposeMotifs" }]; for (var _i = 0, _headersMapping = headersMapping; _i < _headersMapping.length; _i++) { var _headersMapping$_i = _headersMapping[_i], regex = _headersMapping$_i.regex, level = _headersMapping$_i.level, name = _headersMapping$_i.name; if (header.match(regex)) { return [level, name]; } } return [null, ""]; } function cleanText(text) { return (text === null || text === void 0 ? void 0 : text.replace(/[\n\t]+/g, "").trim()) || ""; } var excludedAlineas = [/^Délibéré en séance publique/, /^Fait le/, /^Le Président,$/, /^Signé/]; function parseTexte(assembleeUrl, page) { // Repair HTML. var html = page.replace(/(<style[\w\W]+style>)/g, ""); // Extract subdivisions from HTML. var _JSDOM = new _jsdom.JSDOM(html), window = _JSDOM.window; var document = window.document; _assert["default"].strictEqual(document.children.length, 1); var htmlElement = document.children[0]; _assert["default"].strictEqual(htmlElement.children.length, 2); var bodyElement = htmlElement.children[1]; if (bodyElement.children.length < 3) { // Occurs in http://www.assemblee-nationale.fr/15/textes/0326.asp. window.close(); // Free memory. return { error: { code: -1, message: "Texte de loi sans contenu" }, html: html, page: page }; } _assert["default"].strictEqual(bodyElement.children[0].tagName, "DIV"); // First child is a DIV describing the document (Assemblée's header). Skip it for now. var bodyChild = bodyElement.children[1]; _assert["default"].strictEqual(bodyChild.tagName, "BR"); var alineaElement = null; var isMultiLinesHeader = false; var level = null; var levels = []; var nextParentState = null; var state = "nextBodyChild"; var subdivisions = []; var subdivisionAlineas = null; var subdivisionHeaders = null; while (state !== null) { switch (state) { case "nextBodyChild": if (bodyChild.nextElementSibling === null) { // The document has been fully parsed. state = null; } else { bodyChild = bodyChild.nextElementSibling; if (bodyChild.tagName === "DIV") { alineaElement = bodyChild.children[0]; if (alineaElement === undefined || bodyChild.id.includes("ftn")) { // No alinea in current bodyChild: go to next bodyChild. state = "nextBodyChild"; } else { state = "alineaElement"; } } else { // <P/> is for footnotes (0, _assert["default"])(["BR", "HR", "P"].includes(bodyChild.tagName), "Unexpected tag name \"".concat(bodyChild.tagName, "\" for body child")); // Stay in the same state to go to next bodyChild. } } break; case "alineaElement": switch (alineaElement.tagName) { case "DIV": state = "nextAlineaElement"; break; case "H4": // TODO nextParentState = "nextAlineaElement"; state = "firstParagraphChild"; break; case "P": nextParentState = "nextAlineaElement"; state = "firstParagraphChild"; break; case "OL": // TODO state = "nextAlineaElement"; break; case "TABLE": nextParentState = "nextAlineaElement"; state = "firstParagraphChild"; break; default: return { error: { code: -2, message: "Unexpected tag name for alinea element: ".concat(alineaElement.tagName) }, html: html, page: page }; } break; case "firstParagraphChild": var headerText = alineaElement.textContent; var nameComputed = (headerText || "").normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\(nouveau\)/, "").replace(/\(Pour coordination\)/, "").replace(/\(Supprimés?\)/, "").replace(/ /g, " ").replace(/[\-,.…]/g, "").trim().replace(/ {1,}/g, "_"); var nameUpper = nameComputed.toUpperCase(); var _parseHeader = parseHeader(nameUpper), _parseHeader2 = _slicedToArray(_parseHeader, 2), nextLevel = _parseHeader2[0], paragraphType = _parseHeader2[1]; if (!nameUpper || nameUpper.match(/^(PROJET|PROPOSITION)_DE_LOI(_|$)/) !== null) { // Occurs in: // * http://www.assemblee-nationale.fr/15/textes/0232.asp // * http://www.assemblee-nationale.fr/15/textes/0626.asp // * http://www.assemblee-nationale.fr/15/textes/0676.asp state = nextParentState; break; } else if (nameUpper === "JEUX_OLYMPIQUES_ET_PARALYMPIQUES_DE_2024") { // Occurs in http://www.assemblee-nationale.fr/15/textes/0676.asp state = nextParentState; break; } else if (nameUpper === "TEXTE_DE_LA_COMMISSION_MIXTE_PARITAIRE") { // Occurs in http://www.assemblee-nationale.fr/15/textes/1294.asp state = nextParentState; break; } var lineHtml = cleanText(alineaElement.outerHTML); var lineText = cleanText(alineaElement.textContent); if (nextLevel === null) { // It is a regular alinea // Exclude some alineas var excludeAlinea = false; var _iterator = _createForOfIteratorHelper(excludedAlineas), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var regex = _step.value; if (regex.test(lineText)) { excludeAlinea = true; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (excludeAlinea) { state = nextParentState; break; } if (subdivisionHeaders.length === 0 || isMultiLinesHeader && subdivisionAlineas.length === 0) { subdivisionHeaders.push({ texte: lineText, html: lineHtml }); } else { subdivisionAlineas.push({ texte: lineText, html: lineHtml }); } if (isMultiLinesHeader && subdivisionHeaders.length >= 2) { isMultiLinesHeader = false; } // Skip paragraph. state = nextParentState; break; } else if (nextLevel !== null) { // It is a header level = nextLevel; while (levels.length > 0 && level < levels[levels.length - 1]) { levels.pop(); } if (levels.length === 0 || level > levels[levels.length - 1]) { levels.push(level); } subdivisionAlineas = []; subdivisionHeaders = [{ texte: lineText, html: lineHtml }]; // Articles & "Exposé des motifs" are the only divisions without second title. isMultiLinesHeader = nameUpper.match(/^ARTICLES?_/) === null && nameUpper.match(/^EXPOSE_DES_MOTIFS$/) === null; subdivisions.push({ id: "D_" + nameComputed, type: paragraphType, niveau: level + 1, niveauRelatif: levels.length, titres: subdivisionHeaders, alineas: subdivisionAlineas }); } state = nextParentState; break; case "nextAlineaElement": alineaElement = alineaElement.nextElementSibling; if (alineaElement === null) { // The bodyChild has been fully parsed. Go to next bodyChild state = "nextBodyChild"; } else { state = "alineaElement"; } break; default: throw "Unexpected state: ".concat(state); } } window.close(); // Free memory. return { error: null, html: html, page: page, subdivisions: subdivisions, url: assembleeUrl }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfanNkb20iLCJlIiwiX19lc01vZHVsZSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX3NsaWNlZFRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJsIiwiaSIsIk9iamVjdCIsInB1c2giLCJwYXJzZUhlYWRlciIsImhlYWRlciIsImhlYWRlcnNNYXBwaW5nIiwicmVnZXgiLCJsZXZlbCIsIl9pIiwiX2hlYWRlcnNNYXBwaW5nIiwiX2hlYWRlcnNNYXBwaW5nJF9pIiwibWF0Y2giLCJjbGVhblRleHQiLCJ0ZXh0IiwicmVwbGFjZSIsInRyaW0iLCJleGNsdWRlZEFsaW5lYXMiLCJwYXJzZVRleHRlIiwiYXNzZW1ibGVlVXJsIiwicGFnZSIsImh0bWwiLCJfSlNET00iLCJKU0RPTSIsIndpbmRvdyIsImRvY3VtZW50IiwiYXNzZXJ0Iiwic3RyaWN0RXF1YWwiLCJjaGlsZHJlbiIsImh0bWxFbGVtZW50IiwiYm9keUVsZW1lbnQiLCJjbG9zZSIsImVycm9yIiwiY29kZSIsIm1lc3NhZ2UiLCJ0YWdOYW1lIiwiYm9keUNoaWxkIiwiYWxpbmVhRWxlbWVudCIsImlzTXVsdGlMaW5lc0hlYWRlciIsImxldmVscyIsIm5leHRQYXJlbnRTdGF0ZSIsInN0YXRlIiwic3ViZGl2aXNpb25zIiwic3ViZGl2aXNpb25BbGluZWFzIiwic3ViZGl2aXNpb25IZWFkZXJzIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidW5kZWZpbmVkIiwiaWQiLCJpbmNsdWRlcyIsImNvbmNhdCIsImhlYWRlclRleHQiLCJ0ZXh0Q29udGVudCIsIm5hbWVDb21wdXRlZCIsIm5vcm1hbGl6ZSIsIm5hbWVVcHBlciIsInRvVXBwZXJDYXNlIiwiX3BhcnNlSGVhZGVyIiwiX3BhcnNlSGVhZGVyMiIsIm5leHRMZXZlbCIsInBhcmFncmFwaFR5cGUiLCJsaW5lSHRtbCIsIm91dGVySFRNTCIsImxpbmVUZXh0IiwiZXhjbHVkZUFsaW5lYSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiZXJyIiwidGV4dGUiLCJwb3AiLCJ0eXBlIiwibml2ZWF1Iiwibml2ZWF1UmVsYXRpZiIsInRpdHJlcyIsImFsaW5lYXMiLCJ1cmwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2Vycy90ZXh0ZXNfbG9pcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgSlNET00gfSBmcm9tIFwianNkb21cIlxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcihoZWFkZXI6IHN0cmluZyk6IFtudW1iZXIgfCBudWxsLCBzdHJpbmddIHtcbiAgY29uc3QgaGVhZGVyc01hcHBpbmc6IHsgcmVnZXg6IFJlZ0V4cDsgbGV2ZWw6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHJlZ2V4OiAvXihSQVBQT1JUXyk/QU5ORVhFKF98JCl8XkVUQVRfLywgbGV2ZWw6IDAsIG5hbWU6IFwiQW5uZXhlXCIgfSxcbiAgICB7IHJlZ2V4OiAvXlRPTUVfLywgbGV2ZWw6IDEsIG5hbWU6IFwiVG9tZVwiIH0sXG4gICAge1xuICAgICAgcmVnZXg6XG4gICAgICAgIC9eUEFSVElFX3xeKFBSRU1JRVJFfFNFQ09OREV8REVVWElFTUV8VFJPSVNJRU1FfFFVQVRSSUVNRSlfUEFSVElFKF98JCkvLFxuICAgICAgbGV2ZWw6IDIsXG4gICAgICBuYW1lOiBcIlBhcnRpZVwiLFxuICAgIH0sXG4gICAgeyByZWdleDogL15MSVZSRV8vLCBsZXZlbDogMywgbmFtZTogXCJMaXZyZVwiIH0sXG4gICAgeyByZWdleDogL15USVRSRV8vLCBsZXZlbDogNCwgbmFtZTogXCJUaXRyZVwiIH0sXG4gICAgeyByZWdleDogL15TT1VTVElUUkVfLywgbGV2ZWw6IDUsIG5hbWU6IFwiU291c1RpdHJlXCIgfSxcbiAgICB7IHJlZ2V4OiAvXkNIQVBJVFJFXy8sIGxldmVsOiA2LCBuYW1lOiBcIkNoYXBpdHJlXCIgfSxcbiAgICB7IHJlZ2V4OiAvXlNFQ1RJT05fLywgbGV2ZWw6IDcsIG5hbWU6IFwiU2VjdGlvblwiIH0sXG4gICAgeyByZWdleDogL15TT1VTU0VDVElPTl8vLCBsZXZlbDogOCwgbmFtZTogXCJTb3VzU2VjdGlvblwiIH0sXG4gICAgeyByZWdleDogL15BUlRJQ0xFUz9fLywgbGV2ZWw6IDksIG5hbWU6IFwiQXJ0aWNsZVwiIH0sXG4gICAgeyByZWdleDogL15FWFBPU0VfREVTX01PVElGUyQvLCBsZXZlbDogOSwgbmFtZTogXCJFeHBvc2VNb3RpZnNcIiB9LFxuICBdXG5cbiAgZm9yIChsZXQgeyByZWdleCwgbGV2ZWwsIG5hbWUgfSBvZiBoZWFkZXJzTWFwcGluZykge1xuICAgIGlmIChoZWFkZXIubWF0Y2gocmVnZXgpKSB7XG4gICAgICByZXR1cm4gW2xldmVsLCBuYW1lXVxuICAgIH1cbiAgfVxuICByZXR1cm4gW251bGwsIFwiXCJdXG59XG5cbmZ1bmN0aW9uIGNsZWFuVGV4dCh0ZXh0OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQ/LnJlcGxhY2UoL1tcXG5cXHRdKy9nLCBcIlwiKS50cmltKCkgfHwgXCJcIlxufVxuXG5jb25zdCBleGNsdWRlZEFsaW5lYXMgPSBbXG4gIC9eRMOpbGliw6lyw6kgZW4gc8OpYW5jZSBwdWJsaXF1ZS8sXG4gIC9eRmFpdCBsZS8sXG4gIC9eTGUgUHLDqXNpZGVudCwkLyxcbiAgL15TaWduw6kvLFxuXVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUZXh0ZShhc3NlbWJsZWVVcmw6IHN0cmluZywgcGFnZTogc3RyaW5nKSB7XG4gIC8vIFJlcGFpciBIVE1MLlxuICBsZXQgaHRtbCA9IHBhZ2UucmVwbGFjZSgvKDxzdHlsZVtcXHdcXFddK3N0eWxlPikvZywgXCJcIilcblxuICAvLyBFeHRyYWN0IHN1YmRpdmlzaW9ucyBmcm9tIEhUTUwuXG4gIGNvbnN0IHsgd2luZG93IH0gPSBuZXcgSlNET00oaHRtbClcbiAgY29uc3QgeyBkb2N1bWVudCB9ID0gd2luZG93XG4gIGFzc2VydC5zdHJpY3RFcXVhbChkb2N1bWVudC5jaGlsZHJlbi5sZW5ndGgsIDEpXG4gIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY2hpbGRyZW5bMF1cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKGh0bWxFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCwgMilcbiAgY29uc3QgYm9keUVsZW1lbnQgPSBodG1sRWxlbWVudC5jaGlsZHJlblsxXVxuXG4gIGlmIChib2R5RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPCAzKSB7XG4gICAgLy8gT2NjdXJzIGluIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMDMyNi5hc3AuXG4gICAgd2luZG93LmNsb3NlKCkgLy8gRnJlZSBtZW1vcnkuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6IC0xLCBtZXNzYWdlOiBcIlRleHRlIGRlIGxvaSBzYW5zIGNvbnRlbnVcIiB9LFxuICAgICAgaHRtbCxcbiAgICAgIHBhZ2UsXG4gICAgfVxuICB9XG4gIGFzc2VydC5zdHJpY3RFcXVhbChib2R5RWxlbWVudC5jaGlsZHJlblswXS50YWdOYW1lLCBcIkRJVlwiKVxuICAvLyBGaXJzdCBjaGlsZCBpcyBhIERJViBkZXNjcmliaW5nIHRoZSBkb2N1bWVudCAoQXNzZW1ibMOpZSdzIGhlYWRlcikuIFNraXAgaXQgZm9yIG5vdy5cbiAgbGV0IGJvZHlDaGlsZCA9IGJvZHlFbGVtZW50LmNoaWxkcmVuWzFdXG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHlDaGlsZC50YWdOYW1lLCBcIkJSXCIpXG4gIGxldCBhbGluZWFFbGVtZW50OiBFbGVtZW50IHwgbnVsbCA9IG51bGxcbiAgbGV0IGlzTXVsdGlMaW5lc0hlYWRlcjogYm9vbGVhbiA9IGZhbHNlXG4gIGxldCBsZXZlbDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgbGV0IGxldmVsczogbnVtYmVyW10gPSBbXVxuICBsZXQgbmV4dFBhcmVudFN0YXRlID0gbnVsbFxuICBsZXQgc3RhdGU6IHN0cmluZyB8IG51bGwgPSBcIm5leHRCb2R5Q2hpbGRcIlxuICBjb25zdCBzdWJkaXZpc2lvbnMgPSBbXVxuICBsZXQgc3ViZGl2aXNpb25BbGluZWFzOiBvYmplY3RbXSB8IG51bGwgPSBudWxsXG4gIGxldCBzdWJkaXZpc2lvbkhlYWRlcnM6IG9iamVjdFtdIHwgbnVsbCA9IG51bGxcbiAgd2hpbGUgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgY2FzZSBcIm5leHRCb2R5Q2hpbGRcIjpcbiAgICAgICAgaWYgKGJvZHlDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkLlxuICAgICAgICAgIHN0YXRlID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvZHlDaGlsZCA9IGJvZHlDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgICBpZiAoYm9keUNoaWxkLnRhZ05hbWUgPT09IFwiRElWXCIpIHtcbiAgICAgICAgICAgIGFsaW5lYUVsZW1lbnQgPSBib2R5Q2hpbGQuY2hpbGRyZW5bMF1cblxuICAgICAgICAgICAgaWYgKGFsaW5lYUVsZW1lbnQgPT09IHVuZGVmaW5lZCB8fCBib2R5Q2hpbGQuaWQuaW5jbHVkZXMoXCJmdG5cIikpIHtcbiAgICAgICAgICAgICAgLy8gTm8gYWxpbmVhIGluIGN1cnJlbnQgYm9keUNoaWxkOiBnbyB0byBuZXh0IGJvZHlDaGlsZC5cbiAgICAgICAgICAgICAgc3RhdGUgPSBcIm5leHRCb2R5Q2hpbGRcIlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBcImFsaW5lYUVsZW1lbnRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyA8UC8+IGlzIGZvciBmb290bm90ZXNcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgW1wiQlJcIiwgXCJIUlwiLCBcIlBcIl0uaW5jbHVkZXMoYm9keUNoaWxkLnRhZ05hbWUpLFxuICAgICAgICAgICAgICBgVW5leHBlY3RlZCB0YWcgbmFtZSBcIiR7Ym9keUNoaWxkLnRhZ05hbWV9XCIgZm9yIGJvZHkgY2hpbGRgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLy8gU3RheSBpbiB0aGUgc2FtZSBzdGF0ZSB0byBnbyB0byBuZXh0IGJvZHlDaGlsZC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJhbGluZWFFbGVtZW50XCI6XG4gICAgICAgIHN3aXRjaCAoYWxpbmVhRWxlbWVudCEudGFnTmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJESVZcIjpcbiAgICAgICAgICAgIHN0YXRlID0gXCJuZXh0QWxpbmVhRWxlbWVudFwiXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgXCJINFwiOlxuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgbmV4dFBhcmVudFN0YXRlID0gXCJuZXh0QWxpbmVhRWxlbWVudFwiXG4gICAgICAgICAgICBzdGF0ZSA9IFwiZmlyc3RQYXJhZ3JhcGhDaGlsZFwiXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgXCJQXCI6XG4gICAgICAgICAgICBuZXh0UGFyZW50U3RhdGUgPSBcIm5leHRBbGluZWFFbGVtZW50XCJcbiAgICAgICAgICAgIHN0YXRlID0gXCJmaXJzdFBhcmFncmFwaENoaWxkXCJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBcIk9MXCI6XG4gICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICBzdGF0ZSA9IFwibmV4dEFsaW5lYUVsZW1lbnRcIlxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIFwiVEFCTEVcIjpcbiAgICAgICAgICAgIG5leHRQYXJlbnRTdGF0ZSA9IFwibmV4dEFsaW5lYUVsZW1lbnRcIlxuICAgICAgICAgICAgc3RhdGUgPSBcImZpcnN0UGFyYWdyYXBoQ2hpbGRcIlxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICBjb2RlOiAtMixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCB0YWcgbmFtZSBmb3IgYWxpbmVhIGVsZW1lbnQ6ICR7XG4gICAgICAgICAgICAgICAgICBhbGluZWFFbGVtZW50IS50YWdOYW1lXG4gICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGh0bWwsXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJmaXJzdFBhcmFncmFwaENoaWxkXCI6XG4gICAgICAgIGNvbnN0IGhlYWRlclRleHQgPSBhbGluZWFFbGVtZW50IS50ZXh0Q29udGVudFxuICAgICAgICBjb25zdCBuYW1lQ29tcHV0ZWQgPSAoaGVhZGVyVGV4dCB8fCBcIlwiKVxuICAgICAgICAgIC5ub3JtYWxpemUoXCJORkRcIilcbiAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIilcbiAgICAgICAgICAucmVwbGFjZSgvXFwobm91dmVhdVxcKS8sIFwiXCIpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKFBvdXIgY29vcmRpbmF0aW9uXFwpLywgXCJcIilcbiAgICAgICAgICAucmVwbGFjZSgvXFwoU3VwcHJpbcOpcz9cXCkvLCBcIlwiKVxuICAgICAgICAgIC5yZXBsYWNlKC/CoC9nLCBcIiBcIilcbiAgICAgICAgICAucmVwbGFjZSgvW1xcLSwu4oCmXS9nLCBcIlwiKVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAucmVwbGFjZSgvIHsxLH0vZywgXCJfXCIpXG5cbiAgICAgICAgY29uc3QgbmFtZVVwcGVyID0gbmFtZUNvbXB1dGVkLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgW25leHRMZXZlbCwgcGFyYWdyYXBoVHlwZV0gPSBwYXJzZUhlYWRlcihuYW1lVXBwZXIpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFuYW1lVXBwZXIgfHxcbiAgICAgICAgICBuYW1lVXBwZXIubWF0Y2goL14oUFJPSkVUfFBST1BPU0lUSU9OKV9ERV9MT0koX3wkKS8pICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE9jY3VycyBpbjpcbiAgICAgICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMDIzMi5hc3BcbiAgICAgICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMDYyNi5hc3BcbiAgICAgICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMDY3Ni5hc3BcbiAgICAgICAgICBzdGF0ZSA9IG5leHRQYXJlbnRTdGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAobmFtZVVwcGVyID09PSBcIkpFVVhfT0xZTVBJUVVFU19FVF9QQVJBTFlNUElRVUVTX0RFXzIwMjRcIikge1xuICAgICAgICAgIC8vIE9jY3VycyBpbiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzA2NzYuYXNwXG4gICAgICAgICAgc3RhdGUgPSBuZXh0UGFyZW50U3RhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWVVcHBlciA9PT0gXCJURVhURV9ERV9MQV9DT01NSVNTSU9OX01JWFRFX1BBUklUQUlSRVwiKSB7XG4gICAgICAgICAgLy8gT2NjdXJzIGluIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMTI5NC5hc3BcbiAgICAgICAgICBzdGF0ZSA9IG5leHRQYXJlbnRTdGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lSHRtbCA9IGNsZWFuVGV4dChhbGluZWFFbGVtZW50IS5vdXRlckhUTUwpXG4gICAgICAgIGNvbnN0IGxpbmVUZXh0ID0gY2xlYW5UZXh0KGFsaW5lYUVsZW1lbnQhLnRleHRDb250ZW50KVxuXG4gICAgICAgIGlmIChuZXh0TGV2ZWwgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJdCBpcyBhIHJlZ3VsYXIgYWxpbmVhXG4gICAgICAgICAgLy8gRXhjbHVkZSBzb21lIGFsaW5lYXNcbiAgICAgICAgICBsZXQgZXhjbHVkZUFsaW5lYSA9IGZhbHNlXG4gICAgICAgICAgZm9yIChsZXQgcmVnZXggb2YgZXhjbHVkZWRBbGluZWFzKSB7XG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChsaW5lVGV4dCkpIHtcbiAgICAgICAgICAgICAgZXhjbHVkZUFsaW5lYSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4Y2x1ZGVBbGluZWEpIHtcbiAgICAgICAgICAgIHN0YXRlID0gbmV4dFBhcmVudFN0YXRlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdWJkaXZpc2lvbkhlYWRlcnMhLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgKGlzTXVsdGlMaW5lc0hlYWRlciAmJiBzdWJkaXZpc2lvbkFsaW5lYXMhLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHN1YmRpdmlzaW9uSGVhZGVycyEucHVzaCh7XG4gICAgICAgICAgICAgIHRleHRlOiBsaW5lVGV4dCxcbiAgICAgICAgICAgICAgaHRtbDogbGluZUh0bWwsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJkaXZpc2lvbkFsaW5lYXMhLnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0ZTogbGluZVRleHQsXG4gICAgICAgICAgICAgIGh0bWw6IGxpbmVIdG1sLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzTXVsdGlMaW5lc0hlYWRlciAmJiBzdWJkaXZpc2lvbkhlYWRlcnMhLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBpc011bHRpTGluZXNIZWFkZXIgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTa2lwIHBhcmFncmFwaC5cbiAgICAgICAgICBzdGF0ZSA9IG5leHRQYXJlbnRTdGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dExldmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSXQgaXMgYSBoZWFkZXJcbiAgICAgICAgICBsZXZlbCA9IG5leHRMZXZlbFxuICAgICAgICAgIHdoaWxlIChsZXZlbHMubGVuZ3RoID4gMCAmJiBsZXZlbCA8IGxldmVsc1tsZXZlbHMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGxldmVscy5wb3AoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCB8fCBsZXZlbCA+IGxldmVsc1tsZXZlbHMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGxldmVscy5wdXNoKGxldmVsKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN1YmRpdmlzaW9uQWxpbmVhcyA9IFtdXG4gICAgICAgICAgc3ViZGl2aXNpb25IZWFkZXJzID0gW3sgdGV4dGU6IGxpbmVUZXh0LCBodG1sOiBsaW5lSHRtbCB9XVxuXG4gICAgICAgICAgLy8gQXJ0aWNsZXMgJiBcIkV4cG9zw6kgZGVzIG1vdGlmc1wiIGFyZSB0aGUgb25seSBkaXZpc2lvbnMgd2l0aG91dCBzZWNvbmQgdGl0bGUuXG4gICAgICAgICAgaXNNdWx0aUxpbmVzSGVhZGVyID1cbiAgICAgICAgICAgIG5hbWVVcHBlci5tYXRjaCgvXkFSVElDTEVTP18vKSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgbmFtZVVwcGVyLm1hdGNoKC9eRVhQT1NFX0RFU19NT1RJRlMkLykgPT09IG51bGxcblxuICAgICAgICAgIHN1YmRpdmlzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBcIkRfXCIgKyBuYW1lQ29tcHV0ZWQsXG4gICAgICAgICAgICB0eXBlOiBwYXJhZ3JhcGhUeXBlLFxuICAgICAgICAgICAgbml2ZWF1OiBsZXZlbCArIDEsXG4gICAgICAgICAgICBuaXZlYXVSZWxhdGlmOiBsZXZlbHMubGVuZ3RoLFxuICAgICAgICAgICAgdGl0cmVzOiBzdWJkaXZpc2lvbkhlYWRlcnMsXG4gICAgICAgICAgICBhbGluZWFzOiBzdWJkaXZpc2lvbkFsaW5lYXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gbmV4dFBhcmVudFN0YXRlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibmV4dEFsaW5lYUVsZW1lbnRcIjpcbiAgICAgICAgYWxpbmVhRWxlbWVudCA9IGFsaW5lYUVsZW1lbnQhLm5leHRFbGVtZW50U2libGluZ1xuICAgICAgICBpZiAoYWxpbmVhRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoZSBib2R5Q2hpbGQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkLiBHbyB0byBuZXh0IGJvZHlDaGlsZFxuICAgICAgICAgIHN0YXRlID0gXCJuZXh0Qm9keUNoaWxkXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZSA9IFwiYWxpbmVhRWxlbWVudFwiXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IGBVbmV4cGVjdGVkIHN0YXRlOiAke3N0YXRlfWBcbiAgICB9XG4gIH1cblxuICB3aW5kb3cuY2xvc2UoKSAvLyBGcmVlIG1lbW9yeS5cblxuICByZXR1cm4ge1xuICAgIGVycm9yOiBudWxsLFxuICAgIGh0bWwsXG4gICAgcGFnZSxcbiAgICBzdWJkaXZpc2lvbnMsXG4gICAgdXJsOiBhc3NlbWJsZWVVcmwsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFBNkIsU0FBQUQsdUJBQUFHLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxnQkFBQUEsQ0FBQTtBQUFBLFNBQUFFLDJCQUFBQyxDQUFBLEVBQUFILENBQUEsUUFBQUksQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRixDQUFBLENBQUFFLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSCxDQUFBLHFCQUFBQyxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTCxDQUFBLE1BQUFDLENBQUEsR0FBQUssMkJBQUEsQ0FBQU4sQ0FBQSxNQUFBSCxDQUFBLElBQUFHLENBQUEsdUJBQUFBLENBQUEsQ0FBQU8sTUFBQSxJQUFBTixDQUFBLEtBQUFELENBQUEsR0FBQUMsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFB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