@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,19 +1,120 @@
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.object.define-property.js");
6
+
7
+ require("core-js/modules/es.object.to-string.js");
8
+
9
+ require("core-js/modules/es.function.name.js");
10
+
11
+ require("core-js/modules/es.array.from.js");
12
+
13
+ require("core-js/modules/es.string.iterator.js");
14
+
15
+ require("core-js/modules/es.symbol.js");
16
+
17
+ require("core-js/modules/es.symbol.description.js");
18
+
19
+ require("core-js/modules/es.symbol.iterator.js");
20
+
21
+ require("core-js/modules/es.array.iterator.js");
22
+
23
+ require("core-js/modules/web.dom-collections.iterator.js");
24
+
25
+ require("core-js/modules/es.array.is-array.js");
26
+
27
+ require("core-js/modules/es.promise.js");
28
+
29
+ require("core-js/modules/es.symbol.async-iterator.js");
30
+
31
+ require("core-js/modules/es.symbol.to-string-tag.js");
32
+
33
+ require("core-js/modules/es.json.to-string-tag.js");
34
+
35
+ require("core-js/modules/es.math.to-string-tag.js");
36
+
37
+ require("core-js/modules/es.object.create.js");
38
+
39
+ require("core-js/modules/es.object.get-prototype-of.js");
40
+
41
+ require("core-js/modules/es.array.for-each.js");
42
+
43
+ require("core-js/modules/web.dom-collections.for-each.js");
44
+
45
+ require("core-js/modules/es.object.set-prototype-of.js");
46
+
47
+ require("core-js/modules/es.array.reverse.js");
48
+
49
+ require("core-js/modules/es.weak-map.js");
50
+
51
+ require("core-js/modules/es.object.get-own-property-descriptor.js");
52
+
53
+ require("core-js/modules/es.array.includes.js");
54
+
55
+ require("core-js/modules/es.string.includes.js");
2
56
 
3
- import Ajv from "ajv";
4
- import commandLineArgs from "command-line-args";
5
- import commandLineUsage from "command-line-usage";
6
- import { load, getFiles } from "../file_systems.js";
7
- import * as git from "../git.js";
8
- import temp from "temp";
9
- import fs from "fs-extra";
10
- import path from "path";
11
- import { validDataset, getDatasets, getSchemas, datasetDirectorySchema } from "../../src/datasets.js"; // Automatically track and cleanup files at exit
57
+ require("core-js/modules/es.array.join.js");
58
+
59
+ require("core-js/modules/es.array.concat.js");
60
+
61
+ require("core-js/modules/es.array.slice.js");
62
+
63
+ require("core-js/modules/es.regexp.exec.js");
64
+
65
+ require("core-js/modules/es.string.replace.js");
66
+
67
+ require("core-js/modules/es.string.ends-with.js");
68
+
69
+ var _ajv = _interopRequireDefault(require("ajv"));
70
+
71
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
72
+
73
+ var _commandLineUsage = _interopRequireDefault(require("command-line-usage"));
74
+
75
+ var _file_systems = require("../file_systems");
76
+
77
+ var git = _interopRequireWildcard(require("../git"));
78
+
79
+ var _temp = _interopRequireDefault(require("temp"));
80
+
81
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
82
+
83
+ var _path = _interopRequireDefault(require("path"));
84
+
85
+ var _datasets = require("../../src/datasets");
86
+
87
+ 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); }
88
+
89
+ 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; }
90
+
91
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
92
+
93
+ 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; }
94
+
95
+ 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); } }
96
+
97
+ 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); }); }; }
98
+
99
+ 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(_e) { throw _e; }, 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(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
100
+
101
+ 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); }
102
+
103
+ 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; }
104
+
105
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
106
+
107
+ 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); } }
108
+
109
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
110
+
111
+ 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; }
12
112
 
13
- temp.track();
113
+ // Automatically track and cleanup files at exit
114
+ _temp["default"].track();
14
115
 
15
116
  function parseArgs(argv) {
16
- const optionsDefinitions = [{
117
+ var optionsDefinitions = [{
17
118
  description: "pathname to the directory containing the dataset",
18
119
  defaultOption: true,
19
120
  name: "data",
@@ -24,11 +125,11 @@ function parseArgs(argv) {
24
125
  name: "repository",
25
126
  type: String
26
127
  }, {
27
- description: `dataset (possible values must include exactly one of ${getDatasets()})`,
128
+ description: "dataset (possible values must include exactly one of ".concat((0, _datasets.getDatasets)(), ")"),
28
129
  name: "dataset",
29
130
  type: String
30
131
  }, {
31
- description: `schema (possible values are ${getSchemas()})`,
132
+ description: "schema (possible values are ".concat((0, _datasets.getSchemas)(), ")"),
32
133
  name: "schema",
33
134
  type: String
34
135
  }, {
@@ -43,33 +144,33 @@ function parseArgs(argv) {
43
144
  name: "help",
44
145
  description: "Print this usage guide."
45
146
  }];
46
- const sections = [{
147
+ var sections = [{
47
148
  header: "Validate JSON files",
48
149
  content: "Validate JSON files"
49
150
  }, {
50
151
  header: "Options",
51
152
  optionList: optionsDefinitions
52
153
  }];
53
- const options = commandLineArgs(optionsDefinitions, {
154
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions, {
54
155
  argv: argv
55
156
  });
56
157
 
57
158
  if (options.dataset) {
58
- if (!validDataset(options.dataset)) {
59
- console.error(`--dataset ${options.dataset}`);
159
+ if (!(0, _datasets.validDataset)(options.dataset)) {
160
+ console.error("--dataset ".concat(options.dataset));
60
161
  options.help = true;
61
162
  }
62
163
  }
63
164
 
64
165
  if (options.schema) {
65
- if (!getSchemas().includes(options.schema)) {
66
- console.error(`--schema ${options.schema}`);
166
+ if (!(0, _datasets.getSchemas)().includes(options.schema)) {
167
+ console.error("--schema ".concat(options.schema));
67
168
  options.help = true;
68
169
  }
69
170
  }
70
171
 
71
172
  if ("help" in options) {
72
- const usage = commandLineUsage(sections);
173
+ var usage = (0, _commandLineUsage["default"])(sections);
73
174
  console.warn(usage);
74
175
  return null;
75
176
  }
@@ -77,8 +178,10 @@ function parseArgs(argv) {
77
178
  return options;
78
179
  }
79
180
 
80
- class Validate {
81
- constructor(options) {
181
+ var Validate = /*#__PURE__*/function () {
182
+ function Validate(options) {
183
+ _classCallCheck(this, Validate);
184
+
82
185
  _defineProperty(this, "options", void 0);
83
186
 
84
187
  _defineProperty(this, "version2schema", void 0);
@@ -87,130 +190,277 @@ class Validate {
87
190
 
88
191
  this.options = options;
89
192
  this.version2schema = {};
90
- this.tmpDir = temp.mkdirSync("validation");
193
+ this.tmpDir = _temp["default"].mkdirSync("validation");
91
194
  }
92
195
 
93
- getSchemaDir(tag) {
94
- if (this.options.dev == true) {
95
- if (this.options.verbose) console.log("--dev: use src/schemas");
96
- return "src/schemas";
97
- }
98
-
99
- const repositoryDir = path.join(this.tmpDir, "tricoteuses-assemblee");
100
- const tagDir = path.join(this.tmpDir, tag);
101
-
102
- if (!fs.existsSync(tagDir)) {
103
- if (!fs.existsSync(repositoryDir)) {
104
- git.run(this.tmpDir, `clone --quiet ${this.options.repository} ${repositoryDir}`);
196
+ _createClass(Validate, [{
197
+ key: "getSchemaDir",
198
+ value: function getSchemaDir(tag) {
199
+ if (this.options.dev == true) {
200
+ if (this.options.verbose) console.log("--dev: use src/schemas");
201
+ return "src/schemas";
105
202
  }
106
203
 
107
- git.run(repositoryDir, `checkout tags/${tag} -- src/schemas > /dev/null 2>&1`);
108
- fs.renameSync(path.join(repositoryDir, "src/schemas"), tagDir);
109
- }
204
+ var repositoryDir = _path["default"].join(this.tmpDir, "tricoteuses-assemblee");
110
205
 
111
- return tagDir;
112
- }
206
+ var tagDir = _path["default"].join(this.tmpDir, tag);
113
207
 
114
- getValidator(version) {
115
- if (!(version in this.version2schema)) {
116
- const ajv = new Ajv();
117
- const dir = this.getSchemaDir(`schema-${version}`);
118
- let references = [];
208
+ if (!_fsExtra["default"].existsSync(tagDir)) {
209
+ if (!_fsExtra["default"].existsSync(repositoryDir)) {
210
+ git.run(this.tmpDir, "clone --quiet ".concat(this.options.repository, " ").concat(repositoryDir));
211
+ }
119
212
 
120
- for (const reference of getFiles([`${dir}/${this.options.schema}/*.json`])) references.push(reference);
213
+ git.run(repositoryDir, "checkout tags/".concat(tag, " -- src/schemas > /dev/null 2>&1"));
121
214
 
122
- for (const file of getFiles(references)) {
123
- if (this.options.verbose) console.log(`reference: ${file}`);
124
- ajv.addSchema(load(file));
215
+ _fsExtra["default"].renameSync(_path["default"].join(repositoryDir, "src/schemas"), tagDir);
125
216
  }
126
217
 
127
- const schema = this.options.schema;
128
- const Schema = schema.charAt(0).toUpperCase() + schema.slice(1);
129
- const s = `${dir}/${schema}/${Schema}.json`;
130
- if (this.options.verbose) console.log(`schema ${s}`);
131
- this.version2schema[version] = ajv.compile(load(s));
218
+ return tagDir;
132
219
  }
220
+ }, {
221
+ key: "getValidator",
222
+ value: function getValidator(version) {
223
+ if (!(version in this.version2schema)) {
224
+ var ajv = new _ajv["default"]();
225
+ var dir = this.getSchemaDir("schema-".concat(version));
226
+ var references = [];
227
+
228
+ var _iterator = _createForOfIteratorHelper((0, _file_systems.getFiles)(["".concat(dir, "/").concat(this.options.schema, "/*.json")])),
229
+ _step;
230
+
231
+ try {
232
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
233
+ var reference = _step.value;
234
+ references.push(reference);
235
+ }
236
+ } catch (err) {
237
+ _iterator.e(err);
238
+ } finally {
239
+ _iterator.f();
240
+ }
241
+
242
+ var _iterator2 = _createForOfIteratorHelper((0, _file_systems.getFiles)(references)),
243
+ _step2;
244
+
245
+ try {
246
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
247
+ var file = _step2.value;
248
+ if (this.options.verbose) console.log("reference: ".concat(file));
249
+ ajv.addSchema((0, _file_systems.load)(file));
250
+ }
251
+ } catch (err) {
252
+ _iterator2.e(err);
253
+ } finally {
254
+ _iterator2.f();
255
+ }
256
+
257
+ var schema = this.options.schema;
258
+ var Schema = schema.charAt(0).toUpperCase() + schema.slice(1);
259
+ var s = "".concat(dir, "/").concat(schema, "/").concat(Schema, ".json");
260
+ if (this.options.verbose) console.log("schema ".concat(s));
261
+ this.version2schema[version] = ajv.compile((0, _file_systems.load)(s));
262
+ }
133
263
 
134
- return this.version2schema[version];
135
- }
136
-
137
- getVersion(content) {
138
- if (content.schemaVersion != undefined) return content.schemaVersion;
139
- return `${this.options.schema}-1.0`;
140
- }
141
-
142
- getSchemaURL(version) {
143
- if (this.options.dev == true) return "src/schemas";else {
144
- if (fs.existsSync(this.options.repository)) {
145
- return `${this.options.repository}/src/schemas at tag schema-${version}`;
264
+ return this.version2schema[version];
265
+ }
266
+ }, {
267
+ key: "getVersion",
268
+ value: function getVersion(content) {
269
+ if (content.schemaVersion != undefined) return content.schemaVersion;
270
+ return "".concat(this.options.schema, "-1.0");
271
+ }
272
+ }, {
273
+ key: "getSchemaURL",
274
+ value: function getSchemaURL(version) {
275
+ if (this.options.dev == true) return "src/schemas";else {
276
+ if (_fsExtra["default"].existsSync(this.options.repository)) {
277
+ return "".concat(this.options.repository, "/src/schemas at tag schema-").concat(version);
278
+ } else {
279
+ var repository = this.options.repository.replace(/\.git$/, "");
280
+ return "".concat(repository, "/tree/schema-").concat(version, "/src/schemas");
281
+ }
282
+ }
283
+ }
284
+ }, {
285
+ key: "validate",
286
+ value: function validate(content, filename) {
287
+ var tag = this.getVersion(content);
288
+ var validator = this.getValidator(tag);
289
+ var valid = validator(content);
290
+ var schemaURL = this.getSchemaURL(tag);
291
+
292
+ if (!valid) {
293
+ console.error("".concat(schemaURL, " finds ").concat(filename, " is invalid"));
294
+ console.error(validator.errors);
295
+ return 1;
146
296
  } else {
147
- const repository = this.options.repository.replace(/\.git$/, "");
148
- return `${repository}/tree/schema-${version}/src/schemas`;
297
+ if (this.options.verbose) console.log("".concat(schemaURL, " finds ").concat(filename, " is valid"));
298
+ return 0;
149
299
  }
150
300
  }
151
- }
301
+ }, {
302
+ key: "process",
303
+ value: function () {
304
+ var _process = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
305
+ var status, _iterator3, _step3, file, content;
306
+
307
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
308
+ while (1) {
309
+ switch (_context.prev = _context.next) {
310
+ case 0:
311
+ status = 0;
312
+ _iterator3 = _createForOfIteratorHelper((0, _file_systems.getFiles)([this.options.data]));
313
+
314
+ try {
315
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
316
+ file = _step3.value;
317
+ content = (0, _file_systems.load)(file);
318
+ status |= this.validate(content, file);
319
+ }
320
+ } catch (err) {
321
+ _iterator3.e(err);
322
+ } finally {
323
+ _iterator3.f();
324
+ }
325
+
326
+ return _context.abrupt("return", status);
327
+
328
+ case 4:
329
+ case "end":
330
+ return _context.stop();
331
+ }
332
+ }
333
+ }, _callee, this);
334
+ }));
335
+
336
+ function process() {
337
+ return _process.apply(this, arguments);
338
+ }
152
339
 
153
- validate(content, filename) {
154
- const tag = this.getVersion(content);
155
- const validator = this.getValidator(tag);
156
- const valid = validator(content);
157
- const schemaURL = this.getSchemaURL(tag);
158
-
159
- if (!valid) {
160
- console.error(`${schemaURL} finds ${filename} is invalid`);
161
- console.error(validator.errors);
162
- return 1;
163
- } else {
164
- if (this.options.verbose) console.log(`${schemaURL} finds ${filename} is valid`);
165
- return 0;
166
- }
167
- }
340
+ return process;
341
+ }()
342
+ }]);
168
343
 
169
- async process() {
170
- let status = 0;
344
+ return Validate;
345
+ }();
171
346
 
172
- for (const file of getFiles([this.options.data])) {
173
- const content = load(file);
174
- status |= this.validate(content, file);
175
- }
347
+ function main(_x) {
348
+ return _main.apply(this, arguments);
349
+ }
350
+ /* istanbul ignore if */
176
351
 
177
- return status;
178
- }
179
352
 
180
- }
353
+ function _main() {
354
+ _main = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(argv) {
355
+ var options, directorySchema, _iterator4, _step4, d, validate, status;
181
356
 
182
- async function main(argv) {
183
- const options = parseArgs(argv);
184
- if (options === null) return 1;
185
- let directorySchema = [];
357
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
358
+ while (1) {
359
+ switch (_context2.prev = _context2.next) {
360
+ case 0:
361
+ options = parseArgs(argv);
186
362
 
187
- if (options.schema) {
188
- directorySchema = [[options.data, options.schema]];
189
- } else if (options.dataset) {
190
- directorySchema = datasetDirectorySchema(options.dataset);
191
- } else {
192
- console.error("either --schema or --dataset is required");
193
- return 1;
194
- }
363
+ if (!(options === null)) {
364
+ _context2.next = 3;
365
+ break;
366
+ }
195
367
 
196
- for (const d of directorySchema) {
197
- options.schema = d[1];
198
- options.data = d[0];
199
- if (options.verbose) console.log(`working on files ${options.data} with schema ${options.schema}`);
200
- const validate = new Validate(options);
201
- const status = await validate.process();
202
- if (status != 0) return status;
203
- }
368
+ return _context2.abrupt("return", 1);
204
369
 
205
- return 0;
206
- }
207
- /* istanbul ignore if */
370
+ case 3:
371
+ directorySchema = [];
372
+
373
+ if (!options.schema) {
374
+ _context2.next = 8;
375
+ break;
376
+ }
377
+
378
+ directorySchema = [[options.data, options.schema]];
379
+ _context2.next = 14;
380
+ break;
381
+
382
+ case 8:
383
+ if (!options.dataset) {
384
+ _context2.next = 12;
385
+ break;
386
+ }
387
+
388
+ directorySchema = (0, _datasets.datasetDirectorySchema)(options.dataset);
389
+ _context2.next = 14;
390
+ break;
391
+
392
+ case 12:
393
+ console.error("either --schema or --dataset is required");
394
+ return _context2.abrupt("return", 1);
395
+
396
+ case 14:
397
+ _iterator4 = _createForOfIteratorHelper(directorySchema);
398
+ _context2.prev = 15;
399
+
400
+ _iterator4.s();
401
+
402
+ case 17:
403
+ if ((_step4 = _iterator4.n()).done) {
404
+ _context2.next = 30;
405
+ break;
406
+ }
208
407
 
408
+ d = _step4.value;
409
+ options.schema = d[1];
410
+ options.data = d[0];
411
+ if (options.verbose) console.log("working on files ".concat(options.data, " with schema ").concat(options.schema));
412
+ validate = new Validate(options);
413
+ _context2.next = 25;
414
+ return validate.process();
415
+
416
+ case 25:
417
+ status = _context2.sent;
418
+
419
+ if (!(status != 0)) {
420
+ _context2.next = 28;
421
+ break;
422
+ }
423
+
424
+ return _context2.abrupt("return", status);
425
+
426
+ case 28:
427
+ _context2.next = 17;
428
+ break;
429
+
430
+ case 30:
431
+ _context2.next = 35;
432
+ break;
433
+
434
+ case 32:
435
+ _context2.prev = 32;
436
+ _context2.t0 = _context2["catch"](15);
437
+
438
+ _iterator4.e(_context2.t0);
439
+
440
+ case 35:
441
+ _context2.prev = 35;
442
+
443
+ _iterator4.f();
444
+
445
+ return _context2.finish(35);
446
+
447
+ case 38:
448
+ return _context2.abrupt("return", 0);
449
+
450
+ case 39:
451
+ case "end":
452
+ return _context2.stop();
453
+ }
454
+ }
455
+ }, _callee2, null, [[15, 32, 35, 38]]);
456
+ }));
457
+ return _main.apply(this, arguments);
458
+ }
209
459
 
210
- if (process.argv[1].endsWith("validate_json.ts")) main(process.argv).then(status => {
460
+ if (process.argv[1].endsWith("validate_json.ts")) main(process.argv).then(function (status) {
211
461
  process.exit(status);
212
- }).catch(error => {
462
+ })["catch"](function (error) {
213
463
  console.error(error);
214
464
  process.exit(1);
215
465
  });
216
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBanYiLCJjb21tYW5kTGluZUFyZ3MiLCJjb21tYW5kTGluZVVzYWdlIiwibG9hZCIsImdldEZpbGVzIiwiZ2l0IiwidGVtcCIsImZzIiwicGF0aCIsInZhbGlkRGF0YXNldCIsImdldERhdGFzZXRzIiwiZ2V0U2NoZW1hcyIsImRhdGFzZXREaXJlY3RvcnlTY2hlbWEiLCJ0cmFjayIsInBhcnNlQXJncyIsImFyZ3YiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJkZXNjcmlwdGlvbiIsImRlZmF1bHRPcHRpb24iLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsImRlZmF1bHRWYWx1ZSIsIkJvb2xlYW4iLCJzZWN0aW9ucyIsImhlYWRlciIsImNvbnRlbnQiLCJvcHRpb25MaXN0Iiwib3B0aW9ucyIsImRhdGFzZXQiLCJjb25zb2xlIiwiZXJyb3IiLCJoZWxwIiwic2NoZW1hIiwiaW5jbHVkZXMiLCJ1c2FnZSIsIndhcm4iLCJWYWxpZGF0ZSIsImNvbnN0cnVjdG9yIiwidmVyc2lvbjJzY2hlbWEiLCJ0bXBEaXIiLCJta2RpclN5bmMiLCJnZXRTY2hlbWFEaXIiLCJ0YWciLCJkZXYiLCJ2ZXJib3NlIiwibG9nIiwicmVwb3NpdG9yeURpciIsImpvaW4iLCJ0YWdEaXIiLCJleGlzdHNTeW5jIiwicnVuIiwicmVwb3NpdG9yeSIsInJlbmFtZVN5bmMiLCJnZXRWYWxpZGF0b3IiLCJ2ZXJzaW9uIiwiYWp2IiwiZGlyIiwicmVmZXJlbmNlcyIsInJlZmVyZW5jZSIsInB1c2giLCJmaWxlIiwiYWRkU2NoZW1hIiwiU2NoZW1hIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInMiLCJjb21waWxlIiwiZ2V0VmVyc2lvbiIsInNjaGVtYVZlcnNpb24iLCJ1bmRlZmluZWQiLCJnZXRTY2hlbWFVUkwiLCJyZXBsYWNlIiwidmFsaWRhdGUiLCJmaWxlbmFtZSIsInZhbGlkYXRvciIsInZhbGlkIiwic2NoZW1hVVJMIiwiZXJyb3JzIiwicHJvY2VzcyIsInN0YXR1cyIsImRhdGEiLCJtYWluIiwiZGlyZWN0b3J5U2NoZW1hIiwiZCIsImVuZHNXaXRoIiwidGhlbiIsImV4aXQiLCJjYXRjaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3ZhbGlkYXRlX2pzb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFqdiBmcm9tIFwiYWp2XCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBjb21tYW5kTGluZVVzYWdlIGZyb20gXCJjb21tYW5kLWxpbmUtdXNhZ2VcIlxuaW1wb3J0IHsgbG9hZCwgZ2V0RmlsZXMgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCAqIGFzIGdpdCBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB0ZW1wIGZyb20gXCJ0ZW1wXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtcbiAgdmFsaWREYXRhc2V0LFxuICBnZXREYXRhc2V0cyxcbiAgZ2V0U2NoZW1hcyxcbiAgZGF0YXNldERpcmVjdG9yeVNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3NyYy9kYXRhc2V0c1wiXG5cbi8vIEF1dG9tYXRpY2FsbHkgdHJhY2sgYW5kIGNsZWFudXAgZmlsZXMgYXQgZXhpdFxudGVtcC50cmFjaygpXG5cbmZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSk6IGFueSB7XG4gIGNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJwYXRobmFtZSB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRhdGFzZXRcIixcbiAgICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlVSTCBvciBwYXRoIHRvIHRoZSB0cmljb3RldXNlcy1hc3NlbWJsZWUgZ2l0IHJlcG9zaXRvcnlcIixcbiAgICAgIGRlZmF1bHRWYWx1ZTpcbiAgICAgICAgXCJodHRwczovL2dpdC5lbi1yb290Lm9yZy90cmljb3RldXNlcy90cmljb3RldXNlcy1hc3NlbWJsZWUuZ2l0XCIsXG4gICAgICBuYW1lOiBcInJlcG9zaXRvcnlcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgZGF0YXNldCAocG9zc2libGUgdmFsdWVzIG11c3QgaW5jbHVkZSBleGFjdGx5IG9uZSBvZiAke2dldERhdGFzZXRzKCl9KWAsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgc2NoZW1hIChwb3NzaWJsZSB2YWx1ZXMgYXJlICR7Z2V0U2NoZW1hcygpfSlgLFxuICAgICAgbmFtZTogXCJzY2hlbWFcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcImlnbm9yZSBzY2hlbWFWZXJzaW9uIGZyb20gSlNPTiBmaWxlcyBhbmQgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSAtLXJlcG9zaXRvcnlcIixcbiAgICAgIG5hbWU6IFwiZGV2XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IFwiaW5jcmVhc2UgdmVyYm9zaXR5XCIsXG4gICAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImhlbHBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlByaW50IHRoaXMgdXNhZ2UgZ3VpZGUuXCIsXG4gICAgfSxcbiAgXVxuICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiVmFsaWRhdGUgSlNPTiBmaWxlc1wiLFxuICAgICAgY29udGVudDogXCJWYWxpZGF0ZSBKU09OIGZpbGVzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiT3B0aW9uc1wiLFxuICAgICAgb3B0aW9uTGlzdDogb3B0aW9uc0RlZmluaXRpb25zLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuXG4gIGlmIChvcHRpb25zLmRhdGFzZXQpIHtcbiAgICBpZiAoIXZhbGlkRGF0YXNldChvcHRpb25zLmRhdGFzZXQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAtLWRhdGFzZXQgJHtvcHRpb25zLmRhdGFzZXR9YClcbiAgICAgIG9wdGlvbnMuaGVscCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5zY2hlbWEpIHtcbiAgICBpZiAoIWdldFNjaGVtYXMoKS5pbmNsdWRlcyhvcHRpb25zLnNjaGVtYSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYC0tc2NoZW1hICR7b3B0aW9ucy5zY2hlbWF9YClcbiAgICAgIG9wdGlvbnMuaGVscCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAoXCJoZWxwXCIgaW4gb3B0aW9ucykge1xuICAgIGNvbnN0IHVzYWdlID0gY29tbWFuZExpbmVVc2FnZShzZWN0aW9ucylcbiAgICBjb25zb2xlLndhcm4odXNhZ2UpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5jbGFzcyBWYWxpZGF0ZSB7XG4gIG9wdGlvbnM6IGFueVxuICB2ZXJzaW9uMnNjaGVtYTogYW55XG4gIHRtcERpcjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMudmVyc2lvbjJzY2hlbWEgPSB7fVxuICAgIHRoaXMudG1wRGlyID0gdGVtcC5ta2RpclN5bmMoXCJ2YWxpZGF0aW9uXCIpXG4gIH1cblxuICBnZXRTY2hlbWFEaXIodGFnOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRldiA9PSB0cnVlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIGNvbnNvbGUubG9nKFwiLS1kZXY6IHVzZSBzcmMvc2NoZW1hc1wiKVxuICAgICAgcmV0dXJuIFwic3JjL3NjaGVtYXNcIlxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5RGlyID0gcGF0aC5qb2luKHRoaXMudG1wRGlyLCBcInRyaWNvdGV1c2VzLWFzc2VtYmxlZVwiKVxuICAgIGNvbnN0IHRhZ0RpciA9IHBhdGguam9pbih0aGlzLnRtcERpciwgdGFnKVxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YWdEaXIpKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb3NpdG9yeURpcikpIHtcbiAgICAgICAgZ2l0LnJ1bihcbiAgICAgICAgICB0aGlzLnRtcERpcixcbiAgICAgICAgICBgY2xvbmUgLS1xdWlldCAke3RoaXMub3B0aW9ucy5yZXBvc2l0b3J5fSAke3JlcG9zaXRvcnlEaXJ9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZ2l0LnJ1bihcbiAgICAgICAgcmVwb3NpdG9yeURpcixcbiAgICAgICAgYGNoZWNrb3V0IHRhZ3MvJHt0YWd9IC0tIHNyYy9zY2hlbWFzID4gL2Rldi9udWxsIDI+JjFgLFxuICAgICAgKVxuICAgICAgZnMucmVuYW1lU3luYyhwYXRoLmpvaW4ocmVwb3NpdG9yeURpciwgXCJzcmMvc2NoZW1hc1wiKSwgdGFnRGlyKVxuICAgIH1cbiAgICByZXR1cm4gdGFnRGlyXG4gIH1cblxuICBnZXRWYWxpZGF0b3IodmVyc2lvbjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoISh2ZXJzaW9uIGluIHRoaXMudmVyc2lvbjJzY2hlbWEpKSB7XG4gICAgICBjb25zdCBhanYgPSBuZXcgQWp2KClcbiAgICAgIGNvbnN0IGRpciA9IHRoaXMuZ2V0U2NoZW1hRGlyKGBzY2hlbWEtJHt2ZXJzaW9ufWApXG4gICAgICBsZXQgcmVmZXJlbmNlcyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiBnZXRGaWxlcyhbXG4gICAgICAgIGAke2Rpcn0vJHt0aGlzLm9wdGlvbnMuc2NoZW1hfS8qLmpzb25gLFxuICAgICAgXSkpXG4gICAgICAgIHJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZ2V0RmlsZXMocmVmZXJlbmNlcykpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKSBjb25zb2xlLmxvZyhgcmVmZXJlbmNlOiAke2ZpbGV9YClcbiAgICAgICAgYWp2LmFkZFNjaGVtYShsb2FkKGZpbGUpKVxuICAgICAgfVxuICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5vcHRpb25zLnNjaGVtYVxuICAgICAgY29uc3QgU2NoZW1hID0gc2NoZW1hLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2NoZW1hLnNsaWNlKDEpXG4gICAgICBjb25zdCBzID0gYCR7ZGlyfS8ke3NjaGVtYX0vJHtTY2hlbWF9Lmpzb25gXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIGNvbnNvbGUubG9nKGBzY2hlbWEgJHtzfWApXG4gICAgICB0aGlzLnZlcnNpb24yc2NoZW1hW3ZlcnNpb25dID0gYWp2LmNvbXBpbGUobG9hZChzKSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvbjJzY2hlbWFbdmVyc2lvbl1cbiAgfVxuXG4gIGdldFZlcnNpb24oY29udGVudDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoY29udGVudC5zY2hlbWFWZXJzaW9uICE9IHVuZGVmaW5lZCkgcmV0dXJuIGNvbnRlbnQuc2NoZW1hVmVyc2lvblxuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMuc2NoZW1hfS0xLjBgXG4gIH1cblxuICBnZXRTY2hlbWFVUkwodmVyc2lvbjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRldiA9PSB0cnVlKSByZXR1cm4gXCJzcmMvc2NoZW1hc1wiXG4gICAgZWxzZSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLm9wdGlvbnMucmVwb3NpdG9yeSkpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5yZXBvc2l0b3J5fS9zcmMvc2NoZW1hcyBhdCB0YWcgc2NoZW1hLSR7dmVyc2lvbn1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gdGhpcy5vcHRpb25zLnJlcG9zaXRvcnkucmVwbGFjZSgvXFwuZ2l0JC8sIFwiXCIpXG4gICAgICAgIHJldHVybiBgJHtyZXBvc2l0b3J5fS90cmVlL3NjaGVtYS0ke3ZlcnNpb259L3NyYy9zY2hlbWFzYFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRlbnQ6IGFueSwgZmlsZW5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdGFnID0gdGhpcy5nZXRWZXJzaW9uKGNvbnRlbnQpXG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRWYWxpZGF0b3IodGFnKVxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdG9yKGNvbnRlbnQpXG4gICAgY29uc3Qgc2NoZW1hVVJMID0gdGhpcy5nZXRTY2hlbWFVUkwodGFnKVxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7c2NoZW1hVVJMfSBmaW5kcyAke2ZpbGVuYW1lfSBpcyBpbnZhbGlkYClcbiAgICAgIGNvbnNvbGUuZXJyb3IodmFsaWRhdG9yLmVycm9ycylcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSlcbiAgICAgICAgY29uc29sZS5sb2coYCR7c2NoZW1hVVJMfSBmaW5kcyAke2ZpbGVuYW1lfSBpcyB2YWxpZGApXG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3MoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgc3RhdHVzID0gMFxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBnZXRGaWxlcyhbdGhpcy5vcHRpb25zLmRhdGFdKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGxvYWQoZmlsZSlcbiAgICAgIHN0YXR1cyB8PSB0aGlzLnZhbGlkYXRlKGNvbnRlbnQsIGZpbGUpXG4gICAgfVxuICAgIHJldHVybiBzdGF0dXNcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgaWYgKG9wdGlvbnMgPT09IG51bGwpIHJldHVybiAxXG4gIGxldCBkaXJlY3RvcnlTY2hlbWEgPSBbXVxuICBpZiAob3B0aW9ucy5zY2hlbWEpIHtcbiAgICBkaXJlY3RvcnlTY2hlbWEgPSBbW29wdGlvbnMuZGF0YSwgb3B0aW9ucy5zY2hlbWFdXVxuICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YXNldCkge1xuICAgIGRpcmVjdG9yeVNjaGVtYSA9IGRhdGFzZXREaXJlY3RvcnlTY2hlbWEob3B0aW9ucy5kYXRhc2V0KVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJlaXRoZXIgLS1zY2hlbWEgb3IgLS1kYXRhc2V0IGlzIHJlcXVpcmVkXCIpXG4gICAgcmV0dXJuIDFcbiAgfVxuICBmb3IgKGNvbnN0IGQgb2YgZGlyZWN0b3J5U2NoZW1hKSB7XG4gICAgb3B0aW9ucy5zY2hlbWEgPSBkWzFdXG4gICAgb3B0aW9ucy5kYXRhID0gZFswXVxuICAgIGlmIChvcHRpb25zLnZlcmJvc2UpXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYHdvcmtpbmcgb24gZmlsZXMgJHtvcHRpb25zLmRhdGF9IHdpdGggc2NoZW1hICR7b3B0aW9ucy5zY2hlbWF9YCxcbiAgICAgIClcbiAgICBjb25zdCB2YWxpZGF0ZSA9IG5ldyBWYWxpZGF0ZShvcHRpb25zKVxuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHZhbGlkYXRlLnByb2Nlc3MoKVxuICAgIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIHN0YXR1c1xuICB9XG4gIHJldHVybiAwXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcInZhbGlkYXRlX2pzb24udHNcIikpXG4gIG1haW4ocHJvY2Vzcy5hcmd2KVxuICAgIC50aGVuKChzdGF0dXMpID0+IHtcbiAgICAgIHByb2Nlc3MuZXhpdChzdGF0dXMpXG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSlcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPQSxHQUFQLE1BQWdCLEtBQWhCO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxnQkFBUCxNQUE2QixvQkFBN0I7U0FDU0MsSSxFQUFNQyxRO09BQ1IsS0FBS0MsRztBQUNaLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsVUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFRUMsWSxFQUNBQyxXLEVBQ0FDLFUsRUFDQUMsc0IsaUNBR0Y7O0FBQ0FOLElBQUksQ0FBQ08sS0FBTDs7QUFFQSxTQUFTQyxTQUFULENBQW1CQyxJQUFuQixFQUF3QztFQUN0QyxNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxXQUFXLEVBQUUsa0RBRGY7SUFFRUMsYUFBYSxFQUFFLElBRmpCO0lBR0VDLElBQUksRUFBRSxNQUhSO0lBSUVDLElBQUksRUFBRUM7RUFKUixDQUR5QixFQU96QjtJQUNFSixXQUFXLEVBQUUseURBRGY7SUFFRUssWUFBWSxFQUNWLCtEQUhKO0lBSUVILElBQUksRUFBRSxZQUpSO0lBS0VD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
466
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZW1wIiwidHJhY2siLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiZGVzY3JpcHRpb24iLCJkZWZhdWx0T3B0aW9uIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJkZWZhdWx0VmFsdWUiLCJnZXREYXRhc2V0cyIsImdldFNjaGVtYXMiLCJCb29sZWFuIiwic2VjdGlvbnMiLCJoZWFkZXIiLCJjb250ZW50Iiwib3B0aW9uTGlzdCIsIm9wdGlvbnMiLCJjb21tYW5kTGluZUFyZ3MiLCJkYXRhc2V0IiwidmFsaWREYXRhc2V0IiwiY29uc29sZSIsImVycm9yIiwiaGVscCIsInNjaGVtYSIsImluY2x1ZGVzIiwidXNhZ2UiLCJjb21tYW5kTGluZVVzYWdlIiwid2FybiIsIlZhbGlkYXRlIiwidmVyc2lvbjJzY2hlbWEiLCJ0bXBEaXIiLCJta2RpclN5bmMiLCJ0YWciLCJkZXYiLCJ2ZXJib3NlIiwibG9nIiwicmVwb3NpdG9yeURpciIsInBhdGgiLCJqb2luIiwidGFnRGlyIiwiZnMiLCJleGlzdHNTeW5jIiwiZ2l0IiwicnVuIiwicmVwb3NpdG9yeSIsInJlbmFtZVN5bmMiLCJ2ZXJzaW9uIiwiYWp2IiwiQWp2IiwiZGlyIiwiZ2V0U2NoZW1hRGlyIiwicmVmZXJlbmNlcyIsImdldEZpbGVzIiwicmVmZXJlbmNlIiwicHVzaCIsImZpbGUiLCJhZGRTY2hlbWEiLCJsb2FkIiwiU2NoZW1hIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInMiLCJjb21waWxlIiwic2NoZW1hVmVyc2lvbiIsInVuZGVmaW5lZCIsInJlcGxhY2UiLCJmaWxlbmFtZSIsImdldFZlcnNpb24iLCJ2YWxpZGF0b3IiLCJnZXRWYWxpZGF0b3IiLCJ2YWxpZCIsInNjaGVtYVVSTCIsImdldFNjaGVtYVVSTCIsImVycm9ycyIsInN0YXR1cyIsImRhdGEiLCJ2YWxpZGF0ZSIsIm1haW4iLCJkaXJlY3RvcnlTY2hlbWEiLCJkYXRhc2V0RGlyZWN0b3J5U2NoZW1hIiwiZCIsInByb2Nlc3MiLCJlbmRzV2l0aCIsInRoZW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvdmFsaWRhdGVfanNvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWp2IGZyb20gXCJhanZcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lVXNhZ2UgZnJvbSBcImNvbW1hbmQtbGluZS11c2FnZVwiXG5pbXBvcnQgeyBsb2FkLCBnZXRGaWxlcyB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHRlbXAgZnJvbSBcInRlbXBcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQge1xuICB2YWxpZERhdGFzZXQsXG4gIGdldERhdGFzZXRzLFxuICBnZXRTY2hlbWFzLFxuICBkYXRhc2V0RGlyZWN0b3J5U2NoZW1hLFxufSBmcm9tIFwiLi4vLi4vc3JjL2RhdGFzZXRzXCJcblxuLy8gQXV0b21hdGljYWxseSB0cmFjayBhbmQgY2xlYW51cCBmaWxlcyBhdCBleGl0XG50ZW1wLnRyYWNrKClcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcInBhdGhuYW1lIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZGF0YXNldFwiLFxuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IFwiVVJMIG9yIHBhdGggdG8gdGhlIHRyaWNvdGV1c2VzLWFzc2VtYmxlZSBnaXQgcmVwb3NpdG9yeVwiLFxuICAgICAgZGVmYXVsdFZhbHVlOlxuICAgICAgICBcImh0dHBzOi8vZ2l0LmVuLXJvb3Qub3JnL3RyaWNvdGV1c2VzL3RyaWNvdGV1c2VzLWFzc2VtYmxlZS5naXRcIixcbiAgICAgIG5hbWU6IFwicmVwb3NpdG9yeVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IGBkYXRhc2V0IChwb3NzaWJsZSB2YWx1ZXMgbXVzdCBpbmNsdWRlIGV4YWN0bHkgb25lIG9mICR7Z2V0RGF0YXNldHMoKX0pYCxcbiAgICAgIG5hbWU6IFwiZGF0YXNldFwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IGBzY2hlbWEgKHBvc3NpYmxlIHZhbHVlcyBhcmUgJHtnZXRTY2hlbWFzKCl9KWAsXG4gICAgICBuYW1lOiBcInNjaGVtYVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiaWdub3JlIHNjaGVtYVZlcnNpb24gZnJvbSBKU09OIGZpbGVzIGFuZCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGhlIC0tcmVwb3NpdG9yeVwiLFxuICAgICAgbmFtZTogXCJkZXZcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJpbmNyZWFzZSB2ZXJib3NpdHlcIixcbiAgICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaGVscFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUHJpbnQgdGhpcyB1c2FnZSBndWlkZS5cIixcbiAgICB9LFxuICBdXG4gIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgIHtcbiAgICAgIGhlYWRlcjogXCJWYWxpZGF0ZSBKU09OIGZpbGVzXCIsXG4gICAgICBjb250ZW50OiBcIlZhbGlkYXRlIEpTT04gZmlsZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlYWRlcjogXCJPcHRpb25zXCIsXG4gICAgICBvcHRpb25MaXN0OiBvcHRpb25zRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG5cbiAgaWYgKG9wdGlvbnMuZGF0YXNldCkge1xuICAgIGlmICghdmFsaWREYXRhc2V0KG9wdGlvbnMuZGF0YXNldCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYC0tZGF0YXNldCAke29wdGlvbnMuZGF0YXNldH1gKVxuICAgICAgb3B0aW9ucy5oZWxwID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnNjaGVtYSkge1xuICAgIGlmICghZ2V0U2NoZW1hcygpLmluY2x1ZGVzKG9wdGlvbnMuc2NoZW1hKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgLS1zY2hlbWEgJHtvcHRpb25zLnNjaGVtYX1gKVxuICAgICAgb3B0aW9ucy5oZWxwID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlmIChcImhlbHBcIiBpbiBvcHRpb25zKSB7XG4gICAgY29uc3QgdXNhZ2UgPSBjb21tYW5kTGluZVVzYWdlKHNlY3Rpb25zKVxuICAgIGNvbnNvbGUud2Fybih1c2FnZSlcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbmNsYXNzIFZhbGlkYXRlIHtcbiAgb3B0aW9uczogYW55XG4gIHZlcnNpb24yc2NoZW1hOiBhbnlcbiAgdG1wRGlyOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy52ZXJzaW9uMnNjaGVtYSA9IHt9XG4gICAgdGhpcy50bXBEaXIgPSB0ZW1wLm1rZGlyU3luYyhcInZhbGlkYXRpb25cIilcbiAgfVxuXG4gIGdldFNjaGVtYURpcih0YWc6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGV2ID09IHRydWUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkgY29uc29sZS5sb2coXCItLWRldjogdXNlIHNyYy9zY2hlbWFzXCIpXG4gICAgICByZXR1cm4gXCJzcmMvc2NoZW1hc1wiXG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnlEaXIgPSBwYXRoLmpvaW4odGhpcy50bXBEaXIsIFwidHJpY290ZXVzZXMtYXNzZW1ibGVlXCIpXG4gICAgY29uc3QgdGFnRGlyID0gcGF0aC5qb2luKHRoaXMudG1wRGlyLCB0YWcpXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhZ0RpcikpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZXBvc2l0b3J5RGlyKSkge1xuICAgICAgICBnaXQucnVuKFxuICAgICAgICAgIHRoaXMudG1wRGlyLFxuICAgICAgICAgIGBjbG9uZSAtLXF1aWV0ICR7dGhpcy5vcHRpb25zLnJlcG9zaXRvcnl9ICR7cmVwb3NpdG9yeURpcn1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBnaXQucnVuKFxuICAgICAgICByZXBvc2l0b3J5RGlyLFxuICAgICAgICBgY2hlY2tvdXQgdGFncy8ke3RhZ30gLS0gc3JjL3NjaGVtYXMgPiAvZGV2L251bGwgMj4mMWAsXG4gICAgICApXG4gICAgICBmcy5yZW5hbWVTeW5jKHBhdGguam9pbihyZXBvc2l0b3J5RGlyLCBcInNyYy9zY2hlbWFzXCIpLCB0YWdEaXIpXG4gICAgfVxuICAgIHJldHVybiB0YWdEaXJcbiAgfVxuXG4gIGdldFZhbGlkYXRvcih2ZXJzaW9uOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghKHZlcnNpb24gaW4gdGhpcy52ZXJzaW9uMnNjaGVtYSkpIHtcbiAgICAgIGNvbnN0IGFqdiA9IG5ldyBBanYoKVxuICAgICAgY29uc3QgZGlyID0gdGhpcy5nZXRTY2hlbWFEaXIoYHNjaGVtYS0ke3ZlcnNpb259YClcbiAgICAgIGxldCByZWZlcmVuY2VzID0gW11cbiAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldEZpbGVzKFtcbiAgICAgICAgYCR7ZGlyfS8ke3RoaXMub3B0aW9ucy5zY2hlbWF9LyouanNvbmAsXG4gICAgICBdKSlcbiAgICAgICAgcmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSlcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBnZXRGaWxlcyhyZWZlcmVuY2VzKSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIGNvbnNvbGUubG9nKGByZWZlcmVuY2U6ICR7ZmlsZX1gKVxuICAgICAgICBhanYuYWRkU2NoZW1hKGxvYWQoZmlsZSkpXG4gICAgICB9XG4gICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLm9wdGlvbnMuc2NoZW1hXG4gICAgICBjb25zdCBTY2hlbWEgPSBzY2hlbWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzY2hlbWEuc2xpY2UoMSlcbiAgICAgIGNvbnN0IHMgPSBgJHtkaXJ9LyR7c2NoZW1hfS8ke1NjaGVtYX0uanNvbmBcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkgY29uc29sZS5sb2coYHNjaGVtYSAke3N9YClcbiAgICAgIHRoaXMudmVyc2lvbjJzY2hlbWFbdmVyc2lvbl0gPSBhanYuY29tcGlsZShsb2FkKHMpKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uMnNjaGVtYVt2ZXJzaW9uXVxuICB9XG5cbiAgZ2V0VmVyc2lvbihjb250ZW50OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChjb250ZW50LnNjaGVtYVZlcnNpb24gIT0gdW5kZWZpbmVkKSByZXR1cm4gY29udGVudC5zY2hlbWFWZXJzaW9uXG4gICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5zY2hlbWF9LTEuMGBcbiAgfVxuXG4gIGdldFNjaGVtYVVSTCh2ZXJzaW9uOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGV2ID09IHRydWUpIHJldHVybiBcInNyYy9zY2hlbWFzXCJcbiAgICBlbHNlIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMub3B0aW9ucy5yZXBvc2l0b3J5KSkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLnJlcG9zaXRvcnl9L3NyYy9zY2hlbWFzIGF0IHRhZyBzY2hlbWEtJHt2ZXJzaW9ufWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSB0aGlzLm9wdGlvbnMucmVwb3NpdG9yeS5yZXBsYWNlKC9cXC5naXQkLywgXCJcIilcbiAgICAgICAgcmV0dXJuIGAke3JlcG9zaXRvcnl9L3RyZWUvc2NoZW1hLSR7dmVyc2lvbn0vc3JjL3NjaGVtYXNgXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoY29udGVudDogYW55LCBmaWxlbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YWcgPSB0aGlzLmdldFZlcnNpb24oY29udGVudClcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLmdldFZhbGlkYXRvcih0YWcpXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0b3IoY29udGVudClcbiAgICBjb25zdCBzY2hlbWFVUkwgPSB0aGlzLmdldFNjaGVtYVVSTCh0YWcpXG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtzY2hlbWFVUkx9IGZpbmRzICR7ZmlsZW5hbWV9IGlzIGludmFsaWRgKVxuICAgICAgY29uc29sZS5lcnJvcih2YWxpZGF0b3IuZXJyb3JzKVxuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKVxuICAgICAgICBjb25zb2xlLmxvZyhgJHtzY2hlbWFVUkx9IGZpbmRzICR7ZmlsZW5hbWV9IGlzIHZhbGlkYClcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHJvY2VzcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCBzdGF0dXMgPSAwXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGdldEZpbGVzKFt0aGlzLm9wdGlvbnMuZGF0YV0pKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gbG9hZChmaWxlKVxuICAgICAgc3RhdHVzIHw9IHRoaXMudmFsaWRhdGUoY29udGVudCwgZmlsZSlcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICBpZiAob3B0aW9ucyA9PT0gbnVsbCkgcmV0dXJuIDFcbiAgbGV0IGRpcmVjdG9yeVNjaGVtYSA9IFtdXG4gIGlmIChvcHRpb25zLnNjaGVtYSkge1xuICAgIGRpcmVjdG9yeVNjaGVtYSA9IFtbb3B0aW9ucy5kYXRhLCBvcHRpb25zLnNjaGVtYV1dXG4gIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgZGlyZWN0b3J5U2NoZW1hID0gZGF0YXNldERpcmVjdG9yeVNjaGVtYShvcHRpb25zLmRhdGFzZXQpXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcImVpdGhlciAtLXNjaGVtYSBvciAtLWRhdGFzZXQgaXMgcmVxdWlyZWRcIilcbiAgICByZXR1cm4gMVxuICB9XG4gIGZvciAoY29uc3QgZCBvZiBkaXJlY3RvcnlTY2hlbWEpIHtcbiAgICBvcHRpb25zLnNjaGVtYSA9IGRbMV1cbiAgICBvcHRpb25zLmRhdGEgPSBkWzBdXG4gICAgaWYgKG9wdGlvbnMudmVyYm9zZSlcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgd29ya2luZyBvbiBmaWxlcyAke29wdGlvbnMuZGF0YX0gd2l0aCBzY2hlbWEgJHtvcHRpb25zLnNjaGVtYX1gLFxuICAgICAgKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gbmV3IFZhbGlkYXRlKG9wdGlvbnMpXG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdmFsaWRhdGUucHJvY2VzcygpXG4gICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gc3RhdHVzXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwidmFsaWRhdGVfanNvbi50c1wiKSlcbiAgbWFpbihwcm9jZXNzLmFyZ3YpXG4gICAgLnRoZW4oKHN0YXR1cykgPT4ge1xuICAgICAgcHJvY2Vzcy5leGl0KHN0YXR1cylcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9KVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OzsrQ0FQQSxvSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBQSxnQkFBQSxDQUFLQyxLQUFMOztBQUVBLFNBQVNDLFNBQVQsQ0FBbUJDLElBQW5CLEVBQXdDO0VBQ3RDLElBQU1DLGtCQUFrQixHQUFHLENBQ3pCO0lBQ0VDLFdBQVcsRUFBRSxrREFEZjtJQUVFQyxhQUFhLEVBQUUsSUFGakI7SUFHRUMsSUFBSSxFQUFFLE1BSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBRHlCLEVBT3pCO0lBQ0VKLFdBQVcsRUFBRSx5REFEZjtJQUVFSyxZQUFZLEVBQ1YsK0RBSEo7SUFJRUgsSUFBSSxFQUFFLFlBSlI7SUFLRUMsSUFBSSxFQUFFQztFQUxSLENBUHlCLEVBY3pCO0lBQ0VKLFdBQVcsaUVBQTBELElBQUFNLHFCQUFBLEdBQTFELE1BRGI7SUFFRUosSUFBSSxFQUFFLFNBRlI7SUFHRUMsSUFB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