@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
@@ -13,7 +13,6 @@ import { Convert as AgendasConvert } from "../types/agendas.mjs";
13
13
  import { Convert as AmendementsConvert } from "../types/amendements.mjs";
14
14
  import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legislatifs.mjs";
15
15
  import { Convert as ScrutinsConvert } from "../types/scrutins.mjs";
16
-
17
16
  function parseArgs(argv) {
18
17
  const optionsDefinitions = [{
19
18
  alias: "C",
@@ -37,6 +36,12 @@ function parseArgs(argv) {
37
36
  multiple: true,
38
37
  name: "categories",
39
38
  type: String
39
+ }, {
40
+ alias: "l",
41
+ help: "legislatures of categories of datasets to retrieve",
42
+ multiple: true,
43
+ name: "legislature",
44
+ type: Number
40
45
  }, {
41
46
  alias: "r",
42
47
  help: "push commit to given remote",
@@ -68,7 +73,6 @@ function parseArgs(argv) {
68
73
  });
69
74
  return options;
70
75
  }
71
-
72
76
  function cleanReorganizedData(options) {
73
77
  const dataDir = options.dataDir;
74
78
  Date.prototype.toJSON = patchedDateToJson;
@@ -76,15 +80,19 @@ function cleanReorganizedData(options) {
76
80
  const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
77
81
  options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
78
82
  const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
79
-
83
+ let choosenDatasets = datasets;
84
+ if (options.legislature) {
85
+ const enabledLegislatures = options.legislature.map(legislature => legislature.toString());
86
+ for (let [key, value] of Object.entries(choosenDatasets)) {
87
+ choosenDatasets[key] = value.filter(dataset => enabledLegislatures.includes(dataset.legislature));
88
+ }
89
+ }
80
90
  if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
81
- for (const dataset of datasets.acteursEtOrganes) {
91
+ for (const dataset of choosenDatasets.acteursEtOrganes) {
82
92
  const datasetName = path.basename(dataset.filename, ".json");
83
-
84
93
  if (options.dataset && datasetName !== options.dataset) {
85
94
  continue;
86
95
  }
87
-
88
96
  if (gitGroupUrl !== undefined) {
89
97
  execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
90
98
  cwd: dataDir,
@@ -93,31 +101,26 @@ function cleanReorganizedData(options) {
93
101
  stdio: ["ignore", "ignore", "pipe"]
94
102
  });
95
103
  }
96
-
97
104
  analyzeAndRemove(datasetName, options);
98
105
  const datasetRawDir = path.join(dataDir, datasetName);
99
106
  const datasetCleanDir = datasetRawDir + "_nettoye";
100
-
101
107
  for (const acteurSplitPath of walkDir(datasetRawDir, ["acteurs"])) {
102
108
  const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
103
-
104
109
  if (!acteurFilename.endsWith(".json")) {
105
110
  continue;
106
111
  }
107
-
108
112
  const acteurRawFilePath = path.join(datasetRawDir, ...acteurSplitPath);
109
-
110
113
  if (options.verbose) {
111
114
  console.log(` Cleaning file: ${acteurRawFilePath}…`);
112
115
  }
113
-
114
116
  const acteurRawJson = fs.readFileSync(acteurRawFilePath, {
115
117
  encoding: "utf8"
116
118
  });
117
119
  const acteur = JSON.parse(acteurRawJson);
118
120
  cleanActeur(acteur);
119
- const acteurJson = JSON.stringify(acteur, null, 2); // Validate generated JSON.
121
+ const acteurJson = JSON.stringify(acteur, null, 2);
120
122
 
123
+ // Validate generated JSON.
121
124
  const acteurClean = ActeursEtOrganesConvert.toActeur(acteurJson);
122
125
  const acteurCleanJson = ActeursEtOrganesConvert.acteurToJson(acteurClean);
123
126
  const acteurCleanFilePath = path.join(datasetCleanDir, ...acteurSplitPath);
@@ -126,27 +129,23 @@ function cleanReorganizedData(options) {
126
129
  encoding: "utf8"
127
130
  });
128
131
  }
129
-
130
132
  for (const organeSplitPath of walkDir(datasetRawDir, ["organes"])) {
131
133
  const organeFilename = organeSplitPath[organeSplitPath.length - 1];
132
-
133
134
  if (!organeFilename.endsWith(".json")) {
134
135
  continue;
135
136
  }
136
-
137
137
  const organeRawFilePath = path.join(datasetRawDir, ...organeSplitPath);
138
-
139
138
  if (options.verbose) {
140
139
  console.log(` Cleaning file: ${organeRawFilePath}…`);
141
140
  }
142
-
143
141
  const organeRawJson = fs.readFileSync(organeRawFilePath, {
144
142
  encoding: "utf8"
145
143
  });
146
144
  const organe = JSON.parse(organeRawJson);
147
145
  cleanOrgane(organe);
148
- const organeJson = JSON.stringify(organe, null, 2); // Validate generated JSON.
146
+ const organeJson = JSON.stringify(organe, null, 2);
149
147
 
148
+ // Validate generated JSON.
150
149
  const organeClean = ActeursEtOrganesConvert.toOrgane(organeJson);
151
150
  const organeCleanJson = ActeursEtOrganesConvert.organeToJson(organeClean);
152
151
  const organeCleanFilePath = path.join(datasetCleanDir, ...organeSplitPath);
@@ -155,25 +154,20 @@ function cleanReorganizedData(options) {
155
154
  encoding: "utf8"
156
155
  });
157
156
  }
158
-
159
157
  if (commitAndPush(datasetCleanDir, options, options.remote)) {
160
158
  error = true;
161
159
  }
162
-
163
160
  if (commitAndPushUid(datasetCleanDir, options, ["acteurs", "organes"])) {
164
161
  error = true;
165
162
  }
166
163
  }
167
164
  }
168
-
169
165
  if (enabledDatasets & EnabledDatasets.Agendas) {
170
- for (const dataset of datasets.agendas) {
166
+ for (const dataset of choosenDatasets.agendas) {
171
167
  const datasetName = path.basename(dataset.filename, ".json");
172
-
173
168
  if (options.dataset && datasetName !== options.dataset) {
174
169
  continue;
175
170
  }
176
-
177
171
  if (gitGroupUrl !== undefined) {
178
172
  execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
179
173
  cwd: dataDir,
@@ -182,31 +176,26 @@ function cleanReorganizedData(options) {
182
176
  stdio: ["ignore", "ignore", "pipe"]
183
177
  });
184
178
  }
185
-
186
179
  analyzeAndRemove(datasetName, options);
187
180
  const datasetRawDir = path.join(dataDir, datasetName);
188
181
  const datasetCleanDir = datasetRawDir + "_nettoye";
189
-
190
182
  for (const reunionSplitPath of walkDir(datasetRawDir)) {
191
183
  const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
192
-
193
184
  if (!reunionFilename.endsWith(".json")) {
194
185
  continue;
195
186
  }
196
-
197
187
  const reunionRawFilePath = path.join(datasetRawDir, ...reunionSplitPath);
198
-
199
188
  if (options.verbose) {
200
189
  console.log(` Cleaning file: ${reunionRawFilePath}…`);
201
190
  }
202
-
203
191
  const reunionRawJson = fs.readFileSync(reunionRawFilePath, {
204
192
  encoding: "utf8"
205
193
  });
206
194
  const reunion = JSON.parse(reunionRawJson);
207
195
  cleanReunion(reunion);
208
- const reunionJson = JSON.stringify(reunion, null, 2); // Validate generated JSON.
196
+ const reunionJson = JSON.stringify(reunion, null, 2);
209
197
 
198
+ // Validate generated JSON.
210
199
  const reunionClean = AgendasConvert.toReunion(reunionJson);
211
200
  const reunionCleanJson = AgendasConvert.reunionToJson(reunionClean);
212
201
  const reunionCleanFilePath = path.join(datasetCleanDir, ...reunionSplitPath);
@@ -215,25 +204,20 @@ function cleanReorganizedData(options) {
215
204
  encoding: "utf8"
216
205
  });
217
206
  }
218
-
219
207
  if (commitAndPush(datasetCleanDir, options, options.remote)) {
220
208
  error = true;
221
209
  }
222
-
223
210
  if (commitAndPushUid(datasetCleanDir, options, ["."])) {
224
211
  error = true;
225
212
  }
226
213
  }
227
214
  }
228
-
229
215
  if (enabledDatasets & EnabledDatasets.Amendements) {
230
- for (const dataset of datasets.amendements) {
216
+ for (const dataset of choosenDatasets.amendements) {
231
217
  const datasetName = path.basename(dataset.filename, ".json");
232
-
233
218
  if (options.dataset && datasetName !== options.dataset) {
234
219
  continue;
235
220
  }
236
-
237
221
  if (gitGroupUrl !== undefined) {
238
222
  execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
239
223
  cwd: dataDir,
@@ -242,31 +226,26 @@ function cleanReorganizedData(options) {
242
226
  stdio: ["ignore", "ignore", "pipe"]
243
227
  });
244
228
  }
245
-
246
229
  analyzeAndRemove(datasetName, options);
247
230
  const datasetRawDir = path.join(dataDir, datasetName);
248
231
  const datasetCleanDir = datasetRawDir + "_nettoye";
249
-
250
232
  for (const amendementSplitPath of walkDir(datasetRawDir)) {
251
233
  const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
252
-
253
234
  if (!amendementFilename.endsWith(".json")) {
254
235
  continue;
255
236
  }
256
-
257
237
  const amendementRawFilePath = path.join(datasetRawDir, ...amendementSplitPath);
258
-
259
238
  if (options.verbose) {
260
239
  console.log(` Cleaning file: ${amendementRawFilePath}…`);
261
240
  }
262
-
263
241
  const amendementRawJson = fs.readFileSync(amendementRawFilePath, {
264
242
  encoding: "utf8"
265
243
  });
266
244
  const amendement = JSON.parse(amendementRawJson);
267
245
  cleanAmendement(amendement);
268
- const amendementJson = JSON.stringify(amendement, null, 2); // Validate generated JSON.
246
+ const amendementJson = JSON.stringify(amendement, null, 2);
269
247
 
248
+ // Validate generated JSON.
270
249
  const amendementClean = AmendementsConvert.toAmendement(amendementJson);
271
250
  const amendementCleanJson = AmendementsConvert.amendementToJson(amendementClean);
272
251
  const amendementCleanFilePath = path.join(datasetCleanDir, ...amendementSplitPath);
@@ -275,25 +254,20 @@ function cleanReorganizedData(options) {
275
254
  encoding: "utf8"
276
255
  });
277
256
  }
278
-
279
257
  if (commitAndPush(datasetCleanDir, options, options.remote)) {
280
258
  error = true;
281
259
  }
282
-
283
260
  if (commitAndPushUid(datasetCleanDir, options, ["."])) {
284
261
  error = true;
285
262
  }
286
263
  }
287
264
  }
288
-
289
265
  if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
290
- for (const dataset of datasets.dossiersLegislatifs) {
266
+ for (const dataset of choosenDatasets.dossiersLegislatifs) {
291
267
  const datasetName = path.basename(dataset.filename, ".json");
292
-
293
268
  if (options.dataset && datasetName !== options.dataset) {
294
269
  continue;
295
270
  }
296
-
297
271
  if (gitGroupUrl !== undefined) {
298
272
  execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
299
273
  cwd: dataDir,
@@ -302,31 +276,26 @@ function cleanReorganizedData(options) {
302
276
  stdio: ["ignore", "ignore", "pipe"]
303
277
  });
304
278
  }
305
-
306
279
  analyzeAndRemove(datasetName, options);
307
280
  const datasetRawDir = path.join(dataDir, datasetName);
308
281
  const datasetCleanDir = datasetRawDir + "_nettoye";
309
-
310
282
  for (const documentSplitPath of walkDir(datasetRawDir, ["documents"])) {
311
283
  const documentFilename = documentSplitPath[documentSplitPath.length - 1];
312
-
313
284
  if (!documentFilename.endsWith(".json")) {
314
285
  continue;
315
286
  }
316
-
317
287
  const documentRawFilePath = path.join(datasetRawDir, ...documentSplitPath);
318
-
319
288
  if (options.verbose) {
320
289
  console.log(` Cleaning file: ${documentRawFilePath}…`);
321
290
  }
322
-
323
291
  const documentRawJson = fs.readFileSync(documentRawFilePath, {
324
292
  encoding: "utf8"
325
293
  });
326
294
  const document = JSON.parse(documentRawJson);
327
295
  cleanDocumentOrDivision(document);
328
- const documentJson = JSON.stringify(document, null, 2); // Validate generated JSON.
296
+ const documentJson = JSON.stringify(document, null, 2);
329
297
 
298
+ // Validate generated JSON.
330
299
  const documentClean = DossiersLegislatifsConvert.toDocument(documentJson);
331
300
  const documentCleanJson = DossiersLegislatifsConvert.documentToJson(documentClean);
332
301
  const documentCleanFilePath = path.join(datasetCleanDir, ...documentSplitPath);
@@ -335,27 +304,23 @@ function cleanReorganizedData(options) {
335
304
  encoding: "utf8"
336
305
  });
337
306
  }
338
-
339
307
  for (const dossierSplitPath of walkDir(datasetRawDir, ["dossiers"])) {
340
308
  const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
341
-
342
309
  if (!dossierFilename.endsWith(".json")) {
343
310
  continue;
344
311
  }
345
-
346
312
  const dossierRawFilePath = path.join(datasetRawDir, ...dossierSplitPath);
347
-
348
313
  if (options.verbose) {
349
314
  console.log(` Cleaning file: ${dossierRawFilePath}…`);
350
315
  }
351
-
352
316
  const dossierRawJson = fs.readFileSync(dossierRawFilePath, {
353
317
  encoding: "utf8"
354
318
  });
355
319
  const dossier = JSON.parse(dossierRawJson);
356
320
  cleanDossierParlementaire(dossier);
357
- const dossierJson = JSON.stringify(dossier, null, 2); // Validate generated JSON.
321
+ const dossierJson = JSON.stringify(dossier, null, 2);
358
322
 
323
+ // Validate generated JSON.
359
324
  const dossierClean = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
360
325
  const dossierCleanJson = DossiersLegislatifsConvert.dossierParlementaireToJson(dossierClean);
361
326
  const dossierCleanFilePath = path.join(datasetCleanDir, ...dossierSplitPath);
@@ -364,25 +329,20 @@ function cleanReorganizedData(options) {
364
329
  encoding: "utf8"
365
330
  });
366
331
  }
367
-
368
332
  if (commitAndPush(datasetCleanDir, options, options.remote)) {
369
333
  error = true;
370
334
  }
371
-
372
335
  if (commitAndPushUid(datasetCleanDir, options, ["documents", "dossiers"])) {
373
336
  error = true;
374
337
  }
375
338
  }
376
339
  }
377
-
378
340
  if (enabledDatasets & EnabledDatasets.Scrutins) {
379
- for (const dataset of datasets.scrutins) {
341
+ for (const dataset of choosenDatasets.scrutins) {
380
342
  const datasetName = path.basename(dataset.filename, ".json");
381
-
382
343
  if (options.dataset && datasetName !== options.dataset) {
383
344
  continue;
384
345
  }
385
-
386
346
  if (gitGroupUrl !== undefined) {
387
347
  execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
388
348
  cwd: dataDir,
@@ -391,31 +351,26 @@ function cleanReorganizedData(options) {
391
351
  stdio: ["ignore", "ignore", "pipe"]
392
352
  });
393
353
  }
394
-
395
354
  analyzeAndRemove(datasetName, options);
396
355
  const datasetRawDir = path.join(dataDir, datasetName);
397
356
  const datasetCleanDir = datasetRawDir + "_nettoye";
398
-
399
357
  for (const scrutinSplitPath of walkDir(datasetRawDir)) {
400
358
  const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
401
-
402
359
  if (!scrutinFilename.endsWith(".json")) {
403
360
  continue;
404
361
  }
405
-
406
362
  const scrutinRawFilePath = path.join(datasetRawDir, ...scrutinSplitPath);
407
-
408
363
  if (options.verbose) {
409
364
  console.log(` Cleaning file: ${scrutinRawFilePath}…`);
410
365
  }
411
-
412
366
  const scrutinRawJson = fs.readFileSync(scrutinRawFilePath, {
413
367
  encoding: "utf8"
414
368
  });
415
369
  const scrutin = JSON.parse(scrutinRawJson);
416
370
  cleanScrutin(scrutin);
417
- const scrutinJson = JSON.stringify(scrutin, null, 2); // Validate generated JSON.
371
+ const scrutinJson = JSON.stringify(scrutin, null, 2);
418
372
 
373
+ // Validate generated JSON.
419
374
  const scrutinClean = ScrutinsConvert.toScrutin(scrutinJson);
420
375
  const scrutinCleanJson = ScrutinsConvert.scrutinToJson(scrutinClean);
421
376
  const scrutinCleanFilePath = path.join(datasetCleanDir, ...scrutinSplitPath);
@@ -424,49 +379,39 @@ function cleanReorganizedData(options) {
424
379
  encoding: "utf8"
425
380
  });
426
381
  }
427
-
428
382
  if (commitAndPush(datasetCleanDir, options, options.remote)) {
429
383
  error = true;
430
384
  }
431
-
432
385
  if (commitAndPushUid(datasetCleanDir, options, ["."])) {
433
386
  error = true;
434
387
  }
435
388
  }
436
- } // Restore standard conversion of dates to JSON.
437
-
389
+ }
438
390
 
391
+ // Restore standard conversion of dates to JSON.
439
392
  Date.prototype.toJSON = existingDateToJson;
440
393
  return error;
441
394
  }
442
-
443
395
  function analyzeAndRemove(datasetName, options) {
444
396
  const dataDir = options.dataDir;
445
397
  const datasetRawDir = path.join(dataDir, datasetName);
446
398
  const datasetCleanDir = datasetRawDir + "_nettoye";
447
-
448
399
  if (!options.silent) {
449
400
  console.log(`Cleaning directory: ${datasetCleanDir}…`);
450
401
  }
451
-
452
402
  fs.ensureDirSync(datasetCleanDir);
453
-
454
403
  for (const filename of fs.readdirSync(datasetCleanDir)) {
455
404
  if (filename[0] === ".") {
456
405
  continue;
457
406
  }
458
-
459
407
  const pathname = path.join(datasetCleanDir, filename);
460
408
  fs.removeSync(pathname);
461
409
  }
462
410
  }
463
-
464
411
  function commitAndPush(repositoryDir, options, remotes) {
465
412
  let error = false;
466
-
467
413
  if (options.commit) {
468
414
  git.commit(repositoryDir, "Nouvelle moisson");
469
-
470
415
  for (const remote of remotes || []) {
471
416
  try {
472
417
  execSync(`git push ${remote} master`, {
@@ -482,16 +427,12 @@ function commitAndPush(repositoryDir, options, remotes) {
482
427
  }
483
428
  }
484
429
  }
485
-
486
430
  return error;
487
431
  }
488
-
489
432
  function commitAndPushUid(repositoryDir, options, subdirectories) {
490
433
  let error = false;
491
-
492
434
  if (options.commit) {
493
435
  git.uidBranchUpdate(repositoryDir, subdirectories, options["no-reset-after-commit"]);
494
-
495
436
  for (const remote of options.remote || []) {
496
437
  try {
497
438
  git.run(repositoryDir, `push --quiet ${remote} uid:uid`);
@@ -500,21 +441,17 @@ function commitAndPushUid(repositoryDir, options, subdirectories) {
500
441
  }
501
442
  }
502
443
  }
503
-
504
444
  return error;
505
445
  }
506
-
507
446
  function main(argv) {
508
447
  const options = parseArgs(argv);
509
-
510
448
  if (cleanReorganizedData(options)) {
511
449
  return 1;
512
450
  } else {
513
451
  return 0;
514
452
  }
515
453
  }
516
- /* istanbul ignore if */
517
-
518
454
 
455
+ /* istanbul ignore if */
519
456
  if (process.argv[1].endsWith("clean_reorganized_data.ts")) process.exit(main(process.argv));
520
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJkYXRhc2V0cyIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJlcnJvciIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsImNhdGVnb3JpZXMiLCJtYXAiLCJkYXRhc2V0TmFtZSIsIm5vdFN0cmljdEVxdWFsIiwiZW5hYmxlZERhdGFzZXRzIiwicmVkdWNlIiwiTm9uZSIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJkYXRhc2V0IiwiYWN0ZXVyc0V0T3JnYW5lcyIsImJhc2VuYW1lIiwiZmlsZW5hbWUiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImFuYWx5emVBbmRSZW1vdmUiLCJkYXRhc2V0UmF3RGlyIiwiam9pbiIsImRhdGFzZXRDbGVhbkRpciIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJhY3RldXJSYXdGaWxlUGF0aCIsInZlcmJvc2UiLCJjb25zb2xlIiwibG9nIiwiYWN0ZXVyUmF3SnNvbiIsInJlYWRGaWxlU3luYyIsImFjdGV1ciIsIkpTT04iLCJwYXJzZSIsImFjdGV1ckpzb24iLCJzdHJpbmdpZnkiLCJhY3RldXJDbGVhbiIsInRvQWN0ZXVyIiwiYWN0ZXVyQ2xlYW5Kc29uIiwiYWN0ZXVyVG9Kc29uIiwiYWN0ZXVyQ2xlYW5GaWxlUGF0aCIsImVuc3VyZURpclN5bmMiLCJkaXJuYW1lIiwid3JpdGVGaWxlU3luYyIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lUmF3RmlsZVBhdGgiLCJvcmdhbmVSYXdKc29uIiwib3JnYW5lIiwib3JnYW5lSnNvbiIsIm9yZ2FuZUNsZWFuIiwidG9PcmdhbmUiLCJvcmdhbmVDbGVhbkpzb24iLCJvcmdhbmVUb0pzb24iLCJvcmdhbmVDbGVhbkZpbGVQYXRoIiwiY29tbWl0QW5kUHVzaCIsInJlbW90ZSIsImNvbW1pdEFuZFB1c2hVaWQiLCJBZ2VuZGFzIiwiYWdlbmRhcyIsInJldW5pb25TcGxpdFBhdGgiLCJyZXVuaW9uRmlsZW5hbWUiLCJyZXVuaW9uUmF3RmlsZVBhdGgiLCJyZXVuaW9uUmF3SnNvbiIsInJldW5pb24iLCJyZXVuaW9uSnNvbiIsInJldW5pb25DbGVhbiIsInRvUmV1bmlvbiIsInJldW5pb25DbGVhbkpzb24iLCJyZXVuaW9uVG9Kc29uIiwicmV1bmlvbkNsZWFuRmlsZVBhdGgiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRSYXdGaWxlUGF0aCIsImFtZW5kZW1lbnRSYXdKc29uIiwiYW1lbmRlbWVudCIsImFtZW5kZW1lbnRKc29uIiwiYW1lbmRlbWVudENsZWFuIiwidG9BbWVuZGVtZW50IiwiYW1lbmRlbWVudENsZWFuSnNvbiIsImFtZW5kZW1lbnRUb0pzb24iLCJhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnRTcGxpdFBhdGgiLCJkb2N1bWVudEZpbGVuYW1lIiwiZG9jdW1lbnRSYXdGaWxlUGF0aCIsImRvY3VtZW50UmF3SnNvbiIsImRvY3VtZW50IiwiZG9jdW1lbnRKc29uIiwiZG9jdW1lbnRDbGVhbiIsInRvRG9jdW1lbnQiLCJkb2N1bWVudENsZWFuSnNvbiIsImRvY3VtZW50VG9Kc29uIiwiZG9jdW1lbnRDbGVhbkZpbGVQYXRoIiwiZG9zc2llclNwbGl0UGF0aCIsImRvc3NpZXJGaWxlbmFtZSIsImRvc3NpZXJSYXdGaWxlUGF0aCIsImRvc3NpZXJSYXdKc29uIiwiZG9zc2llciIsImRvc3NpZXJKc29uIiwiZG9zc2llckNsZWFuIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXJDbGVhbkpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZVRvSnNvbiIsImRvc3NpZXJDbGVhbkZpbGVQYXRoIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluUmF3RmlsZVBhdGgiLCJzY3J1dGluUmF3SnNvbiIsInNjcnV0aW4iLCJzY3J1dGluSnNvbiIsInNjcnV0aW5DbGVhbiIsInRvU2NydXRpbiIsInNjcnV0aW5DbGVhbkpzb24iLCJzY3J1dGluVG9Kc29uIiwic2NydXRpbkNsZWFuRmlsZVBhdGgiLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJyZW1vdGVzIiwiY29tbWl0IiwiY2hpbGRQcm9jZXNzIiwib3V0cHV0Iiwic3ViZGlyZWN0b3JpZXMiLCJ1aWRCcmFuY2hVcGRhdGUiLCJydW4iLCJtYWluIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL2NsZWFuX3Jlb3JnYW5pemVkX2RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCB7XG4gIGNsZWFuQWN0ZXVyLFxuICBjbGVhbkFtZW5kZW1lbnQsXG4gIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICBjbGVhbk9yZ2FuZSxcbiAgY2xlYW5SZXVuaW9uLFxuICBjbGVhblNjcnV0aW4sXG59IGZyb20gXCIuLi9jbGVhbmVyc1wiXG5pbXBvcnQgeyBkYXRhc2V0cywgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGFsaWFzOiBcIkNcIixcbiAgICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgICAgbmFtZTogXCJjbG9uZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiY1wiLFxuICAgICAgaGVscDogXCJjb21taXQgY2xlYW4gZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImtcIixcbiAgICAgIGRlZmF1bHRWYWx1ZTogW1wiQWxsXCJdLFxuICAgICAgaGVscDogXCJjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJjYXRlZ29yaWVzXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJyXCIsXG4gICAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwic1wiLFxuICAgICAgaGVscDogXCJkb24ndCBsb2cgYW55dGhpbmdcIixcbiAgICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVscDogXCJkbyBub3QgcmVzZXQgLS1oYXJkIGFmdGVyIGNvbW1pdCB0byBzYXZlIEkvTyBpZiB0aGUgd29ya2luZyB0cmVlIGlzIHRvIGJlIGRpc2NhcmRlZFwiLFxuICAgICAgbmFtZTogXCJuby1yZXNldC1hZnRlci1jb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJ2XCIsXG4gICAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIG9wdGlvbnMuY2F0ZWdvcmllcy5tYXAoKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBVbmtub3duIG5hbWUgb2YgZGF0YXNldDogJHtkYXRhc2V0TmFtZX1gLFxuICAgICksXG4gIClcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gb3B0aW9ucy5jYXRlZ29yaWVzLnJlZHVjZShcbiAgICAoZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsIGRhdGFzZXROYW1lOiBzdHJpbmcpOiBFbmFibGVkRGF0YXNldHMgPT5cbiAgICAgIGVuYWJsZWREYXRhc2V0cyB8XG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgIEVuYWJsZWREYXRhc2V0cy5Ob25lLFxuICApXG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJhY3RldXJzXCJdKSkge1xuICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5hY3RldXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2FjdGV1clJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFjdGV1clJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RldXIgPSBKU09OLnBhcnNlKGFjdGV1clJhd0pzb24pXG4gICAgICAgIGNsZWFuQWN0ZXVyKGFjdGV1cilcbiAgICAgICAgY29uc3QgYWN0ZXVySnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbjogQWN0ZXVyID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIoYWN0ZXVySnNvbilcbiAgICAgICAgY29uc3QgYWN0ZXVyQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LmFjdGV1clRvSnNvbihhY3RldXJDbGVhbilcblxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShhY3RldXJDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhhY3RldXJDbGVhbkZpbGVQYXRoLCBhY3RldXJDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgb3JnYW5lU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wib3JnYW5lc1wiXSkpIHtcbiAgICAgICAgY29uc3Qgb3JnYW5lRmlsZW5hbWUgPSBvcmdhbmVTcGxpdFBhdGhbb3JnYW5lU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghb3JnYW5lRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ub3JnYW5lU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtvcmdhbmVSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yZ2FuZVJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhvcmdhbmVSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgb3JnYW5lID0gSlNPTi5wYXJzZShvcmdhbmVSYXdKc29uKVxuICAgICAgICBjbGVhbk9yZ2FuZShvcmdhbmUpXG4gICAgICAgIGNvbnN0IG9yZ2FuZUpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW46IE9yZ2FuZSA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvT3JnYW5lKG9yZ2FuZUpzb24pXG4gICAgICAgIGNvbnN0IG9yZ2FuZUNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5vcmdhbmVUb0pzb24ob3JnYW5lQ2xlYW4pXG5cbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUob3JnYW5lQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMob3JnYW5lQ2xlYW5GaWxlUGF0aCwgb3JnYW5lQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiYWN0ZXVyc1wiLCBcIm9yZ2FuZXNcIl0pKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9IHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ucmV1bmlvblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7cmV1bmlvblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhyZXVuaW9uUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJldW5pb24gPSBKU09OLnBhcnNlKHJldW5pb25SYXdKc29uKVxuICAgICAgICBjbGVhblJldW5pb24ocmV1bmlvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJldW5pb24sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbjogUmV1bmlvbiA9IEFnZW5kYXNDb252ZXJ0LnRvUmV1bmlvbihyZXVuaW9uSnNvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBZ2VuZGFzQ29udmVydC5yZXVuaW9uVG9Kc29uKHJldW5pb25DbGVhbilcblxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKHJldW5pb25DbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXVuaW9uQ2xlYW5GaWxlUGF0aCwgcmV1bmlvbkNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEZpbGVuYW1lID1cbiAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoW2FtZW5kZW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhbWVuZGVtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHthbWVuZGVtZW50UmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgIGFtZW5kZW1lbnRSYXdGaWxlUGF0aCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gSlNPTi5wYXJzZShhbWVuZGVtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5BbWVuZGVtZW50KGFtZW5kZW1lbnQpXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50LCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW46IEFtZW5kZW1lbnQgPVxuICAgICAgICAgIEFtZW5kZW1lbnRzQ29udmVydC50b0FtZW5kZW1lbnQoYW1lbmRlbWVudEpzb24pXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LmFtZW5kZW1lbnRUb0pzb24oYW1lbmRlbWVudENsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoYW1lbmRlbWVudENsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoLCBhbWVuZGVtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImRvY3VtZW50c1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9IGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudFJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7ZG9jdW1lbnRSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvY3VtZW50UmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gSlNPTi5wYXJzZShkb2N1bWVudFJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uKGRvY3VtZW50KVxuICAgICAgICBjb25zdCBkb2N1bWVudEpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50LCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuOiBEb2N1bWVudCA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudEpzb24pXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvY3VtZW50VG9Kc29uKGRvY3VtZW50Q2xlYW4pXG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvY3VtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGRvY3VtZW50Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZG9jdW1lbnRDbGVhbkZpbGVQYXRoLCBkb2N1bWVudENsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkb3NzaWVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9zc2llcnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGRvc3NpZXJGaWxlbmFtZSA9IGRvc3NpZXJTcGxpdFBhdGhbZG9zc2llclNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWRvc3NpZXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uZG9zc2llclNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7ZG9zc2llclJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9zc2llclJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhkb3NzaWVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRvc3NpZXIgPSBKU09OLnBhcnNlKGRvc3NpZXJSYXdKc29uKVxuICAgICAgICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXIpXG4gICAgICAgIGNvbnN0IGRvc3NpZXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkb3NzaWVyLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW46IERvc3NpZXJQYXJsZW1lbnRhaXJlID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXJKc29uKVxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uKGRvc3NpZXJDbGVhbilcblxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5kb3NzaWVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGRvc3NpZXJDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb3NzaWVyQ2xlYW5GaWxlUGF0aCwgZG9zc2llckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJkb2N1bWVudHNcIiwgXCJkb3NzaWVyc1wiXSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlbmFtZSA9IHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uc2NydXRpblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7c2NydXRpblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhzY3J1dGluUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHNjcnV0aW4gPSBKU09OLnBhcnNlKHNjcnV0aW5SYXdKc29uKVxuICAgICAgICBjbGVhblNjcnV0aW4oc2NydXRpbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHNjcnV0aW4sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbjogU2NydXRpbiA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4oc2NydXRpbkpzb24pXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgU2NydXRpbnNDb252ZXJ0LnNjcnV0aW5Ub0pzb24oc2NydXRpbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoc2NydXRpbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHNjcnV0aW5DbGVhbkZpbGVQYXRoLCBzY3J1dGluQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBDbGVhbmluZyBkaXJlY3Rvcnk6ICR7ZGF0YXNldENsZWFuRGlyfeKApmApXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldENsZWFuRGlyKSkge1xuICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5qb2luKGRhdGFzZXRDbGVhbkRpciwgZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhwYXRobmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC5jb21taXQocmVwb3NpdG9yeURpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIpXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2hVaWQoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICBzdWJkaXJlY3RvcmllczogYW55LFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC51aWRCcmFuY2hVcGRhdGUoXG4gICAgICByZXBvc2l0b3J5RGlyLFxuICAgICAgc3ViZGlyZWN0b3JpZXMsXG4gICAgICBvcHRpb25zW1wibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCJdLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiBvcHRpb25zLnJlbW90ZSB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2l0LnJ1bihyZXBvc2l0b3J5RGlyLCBgcHVzaCAtLXF1aWV0ICR7cmVtb3RlfSB1aWQ6dWlkYClcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogbnVtYmVyIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICBpZiAoY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9ucykpIHtcbiAgICByZXR1cm4gMVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAwXG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50c1wiKSlcbiAgcHJvY2Vzcy5leGl0KG1haW4ocHJvY2Vzcy5hcmd2KSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBUCxNQUFtQixRQUFuQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsZUFBekI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLEVBQVAsTUFBZSxVQUFmO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixNQUFqQjtTQUdFQyxXLEVBQ0FDLGUsRUFDQUMsdUIsRUFDQUMseUIsRUFDQUMsVyxFQUNBQyxZLEVBQ0FDLFk7U0FFT0MsUSxFQUFVQyxlO1NBQ1ZDLGtCLEVBQW9CQyxpQjtTQUNwQkMsTztPQUNGLEtBQUtDLEc7U0FHVkMsT0FBTyxJQUFJQyx1QjtTQUdKRCxPQUFPLElBQUlFLGM7U0FDQ0YsT0FBTyxJQUFJRyxrQjtTQUU5QkgsT0FBTyxJQUFJSSwwQjtTQUlKSixPQUFPLElBQUlLLGU7O0FBRXBCLFNBQVNDLFNBQVQsQ0FBbUJDLElBQW5CLEVBQXdDO0VBQ3RDLE1BQU1DLGtCQUFrQixHQUFHLENBQ3pC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
457
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJkYXRhc2V0cyIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJOdW1iZXIiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJlcnJvciIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsImNhdGVnb3JpZXMiLCJtYXAiLCJkYXRhc2V0TmFtZSIsIm5vdFN0cmljdEVxdWFsIiwiZW5hYmxlZERhdGFzZXRzIiwicmVkdWNlIiwiTm9uZSIsImNob29zZW5EYXRhc2V0cyIsImxlZ2lzbGF0dXJlIiwiZW5hYmxlZExlZ2lzbGF0dXJlcyIsInRvU3RyaW5nIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmlsdGVyIiwiZGF0YXNldCIsImluY2x1ZGVzIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImFjdGV1cnNFdE9yZ2FuZXMiLCJiYXNlbmFtZSIsImZpbGVuYW1lIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJhbmFseXplQW5kUmVtb3ZlIiwiZGF0YXNldFJhd0RpciIsImpvaW4iLCJkYXRhc2V0Q2xlYW5EaXIiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImxlbmd0aCIsImVuZHNXaXRoIiwiYWN0ZXVyUmF3RmlsZVBhdGgiLCJ2ZXJib3NlIiwiY29uc29sZSIsImxvZyIsImFjdGV1clJhd0pzb24iLCJyZWFkRmlsZVN5bmMiLCJhY3RldXIiLCJKU09OIiwicGFyc2UiLCJhY3RldXJKc29uIiwic3RyaW5naWZ5IiwiYWN0ZXVyQ2xlYW4iLCJ0b0FjdGV1ciIsImFjdGV1ckNsZWFuSnNvbiIsImFjdGV1clRvSnNvbiIsImFjdGV1ckNsZWFuRmlsZVBhdGgiLCJlbnN1cmVEaXJTeW5jIiwiZGlybmFtZSIsIndyaXRlRmlsZVN5bmMiLCJvcmdhbmVTcGxpdFBhdGgiLCJvcmdhbmVGaWxlbmFtZSIsIm9yZ2FuZVJhd0ZpbGVQYXRoIiwib3JnYW5lUmF3SnNvbiIsIm9yZ2FuZSIsIm9yZ2FuZUpzb24iLCJvcmdhbmVDbGVhbiIsInRvT3JnYW5lIiwib3JnYW5lQ2xlYW5Kc29uIiwib3JnYW5lVG9Kc29uIiwib3JnYW5lQ2xlYW5GaWxlUGF0aCIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJjb21taXRBbmRQdXNoVWlkIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvblJhd0ZpbGVQYXRoIiwicmV1bmlvblJhd0pzb24iLCJyZXVuaW9uIiwicmV1bmlvbkpzb24iLCJyZXVuaW9uQ2xlYW4iLCJ0b1JldW5pb24iLCJyZXVuaW9uQ2xlYW5Kc29uIiwicmV1bmlvblRvSnNvbiIsInJldW5pb25DbGVhbkZpbGVQYXRoIiwiQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50cyIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50UmF3RmlsZVBhdGgiLCJhbWVuZGVtZW50UmF3SnNvbiIsImFtZW5kZW1lbnQiLCJhbWVuZGVtZW50SnNvbiIsImFtZW5kZW1lbnRDbGVhbiIsInRvQW1lbmRlbWVudCIsImFtZW5kZW1lbnRDbGVhbkpzb24iLCJhbWVuZGVtZW50VG9Kc29uIiwiYW1lbmRlbWVudENsZWFuRmlsZVBhdGgiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50UmF3RmlsZVBhdGgiLCJkb2N1bWVudFJhd0pzb24iLCJkb2N1bWVudCIsImRvY3VtZW50SnNvbiIsImRvY3VtZW50Q2xlYW4iLCJ0b0RvY3VtZW50IiwiZG9jdW1lbnRDbGVhbkpzb24iLCJkb2N1bWVudFRvSnNvbiIsImRvY3VtZW50Q2xlYW5GaWxlUGF0aCIsImRvc3NpZXJTcGxpdFBhdGgiLCJkb3NzaWVyRmlsZW5hbWUiLCJkb3NzaWVyUmF3RmlsZVBhdGgiLCJkb3NzaWVyUmF3SnNvbiIsImRvc3NpZXIiLCJkb3NzaWVySnNvbiIsImRvc3NpZXJDbGVhbiIsInRvRG9zc2llclBhcmxlbWVudGFpcmUiLCJkb3NzaWVyQ2xlYW5Kc29uIiwiZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24iLCJkb3NzaWVyQ2xlYW5GaWxlUGF0aCIsIlNjcnV0aW5zIiwic2NydXRpbnMiLCJzY3J1dGluU3BsaXRQYXRoIiwic2NydXRpbkZpbGVuYW1lIiwic2NydXRpblJhd0ZpbGVQYXRoIiwic2NydXRpblJhd0pzb24iLCJzY3J1dGluIiwic2NydXRpbkpzb24iLCJzY3J1dGluQ2xlYW4iLCJ0b1NjcnV0aW4iLCJzY3J1dGluQ2xlYW5Kc29uIiwic2NydXRpblRvSnNvbiIsInNjcnV0aW5DbGVhbkZpbGVQYXRoIiwic2lsZW50IiwicmVhZGRpclN5bmMiLCJwYXRobmFtZSIsInJlbW92ZVN5bmMiLCJyZXBvc2l0b3J5RGlyIiwicmVtb3RlcyIsImNvbW1pdCIsImNoaWxkUHJvY2VzcyIsIm91dHB1dCIsInN1YmRpcmVjdG9yaWVzIiwidWlkQnJhbmNoVXBkYXRlIiwicnVuIiwibWFpbiIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9jbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQge1xuICBjbGVhbkFjdGV1cixcbiAgY2xlYW5BbWVuZGVtZW50LFxuICBjbGVhbkRvY3VtZW50T3JEaXZpc2lvbixcbiAgY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgY2xlYW5PcmdhbmUsXG4gIGNsZWFuUmV1bmlvbixcbiAgY2xlYW5TY3J1dGluLFxufSBmcm9tIFwiLi4vY2xlYW5lcnNcIlxuaW1wb3J0IHsgZGF0YXNldHMsIEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBleGlzdGluZ0RhdGVUb0pzb24sIHBhdGNoZWREYXRlVG9Kc29uIH0gZnJvbSBcIi4uL2RhdGVzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCAqIGFzIGdpdCBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB7XG4gIEFjdGV1cixcbiAgQ29udmVydCBhcyBBY3RldXJzRXRPcmdhbmVzQ29udmVydCxcbiAgT3JnYW5lLFxufSBmcm9tIFwiLi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWdlbmRhc0NvbnZlcnQsIFJldW5pb24gfSBmcm9tIFwiLi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBBbWVuZGVtZW50LCBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzQ29udmVydCB9IGZyb20gXCIuLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LFxuICBEb2N1bWVudCxcbiAgRG9zc2llclBhcmxlbWVudGFpcmUsXG59IGZyb20gXCIuLi90eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zQ29udmVydCwgU2NydXRpbiB9IGZyb20gXCIuLi90eXBlcy9zY3J1dGluc1wiXG5cbmZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSk6IGFueSB7XG4gIGNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhbGlhczogXCJDXCIsXG4gICAgICBoZWxwOiBcImNsb25lIHJlcG9zaXRvcmllcyBmcm9tIGdpdmVuIGdyb3VwIChvciBvcmdhbml6YXRpb24pIGdpdCBVUkxcIixcbiAgICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImNcIixcbiAgICAgIGhlbHA6IFwiY29tbWl0IGNsZWFuIGZpbGVzXCIsXG4gICAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImRcIixcbiAgICAgIGhlbHA6IFwic2luZ2xlIGRhdGFzZXQgdG8gcmVvcmdhbml6ZVwiLFxuICAgICAgbmFtZTogXCJkYXRhc2V0XCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJrXCIsXG4gICAgICBkZWZhdWx0VmFsdWU6IFtcIkFsbFwiXSxcbiAgICAgIGhlbHA6IFwiY2F0ZWdvcmllcyBvZiBkYXRhc2V0cyB0byByZW9yZ2FuaXplXCIsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwiY2F0ZWdvcmllc1wiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwibFwiLFxuICAgICAgaGVscDogXCJsZWdpc2xhdHVyZXMgb2YgY2F0ZWdvcmllcyBvZiBkYXRhc2V0cyB0byByZXRyaWV2ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcImxlZ2lzbGF0dXJlXCIsXG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJyXCIsXG4gICAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwic1wiLFxuICAgICAgaGVscDogXCJkb24ndCBsb2cgYW55dGhpbmdcIixcbiAgICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVscDogXCJkbyBub3QgcmVzZXQgLS1oYXJkIGFmdGVyIGNvbW1pdCB0byBzYXZlIEkvTyBpZiB0aGUgd29ya2luZyB0cmVlIGlzIHRvIGJlIGRpc2NhcmRlZFwiLFxuICAgICAgbmFtZTogXCJuby1yZXNldC1hZnRlci1jb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJ2XCIsXG4gICAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIG9wdGlvbnMuY2F0ZWdvcmllcy5tYXAoKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBVbmtub3duIG5hbWUgb2YgZGF0YXNldDogJHtkYXRhc2V0TmFtZX1gLFxuICAgICksXG4gIClcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gb3B0aW9ucy5jYXRlZ29yaWVzLnJlZHVjZShcbiAgICAoZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsIGRhdGFzZXROYW1lOiBzdHJpbmcpOiBFbmFibGVkRGF0YXNldHMgPT5cbiAgICAgIGVuYWJsZWREYXRhc2V0cyB8XG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgIEVuYWJsZWREYXRhc2V0cy5Ob25lLFxuICApXG5cbiAgbGV0IGNob29zZW5EYXRhc2V0cyA9IGRhdGFzZXRzXG4gIGlmKG9wdGlvbnMubGVnaXNsYXR1cmUpIHtcbiAgICBjb25zdCBlbmFibGVkTGVnaXNsYXR1cmVzID0gb3B0aW9ucy5sZWdpc2xhdHVyZS5tYXAoKGxlZ2lzbGF0dXJlOiBudW1iZXIpID0+IGxlZ2lzbGF0dXJlLnRvU3RyaW5nKCkpXG4gICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNob29zZW5EYXRhc2V0cykpIHtcbiAgICAgIGNob29zZW5EYXRhc2V0c1trZXkgYXMga2V5b2YgdHlwZW9mIGNob29zZW5EYXRhc2V0c10gPSB2YWx1ZS5maWx0ZXIoKGRhdGFzZXQ6IHsgbGVnaXNsYXR1cmU6IGFueSB9KSA9PiBlbmFibGVkTGVnaXNsYXR1cmVzLmluY2x1ZGVzKGRhdGFzZXQubGVnaXNsYXR1cmUpKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImFjdGV1cnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGV1clJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmFjdGV1clNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7YWN0ZXVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYWN0ZXVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFjdGV1ciA9IEpTT04ucGFyc2UoYWN0ZXVyUmF3SnNvbilcbiAgICAgICAgY2xlYW5BY3RldXIoYWN0ZXVyKVxuICAgICAgICBjb25zdCBhY3RldXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuOiBBY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQuYWN0ZXVyVG9Kc29uKGFjdGV1ckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYWN0ZXVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGFjdGV1ckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFjdGV1ckNsZWFuRmlsZVBhdGgsIGFjdGV1ckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke29yZ2FuZVJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZVJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBKU09OLnBhcnNlKG9yZ2FuZVJhd0pzb24pXG4gICAgICAgIGNsZWFuT3JnYW5lKG9yZ2FuZSlcbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbjogT3JnYW5lID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9PcmdhbmUob3JnYW5lSnNvbilcbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbihvcmdhbmVDbGVhbilcblxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLm9yZ2FuZVNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShvcmdhbmVDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvcmdhbmVDbGVhbkZpbGVQYXRoLCBvcmdhbmVDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJhY3RldXJzXCIsIFwib3JnYW5lc1wiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob29zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9IHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ucmV1bmlvblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7cmV1bmlvblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhyZXVuaW9uUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJldW5pb24gPSBKU09OLnBhcnNlKHJldW5pb25SYXdKc29uKVxuICAgICAgICBjbGVhblJldW5pb24ocmV1bmlvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJldW5pb24sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbjogUmV1bmlvbiA9IEFnZW5kYXNDb252ZXJ0LnRvUmV1bmlvbihyZXVuaW9uSnNvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBZ2VuZGFzQ29udmVydC5yZXVuaW9uVG9Kc29uKHJldW5pb25DbGVhbilcblxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKHJldW5pb25DbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXVuaW9uQ2xlYW5GaWxlUGF0aCwgcmV1bmlvbkNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvb3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRSYXdGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7YW1lbmRlbWVudFJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICBhbWVuZGVtZW50UmF3RmlsZVBhdGgsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudCA9IEpTT04ucGFyc2UoYW1lbmRlbWVudFJhd0pzb24pXG4gICAgICAgIGNsZWFuQW1lbmRlbWVudChhbWVuZGVtZW50KVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYW1lbmRlbWVudCwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuOiBBbWVuZGVtZW50ID1cbiAgICAgICAgICBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50KGFtZW5kZW1lbnRKc29uKVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFtZW5kZW1lbnRzQ29udmVydC5hbWVuZGVtZW50VG9Kc29uKGFtZW5kZW1lbnRDbGVhbilcblxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCwgYW1lbmRlbWVudENsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9jdW1lbnRzXCJdKSkge1xuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID0gZG9jdW1lbnRTcGxpdFBhdGhbZG9jdW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb2N1bWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb2N1bWVudFJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBKU09OLnBhcnNlKGRvY3VtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24oZG9jdW1lbnQpXG4gICAgICAgIGNvbnN0IGRvY3VtZW50SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW46IERvY3VtZW50ID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9jdW1lbnRUb0pzb24oZG9jdW1lbnRDbGVhbilcblxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9jdW1lbnRDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb2N1bWVudENsZWFuRmlsZVBhdGgsIGRvY3VtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb3NzaWVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9IEpTT04ucGFyc2UoZG9zc2llclJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llcilcbiAgICAgICAgY29uc3QgZG9zc2llckpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvc3NpZXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbjogRG9zc2llclBhcmxlbWVudGFpcmUgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llckpzb24pXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24oZG9zc2llckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvc3NpZXJTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9zc2llckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRvc3NpZXJDbGVhbkZpbGVQYXRoLCBkb3NzaWVyQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcImRvY3VtZW50c1wiLCBcImRvc3NpZXJzXCJdKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvb3NlbkRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlbmFtZSA9IHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uc2NydXRpblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7c2NydXRpblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhzY3J1dGluUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHNjcnV0aW4gPSBKU09OLnBhcnNlKHNjcnV0aW5SYXdKc29uKVxuICAgICAgICBjbGVhblNjcnV0aW4oc2NydXRpbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHNjcnV0aW4sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbjogU2NydXRpbiA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4oc2NydXRpbkpzb24pXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgU2NydXRpbnNDb252ZXJ0LnNjcnV0aW5Ub0pzb24oc2NydXRpbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoc2NydXRpbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHNjcnV0aW5DbGVhbkZpbGVQYXRoLCBzY3J1dGluQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBDbGVhbmluZyBkaXJlY3Rvcnk6ICR7ZGF0YXNldENsZWFuRGlyfeKApmApXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldENsZWFuRGlyKSkge1xuICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5qb2luKGRhdGFzZXRDbGVhbkRpciwgZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhwYXRobmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC5jb21taXQocmVwb3NpdG9yeURpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIpXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2hVaWQoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICBzdWJkaXJlY3RvcmllczogYW55LFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC51aWRCcmFuY2hVcGRhdGUoXG4gICAgICByZXBvc2l0b3J5RGlyLFxuICAgICAgc3ViZGlyZWN0b3JpZXMsXG4gICAgICBvcHRpb25zW1wibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCJdLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiBvcHRpb25zLnJlbW90ZSB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2l0LnJ1bihyZXBvc2l0b3J5RGlyLCBgcHVzaCAtLXF1aWV0ICR7cmVtb3RlfSB1aWQ6dWlkYClcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogbnVtYmVyIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICBpZiAoY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9ucykpIHtcbiAgICByZXR1cm4gMVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAwXG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50c1wiKSlcbiAgcHJvY2Vzcy5leGl0KG1haW4ocHJvY2Vzcy5hcmd2KSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBR3JCQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsdUJBQXVCLEVBQ3ZCQyx5QkFBeUIsRUFDekJDLFdBQVcsRUFDWEMsWUFBWSxFQUNaQyxZQUFZO0FBQUEsU0FFTEMsUUFBUSxFQUFFQyxlQUFlO0FBQUEsU0FDekJDLGtCQUFrQixFQUFFQyxpQkFBaUI7QUFBQSxTQUNyQ0MsT0FBTztBQUFBLE9BQ1QsS0FBS0MsR0FBRztBQUFBLFNBR2JDLE9BQU8sSUFBSUMsdUJBQXVCO0FBQUEsU0FHM0JELE9BQU8sSUFBSUUsY0FBYztBQUFBLFNBQ2JGLE9BQU8sSUFBSUcsa0JBQWtCO0FBQUEsU0FFaERILE9BQU8sSUFBSUksMEJBQTBCO0FBQUEsU0FJOUJKLE9BQU8sSUFBSUssZUFBZTtBQUVuQyxTQUFTQyxTQUFTLENBQUNDLElBQWMsRUFBTztFQUN0QyxNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxLQUFLLEVBQUUsR0FBRztJQUNWQyxJQUFJLEVBQUUsK0RB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