UNPKG

@tricoteuses/assemblee

Version:

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

655 lines (651 loc) 94.8 kB
"use strict"; 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); } 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.symbol.to-primitive.js"); require("core-js/modules/es.array.is-array.js"); require("core-js/modules/es.array.slice.js"); require("core-js/modules/es.date.to-primitive.js"); require("core-js/modules/es.date.to-string.js"); require("core-js/modules/es.function.bind.js"); require("core-js/modules/es.number.constructor.js"); require("core-js/modules/es.object.create.js"); require("core-js/modules/es.object.define-property.js"); require("core-js/modules/es.object.get-prototype-of.js"); require("core-js/modules/es.object.set-prototype-of.js"); require("core-js/modules/es.reflect.construct.js"); require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.array.from.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.array.join.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.function.name.js"); require("core-js/modules/es.map.js"); require("core-js/modules/es.object.assign.js"); require("core-js/modules/es.object.entries.js"); require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.regexp.constructor.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.regexp.to-string.js"); require("core-js/modules/es.set.js"); require("core-js/modules/es.string.ends-with.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/es.string.match.js"); require("core-js/modules/es.string.replace.js"); require("core-js/modules/es.string.starts-with.js"); require("core-js/modules/web.dom-collections.iterator.js"); var _commandLineArgs = _interopRequireDefault(require("command-line-args")); var _commandLineUsage = _interopRequireDefault(require("command-line-usage")); var _assert = _interopRequireDefault(require("assert")); var _file_systems = require("../file_systems"); var _LectureMapping; function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } 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 _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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 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 parseArgs(argv) { var optionsDefinitions = [{ description: "pathname to a JSON file or a glob pattern to JSON files", defaultOption: true, multiple: true, name: "data", type: String }, { name: "no-sanity-checks", type: Boolean, description: "Do not perform sanity checks." }, { name: "verbose", type: Boolean, description: "increase verbosity" }, { name: "help", description: "Print this usage guide." }]; var sections = [{ header: "Aide à la documentation du dossier législatif", content: "Génère une hiérarchie des actes législatifs" }, { header: "Options", optionList: optionsDefinitions }]; var options = (0, _commandLineArgs["default"])(optionsDefinitions, { argv: argv }); if (!("help" in options) && !("data" in options)) { console.error("--data is mandatory"); options.help = true; } if ("help" in options) { var usage = (0, _commandLineUsage["default"])(sections); console.warn(usage); return null; } return options; } function eqSet(as, bs) { if (as.size !== bs.size) return false; var _iterator = _createForOfIteratorHelper(as), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var a = _step.value; if (!bs.has(a)) return false; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return true; } var Code2Pattern = /*#__PURE__*/_createClass(function Code2Pattern(pattern, children) { _classCallCheck(this, Code2Pattern); _defineProperty(this, "_pattern_", void 0); _defineProperty(this, "_match_count_", void 0); this._pattern_ = pattern; this._match_count_ = 0; Object.assign(this, children); }); var Code2PatternComFond = /*#__PURE__*/function (_Code2Pattern2) { function Code2PatternComFond() { _classCallCheck(this, Code2PatternComFond); return _callSuper(this, Code2PatternComFond, ["^/SAISIE/(/NOMIN/)*(/REUNION/)*(/RAPPORT/)*$", {}]); } _inherits(Code2PatternComFond, _Code2Pattern2); return _createClass(Code2PatternComFond); }(Code2Pattern); var LectureMapping = /*#__PURE__*/function () { function LectureMapping() { _classCallCheck(this, LectureMapping); _defineProperty(this, "libelle", {}); _defineProperty(this, "codes", new Set()); } return _createClass(LectureMapping, [{ key: "add", value: function add(acte) { this.codes.add(acte.codeActe); var type = LectureMapping.getType(acte); if (!(acte.libelleActe.nomCanonique in this.libelle)) this.libelle[acte.libelleActe.nomCanonique] = new Set(); this.libelle[acte.libelleActe.nomCanonique].add(type); } }, { key: "remap", value: function remap(acte, codeActe) { acte.codeActe = codeActe; var types = this.libelle[acte.libelleActe.nomCanonique]; if (!(types.has("SN") && types.has("AN"))) { if (types.has("SN")) acte.libelleActe.nomCanonique += " (Sénat)";else if (types.has("AN")) acte.libelleActe.nomCanonique += " (Assemblée Nationale)"; } } }, { key: "mergeCodes", value: function mergeCodes(codes) { for (var _i = 0, _Array$from = Array.from(this.codes); _i < _Array$from.length; _i++) { var c = _Array$from[_i]; codes.add(c); } } }, { key: "printAnchors", value: function printAnchors() { for (var _i2 = 0, _Array$from2 = Array.from(this.codes); _i2 < _Array$from2.length; _i2++) { var code = _Array$from2[_i2]; console.log(".. _".concat(code, ":")); } } }, { key: "getCodes", value: function getCodes() { return Array.from(this.codes).join(","); } }], [{ key: "isLecture", value: function isLecture(acte) { return acte.codeActe.match(LectureMapping.codes_lecture_regexp); } }, { key: "getType", value: function getType(acte) { if (acte.codeActe.match(/^AN/)) return "AN";else if (acte.codeActe.match(/^SN/)) return "SN";else throw Error("".concat(acte.codeActe, " does not start with AN or SN")); } }, { key: "map", value: function map(codeActe) { return codeActe.replace(LectureMapping.codes_lecture_regexp, "lecture$1"); } }, { key: "getCodeActe", value: function getCodeActe(acte) { if (!LectureMapping.isLecture(acte)) return; return LectureMapping.map(acte.codeActe); } }]); }(); _LectureMapping = LectureMapping; _defineProperty(LectureMapping, "codes_lecture", ["AN1", "SN1", "ANNLEC", "SNNLEC", "ANLDEF", "AN2", "SN2", "SN3"]); _defineProperty(LectureMapping, "codes_lecture_regexp", new RegExp("^(?:" + _LectureMapping.codes_lecture.join("|") + ")(-.*)?$")); var LectureMapper = /*#__PURE__*/function () { function LectureMapper() { _classCallCheck(this, LectureMapper); _defineProperty(this, "mapping", {}); } return _createClass(LectureMapper, [{ key: "has", value: function has(codeActe) { return codeActe in this.mapping; } }, { key: "collect", value: function collect(acte) { var codeActe = LectureMapping.getCodeActe(acte); if (codeActe != undefined) { var lectures = this.mapping; if (!(codeActe in lectures)) lectures[codeActe] = new LectureMapping(); lectures[codeActe].add(acte); } } }, { key: "remap", value: function remap(acte) { var codeActe = LectureMapping.getCodeActe(acte); if (codeActe != undefined) this.mapping[codeActe].remap(acte, codeActe); } }, { key: "mergeCodes", value: function mergeCodes(codes, codeActe) { this.mapping[codeActe].mergeCodes(codes); } }, { key: "printAnchors", value: function printAnchors(codeActe) { this.mapping[codeActe].printAnchors(); } }, { key: "getCodes", value: function getCodes(codeActe) { return this.mapping[codeActe].getCodes(); } }]); }(); var ActesDocumentation = /*#__PURE__*/function () { function ActesDocumentation(sanityChecks) { var verbose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; _classCallCheck(this, ActesDocumentation); _defineProperty(this, "verbose", void 0); _defineProperty(this, "sanityChecks", void 0); _defineProperty(this, "lectureMapper", new LectureMapper()); _defineProperty(this, "remappedProcedures", {}); _defineProperty(this, "anchorsPrinted", {}); _defineProperty(this, "anchors", new Set()); _defineProperty(this, "codes", {}); _defineProperty(this, "procedures", null); _defineProperty(this, "code2pattern", new Code2Pattern(null, { "Procédure législative": new Code2Pattern("^(((/lecture/)+)|((/lecture/)+/CMP/(/lecture/)*))(/CC/)?(/PROM/)?(/AN-APPLI/)?$", { lecture: new Code2Pattern("^(/DEPOT/)?(/DPTLETTRECT/)?(/ETI/)?(/AVCE/)?(/DGVT/)?(/ACIN/)?(/MOTION/)*(/PROCACC/)?(/COM/)?((/DEBATS/)+)?(/RTRINI/)?$", { "lecture-COM": new Code2Pattern("^(/FOND/|/AVIS/)+$", { "lecture-COM-FOND": new Code2PatternComFond(), "lecture-COM-AVIS": new Code2PatternComFond() }), "lecture-DEBATS": new Code2Pattern("^(/SEANCE/)*((/MOTION/)?(/MOTION-VOTE/)+)?(/DEC/)?$", {}) }), CMP: new Code2Pattern("^(/DEPOT/|/SAISIE/){1,2}(/COM/)?(/DEC/)?(/DEBATS-AN//DEBATS-SN/)?", { "CMP-COM": new Code2Pattern("^(/NOMIN/)?(/RAPPORT-AN/|/RAPPORT-SN/){2}$", {}), "CMP-DEBATS-AN": new Code2Pattern("^(/SEANCE/)*(/DEC/)?$", {}), "CMP-DEBATS-SN": new Code2Pattern("^(/SEANCE/)*(/DEC/)?$", {}) }), CC: new Code2Pattern("^(/SAISIE/)+(/CONCLUSION/)?$", {}), PROM: new Code2Pattern("^(/PUB/)?$", {}), "AN-APPLI": new Code2Pattern("^(/RAPPORT/)?$", {}) }), "Allocution du Président de l'Assemblée nationale": new Code2Pattern("^/AN21/$", { AN21: new Code2Pattern("^(/APAN/)?$", {}) }), "Résolution Article 34-1": new Code2Pattern("^(/ANLUNI/)?$", { ANLUNI: new Code2Pattern("^(/DEPOT/)?(/DEBATS/)?(/RTRINI/)?$", { "ANLUNI-DEBATS": new Code2Pattern("^(/SEANCE/)+(/DEC/)?$", {}) }) }), Résolution: new Code2Pattern("^(/ANLUNI/)?(/CC/)?$", { ANLUNI: new Code2Pattern("^(/DEPOT/)?(/COM/)?(/DEBATS/|/RTRINI/)?$", { "ANLUNI-COM": new Code2Pattern("^(/CAE/)?(/FOND/)?$", { "ANLUNI-COM-FOND": new Code2PatternComFond(), "ANLUNI-COM-CAE": new Code2Pattern("^(/SAISIE/)?(/NOMIN/)?(/REUNION/)?(/RAPPORT/)?(/DEC/)?$", {}) }), "ANLUNI-DEBATS": new Code2Pattern("^(/SEANCE/)*(/DEC/)?$", {}) }), CC: new Code2Pattern("^(/SAISIE/)?(/CONCLUSION/)?$", {}) }), "Rapport d'information sans mission": new Code2Pattern("^(/AN20/)?(/EU/)?$", { AN20: new Code2Pattern("^(/RAPPORT/)?$", {}), EU: new Code2Pattern("^(/DEC/)+$", {}) }), "Mission d'information": new Code2Pattern("^(/AN20/)?$", { AN20: new Code2Pattern("^(/MISINF/)?$", { "AN20-MISINF": new Code2Pattern("^(/CREA/)?(/NOMIN/)?(/RAPPORT/)?$", {}) }) }), "Commission d'enquête": new Code2Pattern("^(/AN20/)?$", { AN20: new Code2Pattern("^(/COMENQ/)?$", { "AN20-COMENQ": new Code2Pattern("^(/CREA/)?(/NOMIN/)?(/RAPPORT/)?$", {}) }) }), "Engagement de la responsabilité gouvernementale": new Code2Pattern("^/AN21/$", { AN21: new Code2Pattern("^(((/MOTION/)*/DEBATS/)|(/DGVT/)){1,2}$", { "AN21-DEBATS": new Code2Pattern("^(/SEANCE/)*(/MOTION-VOTE/)*$", {}) }) }), "Motion référendaire": new Code2Pattern("^(/lecture/)+$", { lecture: new Code2Pattern("^(/DEPOT/)?(/COM/)?(/DEBATS/)?$", { "lecture-COM": new Code2Pattern("^(/FOND/)?$", { "lecture-COM-FOND": new Code2Pattern("^(/SAISIE/)?(/NOMIN/)*(/RAPPORT/)*$", {}) }), "lecture-DEBATS": new Code2Pattern("^(/DEC/)?$", {}) }) }), Immunité: new Code2Pattern("^(/ANLUNI/)+$", { ANLUNI: new Code2Pattern("^(/DEPOT/)?(/COM/)?(/DEBATS/)?(/RTRINI/)?$", { "ANLUNI-COM": new Code2Pattern("^(/FOND/)?$", { "ANLUNI-COM-FOND": new Code2Pattern("^(/SAISIE/)?(/NOMIN/)*(/RAPPORT/)*$", {}) }), "ANLUNI-DEBATS": new Code2Pattern("^(/SEANCE/)?(/DEC/)$", {}) }) }), "Responsabilité pénale du président de la république": new Code2Pattern("^/lecture/$", { lecture: new Code2Pattern("^(/DEPOT/)?(/RECBUREAU/)?$", {}) }), "Proposition de loi présentée en application de l'article 11 de la Constitution": new Code2Pattern("^/lecture/$", { lecture: new Code2Pattern("^(/DEPOT/)?$", {}) }) })); this.verbose = verbose; this.sanityChecks = sanityChecks; this.procedures = {}; this.code2pattern._match_count_++; } return _createClass(ActesDocumentation, [{ key: "walkFiles", value: function walkFiles(data, action) { var _iterator2 = _createForOfIteratorHelper((0, _file_systems.getFiles)(data)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var file = _step2.value; var dossier = (0, _file_systems.load)(file); var procedure = this.remapProcedure(dossier.procedureParlementaire.libelle); if (!(procedure in this.procedures)) this.procedures[procedure] = {}; action(this.procedures[procedure], dossier.actesLegislatifs, this.code2pattern[procedure], null); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } }, { key: "collectFiles", value: function collectFiles(data) { var _this = this; this.walkFiles(data, function (_actes, actesLegislatifs, _c2p, _parent) { _this.collect(actesLegislatifs); }); } }, { key: "processFiles", value: function processFiles(data) { var _this2 = this; this.walkFiles(data, function (actes, actesLegislatifs, c2p, parent) { _this2.merge(actes, actesLegislatifs, c2p, parent); }); if (this.sanityChecks) this.validate(); } }, { key: "remapActes", value: function remapActes(actes) { var results = []; var _iterator3 = _createForOfIteratorHelper(actes), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var acte = _step3.value; this.lectureMapper.remap(acte); // CC-SAISIE- suffix does not imply a hierarchy acte.codeActe = acte.codeActe.replace(/^CC-SAISIE.*/, "CC-SAISIE"); results.push(acte); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return results; } }, { key: "collectActes", value: function collectActes(actes) { var results = []; var _iterator4 = _createForOfIteratorHelper(actes), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var acte = _step4.value; this.lectureMapper.collect(acte); results.push(acte); } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } return results; } }, { key: "remapProcedure", value: function remapProcedure(procedure) { var merge_procedures = new Map([["Proposition de loi ordinaire", "Procédure législative"], ["Projet de loi ordinaire", "Procédure législative"], ["Projet de ratification des traités et conventions", "Procédure législative"], ["Projet ou proposition de loi organique", "Procédure législative"], ["Projet ou proposition de loi constitutionnelle", "Procédure législative"], ["Projet de loi de finances de l'année", "Procédure législative"], ["Projet de loi de finances rectificative", "Procédure législative"], ["Projet de loi de financement de la sécurité sociale", "Procédure législative"]]); if (merge_procedures.has(procedure)) { this.remappedProcedures[procedure] = null; return merge_procedures.get(procedure); } else { return procedure; } } // return the codeActes in the same order they appear in the regexp }, { key: "orderedCodes", value: function orderedCodes(codes, c2p, parent) { codes = new Set(codes); if (!this.sanityChecks) return codes; var ordered = c2p["_pattern_"].match(new RegExp("/.*?/", "g")); ordered = ordered.map(function (x) { return x.replace(new RegExp("/(.*)/"), "$1"); }); if (parent != null) ordered = ordered.map(function (x) { return "".concat(parent, "-").concat(x); }); ordered = new Set(ordered); (0, _assert["default"])(eqSet(ordered, codes), "".concat(_toConsumableArray(ordered), " != ").concat(_toConsumableArray(codes))); return ordered; } }, { key: "validateChronology", value: function validateChronology(actesLegislatifs, c2p, parent) { var pattern = c2p["_pattern_"]; var sequence = actesLegislatifs.map(function (x) { return "/".concat(x.codeActe, "/").replace("/".concat(parent, "-"), "/"); }).join(""); (0, _assert["default"])(sequence.match(new RegExp(pattern)), "".concat(pattern, " does not match ").concat(sequence)); c2p._match_count_++; } }, { key: "mergeActe", value: function mergeActe(actes, acte, c2p, parent) { var code = acte.codeActe; var shortCode = code.replace(new RegExp("^".concat(parent, "-")), ""); shortCode = shortCode.replace(/-(AN|SN)$/, ""); this.codes[shortCode] = null; var name = acte.libelleActe.nomCanonique; if (!(code in actes)) { actes[code] = { type: acte.xsiType, name: new Set([name]), shortCode: shortCode, actes: {} }; } else { actes[code].name.add(name); } if ("actesLegislatifs" in acte) this.merge(actes[code].actes, acte.actesLegislatifs, c2p[code], code); } }, { key: "merge", value: function merge(actes, actesLegislatifs, c2p, parent) { var l = this.remapActes(actesLegislatifs); this.validateChronology(l, c2p, parent); var _iterator5 = _createForOfIteratorHelper(l), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var acte = _step5.value; this.mergeActe(actes, acte, c2p, parent); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } } }, { key: "collect", value: function collect(actesLegislatifs) { var _iterator6 = _createForOfIteratorHelper(this.collectActes(actesLegislatifs)), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var acte = _step6.value; if ("actesLegislatifs" in acte) this.collect(acte.actesLegislatifs); } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } } }, { key: "validateLevel", value: function validateLevel(c2p, path) { (0, _assert["default"])(c2p._match_count_ > 0, "".concat(path, " is never used")); for (var _i3 = 0, _arr = Object.entries(c2p); _i3 < _arr.length; _i3++) { var _arr$_i = _slicedToArray(_arr[_i3], 2), key = _arr$_i[0], value = _arr$_i[1]; if (value != null && value.constructor.name == "Code2Pattern") this.validateLevel(value, path.concat([key])); } } }, { key: "validate", value: function validate() { this.validateLevel(this.code2pattern, []); } }, { key: "printEntry", value: function printEntry(sections, entry, codes) { var title = "`".concat(entry, "`__"); console.log(title); var underline = new Array(title.length + 1).join(sections[0]); console.log(underline); console.log(codes); } }, { key: "addAnchors", value: function addAnchors(key) { if (key in this.anchorsPrinted) return; if (this.lectureMapper.has(key)) this.lectureMapper.mergeCodes(this.anchors, key);else this.anchors.add(key); } }, { key: "printAnchors", value: function printAnchors(key) { if (key in this.anchorsPrinted) return; this.anchorsPrinted[key] = null; if (this.lectureMapper.has(key)) this.lectureMapper.printAnchors(key);else console.log(".. _".concat(key, ":")); } }, { key: "getCodes", value: function getCodes(key, shortCode) { if (key in this.anchorsPrinted) return "cf \\*".concat(shortCode, "\\*"); if (this.lectureMapper.has(key)) return this.lectureMapper.getCodes(key);else return key; } }, { key: "renameCMP", value: function renameCMP(key, name) { if (key.startsWith("CMP")) { if (key.endsWith("-SN")) return "".concat(name, " (S\xE9nat)");else if (key.endsWith("-AN")) return "".concat(name, " (Assembl\xE9e Nationale)");else return name; } else return name; } }, { key: "printLevel", value: function printLevel(actes, sections, c2p, parent) { var keys = this.orderedCodes(Object.keys(actes), c2p, parent); var _iterator7 = _createForOfIteratorHelper(keys), _step7; try { for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { var key = _step7.value; var value = actes[key]; var name = Array.from(value.name).join(", "); name = this.renameCMP(key, name); var codes = this.getCodes(key, value.shortCode); this.addAnchors(key); this.printAnchors(key); console.log(""); this.printEntry(sections, "".concat(name, " <").concat(value.shortCode, "TOC_>"), codes); console.log(""); if (Object.keys(value.actes).length > 0) this.printLevel(value.actes, sections.substring(1), c2p[key], key); } } catch (err) { _iterator7.e(err); } finally { _iterator7.f(); } } }, { key: "printCodes", value: function printCodes() { for (var _i4 = 0, _Object$keys = Object.keys(this.codes); _i4 < _Object$keys.length; _i4++) { var key = _Object$keys[_i4]; console.log(".. _".concat(key, "TOC: http://")); } } }, { key: "printAnchorsIndex", value: function printAnchorsIndex() { for (var _i5 = 0, _Array$from3 = Array.from(this.anchors); _i5 < _Array$from3.length; _i5++) { var code = _Array$from3[_i5]; console.log("* :ref:`".concat(code, " <").concat(code, ">`")); } } }, { key: "getAggregated", value: function getAggregated(procedure) { if (procedure == "Procédure législative") { var remapped = Object.keys(this.remappedProcedures).join(", "); return " (agr\xE9gation de ".concat(remapped, ")"); } else return ""; } }, { key: "print", value: function print() { this.anchorsPrinted = {}; for (var _i6 = 0, _arr2 = Object.entries(this.procedures); _i6 < _arr2.length; _i6++) { var _arr2$_i = _slicedToArray(_arr2[_i6], 2), key = _arr2$_i[0], actes = _arr2$_i[1]; var code = key.replace(/ +/g, "_"); this.codes[code] = null; var aggregated = this.getAggregated(key); var title = "`".concat(key, " <").concat(code, "TOC_>`__").concat(aggregated); console.log(title); var underline = new Array(title.length + 1).join("="); console.log(underline); this.printLevel(actes, "-~.'", this.code2pattern[key], null); } this.printCodes(); this.printAnchorsIndex(); } }]); }(); function main(argv) { var options = parseArgs(argv); if (options === null) return 1; var doc = new ActesDocumentation(!options["no-sanity-checks"], options.verbose); doc.collectFiles(options.data); doc.processFiles(options.data); doc.print(); return 0; } /* istanbul ignore if */ if (process.argv[1].endsWith("document_dossiers_legislatifs.ts")) process.exit(main(process.argv)); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbWFuZExpbmVBcmdzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29tbWFuZExpbmVVc2FnZSIsIl9hc3NlcnQiLCJfZmlsZV9zeXN0ZW1zIiwiX0xlY3R1cmVNYXBwaW5nIiwiZSIsIl9fZXNNb2R1bGUiLCJfc2xpY2VkVG9BcnJheSIsInIiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwibCIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIm4iLCJpIiwidSIsImEiLCJmIiwibyIsImNhbGwiLCJuZXh0IiwiT2JqZWN0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJmcm9tIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJfdHlwZW9mIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIlJlZmVyZW5jZUVycm9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJzZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mIiwiYmluZCIsIl9fcHJvdG9fXyIsIl9pbmhlcml0cyIsImNyZWF0ZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiZGVmaW5lUHJvcGVydHkiLCJfc2V0UHJvdG90eXBlT2YiLCJfZGVmaW5lUHJvcGVydGllcyIsImVudW1lcmFibGUiLCJfdG9Qcm9wZXJ0eUtleSIsImtleSIsIl9jcmVhdGVDbGFzcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0eSIsIl90b1ByaW1pdGl2ZSIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfbiIsIkYiLCJzIiwidG9TdHJpbmciLCJzbGljZSIsIm5hbWUiLCJ0ZXN0IiwicGFyc2VBcmdzIiwiYXJndiIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImRlc2NyaXB0aW9uIiwiZGVmYXVsdE9wdGlvbiIsIm11bHRpcGxlIiwidHlwZSIsInNlY3Rpb25zIiwiaGVhZGVyIiwiY29udGVudCIsIm9wdGlvbkxpc3QiLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiY29uc29sZSIsImVycm9yIiwiaGVscCIsInVzYWdlIiwiY29tbWFuZExpbmVVc2FnZSIsIndhcm4iLCJlcVNldCIsImFzIiwiYnMiLCJzaXplIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJoYXMiLCJlcnIiLCJDb2RlMlBhdHRlcm4iLCJwYXR0ZXJuIiwiY2hpbGRyZW4iLCJfcGF0dGVybl8iLCJfbWF0Y2hfY291bnRfIiwiYXNzaWduIiwiQ29kZTJQYXR0ZXJuQ29tRm9uZCIsIl9Db2RlMlBhdHRlcm4yIiwiTGVjdHVyZU1hcHBpbmciLCJTZXQiLCJhZGQiLCJhY3RlIiwiY29kZXMiLCJjb2RlQWN0ZSIsImdldFR5cGUiLCJsaWJlbGxlQWN0ZSIsIm5vbUNhbm9uaXF1ZSIsImxpYmVsbGUiLCJyZW1hcCIsInR5cGVzIiwibWVyZ2VDb2RlcyIsIl9pIiwiX0FycmF5JGZyb20iLCJjIiwicHJpbnRBbmNob3JzIiwiX2kyIiwiX0FycmF5JGZyb20yIiwiY29kZSIsImxvZyIsImNvbmNhdCIsImdldENvZGVzIiwiam9pbiIsImlzTGVjdHVyZSIsIm1hdGNoIiwiY29kZXNfbGVjdHVyZV9yZWdleHAiLCJFcnJvciIsIm1hcCIsInJlcGxhY2UiLCJnZXRDb2RlQWN0ZSIsIlJlZ0V4cCIsImNvZGVzX2xlY3R1cmUiLCJMZWN0dXJlTWFwcGVyIiwibWFwcGluZyIsImNvbGxlY3QiLCJ1bmRlZmluZWQiLCJsZWN0dXJlcyIsIkFjdGVzRG9jdW1lbnRhdGlvbiIsInNhbml0eUNoZWNrcyIsInZlcmJvc2UiLCJhcmd1bWVudHMiLCJsZWN0dXJlIiwiQ01QIiwiQ0MiLCJQUk9NIiwiQU4yMSIsIkFOTFVOSSIsIlLDqXNvbHV0aW9uIiwiQU4yMCIsIkVVIiwiSW1tdW5pdMOpIiwicHJvY2VkdXJlcyIsImNvZGUycGF0dGVybiIsIndhbGtGaWxlcyIsImRhdGEiLCJhY3Rpb24iLCJfaXRlcmF0b3IyIiwiZ2V0RmlsZXMiLCJfc3RlcDIiLCJmaWxlIiwiZG9zc2llciIsImxvYWQiLCJwcm9jZWR1cmUiLCJyZW1hcFByb2NlZHVyZSIsInByb2NlZHVyZVBhcmxlbWVudGFpcmUiLCJhY3Rlc0xlZ2lzbGF0aWZzIiwiY29sbGVjdEZpbGVzIiwiX3RoaXMiLCJfYWN0ZXMiLCJfYzJwIiwiX3BhcmVudCIsInByb2Nlc3NGaWxlcyIsIl90aGlzMiIsImFjdGVzIiwiYzJwIiwicGFyZW50IiwibWVyZ2UiLCJ2YWxpZGF0ZSIsInJlbWFwQWN0ZXMiLCJyZXN1bHRzIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImxlY3R1cmVNYXBwZXIiLCJjb2xsZWN0QWN0ZXMiLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwibWVyZ2VfcHJvY2VkdXJlcyIsIk1hcCIsInJlbWFwcGVkUHJvY2VkdXJlcyIsImdldCIsIm9yZGVyZWRDb2RlcyIsIm9yZGVyZWQiLCJ4IiwiYXNzZXJ0IiwidmFsaWRhdGVDaHJvbm9sb2d5Iiwic2VxdWVuY2UiLCJtZXJnZUFjdGUiLCJzaG9ydENvZGUiLCJ4c2lUeXBlIiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsIl9pdGVyYXRvcjYiLCJfc3RlcDYiLCJ2YWxpZGF0ZUxldmVsIiwicGF0aCIsIl9pMyIsIl9hcnIiLCJlbnRyaWVzIiwiX2FyciRfaSIsInByaW50RW50cnkiLCJlbnRyeSIsInRpdGxlIiwidW5kZXJsaW5lIiwiYWRkQW5jaG9ycyIsImFuY2hvcnNQcmludGVkIiwiYW5jaG9ycyIsInJlbmFtZUNNUCIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInByaW50TGV2ZWwiLCJrZXlzIiwiX2l0ZXJhdG9yNyIsIl9zdGVwNyIsInN1YnN0cmluZyIsInByaW50Q29kZXMiLCJfaTQiLCJfT2JqZWN0JGtleXMiLCJwcmludEFuY2hvcnNJbmRleCIsIl9pNSIsIl9BcnJheSRmcm9tMyIsImdldEFnZ3JlZ2F0ZWQiLCJyZW1hcHBlZCIsInByaW50IiwiX2k2IiwiX2FycjIiLCJfYXJyMiRfaSIsImFnZ3JlZ2F0ZWQiLCJtYWluIiwiZG9jIiwicHJvY2VzcyIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9kb2N1bWVudF9kb3NzaWVyc19sZWdpc2xhdGlmcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgY29tbWFuZExpbmVVc2FnZSBmcm9tIFwiY29tbWFuZC1saW5lLXVzYWdlXCJcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBsb2FkLCBnZXRGaWxlcyB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IFwicGF0aG5hbWUgdG8gYSBKU09OIGZpbGUgb3IgYSBnbG9iIHBhdHRlcm4gdG8gSlNPTiBmaWxlc1wiLFxuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm5vLXNhbml0eS1jaGVja3NcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZXNjcmlwdGlvbjogXCJEbyBub3QgcGVyZm9ybSBzYW5pdHkgY2hlY2tzLlwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVzY3JpcHRpb246IFwiaW5jcmVhc2UgdmVyYm9zaXR5XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImhlbHBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlByaW50IHRoaXMgdXNhZ2UgZ3VpZGUuXCIsXG4gICAgfSxcbiAgXVxuICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiQWlkZSDDoCBsYSBkb2N1bWVudGF0aW9uIGR1IGRvc3NpZXIgbMOpZ2lzbGF0aWZcIixcbiAgICAgIGNvbnRlbnQ6IFwiR8OpbsOocmUgdW5lIGhpw6lyYXJjaGllIGRlcyBhY3RlcyBsw6lnaXNsYXRpZnNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlYWRlcjogXCJPcHRpb25zXCIsXG4gICAgICBvcHRpb25MaXN0OiBvcHRpb25zRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG4gIGlmICghKFwiaGVscFwiIGluIG9wdGlvbnMpICYmICEoXCJkYXRhXCIgaW4gb3B0aW9ucykpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiLS1kYXRhIGlzIG1hbmRhdG9yeVwiKVxuICAgIG9wdGlvbnMuaGVscCA9IHRydWVcbiAgfVxuICBpZiAoXCJoZWxwXCIgaW4gb3B0aW9ucykge1xuICAgIGNvbnN0IHVzYWdlID0gY29tbWFuZExpbmVVc2FnZShzZWN0aW9ucylcbiAgICBjb25zb2xlLndhcm4odXNhZ2UpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBlcVNldChhczogU2V0PHN0cmluZz4sIGJzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAoYXMuc2l6ZSAhPT0gYnMuc2l6ZSkgcmV0dXJuIGZhbHNlXG4gIGZvciAodmFyIGEgb2YgYXMpIGlmICghYnMuaGFzKGEpKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRydWVcbn1cblxuY2xhc3MgQ29kZTJQYXR0ZXJuIHtcbiAgX3BhdHRlcm5fOiBhbnlcbiAgX21hdGNoX2NvdW50XzogbnVtYmVyXG4gIGNvbnN0cnVjdG9yKHBhdHRlcm46IGFueSwgY2hpbGRyZW46IGFueSkge1xuICAgIHRoaXMuX3BhdHRlcm5fID0gcGF0dGVyblxuICAgIHRoaXMuX21hdGNoX2NvdW50XyA9IDBcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNoaWxkcmVuKVxuICB9XG59XG5cbmNsYXNzIENvZGUyUGF0dGVybkNvbUZvbmQgZXh0ZW5kcyBDb2RlMlBhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIl4vU0FJU0lFLygvTk9NSU4vKSooL1JFVU5JT04vKSooL1JBUFBPUlQvKSokXCIsIHt9KVxuICB9XG59XG5cbmNsYXNzIExlY3R1cmVNYXBwaW5nIHtcbiAgbGliZWxsZTogYW55ID0ge31cbiAgY29kZXM6IGFueSA9IG5ldyBTZXQoKVxuXG4gIHN0YXRpYyBjb2Rlc19sZWN0dXJlOiBzdHJpbmdbXSA9IFtcbiAgICBcIkFOMVwiLFxuICAgIFwiU04xXCIsXG4gICAgXCJBTk5MRUNcIixcbiAgICBcIlNOTkxFQ1wiLFxuICAgIFwiQU5MREVGXCIsXG4gICAgXCJBTjJcIixcbiAgICBcIlNOMlwiLFxuICAgIFwiU04zXCIsXG4gIF1cbiAgc3RhdGljIGNvZGVzX2xlY3R1cmVfcmVnZXhwOiBhbnkgPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OlwiICsgTGVjdHVyZU1hcHBpbmcuY29kZXNfbGVjdHVyZS5qb2luKFwifFwiKSArIFwiKSgtLiopPyRcIixcbiAgKVxuXG4gIHN0YXRpYyBpc0xlY3R1cmUoYWN0ZTogYW55KSB7XG4gICAgcmV0dXJuIGFjdGUuY29kZUFjdGUubWF0Y2goTGVjdHVyZU1hcHBpbmcuY29kZXNfbGVjdHVyZV9yZWdleHApXG4gIH1cblxuICBzdGF0aWMgZ2V0VHlwZShhY3RlOiBhbnkpIHtcbiAgICBpZiAoYWN0ZS5jb2RlQWN0ZS5tYXRjaCgvXkFOLykpIHJldHVybiBcIkFOXCJcbiAgICBlbHNlIGlmIChhY3RlLmNvZGVBY3RlLm1hdGNoKC9eU04vKSkgcmV0dXJuIFwiU05cIlxuICAgIGVsc2UgdGhyb3cgRXJyb3IoYCR7YWN0ZS5jb2RlQWN0ZX0gZG9lcyBub3Qgc3RhcnQgd2l0aCBBTiBvciBTTmApXG4gIH1cblxuICBzdGF0aWMgbWFwKGNvZGVBY3RlOiBhbnkpIHtcbiAgICByZXR1cm4gY29kZUFjdGUucmVwbGFjZShMZWN0dXJlTWFwcGluZy5jb2Rlc19sZWN0dXJlX3JlZ2V4cCwgYGxlY3R1cmUkMWApXG4gIH1cblxuICBzdGF0aWMgZ2V0Q29kZUFjdGUoYWN0ZTogYW55KSB7XG4gICAgaWYgKCFMZWN0dXJlTWFwcGluZy5pc0xlY3R1cmUoYWN0ZSkpIHJldHVyblxuXG4gICAgcmV0dXJuIExlY3R1cmVNYXBwaW5nLm1hcChhY3RlLmNvZGVBY3RlKVxuICB9XG5cbiAgYWRkKGFjdGU6IGFueSkge1xuICAgIHRoaXMuY29kZXMuYWRkKGFjdGUuY29kZUFjdGUpXG5cbiAgICBjb25zdCB0eXBlID0gTGVjdHVyZU1hcHBpbmcuZ2V0VHlwZShhY3RlKVxuXG4gICAgaWYgKCEoYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWUgaW4gdGhpcy5saWJlbGxlKSlcbiAgICAgIHRoaXMubGliZWxsZVthY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZV0gPSBuZXcgU2V0KClcbiAgICB0aGlzLmxpYmVsbGVbYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWVdLmFkZCh0eXBlKVxuICB9XG5cbiAgcmVtYXAoYWN0ZTogYW55LCBjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgYWN0ZS5jb2RlQWN0ZSA9IGNvZGVBY3RlXG5cbiAgICBsZXQgdHlwZXMgPSB0aGlzLmxpYmVsbGVbYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWVdXG4gICAgaWYgKCEodHlwZXMuaGFzKFwiU05cIikgJiYgdHlwZXMuaGFzKFwiQU5cIikpKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKFwiU05cIikpIGFjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlICs9IFwiIChTw6luYXQpXCJcbiAgICAgIGVsc2UgaWYgKHR5cGVzLmhhcyhcIkFOXCIpKVxuICAgICAgICBhY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZSArPSBcIiAoQXNzZW1ibMOpZSBOYXRpb25hbGUpXCJcbiAgICB9XG4gIH1cblxuICBtZXJnZUNvZGVzKGNvZGVzOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgQXJyYXkuZnJvbSh0aGlzLmNvZGVzKSkgY29kZXMuYWRkKGMpXG4gIH1cblxuICBwcmludEFuY2hvcnMoKSB7XG4gICAgZm9yIChjb25zdCBjb2RlIG9mIEFycmF5LmZyb20odGhpcy5jb2RlcykpIGNvbnNvbGUubG9nKGAuLiBfJHtjb2RlfTpgKVxuICB9XG5cbiAgZ2V0Q29kZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb2Rlcykuam9pbihcIixcIilcbiAgfVxufVxuXG5jbGFzcyBMZWN0dXJlTWFwcGVyIHtcbiAgbWFwcGluZzogYW55ID0ge31cblxuICBoYXMoY29kZUFjdGU6IHN0cmluZykge1xuICAgIHJldHVybiBjb2RlQWN0ZSBpbiB0aGlzLm1hcHBpbmdcbiAgfVxuXG4gIGNvbGxlY3QoYWN0ZTogYW55KSB7XG4gICAgY29uc3QgY29kZUFjdGUgPSBMZWN0dXJlTWFwcGluZy5nZXRDb2RlQWN0ZShhY3RlKVxuICAgIGlmIChjb2RlQWN0ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBsZWN0dXJlcyA9IHRoaXMubWFwcGluZ1xuICAgICAgaWYgKCEoY29kZUFjdGUgaW4gbGVjdHVyZXMpKSBsZWN0dXJlc1tjb2RlQWN0ZV0gPSBuZXcgTGVjdHVyZU1hcHBpbmcoKVxuICAgICAgbGVjdHVyZXNbY29kZUFjdGVdLmFkZChhY3RlKVxuICAgIH1cbiAgfVxuXG4gIHJlbWFwKGFjdGU6IGFueSkge1xuICAgIGNvbnN0IGNvZGVBY3RlID0gTGVjdHVyZU1hcHBpbmcuZ2V0Q29kZUFjdGUoYWN0ZSlcbiAgICBpZiAoY29kZUFjdGUgIT0gdW5kZWZpbmVkKSB0aGlzLm1hcHBpbmdbY29kZUFjdGVdLnJlbWFwKGFjdGUsIGNvZGVBY3RlKVxuICB9XG5cbiAgbWVyZ2VDb2Rlcyhjb2RlczogYW55LCBjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5tYXBwaW5nW2NvZGVBY3RlXS5tZXJnZUNvZGVzKGNvZGVzKVxuICB9XG5cbiAgcHJpbnRBbmNob3JzKGNvZGVBY3RlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1hcHBpbmdbY29kZUFjdGVdLnByaW50QW5jaG9ycygpXG4gIH1cblxuICBnZXRDb2Rlcyhjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwcGluZ1tjb2RlQWN0ZV0uZ2V0Q29kZXMoKVxuICB9XG59XG5cbmNsYXNzIEFjdGVzRG9jdW1lbnRhdGlvbiB7XG4gIHZlcmJvc2U6IGJvb2xlYW5cbiAgc2FuaXR5Q2hlY2tzOiBib29sZWFuXG4gIGxlY3R1cmVNYXBwZXI6IGFueSA9IG5ldyBMZWN0dXJlTWFwcGVyKClcbiAgcmVtYXBwZWRQcm9jZWR1cmVzOiBhbnkgPSB7fVxuICBhbmNob3JzUHJpbnRlZDogYW55ID0ge31cbiAgYW5jaG9yczogYW55ID0gbmV3IFNldCgpXG4gIGNvZGVzOiBhbnkgPSB7fVxuICBwcm9jZWR1cmVzOiBhbnkgPSBudWxsXG4gIGNvZGUycGF0dGVybjogYW55ID0gbmV3IENvZGUyUGF0dGVybihudWxsLCB7XG4gICAgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgXCJeKCgoL2xlY3R1cmUvKSspfCgoL2xlY3R1cmUvKSsvQ01QLygvbGVjdHVyZS8pKikpKC9DQy8pPygvUFJPTS8pPygvQU4tQVBQTEkvKT8kXCIsXG4gICAgICB7XG4gICAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgXCJeKC9ERVBPVC8pPygvRFBUTEVUVFJFQ1QvKT8oL0VUSS8pPygvQVZDRS8pPygvREdWVC8pPygvQUNJTi8pPygvTU9USU9OLykqKC9QUk9DQUNDLyk/KC9DT00vKT8oKC9ERUJBVFMvKSspPygvUlRSSU5JLyk/JFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGVjdHVyZS1DT01cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0ZPTkQvfC9BVklTLykrJFwiLCB7XG4gICAgICAgICAgICAgIFwibGVjdHVyZS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuQ29tRm9uZCgpLFxuICAgICAgICAgICAgICBcImxlY3R1cmUtQ09NLUFWSVNcIjogbmV3IENvZGUyUGF0dGVybkNvbUZvbmQoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXCJsZWN0dXJlLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgICAgICBcIl4oL1NFQU5DRS8pKigoL01PVElPTi8pPygvTU9USU9OLVZPVEUvKSspPygvREVDLyk/JFwiLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgQ01QOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvREVQT1QvfC9TQUlTSUUvKXsxLDJ9KC9DT00vKT8oL0RFQy8pPygvREVCQVRTLUFOLy9ERUJBVFMtU04vKT9cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIkNNUC1DT01cIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgICAgXCJeKC9OT01JTi8pPygvUkFQUE9SVC1BTi98L1JBUFBPUlQtU04vKXsyfSRcIixcbiAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgXCJDTVAtREVCQVRTLUFOXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSooL0RFQy8pPyRcIiwge30pLFxuICAgICAgICAgICAgXCJDTVAtREVCQVRTLVNOXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSooL0RFQy8pPyRcIiwge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIENDOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0FJU0lFLykrKC9DT05DTFVTSU9OLyk/JFwiLCB7fSksXG4gICAgICAgIFBST006IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9QVUIvKT8kXCIsIHt9KSxcbiAgICAgICAgXCJBTi1BUFBMSVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvUkFQUE9SVC8pPyRcIiwge30pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiQWxsb2N1dGlvbiBkdSBQcsOpc2lkZW50IGRlIGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgIFwiXi9BTjIxLyRcIixcbiAgICAgIHtcbiAgICAgICAgQU4yMTogbmV3IENvZGUyUGF0dGVybihcIl4oL0FQQU4vKT8kXCIsIHt9KSxcbiAgICAgIH0sXG4gICAgKSxcbiAgICBcIlLDqXNvbHV0aW9uIEFydGljbGUgMzQtMVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU5MVU5JLyk/JFwiLCB7XG4gICAgICBBTkxVTkk6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvREVCQVRTLyk/KC9SVFJJTkkvKT8kXCIsIHtcbiAgICAgICAgXCJBTkxVTkktREVCQVRTXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSsoL0RFQy8pPyRcIiwge30pLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgUsOpc29sdXRpb246IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9BTkxVTkkvKT8oL0NDLyk/JFwiLCB7XG4gICAgICBBTkxVTkk6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvQ09NLyk/KC9ERUJBVFMvfC9SVFJJTkkvKT8kXCIsIHtcbiAgICAgICAgXCJBTkxVTkktQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9DQUUvKT8oL0ZPTkQvKT8kXCIsIHtcbiAgICAgICAgICBcIkFOTFVOSS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuQ29tRm9uZCgpLFxuICAgICAgICAgIFwiQU5MVU5JLUNPTS1DQUVcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgIFwiXigvU0FJU0lFLyk/KC9OT01JTi8pPygvUkVVTklPTi8pPygvUkFQUE9SVC8pPygvREVDLyk/JFwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgKSxcbiAgICAgICAgfSksXG4gICAgICAgIFwiQU5MVU5JLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykqKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgICAgQ0M6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TQUlTSUUvKT8oL0NPTkNMVVNJT04vKT8kXCIsIHt9KSxcbiAgICB9KSxcbiAgICBcIlJhcHBvcnQgZCdpbmZvcm1hdGlvbiBzYW5zIG1pc3Npb25cIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgIFwiXigvQU4yMC8pPygvRVUvKT8kXCIsXG4gICAgICB7XG4gICAgICAgIEFOMjA6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9SQVBQT1JULyk/JFwiLCB7fSksXG4gICAgICAgIEVVOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVDLykrJFwiLCB7fSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJNaXNzaW9uIGQnaW5mb3JtYXRpb25cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOMjAvKT8kXCIsIHtcbiAgICAgIEFOMjA6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9NSVNJTkYvKT8kXCIsIHtcbiAgICAgICAgXCJBTjIwLU1JU0lORlwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvQ1JFQS8pPygvTk9NSU4vKT8oL1JBUFBPUlQvKT8kXCIsXG4gICAgICAgICAge30sXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBcIkNvbW1pc3Npb24gZCdlbnF1w6p0ZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU4yMC8pPyRcIiwge1xuICAgICAgQU4yMDogbmV3IENvZGUyUGF0dGVybihcIl4oL0NPTUVOUS8pPyRcIiwge1xuICAgICAgICBcIkFOMjAtQ09NRU5RXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgXCJeKC9DUkVBLyk/KC9OT01JTi8pPygvUkFQUE9SVC8pPyRcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIFwiRW5nYWdlbWVudCBkZSBsYSByZXNwb25zYWJpbGl0w6kgZ291dmVybmVtZW50YWxlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4vQU4yMS8kXCIsXG4gICAgICB7XG4gICAgICAgIEFOMjE6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKCgoL01PVElPTi8pKi9ERUJBVFMvKXwoL0RHVlQvKSl7MSwyfSRcIiwge1xuICAgICAgICAgIFwiQU4yMS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1NFQU5DRS8pKigvTU9USU9OLVZPVEUvKSokXCIsIHt9KSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJNb3Rpb24gcsOpZsOpcmVuZGFpcmVcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL2xlY3R1cmUvKSskXCIsIHtcbiAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvQ09NLyk/KC9ERUJBVFMvKT8kXCIsIHtcbiAgICAgICAgXCJsZWN0dXJlLUNPTVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvRk9ORC8pPyRcIiwge1xuICAgICAgICAgIFwibGVjdHVyZS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgICAgXCJeKC9TQUlTSUUvKT8oL05PTUlOLykqKC9SQVBQT1JULykqJFwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgKSxcbiAgICAgICAgfSksXG4gICAgICAgIFwibGVjdHVyZS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0RFQy8pPyRcIiwge30pLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgSW1tdW5pdMOpOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU5MVU5JLykrJFwiLCB7XG4gICAgICBBTkxVTkk6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvQ09NLyk/KC9ERUJBVFMvKT8oL1JUUklOSS8pPyRcIiwge1xuICAgICAgICBcIkFOTFVOSS1DT01cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0ZPTkQvKT8kXCIsIHtcbiAgICAgICAgICBcIkFOTFVOSS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgICAgXCJeKC9TQUlTSUUvKT8oL05PTUlOLykqKC9SQVBQT1JULykqJFwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgKSxcbiAgICAgICAgfSksXG4gICAgICAgIFwiQU5MVU5JLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLyk/KC9ERUMvKSRcIiwge30pLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgXCJSZXNwb25zYWJpbGl0w6kgcMOpbmFsZSBkdSBwcsOpc2lkZW50IGRlIGxhIHLDqXB1YmxpcXVlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4vbGVjdHVyZS8kXCIsXG4gICAgICB7XG4gICAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvUkVDQlVSRUFVLyk/JFwiLCB7fSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJQcm9wb3NpdGlvbiBkZSBsb2kgcHLDqXNlbnTDqWUgZW4gYXBwbGljYXRpb24gZGUgbCdhcnRpY2xlIDExIGRlIGxhIENvbnN0aXR1dGlvblwiOlxuICAgICAgbmV3IENvZGUyUGF0dGVybihcIl4vbGVjdHVyZS8kXCIsIHtcbiAgICAgICAgbGVjdHVyZTogbmV3IENvZGUyUGF0dGVybihcIl4oL0RFUE9ULyk/JFwiLCB7fSksXG4gICAgICB9KSxcbiAgfSlcblxuICBjb25zdHJ1Y3RvcihzYW5pdHlDaGVja3M6IGJvb2xlYW4sIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2VcbiAgICB0aGlzLnNhbml0eUNoZWNrcyA9IHNhbml0eUNoZWNrc1xuICAgIHRoaXMucHJvY2VkdXJlcyA9IHt9XG4gICAgdGhpcy5jb2RlMnBhdHRlcm4uX21hdGNoX2NvdW50XysrXG4gIH1cblxuICB3YWxrRmlsZXMoZGF0YTogc3RyaW5nW10sIGFjdGlvbjogYW55KSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGdldEZpbGVzKGRhdGEpKSB7XG4gICAgICBjb25zdCBkb3NzaWVyID0gbG9hZChmaWxlKVxuICAgICAgbGV0IHByb2NlZHVyZTogc3RyaW5nID0gdGhpcy5yZW1hcFByb2NlZHVyZShcbiAgICAgICAgZG9zc2llci5wcm9jZWR1cmVQYXJsZW1lbnRhaXJlLmxpYmVsbGUsXG4gICAgICApXG4gICAgICBpZiAoIShwcm9jZWR1cmUgaW4gdGhpcy5wcm9jZWR1cmVzKSkgdGhpcy5wcm9jZWR1cmVzW3Byb2NlZHVyZV0gPSB7fVxuICAgICAgYWN0aW9uKFxuICAgICAgICB0aGlzLnByb2NlZHVyZXNbcHJvY2VkdXJlXSxcbiAgICAgICAgZG9zc2llci5hY3Rlc0xlZ2lzbGF0aWZzLFxuICAgICAgICB0aGlzLmNvZGUycGF0dGVybltwcm9jZWR1cmVdLFxuICAgICAgICBudWxsLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbGxlY3RGaWxlcyhkYXRhOiBzdHJpbmdbXSkge1xuICAgIHRoaXMud2Fsa0ZpbGVzKFxuICAgICAgZGF0YSxcbiAgICAgIChfYWN0ZXM6IGFueSwgYWN0ZXNMZWdpc2xhdGlmczogYW55LCBfYzJwOiBhbnksIF9wYXJlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmNvbGxlY3QoYWN0ZXNMZWdpc2xhdGlmcylcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgcHJvY2Vzc0ZpbGVzKGRhdGE6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy53YWxrRmlsZXMoXG4gICAgICBkYXRhLFxuICAgICAgKGFjdGVzOiBhbnksIGFjdGVzTGVnaXNsYXRpZnM6IGFueSwgYzJwOiBhbnksIHBhcmVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWVyZ2UoYWN0ZXMsIGFjdGVzTGVnaXNsYXRpZnMsIGMycCwgcGFyZW50KVxuICAgICAgfSxcbiAgICApXG4gICAgaWYgKHRoaXMuc2FuaXR5Q2hlY2tzKSB0aGlzLnZhbGlkYXRlKClcbiAgfVxuXG4gIHJlbWFwQWN0ZXMoYWN0ZXM6IGFueSk6IGFueSB7XG4gICAgbGV0IHJlc3VsdHMgPSBbXVxuICAgIGZvciAoY29uc3QgYWN0ZSBvZiBhY3Rlcykge1xuICAgICAgdGhpcy5sZWN0dXJlTWFwcGVyLnJlbWFwKGFjdGUpXG5cbiAgICAgIC8vIENDLVNBSVNJRS0gc3VmZml4IGRvZXMgbm90IGltcGx5IGEgaGllcmFyY2h5XG4gICAgICBhY3RlLmNvZGVBY3RlID0gYWN0ZS5jb2RlQWN0ZS5yZXBsYWNlKC9eQ0MtU0FJU0lFLiovLCBcIkNDLVNBSVNJRVwiKVxuXG4gICAgICByZXN1bHRzLnB1c2goYWN0ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIGNvbGxlY3RBY3RlcyhhY3RlczogYW55KTogYW55IHtcbiAgICBsZXQgcmVzdWx0cyA9IFtdXG4gICAgZm9yIChjb25zdCBhY3RlIG9mIGFjdGVzKSB7XG4gICAgICB0aGlzLmxlY3R1cmVNYXBwZXIuY29sbGVjdChhY3RlKVxuXG4gICAgICByZXN1bHRzLnB1c2goYWN0ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIHJlbWFwUHJvY2VkdXJlKHByb2NlZHVyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXJnZV9wcm9jZWR1cmVzOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcChbXG4gICAgICBbXCJQcm9wb3NpdGlvbiBkZSBsb2kgb3JkaW5haXJlXCIsIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIl0sXG4gICAgICBbXCJQcm9qZXQgZGUgbG9pIG9yZGluYWlyZVwiLCBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCJdLFxuICAgICAgW1xuICAgICAgICBcIlByb2pldCBkZSByYXRpZmljYXRpb24gZGVzIHRyYWl0w6lzIGV0IGNvbnZlbnRpb25zXCIsXG4gICAgICAg