@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -1,18 +1,137 @@
1
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ require("core-js/modules/es.function.name.js");
6
+
7
+ require("core-js/modules/es.array.from.js");
8
+
9
+ require("core-js/modules/es.string.iterator.js");
10
+
11
+ require("core-js/modules/es.symbol.js");
12
+
13
+ require("core-js/modules/es.symbol.description.js");
14
+
15
+ require("core-js/modules/es.symbol.iterator.js");
16
+
17
+ require("core-js/modules/es.array.iterator.js");
18
+
19
+ require("core-js/modules/web.dom-collections.iterator.js");
20
+
21
+ require("core-js/modules/es.array.is-array.js");
22
+
23
+ require("core-js/modules/es.promise.js");
24
+
25
+ require("core-js/modules/es.symbol.async-iterator.js");
26
+
27
+ require("core-js/modules/es.symbol.to-string-tag.js");
28
+
29
+ require("core-js/modules/es.json.to-string-tag.js");
30
+
31
+ require("core-js/modules/es.math.to-string-tag.js");
32
+
33
+ require("core-js/modules/es.object.create.js");
34
+
35
+ require("core-js/modules/es.object.get-prototype-of.js");
36
+
37
+ require("core-js/modules/es.array.for-each.js");
38
+
39
+ require("core-js/modules/web.dom-collections.for-each.js");
40
+
41
+ require("core-js/modules/es.object.set-prototype-of.js");
42
+
43
+ require("core-js/modules/es.array.reverse.js");
44
+
45
+ require("core-js/modules/es.weak-map.js");
46
+
47
+ require("core-js/modules/es.object.get-own-property-descriptor.js");
48
+
49
+ require("core-js/modules/es.array.concat.js");
50
+
51
+ require("core-js/modules/es.array.map.js");
52
+
53
+ require("core-js/modules/es.date.to-string.js");
54
+
55
+ require("core-js/modules/es.object.to-string.js");
56
+
57
+ require("core-js/modules/es.regexp.to-string.js");
58
+
59
+ require("core-js/modules/es.array.slice.js");
60
+
61
+ require("core-js/modules/es.array.join.js");
62
+
63
+ require("core-js/modules/es.regexp.exec.js");
64
+
65
+ require("core-js/modules/es.string.starts-with.js");
66
+
67
+ require("core-js/modules/es.array.includes.js");
68
+
69
+ require("core-js/modules/es.string.includes.js");
70
+
71
+ require("core-js/modules/es.string.ends-with.js");
72
+
73
+ require("core-js/modules/es.object.define-property.js");
74
+
75
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
76
+
77
+ var _commandLineUsage = _interopRequireDefault(require("command-line-usage"));
78
+
79
+ var git = _interopRequireWildcard(require("../../src/git"));
80
+
81
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
82
+
83
+ var _path = _interopRequireDefault(require("path"));
84
+
85
+ var _file_systems = require("../file_systems");
86
+
87
+ var _urls = require("../urls");
2
88
 
3
- import commandLineArgs from "command-line-args";
4
- import commandLineUsage from "command-line-usage";
5
- import * as git from "../../src/git.js";
6
- import fs from "fs-extra";
89
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
7
90
 
8
- let fetch = require("node-fetch");
91
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
9
92
 
10
- import path from "path";
11
- import { load, getFiles } from "../file_systems.js";
12
- import { DocumentUrlFormat, urlFromDocument } from "../urls.js";
93
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
94
+
95
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
96
+
97
+ 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."); }
98
+
99
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
100
+
101
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
102
+
103
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return generator._invoke = function (innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; }(innerFn, self, context), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; this._invoke = function (method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, "throw" === context.method) { if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
104
+
105
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
106
+
107
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
108
+
109
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
110
+
111
+ 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."); }
112
+
113
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
114
+
115
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
116
+
117
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
118
+
119
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
120
+
121
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
122
+
123
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
124
+
125
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
126
+
127
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
128
+
129
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
130
+
131
+ var fetch = require("node-fetch");
13
132
 
14
133
  function parseArgs(argv) {
15
- const optionsDefinitions = [{
134
+ var optionsDefinitions = [{
16
135
  alias: "c",
17
136
  help: "commit documents",
18
137
  name: "commit",
@@ -60,19 +179,19 @@ function parseArgs(argv) {
60
179
  name: "data",
61
180
  type: String
62
181
  }];
63
- const sections = [{
182
+ var sections = [{
64
183
  header: "Retrieve documents",
65
184
  content: "Retrieve documents"
66
185
  }, {
67
186
  header: "Options",
68
187
  optionList: optionsDefinitions
69
188
  }];
70
- const options = commandLineArgs(optionsDefinitions, {
189
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions, {
71
190
  argv: argv
72
191
  });
73
192
 
74
193
  if ("help" in options) {
75
- const usage = commandLineUsage(sections);
194
+ var usage = (0, _commandLineUsage["default"])(sections);
76
195
  console.warn(usage);
77
196
  return null;
78
197
  }
@@ -80,213 +199,570 @@ function parseArgs(argv) {
80
199
  return options;
81
200
  }
82
201
 
83
- class Retrieve {
84
- constructor(options) {
202
+ var Retrieve = /*#__PURE__*/function () {
203
+ function Retrieve(options) {
204
+ _classCallCheck(this, Retrieve);
205
+
85
206
  _defineProperty(this, "options", void 0);
86
207
 
87
208
  this.options = options;
88
209
  }
89
210
 
90
- getDivisions(division) {
91
- let divisions = [division];
211
+ _createClass(Retrieve, [{
212
+ key: "getDivisions",
213
+ value: function getDivisions(division) {
214
+ var divisions = [division];
92
215
 
93
- if (division.divisions != undefined) {
94
- for (const d of division.divisions) divisions = divisions.concat(this.getDivisions(d));
95
- }
216
+ if (division.divisions != undefined) {
217
+ var _iterator = _createForOfIteratorHelper(division.divisions),
218
+ _step;
96
219
 
97
- return divisions;
98
- }
220
+ try {
221
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
222
+ var d = _step.value;
223
+ divisions = divisions.concat(this.getDivisions(d));
224
+ }
225
+ } catch (err) {
226
+ _iterator.e(err);
227
+ } finally {
228
+ _iterator.f();
229
+ }
230
+ }
99
231
 
100
- getDivisionsOrDocument(document) {
101
- if (document.divisions != undefined) return [].concat(...document.divisions.map(d => this.getDivisions(d)));else return [document];
102
- }
232
+ return divisions;
233
+ }
234
+ }, {
235
+ key: "getDivisionsOrDocument",
236
+ value: function getDivisionsOrDocument(document) {
237
+ var _ref,
238
+ _this = this;
239
+
240
+ if (document.divisions != undefined) return (_ref = []).concat.apply(_ref, _toConsumableArray(document.divisions.map(function (d) {
241
+ return _this.getDivisions(d);
242
+ })));else return [document];
243
+ }
244
+ }, {
245
+ key: "commitAndPush",
246
+ value: function () {
247
+ var _commitAndPush = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(repositoryDir) {
248
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
249
+ while (1) {
250
+ switch (_context.prev = _context.next) {
251
+ case 0:
252
+ if (!(this.options.commit == undefined)) {
253
+ _context.next = 2;
254
+ break;
255
+ }
256
+
257
+ return _context.abrupt("return");
258
+
259
+ case 2:
260
+ git.commit(repositoryDir, "Nouvelle moisson");
261
+
262
+ if (!(this.options.remote == undefined)) {
263
+ _context.next = 5;
264
+ break;
265
+ }
266
+
267
+ return _context.abrupt("return");
268
+
269
+ case 5:
270
+ git.run(repositoryDir, "push ".concat(this.options.remote, " HEAD:master"));
271
+
272
+ case 6:
273
+ case "end":
274
+ return _context.stop();
275
+ }
276
+ }
277
+ }, _callee, this);
278
+ }));
103
279
 
104
- async commitAndPush(repositoryDir) {
105
- if (this.options.commit == undefined) return;
106
- git.commit(repositoryDir, "Nouvelle moisson");
107
- if (this.options.remote == undefined) return;
108
- git.run(repositoryDir, `push ${this.options.remote} HEAD:master`);
109
- }
280
+ function commitAndPush(_x) {
281
+ return _commitAndPush.apply(this, arguments);
282
+ }
110
283
 
111
- getUrls(divisionOrDocument, format) {
112
- const ext = format == "html" ? "raw" : "pdf";
113
- let urls = [`http://www.assemblee-nationale.fr/dyn/docs/${divisionOrDocument.uid}.${ext}`];
284
+ return commitAndPush;
285
+ }()
286
+ }, {
287
+ key: "getUrls",
288
+ value: function getUrls(divisionOrDocument, format) {
289
+ var ext = format == "html" ? "raw" : "pdf";
290
+ var urls = ["http://www.assemblee-nationale.fr/dyn/docs/".concat(divisionOrDocument.uid, ".").concat(ext)];
291
+
292
+ if (format == "html") {
293
+ urls.push((0, _urls.urlFromDocument)(divisionOrDocument, _urls.DocumentUrlFormat.RawHtml));
294
+ urls.push((0, _urls.urlFromDocument)(divisionOrDocument, _urls.DocumentUrlFormat.Html));
295
+ } else if (format == "pdf") {
296
+ urls.push((0, _urls.urlFromDocument)(divisionOrDocument, _urls.DocumentUrlFormat.Pdf));
297
+ }
114
298
 
115
- if (format == "html") {
116
- urls.push(urlFromDocument(divisionOrDocument, DocumentUrlFormat.RawHtml));
117
- urls.push(urlFromDocument(divisionOrDocument, DocumentUrlFormat.Html));
118
- } else if (format == "pdf") {
119
- urls.push(urlFromDocument(divisionOrDocument, DocumentUrlFormat.Pdf));
299
+ return urls;
120
300
  }
301
+ }, {
302
+ key: "needsDownload",
303
+ value: function () {
304
+ var _needsDownload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(filePath, uid) {
305
+ var isNotEmpty, retryFailed, urlPath, url;
306
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
307
+ while (1) {
308
+ switch (_context2.prev = _context2.next) {
309
+ case 0:
310
+ if (!_fsExtra["default"].existsSync(filePath)) {
311
+ _context2.next = 6;
312
+ break;
313
+ }
314
+
315
+ isNotEmpty = _fsExtra["default"].statSync(filePath).size > 0;
316
+ retryFailed = "retry-failed" in this.options;
317
+
318
+ if (!(!retryFailed || isNotEmpty)) {
319
+ _context2.next = 6;
320
+ break;
321
+ }
322
+
323
+ if (this.options.verbose) {
324
+ if (isNotEmpty) {
325
+ urlPath = "".concat(filePath, ".url");
326
+ if (_fsExtra["default"].existsSync(urlPath)) url = _fsExtra["default"].readFileSync(urlPath).toString();else url = "<unknown url>";
327
+ console.log("".concat(uid, ": Cached OK ").concat(filePath, " from ").concat(url));
328
+ } else {
329
+ console.log("".concat(uid, ": Cached FAIL ").concat(filePath));
330
+ }
331
+ }
332
+
333
+ return _context2.abrupt("return", false);
334
+
335
+ case 6:
336
+ return _context2.abrupt("return", true);
337
+
338
+ case 7:
339
+ case "end":
340
+ return _context2.stop();
341
+ }
342
+ }
343
+ }, _callee2, this);
344
+ }));
121
345
 
122
- return urls;
123
- }
346
+ function needsDownload(_x2, _x3) {
347
+ return _needsDownload.apply(this, arguments);
348
+ }
124
349
 
125
- static sanityCheckFormat(page, format) {
126
- if (format == "pdf") {
127
- const length = Math.min(page.length, 4);
128
- const head = page.slice(0, length).toString();
129
- if (!head.startsWith("%PDF")) return [Buffer.from(""), `bad pdf ${encodeURIComponent(head)}...`];
130
- } else if (format == "html") {
131
- const length = Math.min(page.length, 50);
132
- const head = page.slice(0, length).toString();
133
-
134
- if (!head.includes("DOCTYPE") && !head.includes("<?xml")) {
135
- return [Buffer.from(""), `bad html ${encodeURIComponent(head.slice(0, 4))}...`];
350
+ return needsDownload;
351
+ }()
352
+ }, {
353
+ key: "get",
354
+ value: function () {
355
+ var _get = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(url, filePath, format, uid) {
356
+ var response, page, status, _Retrieve$sanityCheck, _Retrieve$sanityCheck2;
357
+
358
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
359
+ while (1) {
360
+ switch (_context3.prev = _context3.next) {
361
+ case 0:
362
+ if (this.options.verbose) console.log("".concat(uid, ": fetch(").concat(url, ")"));
363
+ _context3.next = 3;
364
+ return fetch(url);
365
+
366
+ case 3:
367
+ response = _context3.sent;
368
+ _context3.next = 6;
369
+ return response.buffer();
370
+
371
+ case 6:
372
+ page = _context3.sent;
373
+
374
+ if (!response.ok) {
375
+ status = response.status;
376
+
377
+ if (response.status !== 404) {
378
+ if (this.options.verbose) {
379
+ console.error("Error while getting page \"".concat(url, "\" (uid: ").concat(uid, "):\n\nError:\n").concat(JSON.stringify({
380
+ code: response.status,
381
+ message: response.statusText
382
+ }, null, 2)));
383
+ }
384
+ }
385
+
386
+ _fsExtra["default"].writeFileSync(filePath, "");
387
+ } else {
388
+ ;
389
+ _Retrieve$sanityCheck = Retrieve.sanityCheckFormat(page, format);
390
+ _Retrieve$sanityCheck2 = _slicedToArray(_Retrieve$sanityCheck, 2);
391
+ page = _Retrieve$sanityCheck2[0];
392
+ status = _Retrieve$sanityCheck2[1];
393
+
394
+ _fsExtra["default"].writeFileSync(filePath, page);
395
+ }
396
+
397
+ return _context3.abrupt("return", status);
398
+
399
+ case 9:
400
+ case "end":
401
+ return _context3.stop();
402
+ }
403
+ }
404
+ }, _callee3, this);
405
+ }));
406
+
407
+ function get(_x4, _x5, _x6, _x7) {
408
+ return _get.apply(this, arguments);
136
409
  }
137
- }
138
410
 
139
- return [page, "OK"];
140
- }
411
+ return get;
412
+ }()
413
+ }, {
414
+ key: "download",
415
+ value: function () {
416
+ var _download = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(textesDir, divisionOrDocument, format) {
417
+ var uid, filePath, success, info, url, _iterator2, _step2, status, urlPath;
418
+
419
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
420
+ while (1) {
421
+ switch (_context4.prev = _context4.next) {
422
+ case 0:
423
+ uid = divisionOrDocument.uid;
424
+ filePath = "".concat(textesDir, "/uid/").concat(uid, ".").concat(format);
425
+ _context4.next = 4;
426
+ return this.needsDownload(filePath, uid);
427
+
428
+ case 4:
429
+ if (_context4.sent) {
430
+ _context4.next = 6;
431
+ break;
432
+ }
433
+
434
+ return _context4.abrupt("return", 0);
435
+
436
+ case 6:
437
+ if (this.options.verbose) console.log("".concat(uid, ": Checking ").concat(filePath));
438
+ success = false;
439
+ info = "";
440
+ _iterator2 = _createForOfIteratorHelper(this.getUrls(divisionOrDocument, format));
441
+ _context4.prev = 10;
442
+
443
+ _iterator2.s();
444
+
445
+ case 12:
446
+ if ((_step2 = _iterator2.n()).done) {
447
+ _context4.next = 29;
448
+ break;
449
+ }
450
+
451
+ url = _step2.value;
452
+
453
+ if (!("dry-run" in this.options)) {
454
+ _context4.next = 19;
455
+ break;
456
+ }
457
+
458
+ info += " * ".concat(url, "\n");
459
+ return _context4.abrupt("continue", 27);
460
+
461
+ case 19:
462
+ info += " * ".concat(url, " ");
463
+
464
+ case 20:
465
+ _context4.next = 22;
466
+ return this.get(url, filePath, format, uid);
467
+
468
+ case 22:
469
+ status = _context4.sent;
470
+ info += "".concat(status, "\n");
471
+
472
+ if (!(status == "OK")) {
473
+ _context4.next = 27;
474
+ break;
475
+ }
476
+
477
+ success = true;
478
+ return _context4.abrupt("break", 29);
479
+
480
+ case 27:
481
+ _context4.next = 12;
482
+ break;
483
+
484
+ case 29:
485
+ _context4.next = 34;
486
+ break;
487
+
488
+ case 31:
489
+ _context4.prev = 31;
490
+ _context4.t0 = _context4["catch"](10);
491
+
492
+ _iterator2.e(_context4.t0);
493
+
494
+ case 34:
495
+ _context4.prev = 34;
496
+
497
+ _iterator2.f();
141
498
 
142
- async needsDownload(filePath, uid) {
143
- if (fs.existsSync(filePath)) {
144
- const isNotEmpty = fs.statSync(filePath).size > 0;
145
- const retryFailed = ("retry-failed" in this.options);
146
-
147
- if (!retryFailed || isNotEmpty) {
148
- if (this.options.verbose) {
149
- if (isNotEmpty) {
150
- const urlPath = `${filePath}.url`;
151
- let url;
152
- if (fs.existsSync(urlPath)) url = fs.readFileSync(urlPath).toString();else url = "<unknown url>";
153
- console.log(`${uid}: Cached OK ${filePath} from ${url}`);
154
- } else {
155
- console.log(`${uid}: Cached FAIL ${filePath}`);
499
+ return _context4.finish(34);
500
+
501
+ case 37:
502
+ urlPath = "".concat(filePath, ".url");
503
+
504
+ if (success) {
505
+ _fsExtra["default"].writeFileSync(urlPath, url);
506
+ } else if (_fsExtra["default"].existsSync(urlPath)) {
507
+ _fsExtra["default"].unlinkSync(urlPath);
508
+ }
509
+
510
+ if (!(info != "" && !this.options.silent)) {
511
+ _context4.next = 44;
512
+ break;
513
+ }
514
+
515
+ console.log("* ".concat(Retrieve.urlFromUid(uid), ": Retrieving ").concat(filePath, "\n").concat(info.slice(0, -1)));
516
+ return _context4.abrupt("return", 1);
517
+
518
+ case 44:
519
+ return _context4.abrupt("return", 0);
520
+
521
+ case 45:
522
+ case "end":
523
+ return _context4.stop();
524
+ }
156
525
  }
157
- }
526
+ }, _callee4, this, [[10, 31, 34, 37]]);
527
+ }));
158
528
 
159
- return false;
529
+ function download(_x8, _x9, _x10) {
530
+ return _download.apply(this, arguments);
160
531
  }
161
- }
162
532
 
163
- return true;
164
- }
533
+ return download;
534
+ }()
535
+ }, {
536
+ key: "retrieveDocuments",
537
+ value: function () {
538
+ var _retrieveDocuments = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
539
+ var gitDir, textesDir, _iterator3, _step3, filename, document, _iterator4, _step4, divisionOrDocument, status, _i2, _arr2, format;
165
540
 
166
- async get(url, filePath, format, uid) {
167
- if (this.options.verbose) console.log(`${uid}: fetch(${url})`);
168
- const response = await fetch(url);
169
- let page = await response.buffer();
170
- let status;
171
-
172
- if (!response.ok) {
173
- status = response.status;
174
-
175
- if (response.status !== 404) {
176
- if (this.options.verbose) {
177
- console.error(`Error while getting page "${url}" (uid: ${uid}):\n\nError:\n${JSON.stringify({
178
- code: response.status,
179
- message: response.statusText
180
- }, null, 2)}`);
181
- }
182
- }
541
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
542
+ while (1) {
543
+ switch (_context5.prev = _context5.next) {
544
+ case 0:
545
+ gitDir = "".concat(this.options.textes, "/.git");
183
546
 
184
- fs.writeFileSync(filePath, "");
185
- } else {
186
- ;
187
- [page, status] = Retrieve.sanityCheckFormat(page, format);
188
- fs.writeFileSync(filePath, page);
189
- }
547
+ if (_fsExtra["default"].existsSync(gitDir)) {
548
+ _context5.next = 4;
549
+ break;
550
+ }
190
551
 
191
- return status;
192
- }
552
+ console.error("".concat(gitDir, " is expected to exist but does not"));
553
+ return _context5.abrupt("return", 1);
193
554
 
194
- static urlFromUid(uid) {
195
- const url = "https://git.en-root.org/tricoteuses/data.tricoteuses.fr/Dossiers_Legislatifs_XV/-/tree/master/documents";
196
- return `[${uid}](${url}/uid/${uid}.json)`;
197
- }
555
+ case 4:
556
+ textesDir = _path["default"].join(this.options.textes, this.options.legislature);
198
557
 
199
- async download(textesDir, divisionOrDocument, format) {
200
- const uid = divisionOrDocument.uid;
201
- const filePath = `${textesDir}/uid/${uid}.${format}`;
202
- if (!(await this.needsDownload(filePath, uid))) return 0;
203
- if (this.options.verbose) console.log(`${uid}: Checking ${filePath}`);
204
- let success = false;
205
- let info = "";
206
- let url;
207
-
208
- for (url of this.getUrls(divisionOrDocument, format)) {
209
- if ("dry-run" in this.options) {
210
- info += ` * ${url}\n`;
211
- continue;
212
- } else {
213
- info += ` * ${url} `;
214
- }
558
+ _fsExtra["default"].ensureDirSync("".concat(textesDir, "/uid"));
215
559
 
216
- const status = await this.get(url, filePath, format, uid);
217
- info += `${status}\n`;
560
+ _iterator3 = _createForOfIteratorHelper((0, _file_systems.getFiles)(this.options.data));
561
+ _context5.prev = 7;
218
562
 
219
- if (status == "OK") {
220
- success = true;
221
- break;
222
- }
223
- }
563
+ _iterator3.s();
224
564
 
225
- const urlPath = `${filePath}.url`;
565
+ case 9:
566
+ if ((_step3 = _iterator3.n()).done) {
567
+ _context5.next = 45;
568
+ break;
569
+ }
226
570
 
227
- if (success) {
228
- fs.writeFileSync(urlPath, url);
229
- } else if (fs.existsSync(urlPath)) {
230
- fs.unlinkSync(urlPath);
231
- }
571
+ filename = _step3.value;
572
+ document = (0, _file_systems.load)(filename);
232
573
 
233
- if (info != "" && !this.options.silent) {
234
- console.log(`* ${Retrieve.urlFromUid(uid)}: Retrieving ${filePath}\n${info.slice(0, -1)}`);
235
- return 1;
236
- } else {
237
- return 0;
238
- }
239
- }
574
+ if (!(/^....SN/.test(document.uid) || /^DECL/.test(document.uid))) {
575
+ _context5.next = 14;
576
+ break;
577
+ }
240
578
 
241
- async retrieveDocuments() {
242
- const gitDir = `${this.options.textes}/.git`;
579
+ return _context5.abrupt("continue", 43);
243
580
 
244
- if (!fs.existsSync(gitDir)) {
245
- console.error(`${gitDir} is expected to exist but does not`);
246
- return 1;
247
- }
581
+ case 14:
582
+ _iterator4 = _createForOfIteratorHelper(this.getDivisionsOrDocument(document));
583
+ _context5.prev = 15;
248
584
 
249
- const textesDir = path.join(this.options.textes, this.options.legislature);
250
- fs.ensureDirSync(`${textesDir}/uid`);
585
+ _iterator4.s();
251
586
 
252
- for (const filename of getFiles(this.options.data)) {
253
- const document = load(filename);
254
- if (/^....SN/.test(document.uid) || /^DECL/.test(document.uid)) continue;
587
+ case 17:
588
+ if ((_step4 = _iterator4.n()).done) {
589
+ _context5.next = 35;
590
+ break;
591
+ }
255
592
 
256
- for (const divisionOrDocument of this.getDivisionsOrDocument(document)) {
257
- if (/-COMPA$/.test(divisionOrDocument.uid)) continue;
258
- let status = 0;
593
+ divisionOrDocument = _step4.value;
259
594
 
260
- for (const format of ["html", "pdf"]) {
261
- status |= await this.download(textesDir, divisionOrDocument, format);
262
- }
595
+ if (!/-COMPA$/.test(divisionOrDocument.uid)) {
596
+ _context5.next = 21;
597
+ break;
598
+ }
599
+
600
+ return _context5.abrupt("continue", 33);
601
+
602
+ case 21:
603
+ status = 0;
604
+ _i2 = 0, _arr2 = ["html", "pdf"];
605
+
606
+ case 23:
607
+ if (!(_i2 < _arr2.length)) {
608
+ _context5.next = 32;
609
+ break;
610
+ }
611
+
612
+ format = _arr2[_i2];
613
+ _context5.t0 = status;
614
+ _context5.next = 28;
615
+ return this.download(textesDir, divisionOrDocument, format);
616
+
617
+ case 28:
618
+ status = _context5.t0 |= _context5.sent;
619
+
620
+ case 29:
621
+ _i2++;
622
+ _context5.next = 23;
623
+ break;
624
+
625
+ case 32:
626
+ if (status && !this.options.silent) console.log("---");
627
+
628
+ case 33:
629
+ _context5.next = 17;
630
+ break;
631
+
632
+ case 35:
633
+ _context5.next = 40;
634
+ break;
635
+
636
+ case 37:
637
+ _context5.prev = 37;
638
+ _context5.t1 = _context5["catch"](15);
639
+
640
+ _iterator4.e(_context5.t1);
641
+
642
+ case 40:
643
+ _context5.prev = 40;
644
+
645
+ _iterator4.f();
646
+
647
+ return _context5.finish(40);
648
+
649
+ case 43:
650
+ _context5.next = 9;
651
+ break;
652
+
653
+ case 45:
654
+ _context5.next = 50;
655
+ break;
656
+
657
+ case 47:
658
+ _context5.prev = 47;
659
+ _context5.t2 = _context5["catch"](7);
660
+
661
+ _iterator3.e(_context5.t2);
662
+
663
+ case 50:
664
+ _context5.prev = 50;
665
+
666
+ _iterator3.f();
667
+
668
+ return _context5.finish(50);
263
669
 
264
- if (status && !this.options.silent) console.log("---");
670
+ case 53:
671
+ if ("dry-run" in this.options) {
672
+ _context5.next = 56;
673
+ break;
674
+ }
675
+
676
+ _context5.next = 56;
677
+ return this.commitAndPush(textesDir);
678
+
679
+ case 56:
680
+ return _context5.abrupt("return", 0);
681
+
682
+ case 57:
683
+ case "end":
684
+ return _context5.stop();
685
+ }
686
+ }
687
+ }, _callee5, this, [[7, 47, 50, 53], [15, 37, 40, 43]]);
688
+ }));
689
+
690
+ function retrieveDocuments() {
691
+ return _retrieveDocuments.apply(this, arguments);
265
692
  }
266
- }
267
693
 
268
- if (!("dry-run" in this.options)) {
269
- await this.commitAndPush(textesDir);
270
- }
694
+ return retrieveDocuments;
695
+ }()
696
+ }], [{
697
+ key: "sanityCheckFormat",
698
+ value: function sanityCheckFormat(page, format) {
699
+ if (format == "pdf") {
700
+ var length = Math.min(page.length, 4);
701
+ var head = page.slice(0, length).toString();
702
+ if (!head.startsWith("%PDF")) return [Buffer.from(""), "bad pdf ".concat(encodeURIComponent(head), "...")];
703
+ } else if (format == "html") {
704
+ var _length = Math.min(page.length, 50);
705
+
706
+ var _head = page.slice(0, _length).toString();
707
+
708
+ if (!_head.includes("DOCTYPE") && !_head.includes("<?xml")) {
709
+ return [Buffer.from(""), "bad html ".concat(encodeURIComponent(_head.slice(0, 4)), "...")];
710
+ }
711
+ }
271
712
 
272
- return 0;
273
- }
713
+ return [page, "OK"];
714
+ }
715
+ }, {
716
+ key: "urlFromUid",
717
+ value: function urlFromUid(uid) {
718
+ var url = "https://git.en-root.org/tricoteuses/data.tricoteuses.fr/Dossiers_Legislatifs_XV/-/tree/master/documents";
719
+ return "[".concat(uid, "](").concat(url, "/uid/").concat(uid, ".json)");
720
+ }
721
+ }]);
274
722
 
275
- }
723
+ return Retrieve;
724
+ }();
276
725
 
277
- async function main(argv) {
278
- const options = parseArgs(argv);
279
- if (options === null) return 1;
280
- const retrieve = new Retrieve(options);
281
- return retrieve.retrieveDocuments();
726
+ function main(_x11) {
727
+ return _main.apply(this, arguments);
282
728
  }
283
729
  /* istanbul ignore if */
284
730
 
285
731
 
286
- if (process.argv[1].endsWith("retrieve_documents.ts")) main(process.argv).then(status => {
732
+ function _main() {
733
+ _main = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(argv) {
734
+ var options, retrieve;
735
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
736
+ while (1) {
737
+ switch (_context6.prev = _context6.next) {
738
+ case 0:
739
+ options = parseArgs(argv);
740
+
741
+ if (!(options === null)) {
742
+ _context6.next = 3;
743
+ break;
744
+ }
745
+
746
+ return _context6.abrupt("return", 1);
747
+
748
+ case 3:
749
+ retrieve = new Retrieve(options);
750
+ return _context6.abrupt("return", retrieve.retrieveDocuments());
751
+
752
+ case 5:
753
+ case "end":
754
+ return _context6.stop();
755
+ }
756
+ }
757
+ }, _callee6);
758
+ }));
759
+ return _main.apply(this, arguments);
760
+ }
761
+
762
+ if (process.argv[1].endsWith("retrieve_documents.ts")) main(process.argv).then(function (status) {
287
763
  process.exit(status);
288
- }).catch(error => {
764
+ })["catch"](function (error) {
289
765
  console.error(error);
290
766
  process.exit(1);
291
767
  });
292
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJjb21tYW5kTGluZVVzYWdlIiwiZ2l0IiwiZnMiLCJmZXRjaCIsInJlcXVpcmUiLCJwYXRoIiwibG9hZCIsImdldEZpbGVzIiwiRG9jdW1lbnRVcmxGb3JtYXQiLCJ1cmxGcm9tRG9jdW1lbnQiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwiU3RyaW5nIiwiZGVmYXVsdE9wdGlvbiIsIm11bHRpcGxlIiwic2VjdGlvbnMiLCJoZWFkZXIiLCJjb250ZW50Iiwib3B0aW9uTGlzdCIsIm9wdGlvbnMiLCJ1c2FnZSIsImNvbnNvbGUiLCJ3YXJuIiwiUmV0cmlldmUiLCJjb25zdHJ1Y3RvciIsImdldERpdmlzaW9ucyIsImRpdmlzaW9uIiwiZGl2aXNpb25zIiwidW5kZWZpbmVkIiwiZCIsImNvbmNhdCIsImdldERpdmlzaW9uc09yRG9jdW1lbnQiLCJkb2N1bWVudCIsIm1hcCIsImNvbW1pdEFuZFB1c2giLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwicmVtb3RlIiwicnVuIiwiZ2V0VXJscyIsImRpdmlzaW9uT3JEb2N1bWVudCIsImZvcm1hdCIsImV4dCIsInVybHMiLCJ1aWQiLCJwdXNoIiwiUmF3SHRtbCIsIkh0bWwiLCJQZGYiLCJzYW5pdHlDaGVja0Zvcm1hdCIsInBhZ2UiLCJsZW5ndGgiLCJNYXRoIiwibWluIiwiaGVhZCIsInNsaWNlIiwidG9TdHJpbmciLCJzdGFydHNXaXRoIiwiQnVmZmVyIiwiZnJvbSIsImVuY29kZVVSSUNvbXBvbmVudCIsImluY2x1ZGVzIiwibmVlZHNEb3dubG9hZCIsImZpbGVQYXRoIiwiZXhpc3RzU3luYyIsImlzTm90RW1wdHkiLCJzdGF0U3luYyIsInNpemUiLCJyZXRyeUZhaWxlZCIsInZlcmJvc2UiLCJ1cmxQYXRoIiwidXJsIiwicmVhZEZpbGVTeW5jIiwibG9nIiwiZ2V0IiwicmVzcG9uc2UiLCJidWZmZXIiLCJzdGF0dXMiLCJvayIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvZGUiLCJtZXNzYWdlIiwic3RhdHVzVGV4dCIsIndyaXRlRmlsZVN5bmMiLCJ1cmxGcm9tVWlkIiwiZG93bmxvYWQiLCJ0ZXh0ZXNEaXIiLCJzdWNjZXNzIiwiaW5mbyIsInVubGlua1N5bmMiLCJzaWxlbnQiLCJyZXRyaWV2ZURvY3VtZW50cyIsImdpdERpciIsInRleHRlcyIsImpvaW4iLCJsZWdpc2xhdHVyZSIsImVuc3VyZURpclN5bmMiLCJmaWxlbmFtZSIsImRhdGEiLCJ0ZXN0IiwibWFpbiIsInJldHJpZXZlIiwicHJvY2VzcyIsImVuZHNXaXRoIiwidGhlbiIsImV4aXQiLCJjYXRjaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3JldHJpZXZlX2RvY3VtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgY29tbWFuZExpbmVVc2FnZSBmcm9tIFwiY29tbWFuZC1saW5lLXVzYWdlXCJcbmltcG9ydCAqIGFzIGdpdCBmcm9tIFwiLi4vLi4vc3JjL2dpdFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmxldCBmZXRjaCA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCB7IGxvYWQsIGdldEZpbGVzIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQgeyBEb2N1bWVudFVybEZvcm1hdCwgdXJsRnJvbURvY3VtZW50IH0gZnJvbSBcIi4uL3VybHNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgYWxpYXM6IFwiY1wiLFxuICAgICAgaGVscDogXCJjb21taXQgZG9jdW1lbnRzXCIsXG4gICAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZHJ5IHJ1blwiLFxuICAgICAgbmFtZTogXCJkcnktcnVuXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVscDogXCJyZXRyeSBmYWlsZWQgZG9jdW1lbnRzXCIsXG4gICAgICBuYW1lOiBcInJldHJ5LWZhaWxlZFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwicmV0cnkgYWxsIGRvY3VtZW50c1wiLFxuICAgICAgbmFtZTogXCJyZXRyeVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImxcIixcbiAgICAgIGRlZmF1bHRWYWx1ZTogXCIxNlwiLFxuICAgICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiclwiLFxuICAgICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJzXCIsXG4gICAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwOiBcInRleHRlcyBkaXJcIixcbiAgICAgIG5hbWU6IFwidGV4dGVzXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJ2XCIsXG4gICAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIGhlbHA6IFwiZmlsZXMgb3IgZ2xvYnMgdG8gZG9jdW1lbnRzXCIsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAge1xuICAgICAgaGVhZGVyOiBcIlJldHJpZXZlIGRvY3VtZW50c1wiLFxuICAgICAgY29udGVudDogXCJSZXRyaWV2ZSBkb2N1bWVudHNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlYWRlcjogXCJPcHRpb25zXCIsXG4gICAgICBvcHRpb25MaXN0OiBvcHRpb25zRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG5cbiAgaWYgKFwiaGVscFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2FnZSA9IGNvbW1hbmRMaW5lVXNhZ2Uoc2VjdGlvbnMpXG4gICAgY29uc29sZS53YXJuKHVzYWdlKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuY2xhc3MgUmV0cmlldmUge1xuICBvcHRpb25zOiBhbnlcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gIH1cblxuICBnZXREaXZpc2lvbnMoZGl2aXNpb246IGFueSkge1xuICAgIGxldCBkaXZpc2lvbnMgPSBbZGl2aXNpb25dXG4gICAgaWYgKGRpdmlzaW9uLmRpdmlzaW9ucyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgZCBvZiBkaXZpc2lvbi5kaXZpc2lvbnMpXG4gICAgICAgIGRpdmlzaW9ucyA9IGRpdmlzaW9ucy5jb25jYXQodGhpcy5nZXREaXZpc2lvbnMoZCkpXG4gICAgfVxuICAgIHJldHVybiBkaXZpc2lvbnNcbiAgfVxuXG4gIGdldERpdmlzaW9uc09yRG9jdW1lbnQoZG9jdW1lbnQ6IGFueSkge1xuICAgIGlmIChkb2N1bWVudC5kaXZpc2lvbnMgIT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIFtdLmNvbmNhdChcbiAgICAgICAgLi4uZG9jdW1lbnQuZGl2aXNpb25zLm1hcCgoZDogYW55KSA9PiB0aGlzLmdldERpdmlzaW9ucyhkKSksXG4gICAgICApXG4gICAgZWxzZSByZXR1cm4gW2RvY3VtZW50XVxuICB9XG5cbiAgYXN5bmMgY29tbWl0QW5kUHVzaChyZXBvc2l0b3J5RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbW1pdCA9PSB1bmRlZmluZWQpIHJldHVyblxuICAgIGdpdC5jb21taXQocmVwb3NpdG9yeURpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIpXG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbW90ZSA9PSB1bmRlZmluZWQpIHJldHVyblxuICAgIGdpdC5ydW4ocmVwb3NpdG9yeURpciwgYHB1c2ggJHt0aGlzLm9wdGlvbnMucmVtb3RlfSBIRUFEOm1hc3RlcmApXG4gIH1cblxuICBnZXRVcmxzKGRpdmlzaW9uT3JEb2N1bWVudDogYW55LCBmb3JtYXQ6IHN0cmluZykge1xuICAgIGNvbnN0IGV4dCA9IGZvcm1hdCA9PSBcImh0bWxcIiA/IFwicmF3XCIgOiBcInBkZlwiXG4gICAgbGV0IHVybHM6IGFueSA9IFtcbiAgICAgIGBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvZHluL2RvY3MvJHtkaXZpc2lvbk9yRG9jdW1lbnQudWlkfS4ke2V4dH1gLFxuICAgIF1cbiAgICBpZiAoZm9ybWF0ID09IFwiaHRtbFwiKSB7XG4gICAgICB1cmxzLnB1c2godXJsRnJvbURvY3VtZW50KGRpdmlzaW9uT3JEb2N1bWVudCwgRG9jdW1lbnRVcmxGb3JtYXQuUmF3SHRtbCkpXG4gICAgICB1cmxzLnB1c2godXJsRnJvbURvY3VtZW50KGRpdmlzaW9uT3JEb2N1bWVudCwgRG9jdW1lbnRVcmxGb3JtYXQuSHRtbCkpXG4gICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gXCJwZGZcIikge1xuICAgICAgdXJscy5wdXNoKHVybEZyb21Eb2N1bWVudChkaXZpc2lvbk9yRG9jdW1lbnQsIERvY3VtZW50VXJsRm9ybWF0LlBkZikpXG4gICAgfVxuICAgIHJldHVybiB1cmxzXG4gIH1cblxuICBzdGF0aWMgc2FuaXR5Q2hlY2tGb3JtYXQocGFnZTogQnVmZmVyLCBmb3JtYXQ6IHN0cmluZyk6IFtCdWZmZXIsIHN0cmluZ10ge1xuICAgIGlmIChmb3JtYXQgPT0gXCJwZGZcIikge1xuICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4ocGFnZS5sZW5ndGgsIDQpXG4gICAgICBjb25zdCBoZWFkID0gcGFnZS5zbGljZSgwLCBsZW5ndGgpLnRvU3RyaW5nKClcbiAgICAgIGlmICghaGVhZC5zdGFydHNXaXRoKFwiJVBERlwiKSlcbiAgICAgICAgcmV0dXJuIFtCdWZmZXIuZnJvbShcIlwiKSwgYGJhZCBwZGYgJHtlbmNvZGVVUklDb21wb25lbnQoaGVhZCl9Li4uYF1cbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBcImh0bWxcIikge1xuICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4ocGFnZS5sZW5ndGgsIDUwKVxuICAgICAgY29uc3QgaGVhZCA9IHBhZ2Uuc2xpY2UoMCwgbGVuZ3RoKS50b1N0cmluZygpXG4gICAgICBpZiAoIWhlYWQuaW5jbHVkZXMoXCJET0NUWVBFXCIpICYmICFoZWFkLmluY2x1ZGVzKFwiPD94bWxcIikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBCdWZmZXIuZnJvbShcIlwiKSxcbiAgICAgICAgICBgYmFkIGh0bWwgJHtlbmNvZGVVUklDb21wb25lbnQoaGVhZC5zbGljZSgwLCA0KSl9Li4uYCxcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3BhZ2UsIFwiT0tcIl1cbiAgfVxuXG4gIGFzeW5jIG5lZWRzRG93bmxvYWQoZmlsZVBhdGg6IHN0cmluZywgdWlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGlzTm90RW1wdHkgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA+IDBcbiAgICAgIGNvbnN0IHJldHJ5RmFpbGVkID0gXCJyZXRyeS1mYWlsZWRcIiBpbiB0aGlzLm9wdGlvbnNcbiAgICAgIGlmICghcmV0cnlGYWlsZWQgfHwgaXNOb3RFbXB0eSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBpZiAoaXNOb3RFbXB0eSkge1xuICAgICAgICAgICAgY29uc3QgdXJsUGF0aCA9IGAke2ZpbGVQYXRofS51cmxgXG4gICAgICAgICAgICBsZXQgdXJsXG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh1cmxQYXRoKSlcbiAgICAgICAgICAgICAgdXJsID0gZnMucmVhZEZpbGVTeW5jKHVybFBhdGgpLnRvU3RyaW5nKClcbiAgICAgICAgICAgIGVsc2UgdXJsID0gXCI8dW5rbm93biB1cmw+XCJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3VpZH06IENhY2hlZCBPSyAke2ZpbGVQYXRofSBmcm9tICR7dXJsfWApXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3VpZH06IENhY2hlZCBGQUlMICR7ZmlsZVBhdGh9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBhc3luYyBnZXQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZyxcbiAgICB1aWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIGNvbnNvbGUubG9nKGAke3VpZH06IGZldGNoKCR7dXJsfSlgKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIGxldCBwYWdlOiBhbnkgPSBhd2FpdCByZXNwb25zZS5idWZmZXIoKVxuICAgIGxldCBzdGF0dXNcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHdoaWxlIGdldHRpbmcgcGFnZSBcIiR7dXJsfVwiICh1aWQ6ICR7dWlkfSk6XFxuXFxuRXJyb3I6XFxuJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgeyBjb2RlOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIFwiXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIDtbcGFnZSwgc3RhdHVzXSA9IFJldHJpZXZlLnNhbml0eUNoZWNrRm9ybWF0KHBhZ2UsIGZvcm1hdClcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIHBhZ2UpXG4gICAgfVxuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIHN0YXRpYyB1cmxGcm9tVWlkKHVpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgXCJodHRwczovL2dpdC5lbi1yb290Lm9yZy90cmljb3RldXNlcy9kYXRhLnRyaWNvdGV1c2VzLmZyL0Rvc3NpZXJzX0xlZ2lzbGF0aWZzX1hWLy0vdHJlZS9tYXN0ZXIvZG9jdW1lbnRzXCJcbiAgICByZXR1cm4gYFske3VpZH1dKCR7dXJsfS91aWQvJHt1aWR9Lmpzb24pYFxuICB9XG5cbiAgYXN5bmMgZG93bmxvYWQoXG4gICAgdGV4dGVzRGlyOiBzdHJpbmcsXG4gICAgZGl2aXNpb25PckRvY3VtZW50OiBhbnksXG4gICAgZm9ybWF0OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdWlkID0gZGl2aXNpb25PckRvY3VtZW50LnVpZFxuICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7dGV4dGVzRGlyfS91aWQvJHt1aWR9LiR7Zm9ybWF0fWBcbiAgICBpZiAoIShhd2FpdCB0aGlzLm5lZWRzRG93bmxvYWQoZmlsZVBhdGgsIHVpZCkpKSByZXR1cm4gMFxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkgY29uc29sZS5sb2coYCR7dWlkfTogQ2hlY2tpbmcgJHtmaWxlUGF0aH1gKVxuICAgIGxldCBzdWNjZXNzID0gZmFsc2VcbiAgICBsZXQgaW5mbyA9IFwiXCJcbiAgICBsZXQgdXJsXG5cbiAgICBmb3IgKHVybCBvZiB0aGlzLmdldFVybHMoZGl2aXNpb25PckRvY3VtZW50LCBmb3JtYXQpKSB7XG4gICAgICBpZiAoXCJkcnktcnVuXCIgaW4gdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIGluZm8gKz0gYCAgKiAke3VybH1cXG5gXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvICs9IGAgICogJHt1cmx9IGBcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXQodXJsLCBmaWxlUGF0aCwgZm9ybWF0LCB1aWQpXG5cbiAgICAgIGluZm8gKz0gYCR7c3RhdHVzfVxcbmBcbiAgICAgIGlmIChzdGF0dXMgPT0gXCJPS1wiKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVybFBhdGggPSBgJHtmaWxlUGF0aH0udXJsYFxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHVybFBhdGgsIHVybClcbiAgICB9IGVsc2UgaWYgKGZzLmV4aXN0c1N5bmModXJsUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmModXJsUGF0aClcbiAgICB9XG4gICAgaWYgKGluZm8gIT0gXCJcIiAmJiAhdGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGAqICR7UmV0cmlldmUudXJsRnJvbVVpZCh1aWQpfTogUmV0cmlldmluZyAke2ZpbGVQYXRofVxcbiR7aW5mby5zbGljZShcbiAgICAgICAgICAwLFxuICAgICAgICAgIC0xLFxuICAgICAgICApfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRG9jdW1lbnRzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZ2l0RGlyID0gYCR7dGhpcy5vcHRpb25zLnRleHRlc30vLmdpdGBcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZ2l0RGlyKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtnaXREaXJ9IGlzIGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCBkb2VzIG5vdGApXG4gICAgICByZXR1cm4gMVxuICAgIH1cblxuICAgIGNvbnN0IHRleHRlc0RpciA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMudGV4dGVzLCB0aGlzLm9wdGlvbnMubGVnaXNsYXR1cmUpXG4gICAgZnMuZW5zdXJlRGlyU3luYyhgJHt0ZXh0ZXNEaXJ9L3VpZGApXG5cbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGdldEZpbGVzKHRoaXMub3B0aW9ucy5kYXRhKSkge1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBsb2FkKGZpbGVuYW1lKVxuICAgICAgaWYgKC9eLi4uLlNOLy50ZXN0KGRvY3VtZW50LnVpZCkgfHwgL15ERUNMLy50ZXN0KGRvY3VtZW50LnVpZCkpIGNvbnRpbnVlXG4gICAgICBmb3IgKGNvbnN0IGRpdmlzaW9uT3JEb2N1bWVudCBvZiB0aGlzLmdldERpdmlzaW9uc09yRG9jdW1lbnQoZG9jdW1lbnQpKSB7XG4gICAgICAgIGlmICgvLUNPTVBBJC8udGVzdChkaXZpc2lvbk9yRG9jdW1lbnQudWlkKSkgY29udGludWVcbiAgICAgICAgbGV0IHN0YXR1cyA9IDBcbiAgICAgICAgZm9yIChjb25zdCBmb3JtYXQgb2YgW1wiaHRtbFwiLCBcInBkZlwiXSkge1xuICAgICAgICAgIHN0YXR1cyB8PSBhd2FpdCB0aGlzLmRvd25sb2FkKHRleHRlc0RpciwgZGl2aXNpb25PckRvY3VtZW50LCBmb3JtYXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1cyAmJiAhdGhpcy5vcHRpb25zLnNpbGVudCkgY29uc29sZS5sb2coXCItLS1cIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShcImRyeS1ydW5cIiBpbiB0aGlzLm9wdGlvbnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdEFuZFB1c2godGV4dGVzRGlyKVxuICAgIH1cblxuICAgIHJldHVybiAwXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIGlmIChvcHRpb25zID09PSBudWxsKSByZXR1cm4gMVxuICBjb25zdCByZXRyaWV2ZSA9IG5ldyBSZXRyaWV2ZShvcHRpb25zKVxuICByZXR1cm4gcmV0cmlldmUucmV0cmlldmVEb2N1bWVudHMoKVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJyZXRyaWV2ZV9kb2N1bWVudHMudHNcIikpXG4gIG1haW4ocHJvY2Vzcy5hcmd2KVxuICAgIC50aGVuKChzdGF0dXMpID0+IHtcbiAgICAgIHByb2Nlc3MuZXhpdChzdGF0dXMpXG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSlcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPQSxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLGdCQUFQLE1BQTZCLG9CQUE3QjtPQUNPLEtBQUtDLEc7QUFDWixPQUFPQyxFQUFQLE1BQWUsVUFBZjs7QUFDQSxJQUFJQyxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQW5COztBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsSSxFQUFNQyxRO1NBQ05DLGlCLEVBQW1CQyxlOztBQUU1QixTQUFTQyxTQUFULENBQW1CQyxJQUFuQixFQUF3QztFQUN0QyxNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxLQUFLLEVBQUUsR0FEVDtJQUVFQyxJQUFJLEVBQUUsa0JBRlI7SUFHRUMsSUFBSSxFQUFFLFFBSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBRHlCLEVBT3pCO0lBQ0VILElBQUksRUFBRSxTQURSO0lBRUVDLElBQUksRUFBRSxTQUZSO0lBR0VDLElBQUksRUFBRUM7RUFIUixDQVB5QixFQVl6QjtJQUNFSCxJQUFJLEVBQUUsd0JBRFI7SUFFRUMsSUFBSSxFQUFFLGNBRlI7SUFHRUMsSUFBSSxFQUFFQztFQUhSLENBWnlCLEVBaUJ6QjtJQUNFSCxJQUFJLEVBQUUscUJBRFI7SUFFRUMsSUFBSSxFQUFFLE9BRlI7SUFHRUMsSUFBSSxFQUFFQztFQUhSLENBakJ5QixFQXNCekI7SUFDRUosS0FBSyxFQUFFLEdBRFQ7SUFFRUssWUFBWSxFQUFFLElBRmhCO0lBR0VILElBQUksRUFBRSxhQUhSO0lBSUVDLElBQUksRUFBRUc7RUFKUixDQXRCeUIsRUE0QnpCO0lBQ0VOLEtBQUssRUFBRSxHQURUO0lBRUVDLElBQUksRUFBRSw2QkFGUjtJQUdFQyxJQUFJLEVBQUUsUUFIUjtJQUlFQyxJQUFJLEVBQUVHO0VBSlIsQ0E1QnlCLEVBa0N6QjtJQUNFTixLQUFLLEVBQUUsR0FEVDtJQUVFQyxJQUFJLEVBQUUsb0JBRlI7SUFHRUMsSUFBSSxFQUFFLFFBSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBbEN5QixFQXdDekI7SUFDRUgsSUFBSSxFQUFFLFlBRFI7SUFFRUMsSUFBSSxFQUFFLFFBRlI7SUFHRUMsSUFBSSxFQUFFRztFQUhSLENBeEN5QixFQTZDekI7SUFDRU4sS0FBSyxFQUFFLEdBRFQ7SUFFRUMsSUFBSSxFQUFFLGNBRlI7SUFHRUMsSUFBSSxFQUFFLFNBSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBN0N5QixFQW1EekI7SUFDRUcsYUFBYSxFQUFFLElBRGpCO0lBRUVOLElBQUksRUFBRSw2QkFGUjtJQUdFTyxRQUFRLEVBQUUsSUFIWjtJQUlFTixJQUFJLEVBQUUsTUFKUjtJQUtFQyxJQUFJLEVBQUVHO0VBTFIsQ0FuRHlCLENBQTNCO0VBMkRBLE1BQU1HLFFBQVEsR0FBRyxDQUNmO0lBQ0VDLE1BQU0sRUFBRSxvQkFEVjtJQUVFQyxPQUFPLEVBQUU7RUFGWCxDQURlLEVBS2Y7SUFDRUQsTUFBTSxFQUFFLFNBRFY7SUFFRUUsVUFBVSxFQUFFYjtFQUZkLENBTGUsQ0FBakI7RUFVQSxNQUFNYyxPQUFPLEdBQUczQixlQUFlLENBQUNhLGtCQUFELEVBQXFCO0lBQ2xERCxJQUFJLEVBQUVBO0VBRDRDLENBQXJCLENBQS9COztFQUlBLElBQUksVUFBVWUsT0FBZCxFQUF1QjtJQUNyQixNQUFNQyxLQUFLLEdBQUczQixnQkFBZ0IsQ0FBQ3NCLFFBQUQsQ0FBOUI7SUFDQU0sT0FBTyxDQUFDQyxJQUFSLENBQWFGLEtBQWI7SUFDQSxPQUFPLElBQVA7RUFDRDs7RUFDRCxPQUFPRCxPQUFQO0FBQ0Q7O0FBRUQsTUFBTUksUUFBTixDQUFlO0VBR2JDLFdBQVcsQ0FBQ0wsT0FBRCxFQUFlO0lBQUE7O0lBQ3hCLEtBQUtBLE9BQUwsR0FBZUEsT0FBZjtFQUNEOztFQUVETSxZQUFZLENBQUNDLFFBQUQsRUFBZ0I7SUFDMUIsSUFBSUMsU0FBUyxHQUFHLENBQUNELFFBQUQsQ0FBaEI7O0lBQ0EsSUFBSUEsUUFBUSxDQUFDQyxTQUFULElBQXNCQyxTQUExQixFQUFxQztNQUNuQyxLQUFLLE1BQU1DLENBQVgsSUFBZ0JILFFBQVEsQ0FBQ0MsU0FBekIsRUFDRUEsU0FBUyxHQUFHQSxTQUFTLENBQUNHLE1BQVYsQ0FBaUIsS0FBS0wsWUFBTCxDQUFrQkksQ0FBbEIsQ0FBakIsQ0FBWjtJQUNIOztJQUNELE9BQU9GLFNBQVA7RUFDRDs7RUFFREksc0JBQXNCLENBQUNDLFFBQUQsRUFBZ0I7SUFDcEMsSUFBSUEsUUFBUSxDQUFDTCxTQUFULElBQXNCQyxTQUExQixFQUNFLE9BQU8sR0FBR0UsTUFBSCxDQUNMLEdBQUdFLFFBQVEsQ0FBQ0wsU0FBVCxDQUFtQk0sR0FBbkIsQ0FBd0JKLENBQUQsSUFBWSxLQUFLSixZQUFMLENBQWtCSSxDQUFsQixDQUFuQyxDQURFLENBQVAsQ0FERixLQUlLLE9BQU8sQ0FBQ0csUUFBRCxDQUFQO0VBQ047O0VBRWtCLE1BQWJFLGFBQWEsQ0FBQ0MsYUFBRCxFQUF1QztJQUN4RCxJQUFJLEtBQUtoQixPQUFMLENBQWFpQixNQUFiLElBQXVCUixTQUEzQixFQUFzQztJQUN0Q2xDLEdBQUcsQ0FBQzBDLE1BQUosQ0FBV0QsYUFBWCxFQUEwQixrQkFBMUI7SUFFQSxJQUFJLEtBQUtoQixPQUFMLENBQWFrQixNQUFiLElBQXVCVCxTQUEzQixFQUFzQztJQUN0Q2xDLEdBQUcsQ0FBQzRDLEdBQUosQ0FBUUgsYUFBUixFQUF3QixRQUFPLEtBQUtoQixPQUFMLENBQWFrQixNQUFPLGNBQW5EO0VBQ0Q7O0VBRURFLE9BQU8sQ0FBQ0Msa0JBQUQsRUFBMEJDLE1BQTFCLEVBQTBDO0lBQy9DLE1BQU1DLEdBQUcsR0FBR0QsTUFBTSxJQUFJLE1BQVYsR0FBbUIsS0FBbkIsR0FBMkIsS0FBdkM7SUFDQSxJQUFJRSxJQUFTLEdBQUcsQ0FDYiw4Q0FBNkNILGtCQUFrQixDQUFDSSxHQUFJLElBQUdGLEdBQUksRUFEOUQsQ0FBaEI7O0lBR0EsSUFBSUQsTUFBTSxJQUFJLE1BQWQsRUFBc0I7TUFDcEJFLElBQUksQ0FBQ0UsSUFBTCxDQUFVM0MsZUFBZSxDQUFDc0Msa0JBQUQsRUFBcUJ2QyxpQkFBaUIsQ0FBQzZDLE9BQXZDLENBQXpCO01BQ0FILElBQUksQ0FBQ0UsSUFBTCxDQUFVM0MsZUFBZSxDQUFDc0Msa0JBQUQsRUFBcUJ2QyxpQkFBaUIsQ0FBQzhDLElBQXZDLENBQXpCO0lBQ0QsQ0FIRCxNQUdPLElBQUlOLE1BQU0sSUFBSSxLQUFkLEVBQXFCO01BQzFCRSxJQUFJLENBQUNFLElBQUwsQ0FBVTNDLGVBQWUsQ0FBQ3NDLGtCQUFELEVBQXFCdkMsaUJBQWlCLENBQUMrQyxHQUF2QyxDQUF6QjtJQUNEOztJQUNELE9BQU9MLElBQVA7RUFDRDs7RUFFdUIsT0FBakJNLGlCQUFpQixDQUFDQyxJQUFELEVBQWVULE1BQWYsRUFBaUQ7SUFDdkUsSUFBSUEsTUFBTSxJQUFJLEtBQWQsRUFBcUI7TUFDbkIsTUFBTVUsTUFBTSxHQUFHQyxJQUFJLENBQUNDLEdBQUwsQ0FBU0gsSUFBSSxDQUFDQyxNQUFkLEVBQXNCLENBQXRCLENBQWY7TUFDQSxNQUFNRyxJQUFJLEdBQUdKLElBQUksQ0FBQ0ssS0FBTCxDQUFXLENBQVgsRUFBY0osTUFBZCxFQUFzQkssUUFBdEIsRUFBYjtNQUNBLElBQUksQ0FBQ0YsSUFBSSxDQUFDRyxVQUFMLENBQWdCLE1BQWhCLENBQUwsRUFDRSxPQUFPLENBQUNDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEVBQVosQ0FBRCxFQUFtQixXQUFVQyxrQkFBa0IsQ0FBQ04sSUFBRCxDQUFPLEtBQXRELENBQVA7SUFDSCxDQUxELE1BS08sSUFBSWIsTUFBTSxJQUFJLE1BQWQsRUFBc0I7TUFDM0IsTUFBTVUsTUFBTSxHQUFHQyxJQUFJLENBQUNDLEdBQUwsQ0FBU0gsSUFBSSxDQUFDQyxNQUFkLEVBQXNCLEVBQXRCLENBQWY7TUFDQSxNQUFNRyxJQUFJLEdBQUdKLElBQUksQ0FBQ0ssS0FBTCxDQUFXLENBQVgsRUFBY0osTUFBZCxFQUFzQkssUUFBdEIsRUFBYjs7TUFDQSxJQUFJLENBQUNGLElBQUksQ0FBQ08sUUFBTCxDQUFjLFNBQWQsQ0FBRCxJQUE2QixDQUFDUCxJQUFJLENBQUNPLFFBQUwsQ0FBYyxPQUFkLENBQWxDLEVBQTBEO1FBQ3hELE9BQU8sQ0FDTEgsTUFBTSxDQUFDQyxJQUFQLENBQVksRUFBWixDQURLLEVBRUosWUFBV0Msa0JBQWtCLENBQUNOLElBQUksQ0FBQ0MsS0FBTCxDQUFXLENBQVgsRUFBYyxDQUFkLENBQUQsQ0FBbUIsS0FGNUMsQ0FBUDtNQUlEO0lBQ0Y7O0lBQ0QsT0FBTyxDQUFDTCxJQUFELEVBQU8sSUFBUCxDQUFQO0VBQ0Q7O0VBRWtCLE1BQWJZLGFBQWEsQ0FBQ0MsUUFBRCxFQUFtQm5CLEdBQW5CLEVBQWtEO0lBQ25FLElBQUlqRCxFQUFFLENBQUNxRSxVQUFILENBQWNELFFBQWQsQ0FBSixFQUE2QjtNQUMzQixNQUFNRSxVQUFVLEdBQUd0RSxFQUFFLENBQUN1RSxRQUFILENBQVlILFFBQVosRUFBc0JJLElBQXRCLEdBQTZCLENBQWhEO01BQ0EsTUFBTUMsV0FBVyxJQUFHLGtCQUFrQixLQUFLakQsT0FBMUIsQ0FBakI7O01BQ0EsSUFBSSxDQUFDaUQsV0FBRCxJQUFnQkgsVUFBcEIsRUFBZ0M7UUFDOUIsSUFBSSxLQUFLOUMsT0FBTCxDQUFha0QsT0FBakIsRUFBMEI7VUFDeEIsSUFBSUosVUFBSixFQUFnQjtZQUNkLE1BQU1LLE9BQU8sR0FBSSxHQUFFUCxRQUFTLE1BQTVCO1lBQ0EsSUFBSVEsR0FBSjtZQUNBLElBQUk1RSxFQUFFLENBQUNxRSxVQUFILENBQWNNLE9BQWQsQ0FBSixFQUNFQyxHQUFHLEdBQUc1RSxFQUFFLENBQUM2RSxZQUFILENBQWdCRixPQUFoQixFQUF5QmQsUUFBekIsRUFBTixDQURGLEtBRUtlLEdBQUcsR0FBRyxlQUFOO1lBQ0xsRCxPQUFPLENBQUNvRCxHQUFSLENBQWEsR0FBRTdCLEdBQUksZUFBY21CLFFBQVMsU0FBUVEsR0FBSSxFQUF0RDtVQUNELENBUEQsTUFPTztZQUNMbEQsT0FBTyxDQUFDb0QsR0FBUixDQUFhLEdBQUU3QixHQUFJLGlCQUFnQm1CLFFBQVMsRUFBNUM7VUFDRDtRQUNGOztRQUNELE9BQU8sS0FBUDtNQUNEO0lBQ0Y7O0lBQ0QsT0FBTyxJQUFQO0VBQ0Q7O0VBRVEsTUFBSFcsR0FBRyxDQUNQSCxHQURPLEVBRVBSLFFBRk8sRUFHUHRCLE1BSE8sRUFJUEcsR0FKTyxFQUtVO0lBQ2pCLElBQUksS0FBS3pCLE9BQUwsQ0FBYWtELE9BQWpCLEVBQTBCaEQsT0FBTyxDQUFDb0QsR0FBUixDQUFhLEdBQUU3QixHQUFJLFdBQVUyQixHQUFJLEdBQWpDO0lBQzFCLE1BQU1JLFFBQVEsR0FBRyxNQUFNL0UsS0FBSyxDQUFDMkUsR0FBRCxDQUE1QjtJQUNBLElBQUlyQixJQUFTLEdBQUcsTUFBTXlCLFFBQVEsQ0FBQ0MsTUFBVCxFQUF0QjtJQUNBLElBQUlDLE1BQUo7O0lBQ0EsSUFBSSxDQUFDRixRQUFRLENBQUNHLEVBQWQsRUFBa0I7TUFDaEJELE1BQU0sR0FBR0YsUUFBUSxDQUFDRSxNQUFsQjs7TUFDQSxJQUFJRixRQUFRLENBQUNFLE1BQVQsS0FBb0IsR0FBeEIsRUFBNkI7UUFDM0IsSUFBSSxLQUFLMUQsT0FBTCxDQUFha0QsT0FBakIsRUFBMEI7VUFDeEJoRCxPQUFPLENBQUMwRCxLQUFSLENBQ0csNkJBQTRCUixHQUFJLFdBQVUzQixHQUFJLGlCQUFnQm9DLElBQUksQ0FBQ0MsU0FBTCxDQUM3RDtZQUFFQyxJQUFJLEVBQUVQLFFBQVEsQ0FBQ0UsTUFBakI7WUFBeUJNLE9BQU8sRUFBRVIsUUFBUSxDQUFDUztVQUEzQyxDQUQ2RCxFQUU3RCxJQUY2RCxFQUc3RCxDQUg2RCxDQUk3RCxFQUxKO1FBT0Q7TUFDRjs7TUFDRHpGLEVBQUUsQ0FBQzBGLGFBQUgsQ0FBaUJ0QixRQUFqQixFQUEyQixFQUEzQjtJQUNELENBZEQsTUFjTztNQUNMO01BQUMsQ0FBQ2IsSUFBRCxFQUFPMkIsTUFBUCxJQUFpQnRELFFBQVEsQ0FBQzBCLGlCQUFULENBQTJCQyxJQUEzQixFQUFpQ1QsTUFBakMsQ0FBakI7TUFDRDlDLEVBQUUsQ0FBQzBGLGFBQUgsQ0FBaUJ0QixRQUFqQixFQUEyQmIsSUFBM0I7SUFDRDs7SUFDRCxPQUFPMkIsTUFBUDtFQUNEOztFQUVnQixPQUFWUyxVQUFVLENBQUMxQyxHQUFELEVBQXNCO0lBQ3JDLE1BQU0yQixHQUFHLEdBQ1AseUdBREY7SUFFQSxPQUFRLElBQUczQixHQUFJLEtBQUkyQixHQUFJLFFBQU8zQixHQUFJLFFBQWxDO0VBQ0Q7O0VBRWEsTUFBUjJDLFFBQVEsQ0FDWkMsU0FEWSxFQUVaaEQsa0JBRlksRUFHWkMsTUFIWSxFQUlLO0lBQ2pCLE1BQU1HLEdBQUcsR0FBR0osa0JBQWtCLENBQUNJLEdBQS9CO0lBQ0EsTUFBTW1CLFFBQVEsR0FBSSxHQUFFeUIsU0FBVSxRQUFPNUMsR0FBSSxJQUFHSCxNQUFPLEVBQW5EO0lBQ0EsSUFBSSxFQUFFLE1BQU0sS0FBS3FCLGFBQUwsQ0FBbUJDLFFBQW5CLEVBQTZCbkIsR0FBN0IsQ0FBUixDQUFKLEVBQWdELE9BQU8sQ0FBUDtJQUNoRCxJQUFJLEtBQUt6QixPQUFMLENBQWFrRCxPQUFqQixFQUEwQmhELE9BQU8sQ0FBQ29ELEdBQVIsQ0FBYSxHQUFFN0IsR0FBSSxjQUFhbUIsUUFBUyxFQUF6QztJQUMxQixJQUFJMEIsT0FBTyxHQUFHLEtBQWQ7SUFDQSxJQUFJQyxJQUFJLEdBQUcsRUFBWDtJQUNBLElBQUluQixHQUFKOztJQUVBLEtBQUtBLEdBQUwsSUFBWSxLQUFLaEMsT0FBTCxDQUFhQyxrQkFBYixFQUFpQ0MsTUFBakMsQ0FBWixFQUFzRDtNQUNwRCxJQUFJLGFBQWEsS0FBS3RCLE9BQXRCLEVBQStCO1FBQzdCdUUsSUFBSSxJQUFLLE9BQU1uQixHQUFJLElBQW5CO1FBQ0E7TUFDRCxDQUhELE1BR087UUFDTG1CLElBQUksSUFBSyxPQUFNbkIsR0FBSSxHQUFuQjtNQUNEOztNQUVELE1BQU1NLE1BQU0sR0FBRyxNQUFNLEtBQUtILEdBQUwsQ0FBU0gsR0FBVCxFQUFjUixRQUFkLEVBQXdCdEIsTUFBeEIsRUFBZ0NHLEdBQWhDLENBQXJCO01BRUE4QyxJQUFJLElBQUssR0FBRWIsTUFBTyxJQUFsQjs7TUFDQSxJQUFJQSxNQUFNLElBQUksSUFBZCxFQUFvQjtRQUNsQlksT0FBTyxHQUFHLElBQVY7UUFDQTtNQUNEO0lBQ0Y7O0lBQ0QsTUFBTW5CLE9BQU8sR0FBSSxHQUFFUCxRQUFTLE1BQTVCOztJQUNBLElBQUkwQixPQUFKLEVBQWE7TUFDWDlGLEVBQUUsQ0FBQzBGLGFBQUgsQ0FBaUJmLE9BQWpCLEVBQTBCQyxHQUExQjtJQUNELENBRkQsTUFFTyxJQUFJNUUsRUFBRSxDQUFDcUUsVUFBSCxDQUFjTSxPQUFkLENBQUosRUFBNEI7TUFDakMzRSxFQUFFLENBQUNnRyxVQUFILENBQWNyQixPQUFkO0lBQ0Q7O0lBQ0QsSUFBSW9CLElBQUksSUFBSSxFQUFSLElBQWMsQ0FBQyxLQUFLdkUsT0FBTCxDQUFheUUsTUFBaEMsRUFBd0M7TUFDdEN2RSxPQUFPLENBQUNvRCxHQUFSLENBQ0csS0FBSWxELFFBQVEsQ0FBQytELFVBQVQsQ0FBb0IxQyxHQUFwQixDQUF5QixnQkFBZW1CLFFBQVMsS0FBSTJCLElBQUksQ0FBQ25DLEtBQUwsQ0FDeEQsQ0FEd0QsRUFFeEQsQ0FBQyxDQUZ1RCxDQUd4RCxFQUpKO01BTUEsT0FBTyxDQUFQO0lBQ0QsQ0FSRCxNQVFPO01BQ0wsT0FBTyxDQUFQO0lBQ0Q7RUFDRjs7RUFFc0IsTUFBakJzQyxpQkFBaUIsR0FBb0I7SUFDekMsTUFBTUMsTUFBTSxHQUFJLEdBQUUsS0FBSzNFLE9BQUwsQ0FBYTRFLE1BQU8sT0FBdEM7O0lBQ0EsSUFBSSxDQUFDcEcsRUFBRSxDQUFDcUUsVUFBSCxDQUFjOEIsTUFBZCxDQUFMLEVBQTRCO01BQzFCekUsT0FBTyxDQUFDMEQsS0FBUixDQUFlLEdBQUVlLE1BQU8sb0NBQXhCO01BQ0EsT0FBTyxDQUFQO0lBQ0Q7O0lBRUQsTUFBTU4sU0FBUyxHQUFHMUYsSUFBSSxDQUFDa0csSUFBTCxDQUFVLEtBQUs3RSxPQUFMLENBQWE0RSxNQUF2QixFQUErQixLQUFLNUUsT0FBTCxDQUFhOEUsV0FBNUMsQ0FBbEI7SUFDQXRHLEVBQUUsQ0FBQ3VHLGFBQUgsQ0FBa0IsR0FBRVYsU0FBVSxNQUE5Qjs7SUFFQSxLQUFLLE1BQU1XLFFBQVgsSUFBdUJuRyxRQUFRLENBQUMsS0FBS21CLE9BQUwsQ0FBYWlGLElBQWQsQ0FBL0IsRUFBb0Q7TUFDbEQsTUFBTXBFLFFBQVEsR0FBR2pDLElBQUksQ0FBQ29HLFFBQUQsQ0FBckI7TUFDQSxJQUFJLFVBQVVFLElBQVYsQ0FBZXJFLFFBQVEsQ0FBQ1ksR0FBeEIsS0FBZ0MsUUFBUXlELElBQVIsQ0FBYXJFLFFBQVEsQ0FBQ1ksR0FBdEIsQ0FBcEMsRUFBZ0U7O01BQ2hFLEtBQUssTUFBTUosa0JBQVgsSUFBaUMsS0FBS1Qsc0JBQUwsQ0FBNEJDLFFBQTVCLENBQWpDLEVBQXdFO1FBQ3RFLElBQUksVUFBVXFFLElBQVYsQ0FBZTdELGtCQUFrQixDQUFDSSxHQUFsQyxDQUFKLEVBQTRDO1FBQzVDLElBQUlpQyxNQUFNLEdBQUcsQ0FBYjs7UUFDQSxLQUFLLE1BQU1wQyxNQUFYLElBQXFCLENBQUMsTUFBRCxFQUFTLEtBQVQsQ0FBckIsRUFBc0M7VUFDcENvQyxNQUFNLElBQUksTUFBTSxLQUFLVSxRQUFMLENBQWNDLFNBQWQsRUFBeUJoRCxrQkFBekIsRUFBNkNDLE1BQTdDLENBQWhCO1FBQ0Q7O1FBQ0QsSUFBSW9DLE1BQU0sSUFBSSxDQUFDLEtBQUsxRCxPQUFMLENBQWF5RSxNQUE1QixFQUFvQ3ZFLE9BQU8sQ0FBQ29ELEdBQVIsQ0FBWSxLQUFaO01BQ3JDO0lBQ0Y7O0lBRUQsSUFBSSxFQUFFLGFBQWEsS0FBS3RELE9BQXBCLENBQUosRUFBa0M7TUFDaEMsTUFBTSxLQUFLZSxhQUFMLENBQW1Cc0QsU0FBbkIsQ0FBTjtJQUNEOztJQUVELE9BQU8sQ0FBUDtFQUNEOztBQXpNWTs7QUE0TWYsZUFBZWMsSUFBZixDQUFvQmxHLElBQXBCLEVBQWdEO0VBQzlDLE1BQU1lLE9BQU8sR0FBR2hCLFNBQVMsQ0FBQ0MsSUFBRCxDQUF6QjtFQUNBLElBQUllLE9BQU8sS0FBSyxJQUFoQixFQUFzQixPQUFPLENBQVA7RUFDdEIsTUFBTW9GLFFBQVEsR0FBRyxJQUFJaEYsUUFBSixDQUFhSixPQUFiLENBQWpCO0VBQ0EsT0FBT29GLFFBQVEsQ0FBQ1YsaUJBQVQsRUFBUDtBQUNEO0FBRUQ7OztBQUNBLElBQUlXLE9BQU8sQ0FBQ3BHLElBQVIsQ0FBYSxDQUFiLEVBQWdCcUcsUUFBaEIsQ0FBeUIsdUJBQXpCLENBQUosRUFDRUgsSUFBSSxDQUFDRSxPQUFPLENBQUNwRyxJQUFULENBQUosQ0FDR3NHLElBREgsQ0FDUzdCLE1BQUQsSUFBWTtFQUNoQjJCLE9BQU8sQ0FBQ0csSUFBUixDQUFhOUIsTUFBYjtBQUNELENBSEgsRUFJRytCLEtBSkgsQ0FJVTdCLEtBQUQsSUFBVztFQUNoQjFELE9BQU8sQ0FBQzBELEtBQVIsQ0FBY0EsS0FBZDtFQUNBeUIsT0FBTyxDQUFDRyxJQUFSLENBQWEsQ0FBYjtBQUNELENBUEgifQ==
768
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZXRjaCIsInJlcXVpcmUiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwiU3RyaW5nIiwiZGVmYXVsdE9wdGlvbiIsIm11bHRpcGxlIiwic2VjdGlvbnMiLCJoZWFkZXIiLCJjb250ZW50Iiwib3B0aW9uTGlzdCIsIm9wdGlvbnMiLCJjb21tYW5kTGluZUFyZ3MiLCJ1c2FnZSIsImNvbW1hbmRMaW5lVXNhZ2UiLCJjb25zb2xlIiwid2FybiIsIlJldHJpZXZlIiwiZGl2aXNpb24iLCJkaXZpc2lvbnMiLCJ1bmRlZmluZWQiLCJkIiwiY29uY2F0IiwiZ2V0RGl2aXNpb25zIiwiZG9jdW1lbnQiLCJtYXAiLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwiZ2l0IiwicmVtb3RlIiwicnVuIiwiZGl2aXNpb25PckRvY3VtZW50IiwiZm9ybWF0IiwiZXh0IiwidXJscyIsInVpZCIsInB1c2giLCJ1cmxGcm9tRG9jdW1lbnQiLCJEb2N1bWVudFVybEZvcm1hdCIsIlJhd0h0bWwiLCJIdG1sIiwiUGRmIiwiZmlsZVBhdGgiLCJmcyIsImV4aXN0c1N5bmMiLCJpc05vdEVtcHR5Iiwic3RhdFN5bmMiLCJzaXplIiwicmV0cnlGYWlsZWQiLCJ2ZXJib3NlIiwidXJsUGF0aCIsInVybCIsInJlYWRGaWxlU3luYyIsInRvU3RyaW5nIiwibG9nIiwicmVzcG9uc2UiLCJidWZmZXIiLCJwYWdlIiwib2siLCJzdGF0dXMiLCJlcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb2RlIiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJ3cml0ZUZpbGVTeW5jIiwic2FuaXR5Q2hlY2tGb3JtYXQiLCJ0ZXh0ZXNEaXIiLCJuZWVkc0Rvd25sb2FkIiwic3VjY2VzcyIsImluZm8iLCJnZXRVcmxzIiwiZ2V0IiwidW5saW5rU3luYyIsInNpbGVudCIsInVybEZyb21VaWQiLCJzbGljZSIsImdpdERpciIsInRleHRlcyIsInBhdGgiLCJqb2luIiwibGVnaXNsYXR1cmUiLCJlbnN1cmVEaXJTeW5jIiwiZ2V0RmlsZXMiLCJkYXRhIiwiZmlsZW5hbWUiLCJsb2FkIiwidGVzdCIsImdldERpdmlzaW9uc09yRG9jdW1lbnQiLCJkb3dubG9hZCIsImNvbW1pdEFuZFB1c2giLCJsZW5ndGgiLCJNYXRoIiwibWluIiwiaGVhZCIsInN0YXJ0c1dpdGgiLCJCdWZmZXIiLCJmcm9tIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaW5jbHVkZXMiLCJtYWluIiwicmV0cmlldmUiLCJyZXRyaWV2ZURvY3VtZW50cyIsInByb2Nlc3MiLCJlbmRzV2l0aCIsInRoZW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfZG9jdW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBjb21tYW5kTGluZVVzYWdlIGZyb20gXCJjb21tYW5kLWxpbmUtdXNhZ2VcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi8uLi9zcmMvZ2l0XCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxubGV0IGZldGNoID0gcmVxdWlyZShcIm5vZGUtZmV0Y2hcIilcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgbG9hZCwgZ2V0RmlsZXMgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7IERvY3VtZW50VXJsRm9ybWF0LCB1cmxGcm9tRG9jdW1lbnQgfSBmcm9tIFwiLi4vdXJsc1wiXG5cbmZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSk6IGFueSB7XG4gIGNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhbGlhczogXCJjXCIsXG4gICAgICBoZWxwOiBcImNvbW1pdCBkb2N1bWVudHNcIixcbiAgICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVscDogXCJkcnkgcnVuXCIsXG4gICAgICBuYW1lOiBcImRyeS1ydW5cIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwOiBcInJldHJ5IGZhaWxlZCBkb2N1bWVudHNcIixcbiAgICAgIG5hbWU6IFwicmV0cnktZmFpbGVkXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVscDogXCJyZXRyeSBhbGwgZG9jdW1lbnRzXCIsXG4gICAgICBuYW1lOiBcInJldHJ5XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwibFwiLFxuICAgICAgZGVmYXVsdFZhbHVlOiBcIjE2XCIsXG4gICAgICBuYW1lOiBcImxlZ2lzbGF0dXJlXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJyXCIsXG4gICAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInNcIixcbiAgICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwidGV4dGVzIGRpclwiLFxuICAgICAgbmFtZTogXCJ0ZXh0ZXNcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInZcIixcbiAgICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgICAgaGVscDogXCJmaWxlcyBvciBnbG9icyB0byBkb2N1bWVudHNcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgXVxuICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiUmV0cmlldmUgZG9jdW1lbnRzXCIsXG4gICAgICBjb250ZW50OiBcIlJldHJpZXZlIGRvY3VtZW50c1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVhZGVyOiBcIk9wdGlvbnNcIixcbiAgICAgIG9wdGlvbkxpc3Q6IG9wdGlvbnNEZWZpbml0aW9ucyxcbiAgICB9LFxuICBdXG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zLCB7XG4gICAgYXJndjogYXJndixcbiAgfSlcblxuICBpZiAoXCJoZWxwXCIgaW4gb3B0aW9ucykge1xuICAgIGNvbnN0IHVzYWdlID0gY29tbWFuZExpbmVVc2FnZShzZWN0aW9ucylcbiAgICBjb25zb2xlLndhcm4odXNhZ2UpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5jbGFzcyBSZXRyaWV2ZSB7XG4gIG9wdGlvbnM6IGFueVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgfVxuXG4gIGdldERpdmlzaW9ucyhkaXZpc2lvbjogYW55KSB7XG4gICAgbGV0IGRpdmlzaW9ucyA9IFtkaXZpc2lvbl1cbiAgICBpZiAoZGl2aXNpb24uZGl2aXNpb25zICE9IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBkIG9mIGRpdmlzaW9uLmRpdmlzaW9ucylcbiAgICAgICAgZGl2aXNpb25zID0gZGl2aXNpb25zLmNvbmNhdCh0aGlzLmdldERpdmlzaW9ucyhkKSlcbiAgICB9XG4gICAgcmV0dXJuIGRpdmlzaW9uc1xuICB9XG5cbiAgZ2V0RGl2aXNpb25zT3JEb2N1bWVudChkb2N1bWVudDogYW55KSB7XG4gICAgaWYgKGRvY3VtZW50LmRpdmlzaW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gW10uY29uY2F0KFxuICAgICAgICAuLi5kb2N1bWVudC5kaXZpc2lvbnMubWFwKChkOiBhbnkpID0+IHRoaXMuZ2V0RGl2aXNpb25zKGQpKSxcbiAgICAgIClcbiAgICBlbHNlIHJldHVybiBbZG9jdW1lbnRdXG4gIH1cblxuICBhc3luYyBjb21taXRBbmRQdXNoKHJlcG9zaXRvcnlEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tbWl0ID09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgZ2l0LmNvbW1pdChyZXBvc2l0b3J5RGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIilcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3RlID09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgZ2l0LnJ1bihyZXBvc2l0b3J5RGlyLCBgcHVzaCAke3RoaXMub3B0aW9ucy5yZW1vdGV9IEhFQUQ6bWFzdGVyYClcbiAgfVxuXG4gIGdldFVybHMoZGl2aXNpb25PckRvY3VtZW50OiBhbnksIGZvcm1hdDogc3RyaW5nKSB7XG4gICAgY29uc3QgZXh0ID0gZm9ybWF0ID09IFwiaHRtbFwiID8gXCJyYXdcIiA6IFwicGRmXCJcbiAgICBsZXQgdXJsczogYW55ID0gW1xuICAgICAgYGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9keW4vZG9jcy8ke2RpdmlzaW9uT3JEb2N1bWVudC51aWR9LiR7ZXh0fWAsXG4gICAgXVxuICAgIGlmIChmb3JtYXQgPT0gXCJodG1sXCIpIHtcbiAgICAgIHVybHMucHVzaCh1cmxGcm9tRG9jdW1lbnQoZGl2aXNpb25PckRvY3VtZW50LCBEb2N1bWVudFVybEZvcm1hdC5SYXdIdG1sKSlcbiAgICAgIHVybHMucHVzaCh1cmxGcm9tRG9jdW1lbnQoZGl2aXNpb25PckRvY3VtZW50LCBEb2N1bWVudFVybEZvcm1hdC5IdG1sKSlcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBcInBkZlwiKSB7XG4gICAgICB1cmxzLnB1c2godXJsRnJvbURvY3VtZW50KGRpdmlzaW9uT3JEb2N1bWVudCwgRG9jdW1lbnRVcmxGb3JtYXQuUGRmKSlcbiAgICB9XG4gICAgcmV0dXJuIHVybHNcbiAgfVxuXG4gIHN0YXRpYyBzYW5pdHlDaGVja0Zvcm1hdChwYWdlOiBCdWZmZXIsIGZvcm1hdDogc3RyaW5nKTogW0J1ZmZlciwgc3RyaW5nXSB7XG4gICAgaWYgKGZvcm1hdCA9PSBcInBkZlwiKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihwYWdlLmxlbmd0aCwgNClcbiAgICAgIGNvbnN0IGhlYWQgPSBwYWdlLnNsaWNlKDAsIGxlbmd0aCkudG9TdHJpbmcoKVxuICAgICAgaWYgKCFoZWFkLnN0YXJ0c1dpdGgoXCIlUERGXCIpKVxuICAgICAgICByZXR1cm4gW0J1ZmZlci5mcm9tKFwiXCIpLCBgYmFkIHBkZiAke2VuY29kZVVSSUNvbXBvbmVudChoZWFkKX0uLi5gXVxuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFwiaHRtbFwiKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihwYWdlLmxlbmd0aCwgNTApXG4gICAgICBjb25zdCBoZWFkID0gcGFnZS5zbGljZSgwLCBsZW5ndGgpLnRvU3RyaW5nKClcbiAgICAgIGlmICghaGVhZC5pbmNsdWRlcyhcIkRPQ1RZUEVcIikgJiYgIWhlYWQuaW5jbHVkZXMoXCI8P3htbFwiKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIEJ1ZmZlci5mcm9tKFwiXCIpLFxuICAgICAgICAgIGBiYWQgaHRtbCAke2VuY29kZVVSSUNvbXBvbmVudChoZWFkLnNsaWNlKDAsIDQpKX0uLi5gLFxuICAgICAgICBdXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbcGFnZSwgXCJPS1wiXVxuICB9XG5cbiAgYXN5bmMgbmVlZHNEb3dubG9hZChmaWxlUGF0aDogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaXNOb3RFbXB0eSA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5zaXplID4gMFxuICAgICAgY29uc3QgcmV0cnlGYWlsZWQgPSBcInJldHJ5LWZhaWxlZFwiIGluIHRoaXMub3B0aW9uc1xuICAgICAgaWYgKCFyZXRyeUZhaWxlZCB8fCBpc05vdEVtcHR5KSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGlmIChpc05vdEVtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCB1cmxQYXRoID0gYCR7ZmlsZVBhdGh9LnVybGBcbiAgICAgICAgICAgIGxldCB1cmxcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHVybFBhdGgpKVxuICAgICAgICAgICAgICB1cmwgPSBmcy5yZWFkRmlsZVN5bmModXJsUGF0aCkudG9TdHJpbmcoKVxuICAgICAgICAgICAgZWxzZSB1cmwgPSBcIjx1bmtub3duIHVybD5cIlxuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dWlkfTogQ2FjaGVkIE9LICR7ZmlsZVBhdGh9IGZyb20gJHt1cmx9YClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dWlkfTogQ2FjaGVkIEZBSUwgJHtmaWxlUGF0aH1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIGdldChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGZvcm1hdDogc3RyaW5nLFxuICAgIHVpZDogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkgY29uc29sZS5sb2coYCR7dWlkfTogZmV0Y2goJHt1cmx9KWApXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgbGV0IHBhZ2U6IGFueSA9IGF3YWl0IHJlc3BvbnNlLmJ1ZmZlcigpXG4gICAgbGV0IHN0YXR1c1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igd2hpbGUgZ2V0dGluZyBwYWdlIFwiJHt1cmx9XCIgKHVpZDogJHt1aWR9KTpcXG5cXG5FcnJvcjpcXG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7IGNvZGU6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgXCJcIilcbiAgICB9IGVsc2Uge1xuICAgICAgO1twYWdlLCBzdGF0dXNdID0gUmV0cmlldmUuc2FuaXR5Q2hlY2tGb3JtYXQocGFnZSwgZm9ybWF0KVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcGFnZSlcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgc3RhdGljIHVybEZyb21VaWQodWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybCA9XG4gICAgICBcImh0dHBzOi8vZ2l0LmVuLXJvb3Qub3JnL3RyaWNvdGV1c2VzL2RhdGEudHJpY290ZXVzZXMuZnIvRG9zc2llcnNfTGVnaXNsYXRpZnNfWFYvLS90cmVlL21hc3Rlci9kb2N1bWVudHNcIlxuICAgIHJldHVybiBgWyR7dWlkfV0oJHt1cmx9L3VpZC8ke3VpZH0uanNvbilgXG4gIH1cblxuICBhc3luYyBkb3dubG9hZChcbiAgICB0ZXh0ZXNEaXI6IHN0cmluZyxcbiAgICBkaXZpc2lvbk9yRG9jdW1lbnQ6IGFueSxcbiAgICBmb3JtYXQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB1aWQgPSBkaXZpc2lvbk9yRG9jdW1lbnQudWlkXG4gICAgY29uc3QgZmlsZVBhdGggPSBgJHt0ZXh0ZXNEaXJ9L3VpZC8ke3VpZH0uJHtmb3JtYXR9YFxuICAgIGlmICghKGF3YWl0IHRoaXMubmVlZHNEb3dubG9hZChmaWxlUGF0aCwgdWlkKSkpIHJldHVybiAwXG4gICAgaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKSBjb25zb2xlLmxvZyhgJHt1aWR9OiBDaGVja2luZyAke2ZpbGVQYXRofWApXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuICAgIGxldCBpbmZvID0gXCJcIlxuICAgIGxldCB1cmxcblxuICAgIGZvciAodXJsIG9mIHRoaXMuZ2V0VXJscyhkaXZpc2lvbk9yRG9jdW1lbnQsIGZvcm1hdCkpIHtcbiAgICAgIGlmIChcImRyeS1ydW5cIiBpbiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgaW5mbyArPSBgICAqICR7dXJsfVxcbmBcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8gKz0gYCAgKiAke3VybH0gYFxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldCh1cmwsIGZpbGVQYXRoLCBmb3JtYXQsIHVpZClcblxuICAgICAgaW5mbyArPSBgJHtzdGF0dXN9XFxuYFxuICAgICAgaWYgKHN0YXR1cyA9PSBcIk9LXCIpIHtcbiAgICAgICAgc3VjY2VzcyA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdXJsUGF0aCA9IGAke2ZpbGVQYXRofS51cmxgXG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModXJsUGF0aCwgdXJsKVxuICAgIH0gZWxzZSBpZiAoZnMuZXhpc3RzU3luYyh1cmxQYXRoKSkge1xuICAgICAgZnMudW5saW5rU3luYyh1cmxQYXRoKVxuICAgIH1cbiAgICBpZiAoaW5mbyAhPSBcIlwiICYmICF0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYCogJHtSZXRyaWV2ZS51cmxGcm9tVWlkKHVpZCl9OiBSZXRyaWV2aW5nICR7ZmlsZVBhdGh9XFxuJHtpbmZvLnNsaWNlKFxuICAgICAgICAgIDAsXG4gICAgICAgICAgLTEsXG4gICAgICAgICl9YCxcbiAgICAgIClcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEb2N1bWVudHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBnaXREaXIgPSBgJHt0aGlzLm9wdGlvbnMudGV4dGVzfS8uZ2l0YFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhnaXREaXIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2dpdERpcn0gaXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IGRvZXMgbm90YClcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgY29uc3QgdGV4dGVzRGlyID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy50ZXh0ZXMsIHRoaXMub3B0aW9ucy5sZWdpc2xhdHVyZSlcbiAgICBmcy5lbnN1cmVEaXJTeW5jKGAke3RleHRlc0Rpcn0vdWlkYClcblxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZ2V0RmlsZXModGhpcy5vcHRpb25zLmRhdGEpKSB7XG4gICAgICBjb25zdCBkb2N1bWVudCA9IGxvYWQoZmlsZW5hbWUpXG4gICAgICBpZiAoL14uLi4uU04vLnRlc3QoZG9jdW1lbnQudWlkKSB8fCAvXkRFQ0wvLnRlc3QoZG9jdW1lbnQudWlkKSkgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgZGl2aXNpb25PckRvY3VtZW50IG9mIHRoaXMuZ2V0RGl2aXNpb25zT3JEb2N1bWVudChkb2N1bWVudCkpIHtcbiAgICAgICAgaWYgKC8tQ09NUEEkLy50ZXN0KGRpdmlzaW9uT3JEb2N1bWVudC51aWQpKSBjb250aW51ZVxuICAgICAgICBsZXQgc3RhdHVzID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGZvcm1hdCBvZiBbXCJodG1sXCIsIFwicGRmXCJdKSB7XG4gICAgICAgICAgc3RhdHVzIHw9IGF3YWl0IHRoaXMuZG93bmxvYWQodGV4dGVzRGlyLCBkaXZpc2lvbk9yRG9jdW1lbnQsIGZvcm1hdClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzICYmICF0aGlzLm9wdGlvbnMuc2lsZW50KSBjb25zb2xlLmxvZyhcIi0tLVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghKFwiZHJ5LXJ1blwiIGluIHRoaXMub3B0aW9ucykpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29tbWl0QW5kUHVzaCh0ZXh0ZXNEaXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIDBcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgaWYgKG9wdGlvbnMgPT09IG51bGwpIHJldHVybiAxXG4gIGNvbnN0IHJldHJpZXZlID0gbmV3IFJldHJpZXZlKG9wdGlvbnMpXG4gIHJldHVybiByZXRyaWV2ZS5yZXRyaWV2ZURvY3VtZW50cygpXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcInJldHJpZXZlX2RvY3VtZW50cy50c1wiKSlcbiAgbWFpbihwcm9jZXNzLmFyZ3YpXG4gICAgLnRoZW4oKHN0YXR1cykgPT4ge1xuICAgICAgcHJvY2Vzcy5leGl0KHN0YXR1cylcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9KVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OytDQVBBLG9KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUFuQjs7QUFNQSxTQUFTQyxTQUFULENBQW1CQyxJQUFuQixFQUF3QztFQUN0QyxJQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxLQUFLLEVBQUUsR0FEVDtJQUVFQyxJQUFJLEVBQUUsa0JBRlI7SUFHRUMsSUFBSSxFQUFFLFFBSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBRHlCLEVBT3pCO0lBQ0VILElBQUksRUFBRSxTQURSO0lBRUVDLElBQUksRUFBRSxTQUZSO0lBR0VDLElBQUksRUFBRUM7RUFIUixDQVB5QixFQVl6QjtJQUNFSCxJQUFJLEVBQUUsd0JBRFI7SUFFRUMsSUFBSSxFQUFFLGNBRlI7SUFHRUMsSUFBSSxFQUFFQztFQUhSLENBWnlCLEVBaUJ6QjtJQUNFSCxJQUFJLEVBQUUscUJBRFI7SUFFRUMsSUFBSSxFQUFFLE9BRlI7SUFHRUMsSUFBSSxFQUFFQztFQUhSLENBakJ5QixFQXNCekI7SUFDRUosS0FBSyxFQUFFLEdBRFQ7SUFFRUssWUFBWSxFQUFFLElBRmhCO0lBR0VILElBQUksRUFBRSxhQUhSO0lBSUVDLElBQUksRUFB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