UNPKG

@tricoteuses/assemblee

Version:

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

265 lines (261 loc) 34.3 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.iterator.js"); require("core-js/modules/es.array.slice.js"); require("core-js/modules/es.date.to-string.js"); require("core-js/modules/es.function.name.js"); require("core-js/modules/es.object.define-property.js"); require("core-js/modules/es.regexp.exec.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.cleanActeur = cleanActeur; exports.cleanRapporteur = cleanRapporteur; require("core-js/modules/es.array.filter.js"); require("core-js/modules/es.array.includes.js"); require("core-js/modules/es.array.is-array.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.array.sort.js"); require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.object.to-string.js"); var _assert = _interopRequireDefault(require("assert")); var _xml = require("./xml"); 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 _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 _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function cleanActeur(acteur) { (0, _xml.cleanXmlArtefacts)(acteur); _assert["default"].strictEqual(acteur.uid["@xsi:type"], "IdActeur_type"); acteur.uid = acteur.uid["#text"]; (0, _assert["default"])(acteur.uid); var etatCivil = acteur.etatCivil; { (0, _xml.cleanXmlArtefacts)(etatCivil); var ident = etatCivil.ident; { (0, _xml.cleanXmlArtefacts)(ident); var infoNaissance = etatCivil.infoNaissance; { (0, _xml.cleanXmlArtefacts)(infoNaissance); } } } var profession = acteur.profession; if (profession !== undefined) { (0, _xml.cleanXmlArtefacts)(profession); var socProcInsee = profession.socProcINSEE; (0, _assert["default"])(socProcInsee); (0, _xml.cleanXmlArtefacts)(socProcInsee); delete profession.socProcINSEE; profession.socProcInsee = socProcInsee; } var uriHatvp = acteur.uri_hatvp; if (uriHatvp !== undefined) { acteur.uriHatvp = uriHatvp; delete acteur.uri_hatvp; } var adresses = acteur.adresses; if (adresses !== undefined) { adresses = adresses.adresse; if (adresses === undefined) { delete acteur.adresses; adresses = undefined; } else if (Array.isArray(adresses)) { acteur.adresses = adresses; } else { _assert["default"].notStrictEqual(adresses, null); _assert["default"].strictEqual(_typeof(adresses), "object"); acteur.adresses = adresses = [adresses]; } if (adresses !== undefined) { var _iterator = _createForOfIteratorHelper(adresses), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var adresse = _step.value; (0, _xml.cleanXmlArtefacts)(adresse); var xsiType = adresse["@xsi:type"]; (0, _assert["default"])(["AdresseMail_Type", "AdressePostale_Type", "AdresseSiteWeb_Type", "AdresseTelephonique_Type"].includes(xsiType), "Unexpected \"@xsi:type\": ".concat(xsiType)); adresse.xsiType = xsiType; delete adresse["@xsi:type"]; _assert["default"].notStrictEqual(adresse.uid, undefined); _assert["default"].notStrictEqual(adresse.type, undefined); _assert["default"].notStrictEqual(adresse.typeLibelle, undefined); if (xsiType === "AdressePostale_Type") { _assert["default"].strictEqual(adresse.adresseDeRattachement, undefined); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } } var mandats = acteur.mandats; if (mandats !== undefined) { var mandat = mandats.mandat; if (Array.isArray(mandat)) { mandats = acteur.mandats = mandat; } else if (_typeof(mandat) === "object") { mandats = acteur.mandats = [mandat]; } var _iterator2 = _createForOfIteratorHelper(mandats), _step2; try { var _loop = function _loop() { var mandat = _step2.value; (0, _xml.cleanXmlArtefacts)(mandat); var xsiType = mandat["@xsi:type"]; if (xsiType !== undefined) { mandat.xsiType = xsiType; delete mandat["@xsi:type"]; } var infosQualite = mandat.infosQualite; { (0, _xml.cleanXmlArtefacts)(infosQualite); } var organes = mandat.organes; delete mandat.organes; var organesRefs = organes.organeRef; (0, _assert["default"])(organesRefs); if (!Array.isArray(organesRefs)) { organesRefs = [organesRefs]; } mandat.organesRefs = organesRefs; var suppleant = mandat.suppleants; delete mandat.suppleants; if (suppleant) { suppleant = suppleant.suppleant; (0, _assert["default"])(suppleant); mandat.suppleant = suppleant; (0, _xml.cleanXmlArtefacts)(suppleant); } var election = mandat.election; if (election !== undefined) { (0, _xml.cleanXmlArtefacts)(election); var lieu = election.lieu; (0, _xml.cleanXmlArtefacts)(lieu); } var mandature = mandat.mandature; if (mandature !== undefined) { (0, _xml.cleanXmlArtefacts)(mandature); } _assert["default"].strictEqual(mandat.chambre, undefined); // Replace collaborateurs with an array of collaborateurs. var collaborateurs = mandat.collaborateurs; if (collaborateurs !== undefined) { var collaborateursArray = Array.isArray(collaborateurs) ? collaborateurs.filter(function (collaborateur) { return collaborateur !== null; }) : [collaborateurs]; collaborateurs = []; collaborateursArray.map(function (_ref) { var collaborateur = _ref.collaborateur; if (Array.isArray(collaborateur)) { var _iterator3 = _createForOfIteratorHelper(collaborateur), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var collaborateurItem = _step3.value; if (collaborateurItem !== null) { collaborateurs.push(collaborateurItem); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } } else if (collaborateur) { collaborateurs.push(collaborateur); } }); if (collaborateurs.length === 0) { delete mandat.collaborateurs; collaborateurs = undefined; } else { mandat.collaborateurs = collaborateurs; } var _iterator4 = _createForOfIteratorHelper(collaborateurs || []), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var collaborateur = _step4.value; (0, _xml.cleanXmlArtefacts)(collaborateur); _assert["default"].strictEqual(collaborateur.dateDebut, undefined); _assert["default"].strictEqual(collaborateur.dateFin, undefined); } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } } var infosHorsSian = mandat.InfosHorsSIAN; if (infosHorsSian !== undefined) { (0, _xml.cleanXmlArtefacts)(infosHorsSian); _assert["default"].strictEqual(infosHorsSian.HATVP_URI, undefined); _assert["default"].strictEqual(Object.keys(infosHorsSian).length, 0); delete mandat.InfosHorsSIAN; } }; for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { _loop(); } // Sort mandats to ease comparison of different open data files. } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } mandats.sort(function (a, b) { return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length; }); } var deports = acteur.deports; if (deports !== undefined) { var deport = deports.deport; if (Array.isArray(deport)) { deports = acteur.deports = deport; } else if (_typeof(deport) === "object") { deports = acteur.deports = [deport]; } var _iterator5 = _createForOfIteratorHelper(deports), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var _deport = _step5.value; (0, _xml.cleanXmlArtefacts)(_deport); var cible = _deport.cible; { (0, _xml.cleanXmlArtefacts)(cible); _assert["default"].strictEqual(cible.references, undefined); } } // Sort deports to ease comparison of different open data files. } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } deports.sort(function (a, b) { return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length; }); } } function cleanRapporteur(rapporteur) { var etudePlfRef = rapporteur.etudePLFRef; if (rapporteur.etudePLFRef !== undefined) { delete rapporteur.etudePLFRef; rapporteur.etudePlfRef = etudePlfRef; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfeG1sIiwiZSIsIl9fZXNNb2R1bGUiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX3R5cGVvZiIsInByb3RvdHlwZSIsImNsZWFuQWN0ZXVyIiwiYWN0ZXVyIiwiY2xlYW5YbWxBcnRlZmFjdHMiLCJhc3NlcnQiLCJzdHJpY3RFcXVhbCIsInVpZCIsImV0YXRDaXZpbCIsImlkZW50IiwiaW5mb05haXNzYW5jZSIsInByb2Zlc3Npb24iLCJ1bmRlZmluZWQiLCJzb2NQcm9jSW5zZWUiLCJzb2NQcm9jSU5TRUUiLCJ1cmlIYXR2cCIsInVyaV9oYXR2cCIsImFkcmVzc2VzIiwiYWRyZXNzZSIsIm5vdFN0cmljdEVxdWFsIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJ4c2lUeXBlIiwiaW5jbHVkZXMiLCJjb25jYXQiLCJ0eXBlIiwidHlwZUxpYmVsbGUiLCJhZHJlc3NlRGVSYXR0YWNoZW1lbnQiLCJlcnIiLCJtYW5kYXRzIiwibWFuZGF0IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIl9sb29wIiwiaW5mb3NRdWFsaXRlIiwib3JnYW5lcyIsIm9yZ2FuZXNSZWZzIiwib3JnYW5lUmVmIiwic3VwcGxlYW50Iiwic3VwcGxlYW50cyIsImVsZWN0aW9uIiwibGlldSIsIm1hbmRhdHVyZSIsImNoYW1icmUiLCJjb2xsYWJvcmF0ZXVycyIsImNvbGxhYm9yYXRldXJzQXJyYXkiLCJmaWx0ZXIiLCJjb2xsYWJvcmF0ZXVyIiwibWFwIiwiX3JlZiIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJjb2xsYWJvcmF0ZXVySXRlbSIsInB1c2giLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwiZGF0ZURlYnV0IiwiZGF0ZUZpbiIsImluZm9zSG9yc1NpYW4iLCJJbmZvc0hvcnNTSUFOIiwiSEFUVlBfVVJJIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJiIiwibG9jYWxlQ29tcGFyZSIsImRlcG9ydHMiLCJkZXBvcnQiLCJfaXRlcmF0b3I1IiwiX3N0ZXA1IiwiY2libGUiLCJyZWZlcmVuY2VzIiwiY2xlYW5SYXBwb3J0ZXVyIiwicmFwcG9ydGV1ciIsImV0dWRlUGxmUmVmIiwiZXR1ZGVQTEZSZWYiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xlYW5lcnMvYWN0ZXVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuXG5pbXBvcnQgeyBjbGVhblhtbEFydGVmYWN0cyB9IGZyb20gXCIuL3htbFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkFjdGV1cihhY3RldXI6IGFueSk6IHZvaWQge1xuICBjbGVhblhtbEFydGVmYWN0cyhhY3RldXIpXG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci51aWRbXCJAeHNpOnR5cGVcIl0sIFwiSWRBY3RldXJfdHlwZVwiKVxuICBhY3RldXIudWlkID0gYWN0ZXVyLnVpZFtcIiN0ZXh0XCJdXG4gIGFzc2VydChhY3RldXIudWlkKVxuXG4gIGNvbnN0IGV0YXRDaXZpbCA9IGFjdGV1ci5ldGF0Q2l2aWxcbiAge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGV0YXRDaXZpbClcblxuICAgIGNvbnN0IGlkZW50ID0gZXRhdENpdmlsLmlkZW50XG4gICAge1xuICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoaWRlbnQpXG5cbiAgICAgIGNvbnN0IGluZm9OYWlzc2FuY2UgPSBldGF0Q2l2aWwuaW5mb05haXNzYW5jZVxuICAgICAge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhpbmZvTmFpc3NhbmNlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2Zlc3Npb24gPSBhY3RldXIucHJvZmVzc2lvblxuICBpZiAocHJvZmVzc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMocHJvZmVzc2lvbilcblxuICAgIGNvbnN0IHNvY1Byb2NJbnNlZSA9IHByb2Zlc3Npb24uc29jUHJvY0lOU0VFXG4gICAgYXNzZXJ0KHNvY1Byb2NJbnNlZSlcbiAgICBjbGVhblhtbEFydGVmYWN0cyhzb2NQcm9jSW5zZWUpXG4gICAgZGVsZXRlIHByb2Zlc3Npb24uc29jUHJvY0lOU0VFXG4gICAgcHJvZmVzc2lvbi5zb2NQcm9jSW5zZWUgPSBzb2NQcm9jSW5zZWVcbiAgfVxuXG4gIGNvbnN0IHVyaUhhdHZwID0gYWN0ZXVyLnVyaV9oYXR2cFxuICBpZiAodXJpSGF0dnAgIT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGV1ci51cmlIYXR2cCA9IHVyaUhhdHZwXG4gICAgZGVsZXRlIGFjdGV1ci51cmlfaGF0dnBcbiAgfVxuXG4gIGxldCBhZHJlc3NlcyA9IGFjdGV1ci5hZHJlc3Nlc1xuICBpZiAoYWRyZXNzZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGFkcmVzc2VzID0gYWRyZXNzZXMuYWRyZXNzZVxuICAgIGlmIChhZHJlc3NlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgYWN0ZXVyLmFkcmVzc2VzXG4gICAgICBhZHJlc3NlcyA9IHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhZHJlc3NlcykpIHtcbiAgICAgIGFjdGV1ci5hZHJlc3NlcyA9IGFkcmVzc2VzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhZHJlc3NlcywgbnVsbClcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgYWRyZXNzZXMsIFwib2JqZWN0XCIpXG4gICAgICBhY3RldXIuYWRyZXNzZXMgPSBhZHJlc3NlcyA9IFthZHJlc3Nlc11cbiAgICB9XG4gICAgaWYgKGFkcmVzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgYWRyZXNzZSBvZiBhZHJlc3Nlcykge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhhZHJlc3NlKVxuXG4gICAgICAgIGNvbnN0IHhzaVR5cGUgPSBhZHJlc3NlW1wiQHhzaTp0eXBlXCJdXG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBbXG4gICAgICAgICAgICBcIkFkcmVzc2VNYWlsX1R5cGVcIixcbiAgICAgICAgICAgIFwiQWRyZXNzZVBvc3RhbGVfVHlwZVwiLFxuICAgICAgICAgICAgXCJBZHJlc3NlU2l0ZVdlYl9UeXBlXCIsXG4gICAgICAgICAgICBcIkFkcmVzc2VUZWxlcGhvbmlxdWVfVHlwZVwiLFxuICAgICAgICAgIF0uaW5jbHVkZXMoeHNpVHlwZSksXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgXCJAeHNpOnR5cGVcIjogJHt4c2lUeXBlfWAsXG4gICAgICAgIClcbiAgICAgICAgYWRyZXNzZS54c2lUeXBlID0geHNpVHlwZVxuICAgICAgICBkZWxldGUgYWRyZXNzZVtcIkB4c2k6dHlwZVwiXVxuXG4gICAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhZHJlc3NlLnVpZCwgdW5kZWZpbmVkKVxuICAgICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWRyZXNzZS50eXBlLCB1bmRlZmluZWQpXG4gICAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhZHJlc3NlLnR5cGVMaWJlbGxlLCB1bmRlZmluZWQpXG5cbiAgICAgICAgaWYgKHhzaVR5cGUgPT09IFwiQWRyZXNzZVBvc3RhbGVfVHlwZVwiKSB7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkcmVzc2UuYWRyZXNzZURlUmF0dGFjaGVtZW50LCB1bmRlZmluZWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgbWFuZGF0cyA9IGFjdGV1ci5tYW5kYXRzXG4gIGlmIChtYW5kYXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgbWFuZGF0ID0gbWFuZGF0cy5tYW5kYXRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtYW5kYXQpKSB7XG4gICAgICBtYW5kYXRzID0gYWN0ZXVyLm1hbmRhdHMgPSBtYW5kYXRcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYW5kYXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIG1hbmRhdHMgPSBhY3RldXIubWFuZGF0cyA9IFttYW5kYXRdXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtYW5kYXQgb2YgbWFuZGF0cykge1xuICAgICAgY2xlYW5YbWxBcnRlZmFjdHMobWFuZGF0KVxuXG4gICAgICBjb25zdCB4c2lUeXBlID0gbWFuZGF0W1wiQHhzaTp0eXBlXCJdXG4gICAgICBpZiAoeHNpVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1hbmRhdC54c2lUeXBlID0geHNpVHlwZVxuICAgICAgICBkZWxldGUgbWFuZGF0W1wiQHhzaTp0eXBlXCJdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZm9zUXVhbGl0ZSA9IG1hbmRhdC5pbmZvc1F1YWxpdGVcbiAgICAgIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoaW5mb3NRdWFsaXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvcmdhbmVzID0gbWFuZGF0Lm9yZ2FuZXNcbiAgICAgIGRlbGV0ZSBtYW5kYXQub3JnYW5lc1xuICAgICAgbGV0IG9yZ2FuZXNSZWZzID0gb3JnYW5lcy5vcmdhbmVSZWZcbiAgICAgIGFzc2VydChvcmdhbmVzUmVmcylcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmdhbmVzUmVmcykpIHtcbiAgICAgICAgb3JnYW5lc1JlZnMgPSBbb3JnYW5lc1JlZnNdXG4gICAgICB9XG4gICAgICBtYW5kYXQub3JnYW5lc1JlZnMgPSBvcmdhbmVzUmVmc1xuXG4gICAgICBsZXQgc3VwcGxlYW50ID0gbWFuZGF0LnN1cHBsZWFudHNcbiAgICAgIGRlbGV0ZSBtYW5kYXQuc3VwcGxlYW50c1xuICAgICAgaWYgKHN1cHBsZWFudCkge1xuICAgICAgICBzdXBwbGVhbnQgPSBzdXBwbGVhbnQuc3VwcGxlYW50XG4gICAgICAgIGFzc2VydChzdXBwbGVhbnQpXG4gICAgICAgIG1hbmRhdC5zdXBwbGVhbnQgPSBzdXBwbGVhbnRcblxuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhzdXBwbGVhbnQpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZWN0aW9uID0gbWFuZGF0LmVsZWN0aW9uXG4gICAgICBpZiAoZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhlbGVjdGlvbilcblxuICAgICAgICBjb25zdCBsaWV1ID0gZWxlY3Rpb24ubGlldVxuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhsaWV1KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYW5kYXR1cmUgPSBtYW5kYXQubWFuZGF0dXJlXG4gICAgICBpZiAobWFuZGF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMobWFuZGF0dXJlKVxuICAgICAgfVxuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobWFuZGF0LmNoYW1icmUsIHVuZGVmaW5lZClcblxuICAgICAgLy8gUmVwbGFjZSBjb2xsYWJvcmF0ZXVycyB3aXRoIGFuIGFycmF5IG9mIGNvbGxhYm9yYXRldXJzLlxuICAgICAgbGV0IGNvbGxhYm9yYXRldXJzID0gbWFuZGF0LmNvbGxhYm9yYXRldXJzXG4gICAgICBpZiAoY29sbGFib3JhdGV1cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjb2xsYWJvcmF0ZXVyc0FycmF5ID0gQXJyYXkuaXNBcnJheShjb2xsYWJvcmF0ZXVycylcbiAgICAgICAgICA/IGNvbGxhYm9yYXRldXJzLmZpbHRlcigoY29sbGFib3JhdGV1cikgPT4gY29sbGFib3JhdGV1ciAhPT0gbnVsbClcbiAgICAgICAgICA6IFtjb2xsYWJvcmF0ZXVyc11cbiAgICAgICAgY29sbGFib3JhdGV1cnMgPSBbXVxuICAgICAgICBjb2xsYWJvcmF0ZXVyc0FycmF5Lm1hcCgoeyBjb2xsYWJvcmF0ZXVyIH0pID0+IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xsYWJvcmF0ZXVyKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2xsYWJvcmF0ZXVySXRlbSBvZiBjb2xsYWJvcmF0ZXVyKSB7XG4gICAgICAgICAgICAgIGlmIChjb2xsYWJvcmF0ZXVySXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbGxhYm9yYXRldXJzLnB1c2goY29sbGFib3JhdGV1ckl0ZW0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxhYm9yYXRldXIpIHtcbiAgICAgICAgICAgIGNvbGxhYm9yYXRldXJzLnB1c2goY29sbGFib3JhdGV1cilcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGlmIChjb2xsYWJvcmF0ZXVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgbWFuZGF0LmNvbGxhYm9yYXRldXJzXG4gICAgICAgICAgY29sbGFib3JhdGV1cnMgPSB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYW5kYXQuY29sbGFib3JhdGV1cnMgPSBjb2xsYWJvcmF0ZXVyc1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjb2xsYWJvcmF0ZXVyIG9mIGNvbGxhYm9yYXRldXJzIHx8IFtdKSB7XG4gICAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoY29sbGFib3JhdGV1cilcblxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb2xsYWJvcmF0ZXVyLmRhdGVEZWJ1dCwgdW5kZWZpbmVkKVxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb2xsYWJvcmF0ZXVyLmRhdGVGaW4sIHVuZGVmaW5lZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmZvc0hvcnNTaWFuID0gbWFuZGF0LkluZm9zSG9yc1NJQU5cbiAgICAgIGlmIChpbmZvc0hvcnNTaWFuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoaW5mb3NIb3JzU2lhbilcblxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5mb3NIb3JzU2lhbi5IQVRWUF9VUkksIHVuZGVmaW5lZClcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKE9iamVjdC5rZXlzKGluZm9zSG9yc1NpYW4pLmxlbmd0aCwgMClcbiAgICAgICAgZGVsZXRlIG1hbmRhdC5JbmZvc0hvcnNTSUFOXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBtYW5kYXRzIHRvIGVhc2UgY29tcGFyaXNvbiBvZiBkaWZmZXJlbnQgb3BlbiBkYXRhIGZpbGVzLlxuICAgIG1hbmRhdHMuc29ydCgoYTogeyB1aWQ6IHN0cmluZyB9LCBiOiB7IHVpZDogc3RyaW5nIH0pID0+XG4gICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgIClcbiAgfVxuXG4gIGxldCBkZXBvcnRzID0gYWN0ZXVyLmRlcG9ydHNcbiAgaWYgKGRlcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBkZXBvcnQgPSBkZXBvcnRzLmRlcG9ydFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRlcG9ydCkpIHtcbiAgICAgIGRlcG9ydHMgPSBhY3RldXIuZGVwb3J0cyA9IGRlcG9ydFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlcG9ydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZGVwb3J0cyA9IGFjdGV1ci5kZXBvcnRzID0gW2RlcG9ydF1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcG9ydCBvZiBkZXBvcnRzKSB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhkZXBvcnQpXG5cbiAgICAgIGNvbnN0IGNpYmxlID0gZGVwb3J0LmNpYmxlXG4gICAgICB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGNpYmxlKVxuXG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjaWJsZS5yZWZlcmVuY2VzLCB1bmRlZmluZWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBkZXBvcnRzIHRvIGVhc2UgY29tcGFyaXNvbiBvZiBkaWZmZXJlbnQgb3BlbiBkYXRhIGZpbGVzLlxuICAgIGRlcG9ydHMuc29ydCgoYTogeyB1aWQ6IHN0cmluZyB9LCBiOiB7IHVpZDogc3RyaW5nIH0pID0+XG4gICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5SYXBwb3J0ZXVyKHJhcHBvcnRldXI6IGFueSkge1xuICBjb25zdCBldHVkZVBsZlJlZiA9IHJhcHBvcnRldXIuZXR1ZGVQTEZSZWZcbiAgaWYgKHJhcHBvcnRldXIuZXR1ZGVQTEZSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlbGV0ZSByYXBwb3J0ZXVyLmV0dWRlUExGUmVmXG4gICAgcmFwcG9ydGV1ci5ldHVkZVBsZlJlZiA9IGV0dWRlUGxmUmVmXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsSUFBQSxHQUFBRCxPQUFBO0FBQXlDLFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEs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LE9BQUEsQ0FBT21FLE1BQU0sTUFBSyxRQUFRLEVBQUU7TUFDckNELE9BQU8sR0FBRy9ELE1BQU0sQ0FBQytELE9BQU8sR0FBRyxDQUFDQyxNQUFNLENBQUM7SUFDckM7SUFBQyxJQUFBQyxVQUFBLEdBQUFqRywwQkFBQSxDQUVvQitGLE9BQU87TUFBQUcsTUFBQTtJQUFBO01BQTVCLEtBQUFELFVBQUEsQ0FBQXRGLENBQUEsTUFBQXVGLE1BQUEsR0FBQUQsVUFBQSxDQUFBckYsQ0FBQSxJQUFBQyxJQUFBLEdBQThCO1FBQUEsSUFBbkJtRixPQUFNLEdBQUFFLE1BQUEsQ0FBQXBGLEtBQUE7UUFDZixJQUFBbUIsc0JBQWlCLEVBQUMrRCxPQUFNLENBQUM7UUFFekIsSUFBTUcsS0FBSyxHQUFHSCxPQUFNLENBQUNHLEtBQUs7UUFDMUI7VUFDRSxJQUFBbEUsc0JBQWlCLEVBQUNrRSxLQUFLLENBQUM7VUFFeEJqRSxrQkFBTSxDQUFDQyxXQUFXLENBQUNnRSxLQUFLLENBQUNDLFVBQVUsRUFBRTNELFNBQVMsQ0FBQztRQUNqRDtNQUNGOztNQUVBO0lBQUEsU0FBQWdCLEdBQUE7TUFBQXdDLFVBQUEsQ0FBQW5HLENBQUEsQ0FBQTJELEdBQUE7SUFBQTtNQUFBd0MsVUFBQSxDQUFBbEYsQ0FBQTtJQUFBO0lBQ0FnRixPQUFPLENBQUNILElBQUksQ0FBQyxVQUFDMUUsQ0FBa0IsRUFBRTJFLENBQWtCO01BQUEsT0FDbEQzRSxDQUFDLENBQUNrQixHQUFHLENBQUM1QixNQUFNLEtBQUtxRixDQUFDLENBQUN6RCxHQUFHLENBQUM1QixNQUFNLEdBQ3pCVSxDQUFDLENBQUNrQixHQUFHLENBQUMwRCxhQUFhLENBQUNELENBQUMsQ0FBQ3pELEdBQUcsQ0FBQyxHQUMxQmxCLENBQUMsQ0FBQ2tCLEdBQUcsQ0FBQzVCLE1BQU0sR0FBR3FGLENBQUMsQ0FBQ3pELEdBQUcsQ0FBQzVCLE1BQU07SUFBQSxDQUNqQyxDQUFDO0VBQ0g7QUFDRjtBQUVPLFNBQVM2RixlQUFlQSxDQUFDQyxVQUFlLEVBQUU7RUFDL0MsSUFBTUMsV0FBVyxHQUFHRCxVQUFVLENBQUNFLFdBQVc7RUFDMUMsSUFBSUYsVUFBVSxDQUFDRSxXQUFXLEtBQUsvRCxTQUFTLEVBQUU7SUFDeEMsT0FBTzZELFVBQVUsQ0FBQ0UsV0FBVztJQUM3QkYsVUFBVSxDQUFDQyxXQUFXLEdBQUdBLFdBQVc7RUFDdEM7QUFDRiIsImlnbm9yZUxpc3QiOltdfQ==