@tricoteuses/assemblee 1.0.7 → 1.1.1

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 (134) hide show
  1. package/lib/api.js +3 -9
  2. package/lib/api.mjs +4 -5
  3. package/lib/bugs/acteur-00010/plugin.test.js +3 -50
  4. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  5. package/lib/bugs/acteur-00010.js +2 -57
  6. package/lib/bugs/acteur-00010.mjs +1 -6
  7. package/lib/bugs/agenda-00002/plugin.test.js +3 -53
  8. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -3
  9. package/lib/bugs/agenda-00002.js +3 -148
  10. package/lib/bugs/agenda-00002.mjs +1 -28
  11. package/lib/bugs/agenda-00008/plugin.test.js +3 -52
  12. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  13. package/lib/bugs/agenda-00008.js +2 -61
  14. package/lib/bugs/agenda-00008.mjs +1 -5
  15. package/lib/bugs/agenda-00011/plugin.test.js +5 -99
  16. package/lib/bugs/agenda-00011/plugin.test.mjs +3 -3
  17. package/lib/bugs/agenda-00011.js +4 -105
  18. package/lib/bugs/agenda-00011.mjs +3 -29
  19. package/lib/bugs.js +3 -164
  20. package/lib/bugs.mjs +1 -26
  21. package/lib/cleaners/actes_legislatifs.js +11 -115
  22. package/lib/cleaners/actes_legislatifs.mjs +7 -82
  23. package/lib/cleaners/acteurs.js +12 -92
  24. package/lib/cleaners/acteurs.mjs +7 -38
  25. package/lib/cleaners/amendements.js +10 -103
  26. package/lib/cleaners/amendements.mjs +4 -58
  27. package/lib/cleaners/documents.js +5 -67
  28. package/lib/cleaners/documents.mjs +1 -37
  29. package/lib/cleaners/dossiers_legislatifs.js +5 -61
  30. package/lib/cleaners/dossiers_legislatifs.mjs +1 -29
  31. package/lib/cleaners/index.js +1 -9
  32. package/lib/cleaners/index.mjs +1 -1
  33. package/lib/cleaners/organes.js +1 -33
  34. package/lib/cleaners/organes.mjs +1 -17
  35. package/lib/cleaners/reunions.js +4 -119
  36. package/lib/cleaners/reunions.mjs +1 -64
  37. package/lib/cleaners/scrutins.js +10 -102
  38. package/lib/cleaners/scrutins.mjs +1 -48
  39. package/lib/cleaners/xml.js +8 -42
  40. package/lib/cleaners/xml.mjs +6 -8
  41. package/lib/datasets.js +14 -113
  42. package/lib/datasets.mjs +6 -46
  43. package/lib/dates.js +7 -37
  44. package/lib/dates.mjs +9 -14
  45. package/lib/dossiers_legislatifs.js +6 -68
  46. package/lib/dossiers_legislatifs.mjs +5 -36
  47. package/lib/file_systems.js +56 -139
  48. package/lib/file_systems.mjs +1 -9
  49. package/lib/git.js +4 -53
  50. package/lib/git.mjs +1 -12
  51. package/lib/index.js +1 -15
  52. package/lib/index.mjs +1 -1
  53. package/lib/inserters.js +23 -146
  54. package/lib/inserters.mjs +6 -87
  55. package/lib/loaders.js +44 -316
  56. package/lib/loaders.mjs +12 -135
  57. package/lib/organes.js +1 -7
  58. package/lib/organes.mjs +1 -4
  59. package/lib/parsers/documents.js +22 -151
  60. package/lib/parsers/documents.mjs +19 -81
  61. package/lib/parsers/index.js +1 -4
  62. package/lib/parsers/index.mjs +1 -1
  63. package/lib/parsers/recherche_amendements.js +302 -527
  64. package/lib/parsers/recherche_amendements.mjs +8 -31
  65. package/lib/raw_types/acteurs_et_organes.d.ts +1 -30
  66. package/lib/raw_types/acteurs_et_organes.js +5 -124
  67. package/lib/raw_types/acteurs_et_organes.mjs +5 -105
  68. package/lib/raw_types/agendas.js +6 -89
  69. package/lib/raw_types/agendas.mjs +9 -65
  70. package/lib/raw_types/amendements.d.ts +2 -0
  71. package/lib/raw_types/amendements.js +10 -90
  72. package/lib/raw_types/amendements.mjs +11 -69
  73. package/lib/raw_types/dossiers_legislatifs.js +6 -96
  74. package/lib/raw_types/dossiers_legislatifs.mjs +6 -73
  75. package/lib/raw_types/scrutins.js +6 -81
  76. package/lib/raw_types/scrutins.mjs +9 -57
  77. package/lib/scripts/bugs_helper.js +2 -181
  78. package/lib/scripts/bugs_helper.mjs +2 -39
  79. package/lib/scripts/clean_data.js +27 -143
  80. package/lib/scripts/clean_data.mjs +15 -34
  81. package/lib/scripts/clean_reorganized_data.js +76 -240
  82. package/lib/scripts/clean_reorganized_data.mjs +36 -99
  83. package/lib/scripts/diff_amendements.js +19 -79
  84. package/lib/scripts/diff_amendements.mjs +17 -35
  85. package/lib/scripts/document_dossiers_legislatifs.js +17 -142
  86. package/lib/scripts/document_dossiers_legislatifs.mjs +6 -90
  87. package/lib/scripts/get_today_reunions.js +4 -22
  88. package/lib/scripts/get_today_reunions.mjs +1 -7
  89. package/lib/scripts/merge_scrutins.js +3 -47
  90. package/lib/scripts/merge_scrutins.mjs +1 -9
  91. package/lib/scripts/parse_textes_lois.js +15 -44
  92. package/lib/scripts/parse_textes_lois.mjs +18 -19
  93. package/lib/scripts/raw_types_from_amendements.js +3 -95
  94. package/lib/scripts/raw_types_from_amendements.mjs +1 -16
  95. package/lib/scripts/reorganize_data.js +74 -294
  96. package/lib/scripts/reorganize_data.mjs +22 -133
  97. package/lib/scripts/retrieve_deputes_photos.js +6 -119
  98. package/lib/scripts/retrieve_deputes_photos.mjs +7 -33
  99. package/lib/scripts/retrieve_documents.js +4 -192
  100. package/lib/scripts/retrieve_documents.mjs +2 -50
  101. package/lib/scripts/retrieve_open_data.js +44 -116
  102. package/lib/scripts/retrieve_open_data.mjs +14 -19
  103. package/lib/scripts/retrieve_pending_amendments.js +4 -98
  104. package/lib/scripts/retrieve_pending_amendments.mjs +1 -14
  105. package/lib/scripts/retrieve_senateurs_photos.js +18 -114
  106. package/lib/scripts/retrieve_senateurs_photos.mjs +20 -48
  107. package/lib/scripts/retrieve_textes_lois.js +3 -122
  108. package/lib/scripts/retrieve_textes_lois.mjs +3 -21
  109. package/lib/scripts/test_load.js +2 -10
  110. package/lib/scripts/test_load.mjs +2 -1
  111. package/lib/scripts/test_load_big_files.js +2 -10
  112. package/lib/scripts/test_load_big_files.mjs +2 -1
  113. package/lib/scripts/validate_json.js +4 -119
  114. package/lib/scripts/validate_json.mjs +2 -36
  115. package/lib/shared_types/codes_actes.js +1 -24
  116. package/lib/shared_types/codes_actes.mjs +3 -10
  117. package/lib/strings.js +1 -5
  118. package/lib/strings.mjs +1 -1
  119. package/lib/types/acteurs_et_organes.js +9 -84
  120. package/lib/types/acteurs_et_organes.mjs +10 -63
  121. package/lib/types/agendas.js +8 -90
  122. package/lib/types/agendas.mjs +11 -66
  123. package/lib/types/amendements.d.ts +2 -0
  124. package/lib/types/amendements.js +12 -92
  125. package/lib/types/amendements.mjs +15 -70
  126. package/lib/types/dossiers_legislatifs.js +8 -96
  127. package/lib/types/dossiers_legislatifs.mjs +10 -72
  128. package/lib/types/legislatures.js +1 -3
  129. package/lib/types/legislatures.mjs +1 -2
  130. package/lib/types/scrutins.js +8 -82
  131. package/lib/types/scrutins.mjs +11 -58
  132. package/lib/urls.js +3 -27
  133. package/lib/urls.mjs +3 -21
  134. package/package.json +1 -1
@@ -1,65 +1,35 @@
1
1
  "use strict";
2
2
 
3
3
  require("core-js/modules/es.array.slice.js");
4
-
5
4
  require("core-js/modules/es.function.name.js");
6
-
7
5
  require("core-js/modules/es.array.from.js");
8
-
9
6
  require("core-js/modules/es.string.iterator.js");
10
-
11
7
  require("core-js/modules/es.symbol.js");
12
-
13
8
  require("core-js/modules/es.symbol.description.js");
14
-
15
9
  require("core-js/modules/es.symbol.iterator.js");
16
-
17
10
  require("core-js/modules/es.array.iterator.js");
18
-
19
11
  require("core-js/modules/web.dom-collections.iterator.js");
20
-
21
12
  require("core-js/modules/es.array.is-array.js");
22
-
23
13
  require("core-js/modules/es.array.join.js");
24
-
25
14
  require("core-js/modules/es.object.keys.js");
26
-
27
15
  require("core-js/modules/es.array.for-each.js");
28
-
29
16
  require("core-js/modules/es.object.to-string.js");
30
-
31
17
  require("core-js/modules/es.regexp.exec.js");
32
-
33
18
  require("core-js/modules/es.string.replace.js");
34
-
35
19
  var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
36
-
37
20
  var _fsExtra = _interopRequireDefault(require("fs-extra"));
38
-
39
21
  var _path = _interopRequireDefault(require("path"));
40
-
41
22
  var _deepObjectDiff = require("deep-object-diff");
42
-
43
23
  var _datasets = require("../datasets");
44
-
45
24
  var _file_systems = require("../file_systems");
46
-
47
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
48
-
49
26
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
50
-
51
27
  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."); }
52
-
53
28
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
54
-
55
29
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
56
-
57
30
  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; } } }; }
58
-
59
31
  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); }
60
-
61
32
  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; }
62
-
63
33
  var diffedAmendments = [];
64
34
  var newAmendments = [];
65
35
  var optionsDefinitions = [{
@@ -96,70 +66,59 @@ var optionsDefinitions = [{
96
66
  type: String
97
67
  }];
98
68
  var options = (0, _commandLineArgs["default"])(optionsDefinitions);
99
-
100
69
  function diffAmendements(dataDir) {
101
70
  if (!options.previous) {
102
71
  console.error("No previous data folder specified. You must provide one with the -p or --previous option. Exiting...");
103
72
  process.exit();
104
73
  }
105
-
106
74
  if (!_fsExtra["default"].existsSync(options.output)) {
107
75
  console.error("The output dir does not exists. You must provide an existing directory. Default directory is ./diff_outputs/");
108
76
  process.exit();
109
77
  }
110
-
111
78
  var _iterator = _createForOfIteratorHelper(_datasets.datasets.amendements),
112
- _step;
113
-
79
+ _step;
114
80
  try {
115
81
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
116
82
  var dataset = _step.value;
117
-
118
83
  switch (dataset.structure) {
119
84
  case _datasets.DatasetStructure.SegmentedFiles:
120
85
  {
121
86
  var originalJsonDir = _path["default"].join(dataDir, dataset.filename);
122
-
123
87
  if (!options.silent) {
124
88
  console.log("Diffing ".concat(originalJsonDir, " folder..."));
125
89
  }
126
-
127
90
  var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDir)),
128
- _step2;
129
-
91
+ _step2;
130
92
  try {
131
93
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
132
94
  var amendementSplitPath = _step2.value;
133
95
  var newFilePath = originalJsonDir + "/" + amendementSplitPath.join("/");
134
96
  var newFile = JSON.parse(_fsExtra["default"].readFileSync(newFilePath).toLocaleString());
135
97
  var oldFilePath = options.previous + dataset.filename + "/" + amendementSplitPath.join("/");
136
-
137
98
  var oldFileExists = _fsExtra["default"].existsSync(oldFilePath);
138
-
139
99
  if (!oldFileExists) {
140
100
  // If file found does not exist in the previous dump
141
101
  if (!options.silent) {
142
102
  console.log("File did not exists previously. Guessing it's a new amendment. Adding to the diff list for new objects");
143
103
  }
144
-
145
104
  addToQueueForNewAmendments(newFile, amendementSplitPath);
146
105
  continue;
147
- } // File already existed in previous dump
148
-
106
+ }
149
107
 
108
+ // File already existed in previous dump
150
109
  var oldFile = JSON.parse("{}");
151
-
152
110
  try {
153
111
  // Gather data of the file and retranscript as a Json object
154
112
  oldFile = JSON.parse(_fsExtra["default"].readFileSync(oldFilePath).toLocaleString());
155
113
  } catch (e) {
156
114
  // Skip the process to the next iteration in case of corrupt JSON data
157
115
  continue;
158
- } // Generate the diff beetween the two JSON objects (old & new dump)
159
-
116
+ }
160
117
 
161
- var diff = (0, _deepObjectDiff.detailedDiff)(oldFile, newFile); // If no changes beetween the two dumps
118
+ // Generate the diff beetween the two JSON objects (old & new dump)
119
+ var diff = (0, _deepObjectDiff.detailedDiff)(oldFile, newFile);
162
120
 
121
+ // If no changes beetween the two dumps
163
122
  if (Object.keys(diff.added).length === 0 && Object.keys(diff.updated).length === 0 && Object.keys(diff.deleted).length === 0) {
164
123
  // Skip to next iteration as there is no need to generate a file
165
124
  continue;
@@ -167,10 +126,8 @@ function diffAmendements(dataDir) {
167
126
  if (!options.silent) {
168
127
  console.log("Changes found !");
169
128
  }
170
-
171
129
  addToQueueForDiffedAmendments(diff, amendementSplitPath);
172
130
  }
173
-
174
131
  break;
175
132
  }
176
133
  } catch (err) {
@@ -180,11 +137,9 @@ function diffAmendements(dataDir) {
180
137
  }
181
138
  }
182
139
  }
183
-
184
140
  if (!options.silent) {
185
141
  console.log("Generating output(s)");
186
142
  }
187
-
188
143
  generateDiffFiles();
189
144
  }
190
145
  } catch (err) {
@@ -193,6 +148,7 @@ function diffAmendements(dataDir) {
193
148
  _iterator.f();
194
149
  }
195
150
  }
151
+
196
152
  /**
197
153
  * General process for output of diffs.
198
154
  * The script handles two different modes :
@@ -201,20 +157,16 @@ function diffAmendements(dataDir) {
201
157
  * - splitted : Will output a single file for each amendments, either its new or updated.
202
158
  *
203
159
  */
204
-
205
-
206
160
  function generateDiffFiles() {
207
161
  // Handles merged mode
208
162
  if (options.mode === "merged") {
209
163
  if (!options.silent) {
210
164
  console.log("Generating merged files");
211
165
  }
212
-
213
166
  if (diffedAmendments.length > 0) {
214
167
  if (!options.silent) {
215
168
  console.log("Generating diffed amendments files");
216
169
  }
217
-
218
170
  _fsExtra["default"].writeFileSync(options.output + "amendements_XV_diffed.json", JSON.stringify(diffedAmendments), {
219
171
  encoding: "utf8",
220
172
  flag: "w"
@@ -224,12 +176,10 @@ function generateDiffFiles() {
224
176
  console.log("No diff in the already existing amendments");
225
177
  }
226
178
  }
227
-
228
179
  if (newAmendments.length > 0) {
229
180
  if (!options.silent) {
230
181
  console.log("Generating new amendments file");
231
182
  }
232
-
233
183
  _fsExtra["default"].writeFileSync(options.output + "amendements_XV_new.json", JSON.stringify(newAmendments), {
234
184
  encoding: "utf8",
235
185
  flag: "w"
@@ -244,11 +194,11 @@ function generateDiffFiles() {
244
194
  if (!options.silent) {
245
195
  console.log("Generating separated files");
246
196
  }
197
+
247
198
  /**
248
199
  * Process the copy action of the new and diffed amendments
249
200
  */
250
201
 
251
-
252
202
  diffedAmendments.forEach(function (diffedAmendment) {
253
203
  generateSingleDiffedAmendment(diffedAmendment);
254
204
  });
@@ -259,62 +209,52 @@ function generateDiffFiles() {
259
209
  console.error("Unknown output mode. Aborting...");
260
210
  process.exit();
261
211
  }
262
- } // Pushes an amendment to the queue that will be processed to copy new amendments files
263
-
212
+ }
264
213
 
214
+ // Pushes an amendment to the queue that will be processed to copy new amendments files
265
215
  function addToQueueForNewAmendments(file, path) {
266
216
  var amendment = {
267
217
  path: path,
268
218
  data: file
269
219
  };
270
220
  newAmendments.push(amendment);
271
- } // Pushes an amendment to the queue that will be processed to copy updated amendments files
272
-
273
-
221
+ }
222
+ // Pushes an amendment to the queue that will be processed to copy updated amendments files
274
223
  function addToQueueForDiffedAmendments(diffedData, path) {
275
224
  var amendment = {
276
225
  path: path,
277
226
  data: diffedData
278
227
  };
279
228
  diffedAmendments.push(amendment);
280
- } // generates a file with a copy of the new amendement
281
-
229
+ }
282
230
 
231
+ // generates a file with a copy of the new amendement
283
232
  function generateSingleNewAmendment(newAmendment) {
284
233
  newAmendment.path.shift();
285
-
286
234
  var shortDir = _toConsumableArray(newAmendment.path);
287
-
288
235
  shortDir.pop();
289
236
  console.log(options.output + shortDir.join("/"));
290
-
291
237
  _fsExtra["default"].mkdirSync(options.output + shortDir.join("/"), {
292
238
  recursive: true
293
239
  });
294
-
295
240
  _fsExtra["default"].writeFileSync(options.output + newAmendment.path.join("/").replace(/(\.json)/, ".new$1"), JSON.stringify(newAmendment.data), {
296
241
  encoding: "utf8",
297
242
  flag: "w"
298
243
  });
299
- } // generates a file with a copy of the modified data of the previously existing amendment;
300
-
244
+ }
301
245
 
246
+ // generates a file with a copy of the modified data of the previously existing amendment;
302
247
  function generateSingleDiffedAmendment(diffedAmendment) {
303
248
  diffedAmendment.path.shift();
304
-
305
249
  var shortDir = _toConsumableArray(diffedAmendment.path);
306
-
307
250
  shortDir.pop();
308
-
309
251
  _fsExtra["default"].mkdirSync(options.output + shortDir.join("/"), {
310
252
  recursive: true
311
253
  });
312
-
313
254
  _fsExtra["default"].writeFileSync(options.output + diffedAmendment.path.join("/").replace(/(\.json)/, ".diff$1"), JSON.stringify(diffedAmendment.data), {
314
255
  encoding: "utf8",
315
256
  flag: "w"
316
257
  });
317
258
  }
318
-
319
259
  diffAmendements(options.dataDir);
320
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWZmZWRBbWVuZG1lbnRzIiwibmV3QW1lbmRtZW50cyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIlN0cmluZyIsImRlZmF1bHRPcHRpb24iLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiZGlmZkFtZW5kZW1lbnRzIiwiZGF0YURpciIsInByZXZpb3VzIiwiY29uc29sZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJmcyIsImV4aXN0c1N5bmMiLCJvdXRwdXQiLCJkYXRhc2V0cyIsImFtZW5kZW1lbnRzIiwiZGF0YXNldCIsInN0cnVjdHVyZSIsIkRhdGFzZXRTdHJ1Y3R1cmUiLCJTZWdtZW50ZWRGaWxlcyIsIm9yaWdpbmFsSnNvbkRpciIsInBhdGgiLCJqb2luIiwiZmlsZW5hbWUiLCJzaWxlbnQiLCJsb2ciLCJ3YWxrRGlyIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsIm5ld0ZpbGVQYXRoIiwibmV3RmlsZSIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsInRvTG9jYWxlU3RyaW5nIiwib2xkRmlsZVBhdGgiLCJvbGRGaWxlRXhpc3RzIiwiYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMiLCJvbGRGaWxlIiwiZSIsImRpZmYiLCJkZXRhaWxlZERpZmYiLCJPYmplY3QiLCJrZXlzIiwiYWRkZWQiLCJsZW5ndGgiLCJ1cGRhdGVkIiwiZGVsZXRlZCIsImFkZFRvUXVldWVGb3JEaWZmZWRBbWVuZG1lbnRzIiwiZ2VuZXJhdGVEaWZmRmlsZXMiLCJtb2RlIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImVuY29kaW5nIiwiZmxhZyIsImZvckVhY2giLCJkaWZmZWRBbWVuZG1lbnQiLCJnZW5lcmF0ZVNpbmdsZURpZmZlZEFtZW5kbWVudCIsIm5ld0FtZW5kbWVudCIsImdlbmVyYXRlU2luZ2xlTmV3QW1lbmRtZW50IiwiZmlsZSIsImFtZW5kbWVudCIsImRhdGEiLCJwdXNoIiwiZGlmZmVkRGF0YSIsInNoaWZ0Iiwic2hvcnREaXIiLCJwb3AiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJyZXBsYWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvZGlmZl9hbWVuZGVtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGRldGFpbGVkRGlmZiB9IGZyb20gXCJkZWVwLW9iamVjdC1kaWZmXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBEYXRhc2V0U3RydWN0dXJlIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmNvbnN0IGRpZmZlZEFtZW5kbWVudHM6IEFycmF5PGFueT4gPSBbXVxuY29uc3QgbmV3QW1lbmRtZW50czogQXJyYXk8YW55PiA9IFtdXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInZcIixcbiAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJtXCIsXG4gICAgaGVscDogXCJEaWZmIG1vZGVzLlwiLFxuICAgIG5hbWU6IFwibW9kZVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJtZXJnZWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJwXCIsXG4gICAgaGVscDogXCJEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJldmlvdXMgZHVtcCBvZiBhbWVuZG1lbnRzXCIsXG4gICAgbmFtZTogXCJwcmV2aW91c1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIm9cIixcbiAgICBoZWxwOiBcIk91dHB1dCBkaXJlY3RvcnkgZm9yIGRpZmYgZmlsZXNcIixcbiAgICBuYW1lOiBcIm91dHB1dFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIuL2RpZmZfb3V0cHV0cy9cIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5jb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuZnVuY3Rpb24gZGlmZkFtZW5kZW1lbnRzKGRhdGFEaXI6IHN0cmluZykge1xuICBpZiAoIW9wdGlvbnMucHJldmlvdXMpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJObyBwcmV2aW91cyBkYXRhIGZvbGRlciBzcGVjaWZpZWQuIFlvdSBtdXN0IHByb3ZpZGUgb25lIHdpdGggdGhlIC1wIG9yIC0tcHJldmlvdXMgb3B0aW9uLiBFeGl0aW5nLi4uXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMob3B0aW9ucy5vdXRwdXQpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiVGhlIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3RzLiBZb3UgbXVzdCBwcm92aWRlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gRGVmYXVsdCBkaXJlY3RvcnkgaXMgLi9kaWZmX291dHB1dHMvXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldC5maWxlbmFtZSlcbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBEaWZmaW5nICR7b3JpZ2luYWxKc29uRGlyfSBmb2xkZXIuLi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIob3JpZ2luYWxKc29uRGlyKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ZpbGVQYXRoID1cbiAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpciArIFwiL1wiICsgYW1lbmRlbWVudFNwbGl0UGF0aC5qb2luKFwiL1wiKVxuICAgICAgICAgIGNvbnN0IG5ld0ZpbGUgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKG5ld0ZpbGVQYXRoKS50b0xvY2FsZVN0cmluZygpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IG9sZEZpbGVQYXRoID1cbiAgICAgICAgICAgIG9wdGlvbnMucHJldmlvdXMgK1xuICAgICAgICAgICAgZGF0YXNldC5maWxlbmFtZSArXG4gICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoLmpvaW4oXCIvXCIpXG4gICAgICAgICAgY29uc3Qgb2xkRmlsZUV4aXN0cyA9IGZzLmV4aXN0c1N5bmMob2xkRmlsZVBhdGgpXG4gICAgICAgICAgaWYgKCFvbGRGaWxlRXhpc3RzKSB7XG4gICAgICAgICAgICAvLyBJZiBmaWxlIGZvdW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcmV2aW91cyBkdW1wXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIFwiRmlsZSBkaWQgbm90IGV4aXN0cyBwcmV2aW91c2x5LiBHdWVzc2luZyBpdCdzIGEgbmV3IGFtZW5kbWVudC4gQWRkaW5nIHRvIHRoZSBkaWZmIGxpc3QgZm9yIG5ldyBvYmplY3RzXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKG5ld0ZpbGUsIGFtZW5kZW1lbnRTcGxpdFBhdGgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbGUgYWxyZWFkeSBleGlzdGVkIGluIHByZXZpb3VzIGR1bXBcbiAgICAgICAgICBsZXQgb2xkRmlsZTogSlNPTiA9IEpTT04ucGFyc2UoXCJ7fVwiKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHYXRoZXIgZGF0YSBvZiB0aGUgZmlsZSBhbmQgcmV0cmFuc2NyaXB0IGFzIGEgSnNvbiBvYmplY3RcbiAgICAgICAgICAgIG9sZEZpbGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhvbGRGaWxlUGF0aCkudG9Mb2NhbGVTdHJpbmcoKSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwcm9jZXNzIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBpbiBjYXNlIG9mIGNvcnJ1cHQgSlNPTiBkYXRhXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBkaWZmIGJlZXR3ZWVuIHRoZSB0d28gSlNPTiBvYmplY3RzIChvbGQgJiBuZXcgZHVtcClcbiAgICAgICAgICBjb25zdCBkaWZmOiBhbnkgPSBkZXRhaWxlZERpZmYob2xkRmlsZSwgbmV3RmlsZSlcblxuICAgICAgICAgIC8vIElmIG5vIGNoYW5nZXMgYmVldHdlZW4gdGhlIHR3byBkdW1wc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuYWRkZWQpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi51cGRhdGVkKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuZGVsZXRlZCkubGVuZ3RoID09PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRvIG5leHQgaXRlcmF0aW9uIGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaWxlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hhbmdlcyBmb3VuZCAhXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRUb1F1ZXVlRm9yRGlmZmVkQW1lbmRtZW50cyhkaWZmLCBhbWVuZGVtZW50U3BsaXRQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG91dHB1dChzKVwiKVxuICAgIH1cblxuICAgIGdlbmVyYXRlRGlmZkZpbGVzKClcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYWwgcHJvY2VzcyBmb3Igb3V0cHV0IG9mIGRpZmZzLlxuICogVGhlIHNjcmlwdCBoYW5kbGVzIHR3byBkaWZmZXJlbnQgbW9kZXMgOlxuICogLSBtZXJnZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBuZXcgYW1lbmRlbWVudHMgYW5kIGEgc2luZ2xlIGZpbGVcbiAqICAgICAgICAgICAgZm9yIHVwZGF0ZWQgYW1lbmRlbWVudHNcbiAqIC0gc3BsaXR0ZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBlYWNoIGFtZW5kbWVudHMsIGVpdGhlciBpdHMgbmV3IG9yIHVwZGF0ZWQuXG4gKlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURpZmZGaWxlcygpIHtcbiAgLy8gSGFuZGxlcyBtZXJnZWQgbW9kZVxuICBpZiAob3B0aW9ucy5tb2RlID09PSBcIm1lcmdlZFwiKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG1lcmdlZCBmaWxlc1wiKVxuICAgIH1cblxuICAgIGlmIChkaWZmZWRBbWVuZG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIGRpZmZlZCBhbWVuZG1lbnRzIGZpbGVzXCIpXG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBvcHRpb25zLm91dHB1dCArIFwiYW1lbmRlbWVudHNfWFZfZGlmZmVkLmpzb25cIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGlmZmVkQW1lbmRtZW50cyksXG4gICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZGlmZiBpbiB0aGUgYWxyZWFkeSBleGlzdGluZyBhbWVuZG1lbnRzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld0FtZW5kbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGFtZW5kbWVudHMgZmlsZVwiKVxuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgKyBcImFtZW5kZW1lbnRzX1hWX25ldy5qc29uXCIsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudHMpLFxuICAgICAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vIG5ldyBhbWVuZGVtZW50LiBTa2lwcGluZyBmaWxlIGdlbmVyYXRpb25cIilcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5tb2RlID09PSBcInNwbGl0dGVkXCIpIHtcbiAgICAvLyBIYW5kbGVzIHNwbGl0dGVkIG1vZGVcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgc2VwYXJhdGVkIGZpbGVzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgY29weSBhY3Rpb24gb2YgdGhlIG5ldyBhbmQgZGlmZmVkIGFtZW5kbWVudHNcbiAgICAgKi9cblxuICAgIGRpZmZlZEFtZW5kbWVudHMuZm9yRWFjaCgoZGlmZmVkQW1lbmRtZW50OiBhbnkpID0+IHtcbiAgICAgIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudClcbiAgICB9KVxuXG4gICAgbmV3QW1lbmRtZW50cy5mb3JFYWNoKChuZXdBbWVuZG1lbnQ6IGFueSkgPT4ge1xuICAgICAgZ2VuZXJhdGVTaW5nbGVOZXdBbWVuZG1lbnQobmV3QW1lbmRtZW50KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcIlVua25vd24gb3V0cHV0IG1vZGUuIEFib3J0aW5nLi4uXCIpXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxufVxuXG4vLyBQdXNoZXMgYW4gYW1lbmRtZW50IHRvIHRoZSBxdWV1ZSB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNvcHkgbmV3IGFtZW5kbWVudHMgZmlsZXNcbmZ1bmN0aW9uIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKGZpbGU6IGFueSwgcGF0aDogYW55KTogdm9pZCB7XG4gIGNvbnN0IGFtZW5kbWVudDogYW55ID0ge1xuICAgIHBhdGg6IHBhdGgsXG4gICAgZGF0YTogZmlsZSxcbiAgfVxuICBuZXdBbWVuZG1lbnRzLnB1c2goYW1lbmRtZW50KVxufVxuLy8gUHVzaGVzIGFuIGFtZW5kbWVudCB0byB0aGUgcXVldWUgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCB0byBjb3B5IHVwZGF0ZWQgYW1lbmRtZW50cyBmaWxlc1xuZnVuY3Rpb24gYWRkVG9RdWV1ZUZvckRpZmZlZEFtZW5kbWVudHMoZGlmZmVkRGF0YTogYW55LCBwYXRoOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgYW1lbmRtZW50OiBhbnkgPSB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBkYXRhOiBkaWZmZWREYXRhLFxuICB9XG4gIGRpZmZlZEFtZW5kbWVudHMucHVzaChhbWVuZG1lbnQpXG59XG5cbi8vIGdlbmVyYXRlcyBhIGZpbGUgd2l0aCBhIGNvcHkgb2YgdGhlIG5ldyBhbWVuZGVtZW50XG5mdW5jdGlvbiBnZW5lcmF0ZVNpbmdsZU5ld0FtZW5kbWVudChuZXdBbWVuZG1lbnQ6IHtcbiAgcGF0aDogQXJyYXk8c3RyaW5nPlxuICBkYXRhOiBhbnlcbn0pIHtcbiAgbmV3QW1lbmRtZW50LnBhdGguc2hpZnQoKVxuXG4gIGNvbnN0IHNob3J0RGlyOiBBcnJheTxhbnk+ID0gWy4uLm5ld0FtZW5kbWVudC5wYXRoXVxuICBzaG9ydERpci5wb3AoKVxuICBjb25zb2xlLmxvZyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpKVxuICBmcy5ta2RpclN5bmMob3B0aW9ucy5vdXRwdXQgKyBzaG9ydERpci5qb2luKFwiL1wiKSwge1xuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgfSlcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvcHRpb25zLm91dHB1dCArIG5ld0FtZW5kbWVudC5wYXRoLmpvaW4oXCIvXCIpLnJlcGxhY2UoLyhcXC5qc29uKS8sIFwiLm5ldyQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG4vLyBnZW5lcmF0ZXMgYSBmaWxlIHdpdGggYSBjb3B5IG9mIHRoZSBtb2RpZmllZCBkYXRhIG9mIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGFtZW5kbWVudDtcbmZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudDoge1xuICBwYXRoOiBBcnJheTxzdHJpbmc+XG4gIGRhdGE6IGFueVxufSkge1xuICBkaWZmZWRBbWVuZG1lbnQucGF0aC5zaGlmdCgpXG5cbiAgY29uc3Qgc2hvcnREaXI6IEFycmF5PGFueT4gPSBbLi4uZGlmZmVkQW1lbmRtZW50LnBhdGhdXG4gIHNob3J0RGlyLnBvcCgpXG4gIGZzLm1rZGlyU3luYyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KVxuXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgb3B0aW9ucy5vdXRwdXQgK1xuICAgICAgZGlmZmVkQW1lbmRtZW50LnBhdGguam9pbihcIi9cIikucmVwbGFjZSgvKFxcLmpzb24pLywgXCIuZGlmZiQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KGRpZmZlZEFtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG5kaWZmQW1lbmRlbWVudHMob3B0aW9ucy5kYXRhRGlyKVxuIl0sIm1hcHBpbmdz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
260
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWZmZWRBbWVuZG1lbnRzIiwibmV3QW1lbmRtZW50cyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIlN0cmluZyIsImRlZmF1bHRPcHRpb24iLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiZGlmZkFtZW5kZW1lbnRzIiwiZGF0YURpciIsInByZXZpb3VzIiwiY29uc29sZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJmcyIsImV4aXN0c1N5bmMiLCJvdXRwdXQiLCJkYXRhc2V0cyIsImFtZW5kZW1lbnRzIiwiZGF0YXNldCIsInN0cnVjdHVyZSIsIkRhdGFzZXRTdHJ1Y3R1cmUiLCJTZWdtZW50ZWRGaWxlcyIsIm9yaWdpbmFsSnNvbkRpciIsInBhdGgiLCJqb2luIiwiZmlsZW5hbWUiLCJzaWxlbnQiLCJsb2ciLCJ3YWxrRGlyIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsIm5ld0ZpbGVQYXRoIiwibmV3RmlsZSIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsInRvTG9jYWxlU3RyaW5nIiwib2xkRmlsZVBhdGgiLCJvbGRGaWxlRXhpc3RzIiwiYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMiLCJvbGRGaWxlIiwiZSIsImRpZmYiLCJkZXRhaWxlZERpZmYiLCJPYmplY3QiLCJrZXlzIiwiYWRkZWQiLCJsZW5ndGgiLCJ1cGRhdGVkIiwiZGVsZXRlZCIsImFkZFRvUXVldWVGb3JEaWZmZWRBbWVuZG1lbnRzIiwiZ2VuZXJhdGVEaWZmRmlsZXMiLCJtb2RlIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImVuY29kaW5nIiwiZmxhZyIsImZvckVhY2giLCJkaWZmZWRBbWVuZG1lbnQiLCJnZW5lcmF0ZVNpbmdsZURpZmZlZEFtZW5kbWVudCIsIm5ld0FtZW5kbWVudCIsImdlbmVyYXRlU2luZ2xlTmV3QW1lbmRtZW50IiwiZmlsZSIsImFtZW5kbWVudCIsImRhdGEiLCJwdXNoIiwiZGlmZmVkRGF0YSIsInNoaWZ0Iiwic2hvcnREaXIiLCJwb3AiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJyZXBsYWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvZGlmZl9hbWVuZGVtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGRldGFpbGVkRGlmZiB9IGZyb20gXCJkZWVwLW9iamVjdC1kaWZmXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBEYXRhc2V0U3RydWN0dXJlIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmNvbnN0IGRpZmZlZEFtZW5kbWVudHM6IEFycmF5PGFueT4gPSBbXVxuY29uc3QgbmV3QW1lbmRtZW50czogQXJyYXk8YW55PiA9IFtdXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInZcIixcbiAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJtXCIsXG4gICAgaGVscDogXCJEaWZmIG1vZGVzLlwiLFxuICAgIG5hbWU6IFwibW9kZVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJtZXJnZWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJwXCIsXG4gICAgaGVscDogXCJEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJldmlvdXMgZHVtcCBvZiBhbWVuZG1lbnRzXCIsXG4gICAgbmFtZTogXCJwcmV2aW91c1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIm9cIixcbiAgICBoZWxwOiBcIk91dHB1dCBkaXJlY3RvcnkgZm9yIGRpZmYgZmlsZXNcIixcbiAgICBuYW1lOiBcIm91dHB1dFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIuL2RpZmZfb3V0cHV0cy9cIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5jb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuZnVuY3Rpb24gZGlmZkFtZW5kZW1lbnRzKGRhdGFEaXI6IHN0cmluZykge1xuICBpZiAoIW9wdGlvbnMucHJldmlvdXMpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJObyBwcmV2aW91cyBkYXRhIGZvbGRlciBzcGVjaWZpZWQuIFlvdSBtdXN0IHByb3ZpZGUgb25lIHdpdGggdGhlIC1wIG9yIC0tcHJldmlvdXMgb3B0aW9uLiBFeGl0aW5nLi4uXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMob3B0aW9ucy5vdXRwdXQpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiVGhlIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3RzLiBZb3UgbXVzdCBwcm92aWRlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gRGVmYXVsdCBkaXJlY3RvcnkgaXMgLi9kaWZmX291dHB1dHMvXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldC5maWxlbmFtZSlcbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBEaWZmaW5nICR7b3JpZ2luYWxKc29uRGlyfSBmb2xkZXIuLi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIob3JpZ2luYWxKc29uRGlyKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ZpbGVQYXRoID1cbiAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpciArIFwiL1wiICsgYW1lbmRlbWVudFNwbGl0UGF0aC5qb2luKFwiL1wiKVxuICAgICAgICAgIGNvbnN0IG5ld0ZpbGUgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKG5ld0ZpbGVQYXRoKS50b0xvY2FsZVN0cmluZygpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IG9sZEZpbGVQYXRoID1cbiAgICAgICAgICAgIG9wdGlvbnMucHJldmlvdXMgK1xuICAgICAgICAgICAgZGF0YXNldC5maWxlbmFtZSArXG4gICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoLmpvaW4oXCIvXCIpXG4gICAgICAgICAgY29uc3Qgb2xkRmlsZUV4aXN0cyA9IGZzLmV4aXN0c1N5bmMob2xkRmlsZVBhdGgpXG4gICAgICAgICAgaWYgKCFvbGRGaWxlRXhpc3RzKSB7XG4gICAgICAgICAgICAvLyBJZiBmaWxlIGZvdW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcmV2aW91cyBkdW1wXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIFwiRmlsZSBkaWQgbm90IGV4aXN0cyBwcmV2aW91c2x5LiBHdWVzc2luZyBpdCdzIGEgbmV3IGFtZW5kbWVudC4gQWRkaW5nIHRvIHRoZSBkaWZmIGxpc3QgZm9yIG5ldyBvYmplY3RzXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKG5ld0ZpbGUsIGFtZW5kZW1lbnRTcGxpdFBhdGgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbGUgYWxyZWFkeSBleGlzdGVkIGluIHByZXZpb3VzIGR1bXBcbiAgICAgICAgICBsZXQgb2xkRmlsZTogSlNPTiA9IEpTT04ucGFyc2UoXCJ7fVwiKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHYXRoZXIgZGF0YSBvZiB0aGUgZmlsZSBhbmQgcmV0cmFuc2NyaXB0IGFzIGEgSnNvbiBvYmplY3RcbiAgICAgICAgICAgIG9sZEZpbGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhvbGRGaWxlUGF0aCkudG9Mb2NhbGVTdHJpbmcoKSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwcm9jZXNzIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBpbiBjYXNlIG9mIGNvcnJ1cHQgSlNPTiBkYXRhXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBkaWZmIGJlZXR3ZWVuIHRoZSB0d28gSlNPTiBvYmplY3RzIChvbGQgJiBuZXcgZHVtcClcbiAgICAgICAgICBjb25zdCBkaWZmOiBhbnkgPSBkZXRhaWxlZERpZmYob2xkRmlsZSwgbmV3RmlsZSlcblxuICAgICAgICAgIC8vIElmIG5vIGNoYW5nZXMgYmVldHdlZW4gdGhlIHR3byBkdW1wc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuYWRkZWQpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi51cGRhdGVkKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuZGVsZXRlZCkubGVuZ3RoID09PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRvIG5leHQgaXRlcmF0aW9uIGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaWxlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hhbmdlcyBmb3VuZCAhXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRUb1F1ZXVlRm9yRGlmZmVkQW1lbmRtZW50cyhkaWZmLCBhbWVuZGVtZW50U3BsaXRQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG91dHB1dChzKVwiKVxuICAgIH1cblxuICAgIGdlbmVyYXRlRGlmZkZpbGVzKClcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYWwgcHJvY2VzcyBmb3Igb3V0cHV0IG9mIGRpZmZzLlxuICogVGhlIHNjcmlwdCBoYW5kbGVzIHR3byBkaWZmZXJlbnQgbW9kZXMgOlxuICogLSBtZXJnZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBuZXcgYW1lbmRlbWVudHMgYW5kIGEgc2luZ2xlIGZpbGVcbiAqICAgICAgICAgICAgZm9yIHVwZGF0ZWQgYW1lbmRlbWVudHNcbiAqIC0gc3BsaXR0ZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBlYWNoIGFtZW5kbWVudHMsIGVpdGhlciBpdHMgbmV3IG9yIHVwZGF0ZWQuXG4gKlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURpZmZGaWxlcygpIHtcbiAgLy8gSGFuZGxlcyBtZXJnZWQgbW9kZVxuICBpZiAob3B0aW9ucy5tb2RlID09PSBcIm1lcmdlZFwiKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG1lcmdlZCBmaWxlc1wiKVxuICAgIH1cblxuICAgIGlmIChkaWZmZWRBbWVuZG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIGRpZmZlZCBhbWVuZG1lbnRzIGZpbGVzXCIpXG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBvcHRpb25zLm91dHB1dCArIFwiYW1lbmRlbWVudHNfWFZfZGlmZmVkLmpzb25cIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGlmZmVkQW1lbmRtZW50cyksXG4gICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZGlmZiBpbiB0aGUgYWxyZWFkeSBleGlzdGluZyBhbWVuZG1lbnRzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld0FtZW5kbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGFtZW5kbWVudHMgZmlsZVwiKVxuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgKyBcImFtZW5kZW1lbnRzX1hWX25ldy5qc29uXCIsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudHMpLFxuICAgICAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vIG5ldyBhbWVuZGVtZW50LiBTa2lwcGluZyBmaWxlIGdlbmVyYXRpb25cIilcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5tb2RlID09PSBcInNwbGl0dGVkXCIpIHtcbiAgICAvLyBIYW5kbGVzIHNwbGl0dGVkIG1vZGVcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgc2VwYXJhdGVkIGZpbGVzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgY29weSBhY3Rpb24gb2YgdGhlIG5ldyBhbmQgZGlmZmVkIGFtZW5kbWVudHNcbiAgICAgKi9cblxuICAgIGRpZmZlZEFtZW5kbWVudHMuZm9yRWFjaCgoZGlmZmVkQW1lbmRtZW50OiBhbnkpID0+IHtcbiAgICAgIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudClcbiAgICB9KVxuXG4gICAgbmV3QW1lbmRtZW50cy5mb3JFYWNoKChuZXdBbWVuZG1lbnQ6IGFueSkgPT4ge1xuICAgICAgZ2VuZXJhdGVTaW5nbGVOZXdBbWVuZG1lbnQobmV3QW1lbmRtZW50KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcIlVua25vd24gb3V0cHV0IG1vZGUuIEFib3J0aW5nLi4uXCIpXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxufVxuXG4vLyBQdXNoZXMgYW4gYW1lbmRtZW50IHRvIHRoZSBxdWV1ZSB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNvcHkgbmV3IGFtZW5kbWVudHMgZmlsZXNcbmZ1bmN0aW9uIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKGZpbGU6IGFueSwgcGF0aDogYW55KTogdm9pZCB7XG4gIGNvbnN0IGFtZW5kbWVudDogYW55ID0ge1xuICAgIHBhdGg6IHBhdGgsXG4gICAgZGF0YTogZmlsZSxcbiAgfVxuICBuZXdBbWVuZG1lbnRzLnB1c2goYW1lbmRtZW50KVxufVxuLy8gUHVzaGVzIGFuIGFtZW5kbWVudCB0byB0aGUgcXVldWUgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCB0byBjb3B5IHVwZGF0ZWQgYW1lbmRtZW50cyBmaWxlc1xuZnVuY3Rpb24gYWRkVG9RdWV1ZUZvckRpZmZlZEFtZW5kbWVudHMoZGlmZmVkRGF0YTogYW55LCBwYXRoOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgYW1lbmRtZW50OiBhbnkgPSB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBkYXRhOiBkaWZmZWREYXRhLFxuICB9XG4gIGRpZmZlZEFtZW5kbWVudHMucHVzaChhbWVuZG1lbnQpXG59XG5cbi8vIGdlbmVyYXRlcyBhIGZpbGUgd2l0aCBhIGNvcHkgb2YgdGhlIG5ldyBhbWVuZGVtZW50XG5mdW5jdGlvbiBnZW5lcmF0ZVNpbmdsZU5ld0FtZW5kbWVudChuZXdBbWVuZG1lbnQ6IHtcbiAgcGF0aDogQXJyYXk8c3RyaW5nPlxuICBkYXRhOiBhbnlcbn0pIHtcbiAgbmV3QW1lbmRtZW50LnBhdGguc2hpZnQoKVxuXG4gIGNvbnN0IHNob3J0RGlyOiBBcnJheTxhbnk+ID0gWy4uLm5ld0FtZW5kbWVudC5wYXRoXVxuICBzaG9ydERpci5wb3AoKVxuICBjb25zb2xlLmxvZyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpKVxuICBmcy5ta2RpclN5bmMob3B0aW9ucy5vdXRwdXQgKyBzaG9ydERpci5qb2luKFwiL1wiKSwge1xuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgfSlcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvcHRpb25zLm91dHB1dCArIG5ld0FtZW5kbWVudC5wYXRoLmpvaW4oXCIvXCIpLnJlcGxhY2UoLyhcXC5qc29uKS8sIFwiLm5ldyQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG4vLyBnZW5lcmF0ZXMgYSBmaWxlIHdpdGggYSBjb3B5IG9mIHRoZSBtb2RpZmllZCBkYXRhIG9mIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGFtZW5kbWVudDtcbmZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudDoge1xuICBwYXRoOiBBcnJheTxzdHJpbmc+XG4gIGRhdGE6IGFueVxufSkge1xuICBkaWZmZWRBbWVuZG1lbnQucGF0aC5zaGlmdCgpXG5cbiAgY29uc3Qgc2hvcnREaXI6IEFycmF5PGFueT4gPSBbLi4uZGlmZmVkQW1lbmRtZW50LnBhdGhdXG4gIHNob3J0RGlyLnBvcCgpXG4gIGZzLm1rZGlyU3luYyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KVxuXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgb3B0aW9ucy5vdXRwdXQgK1xuICAgICAgZGlmZmVkQW1lbmRtZW50LnBhdGguam9pbihcIi9cIikucmVwbGFjZSgvKFxcLmpzb24pLywgXCIuZGlmZiQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KGRpZmZlZEFtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG5kaWZmQW1lbmRlbWVudHMob3B0aW9ucy5kYXRhRGlyKVxuIl0sIm1hcHBpbmdz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
@@ -40,58 +40,51 @@ const optionsDefinitions = [{
40
40
  type: String
41
41
  }];
42
42
  const options = commandLineArgs(optionsDefinitions);
43
-
44
43
  function diffAmendements(dataDir) {
45
44
  if (!options.previous) {
46
45
  console.error("No previous data folder specified. You must provide one with the -p or --previous option. Exiting...");
47
46
  process.exit();
48
47
  }
49
-
50
48
  if (!fs.existsSync(options.output)) {
51
49
  console.error("The output dir does not exists. You must provide an existing directory. Default directory is ./diff_outputs/");
52
50
  process.exit();
53
51
  }
54
-
55
52
  for (const dataset of datasets.amendements) {
56
53
  switch (dataset.structure) {
57
54
  case DatasetStructure.SegmentedFiles:
58
55
  {
59
56
  const originalJsonDir = path.join(dataDir, dataset.filename);
60
-
61
57
  if (!options.silent) {
62
58
  console.log(`Diffing ${originalJsonDir} folder...`);
63
59
  }
64
-
65
60
  for (const amendementSplitPath of walkDir(originalJsonDir)) {
66
61
  const newFilePath = originalJsonDir + "/" + amendementSplitPath.join("/");
67
62
  const newFile = JSON.parse(fs.readFileSync(newFilePath).toLocaleString());
68
63
  const oldFilePath = options.previous + dataset.filename + "/" + amendementSplitPath.join("/");
69
64
  const oldFileExists = fs.existsSync(oldFilePath);
70
-
71
65
  if (!oldFileExists) {
72
66
  // If file found does not exist in the previous dump
73
67
  if (!options.silent) {
74
68
  console.log("File did not exists previously. Guessing it's a new amendment. Adding to the diff list for new objects");
75
69
  }
76
-
77
70
  addToQueueForNewAmendments(newFile, amendementSplitPath);
78
71
  continue;
79
- } // File already existed in previous dump
80
-
72
+ }
81
73
 
74
+ // File already existed in previous dump
82
75
  let oldFile = JSON.parse("{}");
83
-
84
76
  try {
85
77
  // Gather data of the file and retranscript as a Json object
86
78
  oldFile = JSON.parse(fs.readFileSync(oldFilePath).toLocaleString());
87
79
  } catch (e) {
88
80
  // Skip the process to the next iteration in case of corrupt JSON data
89
81
  continue;
90
- } // Generate the diff beetween the two JSON objects (old & new dump)
91
-
82
+ }
92
83
 
93
- const diff = detailedDiff(oldFile, newFile); // If no changes beetween the two dumps
84
+ // Generate the diff beetween the two JSON objects (old & new dump)
85
+ const diff = detailedDiff(oldFile, newFile);
94
86
 
87
+ // If no changes beetween the two dumps
95
88
  if (Object.keys(diff.added).length === 0 && Object.keys(diff.updated).length === 0 && Object.keys(diff.deleted).length === 0) {
96
89
  // Skip to next iteration as there is no need to generate a file
97
90
  continue;
@@ -99,22 +92,19 @@ function diffAmendements(dataDir) {
99
92
  if (!options.silent) {
100
93
  console.log("Changes found !");
101
94
  }
102
-
103
95
  addToQueueForDiffedAmendments(diff, amendementSplitPath);
104
96
  }
105
-
106
97
  break;
107
98
  }
108
99
  }
109
100
  }
110
-
111
101
  if (!options.silent) {
112
102
  console.log("Generating output(s)");
113
103
  }
114
-
115
104
  generateDiffFiles();
116
105
  }
117
106
  }
107
+
118
108
  /**
119
109
  * General process for output of diffs.
120
110
  * The script handles two different modes :
@@ -123,20 +113,16 @@ function diffAmendements(dataDir) {
123
113
  * - splitted : Will output a single file for each amendments, either its new or updated.
124
114
  *
125
115
  */
126
-
127
-
128
116
  function generateDiffFiles() {
129
117
  // Handles merged mode
130
118
  if (options.mode === "merged") {
131
119
  if (!options.silent) {
132
120
  console.log("Generating merged files");
133
121
  }
134
-
135
122
  if (diffedAmendments.length > 0) {
136
123
  if (!options.silent) {
137
124
  console.log("Generating diffed amendments files");
138
125
  }
139
-
140
126
  fs.writeFileSync(options.output + "amendements_XV_diffed.json", JSON.stringify(diffedAmendments), {
141
127
  encoding: "utf8",
142
128
  flag: "w"
@@ -146,12 +132,10 @@ function generateDiffFiles() {
146
132
  console.log("No diff in the already existing amendments");
147
133
  }
148
134
  }
149
-
150
135
  if (newAmendments.length > 0) {
151
136
  if (!options.silent) {
152
137
  console.log("Generating new amendments file");
153
138
  }
154
-
155
139
  fs.writeFileSync(options.output + "amendements_XV_new.json", JSON.stringify(newAmendments), {
156
140
  encoding: "utf8",
157
141
  flag: "w"
@@ -166,11 +150,11 @@ function generateDiffFiles() {
166
150
  if (!options.silent) {
167
151
  console.log("Generating separated files");
168
152
  }
153
+
169
154
  /**
170
155
  * Process the copy action of the new and diffed amendments
171
156
  */
172
157
 
173
-
174
158
  diffedAmendments.forEach(diffedAmendment => {
175
159
  generateSingleDiffedAmendment(diffedAmendment);
176
160
  });
@@ -181,27 +165,26 @@ function generateDiffFiles() {
181
165
  console.error("Unknown output mode. Aborting...");
182
166
  process.exit();
183
167
  }
184
- } // Pushes an amendment to the queue that will be processed to copy new amendments files
185
-
168
+ }
186
169
 
170
+ // Pushes an amendment to the queue that will be processed to copy new amendments files
187
171
  function addToQueueForNewAmendments(file, path) {
188
172
  const amendment = {
189
173
  path: path,
190
174
  data: file
191
175
  };
192
176
  newAmendments.push(amendment);
193
- } // Pushes an amendment to the queue that will be processed to copy updated amendments files
194
-
195
-
177
+ }
178
+ // Pushes an amendment to the queue that will be processed to copy updated amendments files
196
179
  function addToQueueForDiffedAmendments(diffedData, path) {
197
180
  const amendment = {
198
181
  path: path,
199
182
  data: diffedData
200
183
  };
201
184
  diffedAmendments.push(amendment);
202
- } // generates a file with a copy of the new amendement
203
-
185
+ }
204
186
 
187
+ // generates a file with a copy of the new amendement
205
188
  function generateSingleNewAmendment(newAmendment) {
206
189
  newAmendment.path.shift();
207
190
  const shortDir = [...newAmendment.path];
@@ -214,9 +197,9 @@ function generateSingleNewAmendment(newAmendment) {
214
197
  encoding: "utf8",
215
198
  flag: "w"
216
199
  });
217
- } // generates a file with a copy of the modified data of the previously existing amendment;
218
-
200
+ }
219
201
 
202
+ // generates a file with a copy of the modified data of the previously existing amendment;
220
203
  function generateSingleDiffedAmendment(diffedAmendment) {
221
204
  diffedAmendment.path.shift();
222
205
  const shortDir = [...diffedAmendment.path];
@@ -229,6 +212,5 @@ function generateSingleDiffedAmendment(diffedAmendment) {
229
212
  flag: "w"
230
213
  });
231
214
  }
232
-
233
215
  diffAmendements(options.dataDir);
234
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJkZXRhaWxlZERpZmYiLCJkYXRhc2V0cyIsIkRhdGFzZXRTdHJ1Y3R1cmUiLCJ3YWxrRGlyIiwiZGlmZmVkQW1lbmRtZW50cyIsIm5ld0FtZW5kbWVudHMiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIkJvb2xlYW4iLCJkZWZhdWx0VmFsdWUiLCJTdHJpbmciLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImRpZmZBbWVuZGVtZW50cyIsImRhdGFEaXIiLCJwcmV2aW91cyIsImNvbnNvbGUiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiZXhpc3RzU3luYyIsIm91dHB1dCIsImRhdGFzZXQiLCJhbWVuZGVtZW50cyIsInN0cnVjdHVyZSIsIlNlZ21lbnRlZEZpbGVzIiwib3JpZ2luYWxKc29uRGlyIiwiam9pbiIsImZpbGVuYW1lIiwic2lsZW50IiwibG9nIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsIm5ld0ZpbGVQYXRoIiwibmV3RmlsZSIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsInRvTG9jYWxlU3RyaW5nIiwib2xkRmlsZVBhdGgiLCJvbGRGaWxlRXhpc3RzIiwiYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMiLCJvbGRGaWxlIiwiZSIsImRpZmYiLCJPYmplY3QiLCJrZXlzIiwiYWRkZWQiLCJsZW5ndGgiLCJ1cGRhdGVkIiwiZGVsZXRlZCIsImFkZFRvUXVldWVGb3JEaWZmZWRBbWVuZG1lbnRzIiwiZ2VuZXJhdGVEaWZmRmlsZXMiLCJtb2RlIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImVuY29kaW5nIiwiZmxhZyIsImZvckVhY2giLCJkaWZmZWRBbWVuZG1lbnQiLCJnZW5lcmF0ZVNpbmdsZURpZmZlZEFtZW5kbWVudCIsIm5ld0FtZW5kbWVudCIsImdlbmVyYXRlU2luZ2xlTmV3QW1lbmRtZW50IiwiZmlsZSIsImFtZW5kbWVudCIsImRhdGEiLCJwdXNoIiwiZGlmZmVkRGF0YSIsInNoaWZ0Iiwic2hvcnREaXIiLCJwb3AiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJyZXBsYWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvZGlmZl9hbWVuZGVtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGRldGFpbGVkRGlmZiB9IGZyb20gXCJkZWVwLW9iamVjdC1kaWZmXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBEYXRhc2V0U3RydWN0dXJlIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmNvbnN0IGRpZmZlZEFtZW5kbWVudHM6IEFycmF5PGFueT4gPSBbXVxuY29uc3QgbmV3QW1lbmRtZW50czogQXJyYXk8YW55PiA9IFtdXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInZcIixcbiAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJtXCIsXG4gICAgaGVscDogXCJEaWZmIG1vZGVzLlwiLFxuICAgIG5hbWU6IFwibW9kZVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJtZXJnZWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJwXCIsXG4gICAgaGVscDogXCJEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJldmlvdXMgZHVtcCBvZiBhbWVuZG1lbnRzXCIsXG4gICAgbmFtZTogXCJwcmV2aW91c1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIm9cIixcbiAgICBoZWxwOiBcIk91dHB1dCBkaXJlY3RvcnkgZm9yIGRpZmYgZmlsZXNcIixcbiAgICBuYW1lOiBcIm91dHB1dFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIuL2RpZmZfb3V0cHV0cy9cIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5jb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuZnVuY3Rpb24gZGlmZkFtZW5kZW1lbnRzKGRhdGFEaXI6IHN0cmluZykge1xuICBpZiAoIW9wdGlvbnMucHJldmlvdXMpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJObyBwcmV2aW91cyBkYXRhIGZvbGRlciBzcGVjaWZpZWQuIFlvdSBtdXN0IHByb3ZpZGUgb25lIHdpdGggdGhlIC1wIG9yIC0tcHJldmlvdXMgb3B0aW9uLiBFeGl0aW5nLi4uXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMob3B0aW9ucy5vdXRwdXQpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiVGhlIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3RzLiBZb3UgbXVzdCBwcm92aWRlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gRGVmYXVsdCBkaXJlY3RvcnkgaXMgLi9kaWZmX291dHB1dHMvXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldC5maWxlbmFtZSlcbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBEaWZmaW5nICR7b3JpZ2luYWxKc29uRGlyfSBmb2xkZXIuLi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIob3JpZ2luYWxKc29uRGlyKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ZpbGVQYXRoID1cbiAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpciArIFwiL1wiICsgYW1lbmRlbWVudFNwbGl0UGF0aC5qb2luKFwiL1wiKVxuICAgICAgICAgIGNvbnN0IG5ld0ZpbGUgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKG5ld0ZpbGVQYXRoKS50b0xvY2FsZVN0cmluZygpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IG9sZEZpbGVQYXRoID1cbiAgICAgICAgICAgIG9wdGlvbnMucHJldmlvdXMgK1xuICAgICAgICAgICAgZGF0YXNldC5maWxlbmFtZSArXG4gICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoLmpvaW4oXCIvXCIpXG4gICAgICAgICAgY29uc3Qgb2xkRmlsZUV4aXN0cyA9IGZzLmV4aXN0c1N5bmMob2xkRmlsZVBhdGgpXG4gICAgICAgICAgaWYgKCFvbGRGaWxlRXhpc3RzKSB7XG4gICAgICAgICAgICAvLyBJZiBmaWxlIGZvdW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcmV2aW91cyBkdW1wXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIFwiRmlsZSBkaWQgbm90IGV4aXN0cyBwcmV2aW91c2x5LiBHdWVzc2luZyBpdCdzIGEgbmV3IGFtZW5kbWVudC4gQWRkaW5nIHRvIHRoZSBkaWZmIGxpc3QgZm9yIG5ldyBvYmplY3RzXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKG5ld0ZpbGUsIGFtZW5kZW1lbnRTcGxpdFBhdGgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbGUgYWxyZWFkeSBleGlzdGVkIGluIHByZXZpb3VzIGR1bXBcbiAgICAgICAgICBsZXQgb2xkRmlsZTogSlNPTiA9IEpTT04ucGFyc2UoXCJ7fVwiKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHYXRoZXIgZGF0YSBvZiB0aGUgZmlsZSBhbmQgcmV0cmFuc2NyaXB0IGFzIGEgSnNvbiBvYmplY3RcbiAgICAgICAgICAgIG9sZEZpbGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhvbGRGaWxlUGF0aCkudG9Mb2NhbGVTdHJpbmcoKSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwcm9jZXNzIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBpbiBjYXNlIG9mIGNvcnJ1cHQgSlNPTiBkYXRhXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBkaWZmIGJlZXR3ZWVuIHRoZSB0d28gSlNPTiBvYmplY3RzIChvbGQgJiBuZXcgZHVtcClcbiAgICAgICAgICBjb25zdCBkaWZmOiBhbnkgPSBkZXRhaWxlZERpZmYob2xkRmlsZSwgbmV3RmlsZSlcblxuICAgICAgICAgIC8vIElmIG5vIGNoYW5nZXMgYmVldHdlZW4gdGhlIHR3byBkdW1wc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuYWRkZWQpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi51cGRhdGVkKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuZGVsZXRlZCkubGVuZ3RoID09PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRvIG5leHQgaXRlcmF0aW9uIGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaWxlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hhbmdlcyBmb3VuZCAhXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRUb1F1ZXVlRm9yRGlmZmVkQW1lbmRtZW50cyhkaWZmLCBhbWVuZGVtZW50U3BsaXRQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG91dHB1dChzKVwiKVxuICAgIH1cblxuICAgIGdlbmVyYXRlRGlmZkZpbGVzKClcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYWwgcHJvY2VzcyBmb3Igb3V0cHV0IG9mIGRpZmZzLlxuICogVGhlIHNjcmlwdCBoYW5kbGVzIHR3byBkaWZmZXJlbnQgbW9kZXMgOlxuICogLSBtZXJnZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBuZXcgYW1lbmRlbWVudHMgYW5kIGEgc2luZ2xlIGZpbGVcbiAqICAgICAgICAgICAgZm9yIHVwZGF0ZWQgYW1lbmRlbWVudHNcbiAqIC0gc3BsaXR0ZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBlYWNoIGFtZW5kbWVudHMsIGVpdGhlciBpdHMgbmV3IG9yIHVwZGF0ZWQuXG4gKlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURpZmZGaWxlcygpIHtcbiAgLy8gSGFuZGxlcyBtZXJnZWQgbW9kZVxuICBpZiAob3B0aW9ucy5tb2RlID09PSBcIm1lcmdlZFwiKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG1lcmdlZCBmaWxlc1wiKVxuICAgIH1cblxuICAgIGlmIChkaWZmZWRBbWVuZG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIGRpZmZlZCBhbWVuZG1lbnRzIGZpbGVzXCIpXG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBvcHRpb25zLm91dHB1dCArIFwiYW1lbmRlbWVudHNfWFZfZGlmZmVkLmpzb25cIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGlmZmVkQW1lbmRtZW50cyksXG4gICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZGlmZiBpbiB0aGUgYWxyZWFkeSBleGlzdGluZyBhbWVuZG1lbnRzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld0FtZW5kbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGFtZW5kbWVudHMgZmlsZVwiKVxuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgKyBcImFtZW5kZW1lbnRzX1hWX25ldy5qc29uXCIsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudHMpLFxuICAgICAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vIG5ldyBhbWVuZGVtZW50LiBTa2lwcGluZyBmaWxlIGdlbmVyYXRpb25cIilcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5tb2RlID09PSBcInNwbGl0dGVkXCIpIHtcbiAgICAvLyBIYW5kbGVzIHNwbGl0dGVkIG1vZGVcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgc2VwYXJhdGVkIGZpbGVzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgY29weSBhY3Rpb24gb2YgdGhlIG5ldyBhbmQgZGlmZmVkIGFtZW5kbWVudHNcbiAgICAgKi9cblxuICAgIGRpZmZlZEFtZW5kbWVudHMuZm9yRWFjaCgoZGlmZmVkQW1lbmRtZW50OiBhbnkpID0+IHtcbiAgICAgIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudClcbiAgICB9KVxuXG4gICAgbmV3QW1lbmRtZW50cy5mb3JFYWNoKChuZXdBbWVuZG1lbnQ6IGFueSkgPT4ge1xuICAgICAgZ2VuZXJhdGVTaW5nbGVOZXdBbWVuZG1lbnQobmV3QW1lbmRtZW50KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcIlVua25vd24gb3V0cHV0IG1vZGUuIEFib3J0aW5nLi4uXCIpXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxufVxuXG4vLyBQdXNoZXMgYW4gYW1lbmRtZW50IHRvIHRoZSBxdWV1ZSB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNvcHkgbmV3IGFtZW5kbWVudHMgZmlsZXNcbmZ1bmN0aW9uIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKGZpbGU6IGFueSwgcGF0aDogYW55KTogdm9pZCB7XG4gIGNvbnN0IGFtZW5kbWVudDogYW55ID0ge1xuICAgIHBhdGg6IHBhdGgsXG4gICAgZGF0YTogZmlsZSxcbiAgfVxuICBuZXdBbWVuZG1lbnRzLnB1c2goYW1lbmRtZW50KVxufVxuLy8gUHVzaGVzIGFuIGFtZW5kbWVudCB0byB0aGUgcXVldWUgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCB0byBjb3B5IHVwZGF0ZWQgYW1lbmRtZW50cyBmaWxlc1xuZnVuY3Rpb24gYWRkVG9RdWV1ZUZvckRpZmZlZEFtZW5kbWVudHMoZGlmZmVkRGF0YTogYW55LCBwYXRoOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgYW1lbmRtZW50OiBhbnkgPSB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBkYXRhOiBkaWZmZWREYXRhLFxuICB9XG4gIGRpZmZlZEFtZW5kbWVudHMucHVzaChhbWVuZG1lbnQpXG59XG5cbi8vIGdlbmVyYXRlcyBhIGZpbGUgd2l0aCBhIGNvcHkgb2YgdGhlIG5ldyBhbWVuZGVtZW50XG5mdW5jdGlvbiBnZW5lcmF0ZVNpbmdsZU5ld0FtZW5kbWVudChuZXdBbWVuZG1lbnQ6IHtcbiAgcGF0aDogQXJyYXk8c3RyaW5nPlxuICBkYXRhOiBhbnlcbn0pIHtcbiAgbmV3QW1lbmRtZW50LnBhdGguc2hpZnQoKVxuXG4gIGNvbnN0IHNob3J0RGlyOiBBcnJheTxhbnk+ID0gWy4uLm5ld0FtZW5kbWVudC5wYXRoXVxuICBzaG9ydERpci5wb3AoKVxuICBjb25zb2xlLmxvZyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpKVxuICBmcy5ta2RpclN5bmMob3B0aW9ucy5vdXRwdXQgKyBzaG9ydERpci5qb2luKFwiL1wiKSwge1xuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgfSlcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvcHRpb25zLm91dHB1dCArIG5ld0FtZW5kbWVudC5wYXRoLmpvaW4oXCIvXCIpLnJlcGxhY2UoLyhcXC5qc29uKS8sIFwiLm5ldyQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG4vLyBnZW5lcmF0ZXMgYSBmaWxlIHdpdGggYSBjb3B5IG9mIHRoZSBtb2RpZmllZCBkYXRhIG9mIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGFtZW5kbWVudDtcbmZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudDoge1xuICBwYXRoOiBBcnJheTxzdHJpbmc+XG4gIGRhdGE6IGFueVxufSkge1xuICBkaWZmZWRBbWVuZG1lbnQucGF0aC5zaGlmdCgpXG5cbiAgY29uc3Qgc2hvcnREaXI6IEFycmF5PGFueT4gPSBbLi4uZGlmZmVkQW1lbmRtZW50LnBhdGhdXG4gIHNob3J0RGlyLnBvcCgpXG4gIGZzLm1rZGlyU3luYyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KVxuXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgb3B0aW9ucy5vdXRwdXQgK1xuICAgICAgZGlmZmVkQW1lbmRtZW50LnBhdGguam9pbihcIi9cIikucmVwbGFjZSgvKFxcLmpzb24pLywgXCIuZGlmZiQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KGRpZmZlZEFtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG5kaWZmQW1lbmRlbWVudHMob3B0aW9ucy5kYXRhRGlyKVxuIl0sIm1hcHBpbmdz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
216
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJkZXRhaWxlZERpZmYiLCJkYXRhc2V0cyIsIkRhdGFzZXRTdHJ1Y3R1cmUiLCJ3YWxrRGlyIiwiZGlmZmVkQW1lbmRtZW50cyIsIm5ld0FtZW5kbWVudHMiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIkJvb2xlYW4iLCJkZWZhdWx0VmFsdWUiLCJTdHJpbmciLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImRpZmZBbWVuZGVtZW50cyIsImRhdGFEaXIiLCJwcmV2aW91cyIsImNvbnNvbGUiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiZXhpc3RzU3luYyIsIm91dHB1dCIsImRhdGFzZXQiLCJhbWVuZGVtZW50cyIsInN0cnVjdHVyZSIsIlNlZ21lbnRlZEZpbGVzIiwib3JpZ2luYWxKc29uRGlyIiwiam9pbiIsImZpbGVuYW1lIiwic2lsZW50IiwibG9nIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsIm5ld0ZpbGVQYXRoIiwibmV3RmlsZSIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsInRvTG9jYWxlU3RyaW5nIiwib2xkRmlsZVBhdGgiLCJvbGRGaWxlRXhpc3RzIiwiYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMiLCJvbGRGaWxlIiwiZSIsImRpZmYiLCJPYmplY3QiLCJrZXlzIiwiYWRkZWQiLCJsZW5ndGgiLCJ1cGRhdGVkIiwiZGVsZXRlZCIsImFkZFRvUXVldWVGb3JEaWZmZWRBbWVuZG1lbnRzIiwiZ2VuZXJhdGVEaWZmRmlsZXMiLCJtb2RlIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImVuY29kaW5nIiwiZmxhZyIsImZvckVhY2giLCJkaWZmZWRBbWVuZG1lbnQiLCJnZW5lcmF0ZVNpbmdsZURpZmZlZEFtZW5kbWVudCIsIm5ld0FtZW5kbWVudCIsImdlbmVyYXRlU2luZ2xlTmV3QW1lbmRtZW50IiwiZmlsZSIsImFtZW5kbWVudCIsImRhdGEiLCJwdXNoIiwiZGlmZmVkRGF0YSIsInNoaWZ0Iiwic2hvcnREaXIiLCJwb3AiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJyZXBsYWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvZGlmZl9hbWVuZGVtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGRldGFpbGVkRGlmZiB9IGZyb20gXCJkZWVwLW9iamVjdC1kaWZmXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBEYXRhc2V0U3RydWN0dXJlIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmNvbnN0IGRpZmZlZEFtZW5kbWVudHM6IEFycmF5PGFueT4gPSBbXVxuY29uc3QgbmV3QW1lbmRtZW50czogQXJyYXk8YW55PiA9IFtdXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInZcIixcbiAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJtXCIsXG4gICAgaGVscDogXCJEaWZmIG1vZGVzLlwiLFxuICAgIG5hbWU6IFwibW9kZVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJtZXJnZWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJwXCIsXG4gICAgaGVscDogXCJEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJldmlvdXMgZHVtcCBvZiBhbWVuZG1lbnRzXCIsXG4gICAgbmFtZTogXCJwcmV2aW91c1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIm9cIixcbiAgICBoZWxwOiBcIk91dHB1dCBkaXJlY3RvcnkgZm9yIGRpZmYgZmlsZXNcIixcbiAgICBuYW1lOiBcIm91dHB1dFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIuL2RpZmZfb3V0cHV0cy9cIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5jb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuZnVuY3Rpb24gZGlmZkFtZW5kZW1lbnRzKGRhdGFEaXI6IHN0cmluZykge1xuICBpZiAoIW9wdGlvbnMucHJldmlvdXMpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJObyBwcmV2aW91cyBkYXRhIGZvbGRlciBzcGVjaWZpZWQuIFlvdSBtdXN0IHByb3ZpZGUgb25lIHdpdGggdGhlIC1wIG9yIC0tcHJldmlvdXMgb3B0aW9uLiBFeGl0aW5nLi4uXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMob3B0aW9ucy5vdXRwdXQpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiVGhlIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3RzLiBZb3UgbXVzdCBwcm92aWRlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gRGVmYXVsdCBkaXJlY3RvcnkgaXMgLi9kaWZmX291dHB1dHMvXCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldC5maWxlbmFtZSlcbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBEaWZmaW5nICR7b3JpZ2luYWxKc29uRGlyfSBmb2xkZXIuLi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIob3JpZ2luYWxKc29uRGlyKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ZpbGVQYXRoID1cbiAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpciArIFwiL1wiICsgYW1lbmRlbWVudFNwbGl0UGF0aC5qb2luKFwiL1wiKVxuICAgICAgICAgIGNvbnN0IG5ld0ZpbGUgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKG5ld0ZpbGVQYXRoKS50b0xvY2FsZVN0cmluZygpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IG9sZEZpbGVQYXRoID1cbiAgICAgICAgICAgIG9wdGlvbnMucHJldmlvdXMgK1xuICAgICAgICAgICAgZGF0YXNldC5maWxlbmFtZSArXG4gICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoLmpvaW4oXCIvXCIpXG4gICAgICAgICAgY29uc3Qgb2xkRmlsZUV4aXN0cyA9IGZzLmV4aXN0c1N5bmMob2xkRmlsZVBhdGgpXG4gICAgICAgICAgaWYgKCFvbGRGaWxlRXhpc3RzKSB7XG4gICAgICAgICAgICAvLyBJZiBmaWxlIGZvdW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcmV2aW91cyBkdW1wXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIFwiRmlsZSBkaWQgbm90IGV4aXN0cyBwcmV2aW91c2x5LiBHdWVzc2luZyBpdCdzIGEgbmV3IGFtZW5kbWVudC4gQWRkaW5nIHRvIHRoZSBkaWZmIGxpc3QgZm9yIG5ldyBvYmplY3RzXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKG5ld0ZpbGUsIGFtZW5kZW1lbnRTcGxpdFBhdGgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbGUgYWxyZWFkeSBleGlzdGVkIGluIHByZXZpb3VzIGR1bXBcbiAgICAgICAgICBsZXQgb2xkRmlsZTogSlNPTiA9IEpTT04ucGFyc2UoXCJ7fVwiKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHYXRoZXIgZGF0YSBvZiB0aGUgZmlsZSBhbmQgcmV0cmFuc2NyaXB0IGFzIGEgSnNvbiBvYmplY3RcbiAgICAgICAgICAgIG9sZEZpbGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhvbGRGaWxlUGF0aCkudG9Mb2NhbGVTdHJpbmcoKSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwcm9jZXNzIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBpbiBjYXNlIG9mIGNvcnJ1cHQgSlNPTiBkYXRhXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBkaWZmIGJlZXR3ZWVuIHRoZSB0d28gSlNPTiBvYmplY3RzIChvbGQgJiBuZXcgZHVtcClcbiAgICAgICAgICBjb25zdCBkaWZmOiBhbnkgPSBkZXRhaWxlZERpZmYob2xkRmlsZSwgbmV3RmlsZSlcblxuICAgICAgICAgIC8vIElmIG5vIGNoYW5nZXMgYmVldHdlZW4gdGhlIHR3byBkdW1wc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuYWRkZWQpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi51cGRhdGVkKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpZmYuZGVsZXRlZCkubGVuZ3RoID09PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHRvIG5leHQgaXRlcmF0aW9uIGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaWxlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hhbmdlcyBmb3VuZCAhXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRUb1F1ZXVlRm9yRGlmZmVkQW1lbmRtZW50cyhkaWZmLCBhbWVuZGVtZW50U3BsaXRQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG91dHB1dChzKVwiKVxuICAgIH1cblxuICAgIGdlbmVyYXRlRGlmZkZpbGVzKClcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYWwgcHJvY2VzcyBmb3Igb3V0cHV0IG9mIGRpZmZzLlxuICogVGhlIHNjcmlwdCBoYW5kbGVzIHR3byBkaWZmZXJlbnQgbW9kZXMgOlxuICogLSBtZXJnZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBuZXcgYW1lbmRlbWVudHMgYW5kIGEgc2luZ2xlIGZpbGVcbiAqICAgICAgICAgICAgZm9yIHVwZGF0ZWQgYW1lbmRlbWVudHNcbiAqIC0gc3BsaXR0ZWQgOiBXaWxsIG91dHB1dCBhIHNpbmdsZSBmaWxlIGZvciBlYWNoIGFtZW5kbWVudHMsIGVpdGhlciBpdHMgbmV3IG9yIHVwZGF0ZWQuXG4gKlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURpZmZGaWxlcygpIHtcbiAgLy8gSGFuZGxlcyBtZXJnZWQgbW9kZVxuICBpZiAob3B0aW9ucy5tb2RlID09PSBcIm1lcmdlZFwiKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIG1lcmdlZCBmaWxlc1wiKVxuICAgIH1cblxuICAgIGlmIChkaWZmZWRBbWVuZG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIGRpZmZlZCBhbWVuZG1lbnRzIGZpbGVzXCIpXG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBvcHRpb25zLm91dHB1dCArIFwiYW1lbmRlbWVudHNfWFZfZGlmZmVkLmpzb25cIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGlmZmVkQW1lbmRtZW50cyksXG4gICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZGlmZiBpbiB0aGUgYWxyZWFkeSBleGlzdGluZyBhbWVuZG1lbnRzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld0FtZW5kbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGFtZW5kbWVudHMgZmlsZVwiKVxuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgKyBcImFtZW5kZW1lbnRzX1hWX25ldy5qc29uXCIsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudHMpLFxuICAgICAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vIG5ldyBhbWVuZGVtZW50LiBTa2lwcGluZyBmaWxlIGdlbmVyYXRpb25cIilcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5tb2RlID09PSBcInNwbGl0dGVkXCIpIHtcbiAgICAvLyBIYW5kbGVzIHNwbGl0dGVkIG1vZGVcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgc2VwYXJhdGVkIGZpbGVzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgY29weSBhY3Rpb24gb2YgdGhlIG5ldyBhbmQgZGlmZmVkIGFtZW5kbWVudHNcbiAgICAgKi9cblxuICAgIGRpZmZlZEFtZW5kbWVudHMuZm9yRWFjaCgoZGlmZmVkQW1lbmRtZW50OiBhbnkpID0+IHtcbiAgICAgIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudClcbiAgICB9KVxuXG4gICAgbmV3QW1lbmRtZW50cy5mb3JFYWNoKChuZXdBbWVuZG1lbnQ6IGFueSkgPT4ge1xuICAgICAgZ2VuZXJhdGVTaW5nbGVOZXdBbWVuZG1lbnQobmV3QW1lbmRtZW50KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcIlVua25vd24gb3V0cHV0IG1vZGUuIEFib3J0aW5nLi4uXCIpXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxufVxuXG4vLyBQdXNoZXMgYW4gYW1lbmRtZW50IHRvIHRoZSBxdWV1ZSB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNvcHkgbmV3IGFtZW5kbWVudHMgZmlsZXNcbmZ1bmN0aW9uIGFkZFRvUXVldWVGb3JOZXdBbWVuZG1lbnRzKGZpbGU6IGFueSwgcGF0aDogYW55KTogdm9pZCB7XG4gIGNvbnN0IGFtZW5kbWVudDogYW55ID0ge1xuICAgIHBhdGg6IHBhdGgsXG4gICAgZGF0YTogZmlsZSxcbiAgfVxuICBuZXdBbWVuZG1lbnRzLnB1c2goYW1lbmRtZW50KVxufVxuLy8gUHVzaGVzIGFuIGFtZW5kbWVudCB0byB0aGUgcXVldWUgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCB0byBjb3B5IHVwZGF0ZWQgYW1lbmRtZW50cyBmaWxlc1xuZnVuY3Rpb24gYWRkVG9RdWV1ZUZvckRpZmZlZEFtZW5kbWVudHMoZGlmZmVkRGF0YTogYW55LCBwYXRoOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgYW1lbmRtZW50OiBhbnkgPSB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBkYXRhOiBkaWZmZWREYXRhLFxuICB9XG4gIGRpZmZlZEFtZW5kbWVudHMucHVzaChhbWVuZG1lbnQpXG59XG5cbi8vIGdlbmVyYXRlcyBhIGZpbGUgd2l0aCBhIGNvcHkgb2YgdGhlIG5ldyBhbWVuZGVtZW50XG5mdW5jdGlvbiBnZW5lcmF0ZVNpbmdsZU5ld0FtZW5kbWVudChuZXdBbWVuZG1lbnQ6IHtcbiAgcGF0aDogQXJyYXk8c3RyaW5nPlxuICBkYXRhOiBhbnlcbn0pIHtcbiAgbmV3QW1lbmRtZW50LnBhdGguc2hpZnQoKVxuXG4gIGNvbnN0IHNob3J0RGlyOiBBcnJheTxhbnk+ID0gWy4uLm5ld0FtZW5kbWVudC5wYXRoXVxuICBzaG9ydERpci5wb3AoKVxuICBjb25zb2xlLmxvZyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpKVxuICBmcy5ta2RpclN5bmMob3B0aW9ucy5vdXRwdXQgKyBzaG9ydERpci5qb2luKFwiL1wiKSwge1xuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgfSlcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvcHRpb25zLm91dHB1dCArIG5ld0FtZW5kbWVudC5wYXRoLmpvaW4oXCIvXCIpLnJlcGxhY2UoLyhcXC5qc29uKS8sIFwiLm5ldyQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KG5ld0FtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG4vLyBnZW5lcmF0ZXMgYSBmaWxlIHdpdGggYSBjb3B5IG9mIHRoZSBtb2RpZmllZCBkYXRhIG9mIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGFtZW5kbWVudDtcbmZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50KGRpZmZlZEFtZW5kbWVudDoge1xuICBwYXRoOiBBcnJheTxzdHJpbmc+XG4gIGRhdGE6IGFueVxufSkge1xuICBkaWZmZWRBbWVuZG1lbnQucGF0aC5zaGlmdCgpXG5cbiAgY29uc3Qgc2hvcnREaXI6IEFycmF5PGFueT4gPSBbLi4uZGlmZmVkQW1lbmRtZW50LnBhdGhdXG4gIHNob3J0RGlyLnBvcCgpXG4gIGZzLm1rZGlyU3luYyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KVxuXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgb3B0aW9ucy5vdXRwdXQgK1xuICAgICAgZGlmZmVkQW1lbmRtZW50LnBhdGguam9pbihcIi9cIikucmVwbGFjZSgvKFxcLmpzb24pLywgXCIuZGlmZiQxXCIpLFxuICAgIEpTT04uc3RyaW5naWZ5KGRpZmZlZEFtZW5kbWVudC5kYXRhKSxcbiAgICB7IGVuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3XCIgfSxcbiAgKVxufVxuXG5kaWZmQW1lbmRlbWVudHMob3B0aW9ucy5kYXRhRGlyKVxuIl0sIm1hcHBpbmdz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