@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -0,0 +1,678 @@
1
+ /// Load data from files
2
+ import assert from "assert";
3
+ import fs from "fs-extra";
4
+ import path from "path";
5
+ export { EnabledDatasets } from "./datasets.mjs";
6
+ import { datasets, EnabledDatasets } from "./datasets.mjs";
7
+ export { walkDir } from "./file_systems.mjs";
8
+ import { walkDir } from "./file_systems.mjs";
9
+ import { Convert as ActeursEtOrganesConvert } from "./types/acteurs_et_organes.mjs";
10
+ import { Convert as AgendasConvert } from "./types/agendas.mjs";
11
+ import { Convert as AmendementsConvert } from "./types/amendements.mjs";
12
+ import { Convert as DossiersLegislatifsConvert } from "./types/dossiers_legislatifs.mjs";
13
+ import { Legislature } from "./types/legislatures.mjs";
14
+ import { Convert as ScrutinsConvert } from "./types/scrutins.mjs";
15
+ const documentUidRegex = /^(ACIN|ALCN|AVCE|AVIS|DECL|ETDI|LETT|MESS|PION|PNRE|PRJL|RAPP|RINF|RION)(AN|SN)(R\d+)[LS](\d+)(B|BTA|BTC|TAP)(\d+)(-.*)?$/;
16
+ const dossierUidRegex = /^DL(R\d+)(L\d+)N(\d+)$/;
17
+ const reunionUidRegex = /^RU(AN|CG|SN)(R\d+)(L\d+)([AS]\d{4})(IDC|IDFL?|IDS)(\d+)$/;
18
+ const scrutinUidRegex = /^VTAN(R\d+)(L\d+)V(\d+)$/;
19
+ /** Load data from split files. */
20
+
21
+ export function loadAssembleeData(dataDir, enabledDatasets, legislature, {
22
+ log = false
23
+ } = {}) {
24
+ const acteurByUid = {};
25
+ const organeByUid = {};
26
+
27
+ if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
28
+ for (const dataset of datasets.acteursEtOrganes) {
29
+ if (dataset.ignoreForWeb) {
30
+ continue;
31
+ }
32
+
33
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
34
+ continue;
35
+ }
36
+
37
+ const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
38
+
39
+ for (const acteurSplitPath of walkDir(datasetDir, ["acteurs"])) {
40
+ const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
41
+
42
+ if (!acteurFilename.endsWith(".json")) {
43
+ continue;
44
+ }
45
+
46
+ const acteurFilePath = path.join(datasetDir, ...acteurSplitPath);
47
+
48
+ if (log) {
49
+ console.log(`Loading file: ${acteurFilePath}…`);
50
+ }
51
+
52
+ const acteurJson = fs.readFileSync(acteurFilePath, {
53
+ encoding: "utf8"
54
+ });
55
+ const acteur = ActeursEtOrganesConvert.toActeur(acteurJson); // Keep the first existing "acteur", because the first wrapper is the most complete.
56
+
57
+ if (acteurByUid[acteur.uid] === undefined) {
58
+ acteurByUid[acteur.uid] = acteur;
59
+ }
60
+ }
61
+
62
+ for (const organeSplitPath of walkDir(datasetDir, ["organes"])) {
63
+ const organeFilename = organeSplitPath[organeSplitPath.length - 1];
64
+
65
+ if (!organeFilename.endsWith(".json")) {
66
+ continue;
67
+ }
68
+
69
+ const organeFilePath = path.join(datasetDir, ...organeSplitPath);
70
+
71
+ if (log) {
72
+ console.log(`Loading file: ${organeFilePath}…`);
73
+ }
74
+
75
+ const organeJson = fs.readFileSync(organeFilePath, {
76
+ encoding: "utf8"
77
+ });
78
+ const organe = ActeursEtOrganesConvert.toOrgane(organeJson); // Keep the first existing "organe", because the first wrapper is the most complete.
79
+
80
+ if (organeByUid[organe.uid] === undefined) {
81
+ organeByUid[organe.uid] = organe;
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ const reunionByUid = {};
88
+ const reunionsByDay = {};
89
+ const reunionsByDossierUid = {};
90
+
91
+ if (enabledDatasets & EnabledDatasets.Agendas) {
92
+ for (const dataset of datasets.agendas) {
93
+ if (dataset.ignoreForWeb) {
94
+ continue;
95
+ }
96
+
97
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
98
+ continue;
99
+ }
100
+
101
+ const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
102
+
103
+ for (const reunionSplitPath of walkDir(datasetDir)) {
104
+ const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
105
+
106
+ if (!reunionFilename.endsWith(".json")) {
107
+ continue;
108
+ }
109
+
110
+ const reunionFilePath = path.join(datasetDir, ...reunionSplitPath);
111
+
112
+ if (log) {
113
+ console.log(`Loading file: ${reunionFilePath}…`);
114
+ }
115
+
116
+ const reunionJson = fs.readFileSync(reunionFilePath, {
117
+ encoding: "utf8"
118
+ });
119
+ const reunion = AgendasConvert.toReunion(reunionJson);
120
+
121
+ if (reunionByUid[reunion.uid] === undefined) {
122
+ reunionByUid[reunion.uid] = reunion;
123
+ }
124
+
125
+ const day = reunion.timestampDebut.toISOString().split("T")[0];
126
+ let reunionsAtDay = reunionsByDay[day];
127
+
128
+ if (reunionsAtDay === undefined) {
129
+ reunionsAtDay = reunionsByDay[day] = [];
130
+ }
131
+
132
+ reunionsAtDay.push(reunion);
133
+ const odj = reunion.odj;
134
+
135
+ if (odj !== undefined) {
136
+ for (const pointOdj of odj.pointsOdj || []) {
137
+ for (const dossierLegislatifRef of pointOdj.dossiersLegislatifsRefs || []) {
138
+ let reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
139
+
140
+ if (reunionsAtDossierUid === undefined) {
141
+ reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
142
+ }
143
+
144
+ reunionsAtDossierUid.push(reunion);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+ const amendementByUid = {};
153
+
154
+ if (enabledDatasets & EnabledDatasets.Amendements) {
155
+ for (const dataset of datasets.amendements) {
156
+ if (dataset.ignoreForWeb) {
157
+ continue;
158
+ }
159
+
160
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
161
+ continue;
162
+ }
163
+
164
+ const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
165
+
166
+ for (const amendementSplitPath of walkDir(datasetDir)) {
167
+ const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
168
+
169
+ if (!amendementFilename.endsWith(".json")) {
170
+ continue;
171
+ }
172
+
173
+ const amendementFilePath = path.join(datasetDir, ...amendementSplitPath);
174
+
175
+ if (log) {
176
+ console.log(`Loading file: ${amendementFilePath}…`);
177
+ }
178
+
179
+ const amendementJson = fs.readFileSync(amendementFilePath, {
180
+ encoding: "utf8"
181
+ });
182
+ const amendement = AmendementsConvert.toAmendement(amendementJson);
183
+
184
+ if (amendementByUid[amendement.uid] === undefined) {
185
+ amendementByUid[amendement.uid] = amendement;
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ const documentByUid = {};
192
+ const dossierParlementaireBySenatChemin = {};
193
+ const dossierParlementaireByTitreChemin = {};
194
+ const dossierParlementaireByUid = {};
195
+
196
+ if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
197
+ for (const dataset of datasets.dossiersLegislatifs) {
198
+ if (dataset.ignoreForWeb) {
199
+ continue;
200
+ }
201
+
202
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
203
+ continue;
204
+ }
205
+
206
+ const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
207
+
208
+ for (const documentSplitPath of walkDir(datasetDir, ["documents"])) {
209
+ const documentFilename = documentSplitPath[documentSplitPath.length - 1];
210
+
211
+ if (!documentFilename.endsWith(".json")) {
212
+ continue;
213
+ }
214
+
215
+ const documentFilePath = path.join(datasetDir, ...documentSplitPath);
216
+
217
+ if (log) {
218
+ console.log(`Loading file: ${documentFilePath}…`);
219
+ }
220
+
221
+ const documentJson = fs.readFileSync(documentFilePath, {
222
+ encoding: "utf8"
223
+ });
224
+ const document = DossiersLegislatifsConvert.toDocument(documentJson);
225
+
226
+ if (documentByUid[document.uid] === undefined) {
227
+ documentByUid[document.uid] = document;
228
+ }
229
+ }
230
+
231
+ for (const dossierSplitPath of walkDir(datasetDir, ["dossiers"])) {
232
+ const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
233
+
234
+ if (!dossierFilename.endsWith(".json")) {
235
+ continue;
236
+ }
237
+
238
+ const dossierFilePath = path.join(datasetDir, ...dossierSplitPath);
239
+
240
+ if (log) {
241
+ console.log(`Loading file: ${dossierFilePath}…`);
242
+ }
243
+
244
+ const dossierJson = fs.readFileSync(dossierFilePath, {
245
+ encoding: "utf8"
246
+ });
247
+ const dossier = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
248
+ const titreDossier = dossier.titreDossier;
249
+
250
+ if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
251
+ dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
252
+ }
253
+
254
+ if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
255
+ dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
256
+ }
257
+
258
+ if (dossierParlementaireByUid[dossier.uid] === undefined) {
259
+ dossierParlementaireByUid[dossier.uid] = dossier;
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ let photoByUid = {};
266
+
267
+ if (enabledDatasets & EnabledDatasets.Photos) {
268
+ {
269
+ const jsonFilePath = path.join(dataDir, `photos_deputes_${// TODO: Handle Legislature.All.
270
+ legislature === Legislature.All ? Legislature.Seize : legislature}`, "deputes.json");
271
+
272
+ if (fs.existsSync(jsonFilePath)) {
273
+ if (log) {
274
+ console.log(`Loading file: ${jsonFilePath}`);
275
+ }
276
+
277
+ const json = fs.readFileSync(jsonFilePath, {
278
+ encoding: "utf8"
279
+ });
280
+ Object.assign(photoByUid, JSON.parse(json));
281
+ } else if (log) {
282
+ console.log(`Ignoring missing file: ${jsonFilePath}`);
283
+ }
284
+ }
285
+ {
286
+ const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
287
+
288
+ if (fs.existsSync(jsonFilePath)) {
289
+ if (log) {
290
+ console.log(`Loading file: ${jsonFilePath}`);
291
+ }
292
+
293
+ const json = fs.readFileSync(jsonFilePath, {
294
+ encoding: "utf8"
295
+ });
296
+ Object.assign(photoByUid, JSON.parse(json));
297
+ } else if (log) {
298
+ console.log(`Ignoring missing file: ${jsonFilePath}`);
299
+ }
300
+ }
301
+ }
302
+
303
+ const scrutinByUid = {};
304
+
305
+ if (enabledDatasets & EnabledDatasets.Scrutins) {
306
+ for (const dataset of datasets.scrutins) {
307
+ if (dataset.ignoreForWeb) {
308
+ continue;
309
+ }
310
+
311
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
312
+ continue;
313
+ }
314
+
315
+ const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
316
+
317
+ for (const scrutinSplitPath of walkDir(datasetDir)) {
318
+ const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
319
+
320
+ if (!scrutinFilename.endsWith(".json")) {
321
+ continue;
322
+ }
323
+
324
+ const scrutinFilePath = path.join(datasetDir, ...scrutinSplitPath);
325
+
326
+ if (log) {
327
+ console.log(`Loading file: ${scrutinFilePath}…`);
328
+ }
329
+
330
+ const scrutinJson = fs.readFileSync(scrutinFilePath, {
331
+ encoding: "utf8"
332
+ });
333
+ const scrutin = ScrutinsConvert.toScrutin(scrutinJson);
334
+
335
+ if (scrutinByUid[scrutin.uid] === undefined) {
336
+ scrutinByUid[scrutin.uid] = scrutin;
337
+ }
338
+ }
339
+ }
340
+ }
341
+
342
+ return {
343
+ acteurByUid,
344
+ amendementByUid,
345
+ documentByUid,
346
+ dossierParlementaireBySenatChemin,
347
+ dossierParlementaireByTitreChemin,
348
+ dossierParlementaireByUid,
349
+ organeByUid,
350
+ photoByUid,
351
+ reunionByUid,
352
+ reunionsByDay,
353
+ reunionsByDossierUid,
354
+ scrutinByUid
355
+ };
356
+ }
357
+ /** Load data from big monolytic files. */
358
+
359
+ export function loadAssembleeDataFromBigFiles(dataDir, enabledDatasets, legislature, {
360
+ log = false
361
+ } = {}) {
362
+ const acteurByUid = {};
363
+ const organeByUid = {};
364
+
365
+ if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
366
+ for (const dataset of datasets.acteursEtOrganes) {
367
+ if (dataset.ignoreForWeb) {
368
+ continue;
369
+ }
370
+
371
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
372
+ continue;
373
+ }
374
+
375
+ const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
376
+
377
+ if (log) {
378
+ console.log(`Loading file: ${jsonFilePath}`);
379
+ }
380
+
381
+ const json = fs.readFileSync(jsonFilePath, {
382
+ encoding: "utf8"
383
+ });
384
+ const acteursEtOrganes = ActeursEtOrganesConvert.toActeursEtOrganes(json);
385
+
386
+ for (const acteur of acteursEtOrganes.acteurs) {
387
+ // Keep the first existing "acteur", because the first wrapper is the most complete.
388
+ if (acteurByUid[acteur.uid] === undefined) {
389
+ acteurByUid[acteur.uid] = acteur;
390
+ }
391
+ }
392
+
393
+ for (const organe of acteursEtOrganes.organes) {
394
+ // Keep the first existing "organe", because the first wrapper is the most complete.
395
+ if (organeByUid[organe.uid] === undefined) {
396
+ organeByUid[organe.uid] = organe;
397
+ }
398
+ }
399
+ }
400
+ }
401
+
402
+ const reunionByUid = {};
403
+ const reunionsByDay = {};
404
+ const reunionsByDossierUid = {};
405
+
406
+ if (enabledDatasets & EnabledDatasets.Agendas) {
407
+ for (const dataset of datasets.agendas) {
408
+ if (dataset.ignoreForWeb) {
409
+ continue;
410
+ }
411
+
412
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
413
+ continue;
414
+ }
415
+
416
+ const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
417
+
418
+ if (log) {
419
+ console.log(`Loading file: ${jsonFilePath}`);
420
+ }
421
+
422
+ const json = fs.readFileSync(jsonFilePath, {
423
+ encoding: "utf8"
424
+ });
425
+ const agendas = AgendasConvert.toAgendas(json);
426
+
427
+ for (const reunion of agendas.reunions) {
428
+ if (reunionByUid[reunion.uid] === undefined) {
429
+ reunionByUid[reunion.uid] = reunion;
430
+ }
431
+
432
+ const day = reunion.timestampDebut.toISOString().split("T")[0];
433
+ let reunionsAtDay = reunionsByDay[day];
434
+
435
+ if (reunionsAtDay === undefined) {
436
+ reunionsAtDay = reunionsByDay[day] = [];
437
+ }
438
+
439
+ reunionsAtDay.push(reunion);
440
+ const odj = reunion.odj;
441
+
442
+ if (odj !== undefined) {
443
+ for (const pointOdj of odj.pointsOdj || []) {
444
+ for (const dossierLegislatifRef of pointOdj.dossiersLegislatifsRefs || []) {
445
+ let reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
446
+
447
+ if (reunionsAtDossierUid === undefined) {
448
+ reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
449
+ }
450
+
451
+ reunionsAtDossierUid.push(reunion);
452
+ }
453
+ }
454
+ }
455
+ }
456
+ }
457
+ }
458
+
459
+ const amendementByUid = {};
460
+
461
+ if (enabledDatasets & EnabledDatasets.Amendements) {
462
+ for (const dataset of datasets.amendements) {
463
+ if (dataset.ignoreForWeb) {
464
+ continue;
465
+ }
466
+
467
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
468
+ continue;
469
+ }
470
+
471
+ const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
472
+
473
+ if (log) {
474
+ console.log(`Loading file: ${jsonFilePath}`);
475
+ }
476
+
477
+ const json = fs.readFileSync(jsonFilePath, {
478
+ encoding: "utf8"
479
+ });
480
+ const amendements = AmendementsConvert.toAmendements(json);
481
+
482
+ for (const texteLegislatif of amendements.textesLegislatifs) {
483
+ for (const amendement of texteLegislatif.amendements) {
484
+ if (amendementByUid[amendement.uid] === undefined) {
485
+ amendementByUid[amendement.uid] = amendement;
486
+ }
487
+ }
488
+ }
489
+ }
490
+ }
491
+
492
+ const documentByUid = {};
493
+ const dossierParlementaireBySenatChemin = {};
494
+ const dossierParlementaireByTitreChemin = {};
495
+ const dossierParlementaireByUid = {};
496
+
497
+ if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
498
+ for (const dataset of datasets.dossiersLegislatifs) {
499
+ if (dataset.ignoreForWeb) {
500
+ continue;
501
+ }
502
+
503
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
504
+ continue;
505
+ }
506
+
507
+ const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
508
+
509
+ if (log) {
510
+ console.log(`Loading file: ${jsonFilePath}`);
511
+ }
512
+
513
+ const json = fs.readFileSync(jsonFilePath, {
514
+ encoding: "utf8"
515
+ });
516
+ const dossiersLegislatifs = DossiersLegislatifsConvert.toDossiersLegislatifs(json);
517
+
518
+ for (const document of dossiersLegislatifs.textesLegislatifs) {
519
+ if (documentByUid[document.uid] === undefined) {
520
+ documentByUid[document.uid] = document;
521
+ }
522
+ }
523
+
524
+ for (const dossier of dossiersLegislatifs.dossiersParlementaires) {
525
+ const titreDossier = dossier.titreDossier;
526
+
527
+ if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
528
+ dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
529
+ }
530
+
531
+ if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
532
+ dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
533
+ }
534
+
535
+ if (dossierParlementaireByUid[dossier.uid] === undefined) {
536
+ dossierParlementaireByUid[dossier.uid] = dossier;
537
+ }
538
+ }
539
+ }
540
+ }
541
+
542
+ const photoByUid = {};
543
+
544
+ if (enabledDatasets & EnabledDatasets.Photos) {
545
+ const photoByUid = {};
546
+ {
547
+ const jsonFilePath = path.join(dataDir, `photos_deputes_${// TODO: Handle Legislature.All.
548
+ legislature === Legislature.All ? Legislature.Seize : legislature}`, "deputes.json");
549
+
550
+ if (fs.existsSync(jsonFilePath)) {
551
+ if (log) {
552
+ console.log(`Loading file: ${jsonFilePath}`);
553
+ }
554
+
555
+ const json = fs.readFileSync(jsonFilePath, {
556
+ encoding: "utf8"
557
+ });
558
+ Object.assign(photoByUid, JSON.parse(json));
559
+ } else if (log) {
560
+ console.log(`Ignoring missing file: ${jsonFilePath}`);
561
+ }
562
+ }
563
+ {
564
+ const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
565
+
566
+ if (fs.existsSync(jsonFilePath)) {
567
+ if (log) {
568
+ console.log(`Loading file: ${jsonFilePath}`);
569
+ }
570
+
571
+ const json = fs.readFileSync(jsonFilePath, {
572
+ encoding: "utf8"
573
+ });
574
+ Object.assign(photoByUid, JSON.parse(json));
575
+ } else if (log) {
576
+ console.log(`Ignoring missing file: ${jsonFilePath}`);
577
+ }
578
+ }
579
+ }
580
+
581
+ const scrutinByUid = {};
582
+
583
+ if (enabledDatasets & EnabledDatasets.Scrutins) {
584
+ for (const dataset of datasets.scrutins) {
585
+ if (dataset.ignoreForWeb) {
586
+ continue;
587
+ }
588
+
589
+ if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
590
+ continue;
591
+ }
592
+
593
+ const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
594
+
595
+ if (log) {
596
+ console.log(`Loading file: ${jsonFilePath}`);
597
+ }
598
+
599
+ const json = fs.readFileSync(jsonFilePath, {
600
+ encoding: "utf8"
601
+ });
602
+ const scrutins = ScrutinsConvert.toScrutins(json);
603
+
604
+ for (const scrutin of scrutins.scrutins) {
605
+ if (scrutinByUid[scrutin.uid] === undefined) {
606
+ scrutinByUid[scrutin.uid] = scrutin;
607
+ }
608
+ }
609
+ }
610
+ }
611
+
612
+ return {
613
+ acteurByUid,
614
+ amendementByUid,
615
+ documentByUid,
616
+ dossierParlementaireBySenatChemin,
617
+ dossierParlementaireByTitreChemin,
618
+ dossierParlementaireByUid,
619
+ organeByUid,
620
+ photoByUid,
621
+ reunionByUid,
622
+ reunionsByDay,
623
+ reunionsByDossierUid,
624
+ scrutinByUid
625
+ };
626
+ }
627
+ export function pathFromDocumentUid(documentsDir, uid) {
628
+ const match = documentUidRegex.exec(uid);
629
+ assert.notStrictEqual(match, null, `Unexpected structure for document UID: ${uid}`);
630
+ const documentType = path.join(documentsDir, match[1]);
631
+ const chambreDir = path.join(documentType, match[2]);
632
+ const republiqueDir = path.join(chambreDir, match[3]);
633
+ const legislatureDir = path.join(republiqueDir, match[4]);
634
+ const etatDir = path.join(legislatureDir, match[5]);
635
+ let numero = "000000" + match[6];
636
+ numero = numero.substr(numero.length - 6);
637
+ const numeroMilliersDir = path.join(etatDir, numero.substr(0, 3));
638
+ fs.ensureDirSync(numeroMilliersDir);
639
+ return path.join(numeroMilliersDir, uid);
640
+ }
641
+ export function pathFromDossierParlementaireUid(dossiersDir, uid) {
642
+ const match = dossierUidRegex.exec(uid);
643
+ assert.notStrictEqual(match, null, `Unexpected structure for dossier parlementaire UID: ${uid}`);
644
+ const republiqueDir = path.join(dossiersDir, match[1]);
645
+ const legislatureDir = path.join(republiqueDir, match[2]);
646
+ let numero = "000000" + match[3];
647
+ numero = numero.substr(numero.length - 6);
648
+ const numeroMilliersDir = path.join(legislatureDir, numero.substr(0, 3));
649
+ fs.ensureDirSync(numeroMilliersDir);
650
+ return path.join(numeroMilliersDir, uid);
651
+ }
652
+ export function pathFromReunionUid(reunionsDir, uid) {
653
+ const match = reunionUidRegex.exec(uid);
654
+ assert.notStrictEqual(match, null, `Unexpected structure for reunion UID: ${uid}`);
655
+ const chambreDir = path.join(reunionsDir, match[1]);
656
+ const republiqueDir = path.join(chambreDir, match[2]);
657
+ const legislatureDir = path.join(republiqueDir, match[3]);
658
+ const sessionDir = path.join(legislatureDir, match[4]);
659
+ const idDir = path.join(sessionDir, match[5]);
660
+ let numero = "000000000" + match[6];
661
+ numero = numero.substr(numero.length - 9);
662
+ const numeroMillionsDir = path.join(idDir, numero.substr(0, 3));
663
+ const numeroMilliersDir = path.join(numeroMillionsDir, numero.substr(3, 3));
664
+ fs.ensureDirSync(numeroMilliersDir);
665
+ return path.join(numeroMilliersDir, uid);
666
+ }
667
+ export function pathFromScrutinUid(scrutinsDir, uid) {
668
+ const match = scrutinUidRegex.exec(uid);
669
+ assert.notStrictEqual(match, null, `Unexpected structure for scrutin UID: ${uid}`);
670
+ const republiqueDir = path.join(scrutinsDir, match[1]);
671
+ const legislatureDir = path.join(republiqueDir, match[2]);
672
+ let numero = "000000" + match[3];
673
+ numero = numero.substr(numero.length - 6);
674
+ const numeroMilliersDir = path.join(legislatureDir, numero.substr(0, 3));
675
+ fs.ensureDirSync(numeroMilliersDir);
676
+ return path.join(numeroMilliersDir, uid);
677
+ }
678
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJmcyIsInBhdGgiLCJFbmFibGVkRGF0YXNldHMiLCJkYXRhc2V0cyIsIndhbGtEaXIiLCJDb252ZXJ0IiwiQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQiLCJBZ2VuZGFzQ29udmVydCIsIkFtZW5kZW1lbnRzQ29udmVydCIsIkRvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0IiwiTGVnaXNsYXR1cmUiLCJTY3J1dGluc0NvbnZlcnQiLCJkb2N1bWVudFVpZFJlZ2V4IiwiZG9zc2llclVpZFJlZ2V4IiwicmV1bmlvblVpZFJlZ2V4Iiwic2NydXRpblVpZFJlZ2V4IiwibG9hZEFzc2VtYmxlZURhdGEiLCJkYXRhRGlyIiwiZW5hYmxlZERhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJsb2ciLCJhY3RldXJCeVVpZCIsIm9yZ2FuZUJ5VWlkIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwiaWdub3JlRm9yV2ViIiwiQWxsIiwiZGF0YXNldERpciIsImpvaW4iLCJmaWxlbmFtZSIsInJlcGxhY2UiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImxlbmd0aCIsImVuZHNXaXRoIiwiYWN0ZXVyRmlsZVBhdGgiLCJjb25zb2xlIiwiYWN0ZXVySnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiYWN0ZXVyIiwidG9BY3RldXIiLCJ1aWQiLCJ1bmRlZmluZWQiLCJvcmdhbmVTcGxpdFBhdGgiLCJvcmdhbmVGaWxlbmFtZSIsIm9yZ2FuZUZpbGVQYXRoIiwib3JnYW5lSnNvbiIsIm9yZ2FuZSIsInRvT3JnYW5lIiwicmV1bmlvbkJ5VWlkIiwicmV1bmlvbnNCeURheSIsInJldW5pb25zQnlEb3NzaWVyVWlkIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvbkZpbGVQYXRoIiwicmV1bmlvbkpzb24iLCJyZXVuaW9uIiwidG9SZXVuaW9uIiwiZGF5IiwidGltZXN0YW1wRGVidXQiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwicmV1bmlvbnNBdERheSIsInB1c2giLCJvZGoiLCJwb2ludE9kaiIsInBvaW50c09kaiIsImRvc3NpZXJMZWdpc2xhdGlmUmVmIiwiZG9zc2llcnNMZWdpc2xhdGlmc1JlZnMiLCJyZXVuaW9uc0F0RG9zc2llclVpZCIsImFtZW5kZW1lbnRCeVVpZCIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudEZpbGVQYXRoIiwiYW1lbmRlbWVudEpzb24iLCJhbWVuZGVtZW50IiwidG9BbWVuZGVtZW50IiwiZG9jdW1lbnRCeVVpZCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50RmlsZVBhdGgiLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyU3BsaXRQYXRoIiwiZG9zc2llckZpbGVuYW1lIiwiZG9zc2llckZpbGVQYXRoIiwiZG9zc2llckpzb24iLCJkb3NzaWVyIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsInRpdHJlRG9zc2llciIsInNlbmF0Q2hlbWluIiwidGl0cmVDaGVtaW4iLCJwaG90b0J5VWlkIiwiUGhvdG9zIiwianNvbkZpbGVQYXRoIiwiU2VpemUiLCJleGlzdHNTeW5jIiwianNvbiIsIk9iamVjdCIsImFzc2lnbiIsIkpTT04iLCJwYXJzZSIsInNjcnV0aW5CeVVpZCIsIlNjcnV0aW5zIiwic2NydXRpbnMiLCJzY3J1dGluU3BsaXRQYXRoIiwic2NydXRpbkZpbGVuYW1lIiwic2NydXRpbkZpbGVQYXRoIiwic2NydXRpbkpzb24iLCJzY3J1dGluIiwidG9TY3J1dGluIiwibG9hZEFzc2VtYmxlZURhdGFGcm9tQmlnRmlsZXMiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJhY3RldXJzIiwib3JnYW5lcyIsInRvQWdlbmRhcyIsInJldW5pb25zIiwidG9BbWVuZGVtZW50cyIsInRleHRlTGVnaXNsYXRpZiIsInRleHRlc0xlZ2lzbGF0aWZzIiwidG9Eb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNQYXJsZW1lbnRhaXJlcyIsInRvU2NydXRpbnMiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwiZG9jdW1lbnRzRGlyIiwibWF0Y2giLCJleGVjIiwibm90U3RyaWN0RXF1YWwiLCJkb2N1bWVudFR5cGUiLCJjaGFtYnJlRGlyIiwicmVwdWJsaXF1ZURpciIsImxlZ2lzbGF0dXJlRGlyIiwiZXRhdERpciIsIm51bWVybyIsInN1YnN0ciIsIm51bWVyb01pbGxpZXJzRGlyIiwiZW5zdXJlRGlyU3luYyIsInBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQiLCJkb3NzaWVyc0RpciIsInBhdGhGcm9tUmV1bmlvblVpZCIsInJldW5pb25zRGlyIiwic2Vzc2lvbkRpciIsImlkRGlyIiwibnVtZXJvTWlsbGlvbnNEaXIiLCJwYXRoRnJvbVNjcnV0aW5VaWQiLCJzY3J1dGluc0RpciJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2FkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vLyBMb2FkIGRhdGEgZnJvbSBmaWxlc1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmV4cG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuL2RhdGFzZXRzXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBFbmFibGVkRGF0YXNldHMgfSBmcm9tIFwiLi9kYXRhc2V0c1wiXG5leHBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG4gIFBob3RvLFxufSBmcm9tIFwiLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuL3R5cGVzL2FnZW5kYXNcIlxuaW1wb3J0IHsgQW1lbmRlbWVudCwgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQgfSBmcm9tIFwiLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LFxuICBEb2N1bWVudCxcbiAgRG9zc2llclBhcmxlbWVudGFpcmUsXG59IGZyb20gXCIuL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IExlZ2lzbGF0dXJlIH0gZnJvbSBcIi4vdHlwZXMvbGVnaXNsYXR1cmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4vdHlwZXMvc2NydXRpbnNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGEge1xuICByZWFkb25seSBhY3RldXJCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfVxuICByZWFkb25seSBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9XG4gIHJlYWRvbmx5IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfVxuICByZWFkb25seSBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9XG4gIHJlYWRvbmx5IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH1cbiAgcmVhZG9ubHkgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9XG4gIHJlYWRvbmx5IG9yZ2FuZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IE9yZ2FuZSB9XG4gIHJlYWRvbmx5IHBob3RvQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfVxuICByZWFkb25seSByZXVuaW9uQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUmV1bmlvbiB9XG4gIHJlYWRvbmx5IHJldW5pb25zQnlEYXk6IHsgW2RheTogc3RyaW5nXTogUmV1bmlvbltdIH1cbiAgcmVhZG9ubHkgcmV1bmlvbnNCeURvc3NpZXJVaWQ6IHsgW2Rvc3NpZXJVaWQ6IHN0cmluZ106IFJldW5pb25bXSB9XG4gIHJlYWRvbmx5IHNjcnV0aW5CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBTY3J1dGluIH1cbn1cblxuY29uc3QgZG9jdW1lbnRVaWRSZWdleCA9XG4gIC9eKEFDSU58QUxDTnxBVkNFfEFWSVN8REVDTHxFVERJfExFVFR8TUVTU3xQSU9OfFBOUkV8UFJKTHxSQVBQfFJJTkZ8UklPTikoQU58U04pKFJcXGQrKVtMU10oXFxkKykoQnxCVEF8QlRDfFRBUCkoXFxkKykoLS4qKT8kL1xuY29uc3QgZG9zc2llclVpZFJlZ2V4ID0gL15ETChSXFxkKykoTFxcZCspTihcXGQrKSQvXG5jb25zdCByZXVuaW9uVWlkUmVnZXggPVxuICAvXlJVKEFOfENHfFNOKShSXFxkKykoTFxcZCspKFtBU11cXGR7NH0pKElEQ3xJREZMP3xJRFMpKFxcZCspJC9cbmNvbnN0IHNjcnV0aW5VaWRSZWdleCA9IC9eVlRBTihSXFxkKykoTFxcZCspVihcXGQrKSQvXG5cbi8qKiBMb2FkIGRhdGEgZnJvbSBzcGxpdCBmaWxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXNzZW1ibGVlRGF0YShcbiAgZGF0YURpcjogc3RyaW5nLFxuICBlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICB7IGxvZyA9IGZhbHNlIH0gPSB7fSxcbik6IERhdGEge1xuICBjb25zdCBhY3RldXJCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfSA9IHt9XG4gIGNvbnN0IG9yZ2FuZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IE9yZ2FuZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJhY3RldXJzXCJdKSkge1xuICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5hY3RldXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2FjdGV1ckZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVySnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFjdGV1ckZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcImFjdGV1clwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAoYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdGV1ckJ5VWlkW2FjdGV1ci51aWRdID0gYWN0ZXVyXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke29yZ2FuZUZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZUZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZShvcmdhbmVKc29uKVxuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcIm9yZ2FuZVwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAob3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9yZ2FuZUJ5VWlkW29yZ2FuZS51aWRdID0gb3JnYW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXVuaW9uQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUmV1bmlvbiB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURheTogeyBbZGF5OiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGNvbnN0IHJldW5pb25zQnlEb3NzaWVyVWlkOiB7IFtkb3NzaWVyVWlkOiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldERpciA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWVcIiksXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPSByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLnJldW5pb25TcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3JldW5pb25GaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25Kc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocmV1bmlvbkZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXVuaW9uID0gQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25Kc29uKVxuICAgICAgICBpZiAocmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9IHJldW5pb25cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheSA9IHJldW5pb24udGltZXN0YW1wRGVidXQudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cbiAgICAgICAgbGV0IHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV1cbiAgICAgICAgaWYgKHJldW5pb25zQXREYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldW5pb25zQXREYXkucHVzaChyZXVuaW9uKVxuXG4gICAgICAgIGNvbnN0IG9kaiA9IHJldW5pb24ub2RqXG4gICAgICAgIGlmIChvZGogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnRPZGogb2Ygb2RqLnBvaW50c09kaiB8fCBbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyTGVnaXNsYXRpZlJlZiBvZiBwb2ludE9kai5kb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8fFxuICAgICAgICAgICAgICBbXSkge1xuICAgICAgICAgICAgICBsZXQgcmV1bmlvbnNBdERvc3NpZXJVaWQgPVxuICAgICAgICAgICAgICAgIHJldW5pb25zQnlEb3NzaWVyVWlkW2Rvc3NpZXJMZWdpc2xhdGlmUmVmXVxuICAgICAgICAgICAgICBpZiAocmV1bmlvbnNBdERvc3NpZXJVaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkID0gcmV1bmlvbnNCeURvc3NpZXJVaWRbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyTGVnaXNsYXRpZlJlZlxuICAgICAgICAgICAgICAgIF0gPSBbXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkLnB1c2gocmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldERpciwgLi4uYW1lbmRlbWVudFNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7YW1lbmRlbWVudEZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhhbWVuZGVtZW50RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50KGFtZW5kZW1lbnRKc29uKVxuICAgICAgICBpZiAoYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9IGFtZW5kZW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIsIFtcImRvY3VtZW50c1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9IGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLmRvY3VtZW50U3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtkb2N1bWVudEZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgaWYgKGRvY3VtZW50QnlVaWRbZG9jdW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID0gZG9jdW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtkb3NzaWVyRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVySnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShkb3NzaWVySnNvbilcbiAgICAgICAgY29uc3QgdGl0cmVEb3NzaWVyID0gZG9zc2llci50aXRyZURvc3NpZXJcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci5zZW5hdENoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aXRyZURvc3NpZXIudGl0cmVDaGVtaW4gJiZcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9PT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9IGRvc3NpZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWRbZG9zc2llci51aWRdID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHBob3RvQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUGhvdG9zKSB7XG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGBwaG90b3NfZGVwdXRlc18ke1xuICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMZWdpc2xhdHVyZS5BbGwuXG4gICAgICAgICAgbGVnaXNsYXR1cmUgPT09IExlZ2lzbGF0dXJlLkFsbCA/IExlZ2lzbGF0dXJlLlNlaXplIDogbGVnaXNsYXR1cmVcbiAgICAgICAgfWAsXG4gICAgICAgIFwiZGVwdXRlcy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIFwicGhvdG9zX3NlbmF0ZXVyc1wiLFxuICAgICAgICBcInNlbmF0ZXVycy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldERpcikpIHtcbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID0gc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5zY3J1dGluU3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtzY3J1dGluRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNjcnV0aW5GaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc2NydXRpbiA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4oc2NydXRpbkpzb24pXG4gICAgICAgIGlmIChzY3J1dGluQnlVaWRbc2NydXRpbi51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY3J1dGluQnlVaWRbc2NydXRpbi51aWRdID0gc2NydXRpblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY3RldXJCeVVpZCxcbiAgICBhbWVuZGVtZW50QnlVaWQsXG4gICAgZG9jdW1lbnRCeVVpZCxcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQsXG4gICAgb3JnYW5lQnlVaWQsXG4gICAgcGhvdG9CeVVpZCxcbiAgICByZXVuaW9uQnlVaWQsXG4gICAgcmV1bmlvbnNCeURheSxcbiAgICByZXVuaW9uc0J5RG9zc2llclVpZCxcbiAgICBzY3J1dGluQnlVaWQsXG4gIH1cbn1cblxuLyoqIExvYWQgZGF0YSBmcm9tIGJpZyBtb25vbHl0aWMgZmlsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEFzc2VtYmxlZURhdGFGcm9tQmlnRmlsZXMoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsXG4gIGxlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSxcbiAgeyBsb2cgPSBmYWxzZSB9ID0ge30sXG4pOiBEYXRhIHtcbiAgY29uc3QgYWN0ZXVyQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQWN0ZXVyIH0gPSB7fVxuICBjb25zdCBvcmdhbmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBPcmdhbmUgfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICAgICAgY29uc3QgYWN0ZXVyc0V0T3JnYW5lcyA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvQWN0ZXVyc0V0T3JnYW5lcyhqc29uKVxuICAgICAgZm9yIChjb25zdCBhY3RldXIgb2YgYWN0ZXVyc0V0T3JnYW5lcy5hY3RldXJzKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IGV4aXN0aW5nIFwiYWN0ZXVyXCIsIGJlY2F1c2UgdGhlIGZpcnN0IHdyYXBwZXIgaXMgdGhlIG1vc3QgY29tcGxldGUuXG4gICAgICAgIGlmIChhY3RldXJCeVVpZFthY3RldXIudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPSBhY3RldXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2YgYWN0ZXVyc0V0T3JnYW5lcy5vcmdhbmVzKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IGV4aXN0aW5nIFwib3JnYW5lXCIsIGJlY2F1c2UgdGhlIGZpcnN0IHdyYXBwZXIgaXMgdGhlIG1vc3QgY29tcGxldGUuXG4gICAgICAgIGlmIChvcmdhbmVCeVVpZFtvcmdhbmUudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPSBvcmdhbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJldW5pb25CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBSZXVuaW9uIH0gPSB7fVxuICBjb25zdCByZXVuaW9uc0J5RGF5OiB7IFtkYXk6IHN0cmluZ106IFJldW5pb25bXSB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURvc3NpZXJVaWQ6IHsgW2Rvc3NpZXJVaWQ6IHN0cmluZ106IFJldW5pb25bXSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBhZ2VuZGFzID0gQWdlbmRhc0NvbnZlcnQudG9BZ2VuZGFzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHJldW5pb24gb2YgYWdlbmRhcy5yZXVuaW9ucykge1xuICAgICAgICBpZiAocmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9IHJldW5pb25cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheSA9IHJldW5pb24udGltZXN0YW1wRGVidXQudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cbiAgICAgICAgbGV0IHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV1cbiAgICAgICAgaWYgKHJldW5pb25zQXREYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldW5pb25zQXREYXkucHVzaChyZXVuaW9uKVxuXG4gICAgICAgIGNvbnN0IG9kaiA9IHJldW5pb24ub2RqXG4gICAgICAgIGlmIChvZGogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnRPZGogb2Ygb2RqLnBvaW50c09kaiB8fCBbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyTGVnaXNsYXRpZlJlZiBvZiBwb2ludE9kai5kb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8fFxuICAgICAgICAgICAgICBbXSkge1xuICAgICAgICAgICAgICBsZXQgcmV1bmlvbnNBdERvc3NpZXJVaWQgPVxuICAgICAgICAgICAgICAgIHJldW5pb25zQnlEb3NzaWVyVWlkW2Rvc3NpZXJMZWdpc2xhdGlmUmVmXVxuICAgICAgICAgICAgICBpZiAocmV1bmlvbnNBdERvc3NpZXJVaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkID0gcmV1bmlvbnNCeURvc3NpZXJVaWRbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyTGVnaXNsYXRpZlJlZlxuICAgICAgICAgICAgICAgIF0gPSBbXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkLnB1c2gocmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgfVxuICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRzID0gQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudHMoanNvbilcbiAgICAgIGZvciAoY29uc3QgdGV4dGVMZWdpc2xhdGlmIG9mIGFtZW5kZW1lbnRzLnRleHRlc0xlZ2lzbGF0aWZzKSB7XG4gICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICAgICAgICBpZiAoYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhbWVuZGVtZW50QnlVaWRbYW1lbmRlbWVudC51aWRdID0gYW1lbmRlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBkb3NzaWVyc0xlZ2lzbGF0aWZzID1cbiAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyc0xlZ2lzbGF0aWZzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50IG9mIGRvc3NpZXJzTGVnaXNsYXRpZnMudGV4dGVzTGVnaXNsYXRpZnMpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50QnlVaWRbZG9jdW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID0gZG9jdW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkb3NzaWVyIG9mIGRvc3NpZXJzTGVnaXNsYXRpZnMuZG9zc2llcnNQYXJsZW1lbnRhaXJlcykge1xuICAgICAgICBjb25zdCB0aXRyZURvc3NpZXIgPSBkb3NzaWVyLnRpdHJlRG9zc2llclxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGl0cmVEb3NzaWVyLnNlbmF0Q2hlbWluICYmXG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluW3RpdHJlRG9zc2llci5zZW5hdENoZW1pbl0gPT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVNlbmF0Q2hlbWluW3RpdHJlRG9zc2llci5zZW5hdENoZW1pbl0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci50aXRyZUNoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pblt0aXRyZURvc3NpZXIudGl0cmVDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlUaXRyZUNoZW1pblt0aXRyZURvc3NpZXIudGl0cmVDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkW2Rvc3NpZXIudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPSBkb3NzaWVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwaG90b0J5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFBob3RvIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlBob3Rvcykge1xuICAgIGNvbnN0IHBob3RvQnlVaWQgPSB7fVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGBwaG90b3NfZGVwdXRlc18ke1xuICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMZWdpc2xhdHVyZS5BbGwuXG4gICAgICAgICAgbGVnaXNsYXR1cmUgPT09IExlZ2lzbGF0dXJlLkFsbCA/IExlZ2lzbGF0dXJlLlNlaXplIDogbGVnaXNsYXR1cmVcbiAgICAgICAgfWAsXG4gICAgICAgIFwiZGVwdXRlcy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIFwicGhvdG9zX3NlbmF0ZXVyc1wiLFxuICAgICAgICBcInNlbmF0ZXVycy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBzY3J1dGlucyA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW5zKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygc2NydXRpbnMuc2NydXRpbnMpIHtcbiAgICAgICAgaWYgKHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPSBzY3J1dGluXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGV1ckJ5VWlkLFxuICAgIGFtZW5kZW1lbnRCeVVpZCxcbiAgICBkb2N1bWVudEJ5VWlkLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbixcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZCxcbiAgICBvcmdhbmVCeVVpZCxcbiAgICBwaG90b0J5VWlkLFxuICAgIHJldW5pb25CeVVpZCxcbiAgICByZXVuaW9uc0J5RGF5LFxuICAgIHJldW5pb25zQnlEb3NzaWVyVWlkLFxuICAgIHNjcnV0aW5CeVVpZCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZyb21Eb2N1bWVudFVpZChkb2N1bWVudHNEaXI6IHN0cmluZywgdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IGRvY3VtZW50VWlkUmVnZXguZXhlYyh1aWQpXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICBtYXRjaCxcbiAgICBudWxsLFxuICAgIGBVbmV4cGVjdGVkIHN0cnVjdHVyZSBmb3IgZG9jdW1lbnQgVUlEOiAke3VpZH1gLFxuICApXG4gIGNvbnN0IGRvY3VtZW50VHlwZSA9IHBhdGguam9pbihkb2N1bWVudHNEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgY2hhbWJyZURpciA9IHBhdGguam9pbihkb2N1bWVudFR5cGUsIG1hdGNoIVsyXSlcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihjaGFtYnJlRGlyLCBtYXRjaCFbM10pXG4gIGNvbnN0IGxlZ2lzbGF0dXJlRGlyID0gcGF0aC5qb2luKHJlcHVibGlxdWVEaXIsIG1hdGNoIVs0XSlcbiAgY29uc3QgZXRhdERpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbWF0Y2ghWzVdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDBcIiArIG1hdGNoIVs2XVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyKG51bWVyby5sZW5ndGggLSA2KVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihldGF0RGlyLCBudW1lcm8uc3Vic3RyKDAsIDMpKVxuICBmcy5lbnN1cmVEaXJTeW5jKG51bWVyb01pbGxpZXJzRGlyKVxuICByZXR1cm4gcGF0aC5qb2luKG51bWVyb01pbGxpZXJzRGlyLCB1aWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkKFxuICBkb3NzaWVyc0Rpcjogc3RyaW5nLFxuICB1aWQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gZG9zc2llclVpZFJlZ2V4LmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIGRvc3NpZXIgcGFybGVtZW50YWlyZSBVSUQ6ICR7dWlkfWAsXG4gIClcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihkb3NzaWVyc0RpciwgbWF0Y2ghWzFdKVxuICBjb25zdCBsZWdpc2xhdHVyZURpciA9IHBhdGguam9pbihyZXB1YmxpcXVlRGlyLCBtYXRjaCFbMl0pXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMFwiICsgbWF0Y2ghWzNdXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHIobnVtZXJvLmxlbmd0aCAtIDYpXG4gIGNvbnN0IG51bWVyb01pbGxpZXJzRGlyID0gcGF0aC5qb2luKGxlZ2lzbGF0dXJlRGlyLCBudW1lcm8uc3Vic3RyKDAsIDMpKVxuICBmcy5lbnN1cmVEaXJTeW5jKG51bWVyb01pbGxpZXJzRGlyKVxuICByZXR1cm4gcGF0aC5qb2luKG51bWVyb01pbGxpZXJzRGlyLCB1aWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRnJvbVJldW5pb25VaWQocmV1bmlvbnNEaXI6IHN0cmluZywgdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IHJldW5pb25VaWRSZWdleC5leGVjKHVpZClcbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgIG1hdGNoLFxuICAgIG51bGwsXG4gICAgYFVuZXhwZWN0ZWQgc3RydWN0dXJlIGZvciByZXVuaW9uIFVJRDogJHt1aWR9YCxcbiAgKVxuICBjb25zdCBjaGFtYnJlRGlyID0gcGF0aC5qb2luKHJldW5pb25zRGlyLCBtYXRjaCFbMV0pXG4gIGNvbnN0IHJlcHVibGlxdWVEaXIgPSBwYXRoLmpvaW4oY2hhbWJyZURpciwgbWF0Y2ghWzJdKVxuICBjb25zdCBsZWdpc2xhdHVyZURpciA9IHBhdGguam9pbihyZXB1YmxpcXVlRGlyLCBtYXRjaCFbM10pXG4gIGNvbnN0IHNlc3Npb25EaXIgPSBwYXRoLmpvaW4obGVnaXNsYXR1cmVEaXIsIG1hdGNoIVs0XSlcbiAgY29uc3QgaWREaXIgPSBwYXRoLmpvaW4oc2Vzc2lvbkRpciwgbWF0Y2ghWzVdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDAwMDBcIiArIG1hdGNoIVs2XVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyKG51bWVyby5sZW5ndGggLSA5KVxuICBjb25zdCBudW1lcm9NaWxsaW9uc0RpciA9IHBhdGguam9pbihpZERpciwgbnVtZXJvLnN1YnN0cigwLCAzKSlcbiAgY29uc3QgbnVtZXJvTWlsbGllcnNEaXIgPSBwYXRoLmpvaW4obnVtZXJvTWlsbGlvbnNEaXIsIG51bWVyby5zdWJzdHIoMywgMykpXG4gIGZzLmVuc3VyZURpclN5bmMobnVtZXJvTWlsbGllcnNEaXIpXG4gIHJldHVybiBwYXRoLmpvaW4obnVtZXJvTWlsbGllcnNEaXIsIHVpZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tU2NydXRpblVpZChzY3J1dGluc0Rpcjogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gc2NydXRpblVpZFJlZ2V4LmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIHNjcnV0aW4gVUlEOiAke3VpZH1gLFxuICApXG4gIGNvbnN0IHJlcHVibGlxdWVEaXIgPSBwYXRoLmpvaW4oc2NydXRpbnNEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgbGVnaXNsYXR1cmVEaXIgPSBwYXRoLmpvaW4ocmVwdWJsaXF1ZURpciwgbWF0Y2ghWzJdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDBcIiArIG1hdGNoIVszXVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyKG51bWVyby5sZW5ndGggLSA2KVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbnVtZXJvLnN1YnN0cigwLCAzKSlcbiAgZnMuZW5zdXJlRGlyU3luYyhudW1lcm9NaWxsaWVyc0RpcilcbiAgcmV0dXJuIHBhdGguam9pbihudW1lcm9NaWxsaWVyc0RpciwgdWlkKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUVBLE9BQU9BLE1BQVAsTUFBbUIsUUFBbkI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsVUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsZTtTQUNBQyxRLEVBQVVELGU7U0FDVkUsTztTQUNBQSxPO1NBR1BDLE9BQU8sSUFBSUMsdUI7U0FJSkQsT0FBTyxJQUFJRSxjO1NBQ0NGLE9BQU8sSUFBSUcsa0I7U0FFOUJILE9BQU8sSUFBSUksMEI7U0FJSkMsVztTQUNBTCxPQUFPLElBQUlNLGU7QUFxQnBCLE1BQU1DLGdCQUFnQixHQUNwQiwySEFERjtBQUVBLE1BQU1DLGVBQWUsR0FBRyx3QkFBeEI7QUFDQSxNQUFNQyxlQUFlLEdBQ25CLDJEQURGO0FBRUEsTUFBTUMsZUFBZSxHQUFHLDBCQUF4QjtBQUVBOztBQUNBLE9BQU8sU0FBU0MsaUJB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