@tricoteuses/assemblee 1.6.1 → 1.7.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 (130) hide show
  1. package/README.md +9 -27
  2. package/lib/bugs/acteur-00010/plugin.test.js +4 -4
  3. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  4. package/lib/bugs/acteur-00010.js +15 -16
  5. package/lib/bugs/acteur-00010.mjs +1 -1
  6. package/lib/bugs/agenda-00002/plugin.test.js +4 -4
  7. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -1
  8. package/lib/bugs/agenda-00002.js +27 -28
  9. package/lib/bugs/agenda-00002.mjs +3 -3
  10. package/lib/bugs/agenda-00008/plugin.test.js +4 -4
  11. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  12. package/lib/bugs/agenda-00008.js +15 -16
  13. package/lib/bugs/agenda-00008.mjs +1 -1
  14. package/lib/bugs/agenda-00011/plugin.test.js +5 -5
  15. package/lib/bugs/agenda-00011/plugin.test.mjs +1 -1
  16. package/lib/bugs/agenda-00011.js +21 -22
  17. package/lib/bugs/agenda-00011.mjs +3 -3
  18. package/lib/bugs.js +17 -19
  19. package/lib/bugs.mjs +3 -3
  20. package/lib/cleaners/actes_legislatifs.js +5 -5
  21. package/lib/cleaners/acteurs.js +5 -5
  22. package/lib/cleaners/acteurs.mjs +1 -1
  23. package/lib/cleaners/amendements.js +5 -5
  24. package/lib/cleaners/documents.js +5 -5
  25. package/lib/cleaners/dossiers_legislatifs.js +5 -5
  26. package/lib/cleaners/organes.js +2 -2
  27. package/lib/cleaners/reunions.js +5 -5
  28. package/lib/cleaners/scrutins.js +23 -10
  29. package/lib/cleaners/scrutins.mjs +16 -3
  30. package/lib/cleaners/xml.js +8 -8
  31. package/lib/cleaners/xml.mjs +1 -1
  32. package/lib/datasets.d.ts +2 -2
  33. package/lib/datasets.js +53 -132
  34. package/lib/datasets.mjs +40 -118
  35. package/lib/dates.js +1 -2
  36. package/lib/dossiers_legislatifs.js +8 -8
  37. package/lib/file_systems.js +15 -14
  38. package/lib/file_systems.mjs +3 -3
  39. package/lib/git.d.ts +1 -0
  40. package/lib/git.js +21 -5
  41. package/lib/git.mjs +16 -1
  42. package/lib/inserters.js +3 -3
  43. package/lib/loaders.d.ts +14 -40
  44. package/lib/loaders.js +586 -1091
  45. package/lib/loaders.mjs +115 -357
  46. package/lib/parsers/documents.js +10 -10
  47. package/lib/parsers/documents.mjs +1 -1
  48. package/lib/parsers/recherche_amendements.js +17 -15
  49. package/lib/parsers/recherche_amendements.mjs +1 -1
  50. package/lib/raw_types/acteurs_et_organes.js +9 -9
  51. package/lib/raw_types/acteurs_et_organes.mjs +1 -1
  52. package/lib/raw_types/agendas.js +9 -9
  53. package/lib/raw_types/agendas.mjs +1 -1
  54. package/lib/raw_types/amendements.js +9 -9
  55. package/lib/raw_types/amendements.mjs +1 -1
  56. package/lib/raw_types/debats.d.ts +26 -78
  57. package/lib/raw_types/debats.js +49 -242
  58. package/lib/raw_types/debats.mjs +41 -234
  59. package/lib/raw_types/dossiers_legislatifs.js +9 -9
  60. package/lib/raw_types/dossiers_legislatifs.mjs +1 -1
  61. package/lib/raw_types/questions.js +9 -9
  62. package/lib/raw_types/questions.mjs +1 -1
  63. package/lib/raw_types/scrutins.d.ts +21 -9
  64. package/lib/raw_types/scrutins.js +46 -20
  65. package/lib/raw_types/scrutins.mjs +37 -11
  66. package/lib/scripts/bugs_helper.js +17 -18
  67. package/lib/scripts/bugs_helper.mjs +3 -3
  68. package/lib/scripts/clean_reorganized_data.js +183 -561
  69. package/lib/scripts/clean_reorganized_data.mjs +111 -410
  70. package/lib/scripts/diff_amendements.js +11 -24
  71. package/lib/scripts/diff_amendements.mjs +3 -17
  72. package/lib/scripts/document_dossiers_legislatifs.js +24 -27
  73. package/lib/scripts/document_dossiers_legislatifs.mjs +3 -3
  74. package/lib/scripts/get_today_reunions.js +5 -8
  75. package/lib/scripts/get_today_reunions.mjs +3 -7
  76. package/lib/scripts/merge_scrutins.js +11 -24
  77. package/lib/scripts/merge_scrutins.mjs +3 -17
  78. package/lib/scripts/parse_textes_lois.js +8 -38
  79. package/lib/scripts/parse_textes_lois.mjs +3 -33
  80. package/lib/scripts/raw_types_from_amendements.js +14 -27
  81. package/lib/scripts/raw_types_from_amendements.mjs +3 -17
  82. package/lib/scripts/reorganize_data.js +204 -456
  83. package/lib/scripts/reorganize_data.mjs +68 -260
  84. package/lib/scripts/retrieve_deputes_photos.d.ts +3 -1
  85. package/lib/scripts/retrieve_deputes_photos.js +146 -172
  86. package/lib/scripts/retrieve_deputes_photos.mjs +74 -98
  87. package/lib/scripts/retrieve_documents.js +207 -156
  88. package/lib/scripts/retrieve_documents.mjs +116 -128
  89. package/lib/scripts/retrieve_open_data.js +272 -249
  90. package/lib/scripts/retrieve_open_data.mjs +109 -123
  91. package/lib/scripts/retrieve_pending_amendments.js +16 -67
  92. package/lib/scripts/retrieve_pending_amendments.mjs +4 -55
  93. package/lib/scripts/retrieve_senateurs_photos.js +20 -77
  94. package/lib/scripts/retrieve_senateurs_photos.mjs +5 -61
  95. package/lib/scripts/retrieve_textes_lois.js +18 -46
  96. package/lib/scripts/retrieve_textes_lois.mjs +3 -33
  97. package/lib/scripts/shared/cli_helpers.d.ts +66 -0
  98. package/lib/scripts/shared/cli_helpers.js +90 -0
  99. package/lib/scripts/shared/cli_helpers.mjs +72 -0
  100. package/lib/scripts/test_iter_load.d.ts +1 -0
  101. package/lib/scripts/test_iter_load.js +154 -0
  102. package/lib/scripts/test_iter_load.mjs +71 -0
  103. package/lib/scripts/test_load.js +4 -15
  104. package/lib/scripts/test_load.mjs +3 -14
  105. package/lib/scripts/test_load_big_files.js +4 -15
  106. package/lib/scripts/test_load_big_files.mjs +3 -14
  107. package/lib/scripts/validate_json.js +15 -16
  108. package/lib/scripts/validate_json.mjs +3 -3
  109. package/lib/types/acteurs_et_organes.js +9 -9
  110. package/lib/types/acteurs_et_organes.mjs +1 -1
  111. package/lib/types/agendas.js +9 -9
  112. package/lib/types/agendas.mjs +1 -1
  113. package/lib/types/amendements.js +9 -9
  114. package/lib/types/amendements.mjs +1 -1
  115. package/lib/types/debats.d.ts +27 -79
  116. package/lib/types/debats.js +48 -241
  117. package/lib/types/debats.mjs +40 -233
  118. package/lib/types/dossiers_legislatifs.js +9 -9
  119. package/lib/types/dossiers_legislatifs.mjs +1 -1
  120. package/lib/types/legislatures.d.ts +4 -4
  121. package/lib/types/legislatures.js +5 -5
  122. package/lib/types/legislatures.mjs +5 -5
  123. package/lib/types/questions.js +9 -9
  124. package/lib/types/questions.mjs +1 -1
  125. package/lib/types/scrutins.d.ts +13 -4
  126. package/lib/types/scrutins.js +29 -15
  127. package/lib/types/scrutins.mjs +20 -6
  128. package/lib/urls.js +2 -2
  129. package/lib/urls.mjs +1 -1
  130. package/package.json +9 -7
@@ -1,10 +1,9 @@
1
- import assert from "assert";
2
1
  import { execSync } from "child_process";
3
2
  import commandLineArgs from "command-line-args";
4
3
  import fs from "fs-extra";
5
4
  import path from "path";
6
5
  import { cleanActeur, cleanAmendement, cleanDocumentOrDivision, cleanDossierParlementaire, cleanOrgane, cleanReunion, cleanScrutin, cleanQuestion, cleanCompteRendu } from "../cleaners/index.mjs";
7
- import { datasets, EnabledDatasets, filterByLegislature } from "../datasets.mjs";
6
+ import { datasets, EnabledDatasets, getEnabledDatasets, filterByLegislature } from "../datasets.mjs";
8
7
  import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
9
8
  import { walkDir } from "../file_systems.mjs";
10
9
  import * as git from "../git.mjs";
@@ -15,78 +14,85 @@ import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legisla
15
14
  import { Convert as ScrutinsConvert } from "../types/scrutins.mjs";
16
15
  import { Convert as QuestionsConvert } from "../types/questions.mjs";
17
16
  import { Convert as ComptesRendusConvert } from "../types/debats.mjs";
17
+ import { cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, dataDirDefaultOption, silentOption, verboseOption, pullOption } from "./shared/cli_helpers.mjs";
18
18
  function parseArgs(argv) {
19
- const optionsDefinitions = [{
20
- alias: "C",
21
- help: "clone repositories from given group (or organization) git URL",
22
- name: "clone",
23
- type: String
24
- }, {
25
- alias: "c",
26
- help: "commit clean files",
27
- name: "commit",
28
- type: Boolean
29
- }, {
19
+ const optionsDefinitions = [cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, {
30
20
  alias: "d",
31
21
  help: "single dataset to reorganize",
32
22
  name: "dataset",
33
23
  type: String
34
- }, {
35
- alias: "k",
36
- defaultValue: ["All"],
37
- help: "categories of datasets to reorganize",
38
- multiple: true,
39
- name: "categories",
40
- type: String
41
- }, {
42
- alias: "l",
43
- help: "legislatures of categories of datasets to retrieve; leave empty or use 0 for all",
44
- multiple: true,
45
- name: "legislature",
46
- type: Number
47
- }, {
48
- alias: "p",
49
- help: "pull repositories before proceeding",
50
- name: "pull",
51
- type: Boolean
52
- }, {
53
- alias: "r",
54
- help: "push commit to given remote",
55
- multiple: true,
56
- name: "remote",
57
- type: String
58
- }, {
59
- alias: "s",
60
- help: "don't log anything",
61
- name: "silent",
62
- type: Boolean
63
24
  }, {
64
25
  help: "do not reset --hard after commit to save I/O if the working tree is to be discarded",
65
26
  name: "no-reset-after-commit",
66
27
  type: Boolean
67
28
  }, {
68
- alias: "v",
69
- help: "verbose logs",
70
- name: "verbose",
29
+ alias: "V",
30
+ help: "don't validate data",
31
+ name: "no-validate",
71
32
  type: Boolean
72
- }, {
73
- defaultOption: true,
74
- help: "directory containing Assemblée open data files",
75
- name: "dataDir",
76
- type: String
77
33
  }];
78
34
  const options = commandLineArgs(optionsDefinitions, {
79
35
  argv: argv
80
36
  });
81
37
  return options;
82
38
  }
39
+ function cloneGit(gitGroupUrl, datasetName, dataDir) {
40
+ if (gitGroupUrl !== undefined) {
41
+ execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
42
+ cwd: dataDir,
43
+ env: process.env,
44
+ encoding: "utf-8",
45
+ stdio: ["ignore", "ignore", "pipe"]
46
+ });
47
+ }
48
+ }
49
+ function commitGit(datasetCleanDir, options, exitCode, subdirectories) {
50
+ if (options.commit) {
51
+ const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
52
+ if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
53
+ exitCode = errorCode;
54
+ }
55
+ }
56
+ if (commitAndPushUid(datasetCleanDir, options, subdirectories) && (exitCode === 0 || exitCode === 10)) {
57
+ exitCode = 1;
58
+ }
59
+ return exitCode;
60
+ }
61
+ function cleanAndValidateData(data, cleaner, fromJson, toJson, noValidate) {
62
+ cleaner(data);
63
+ const jsonData = JSON.stringify(data, null, 2);
64
+ if (!noValidate) {
65
+ return jsonData;
66
+ } else {
67
+ const validatedData = fromJson(jsonData);
68
+ return toJson(validatedData);
69
+ }
70
+ }
71
+ function processFiles(datasetRawDir, datasetCleanDir, walkDirParams, cleaner, dataConverter, options) {
72
+ for (const filePathArray of walkDir(datasetRawDir, walkDirParams)) {
73
+ const filename = filePathArray[filePathArray.length - 1];
74
+ if (!filename.endsWith(".json")) continue;
75
+ const rawFilePath = path.join(datasetRawDir, ...filePathArray);
76
+ const rawJson = fs.readFileSync(rawFilePath, {
77
+ encoding: "utf8"
78
+ });
79
+ if (options.verbose) console.log(`Cleaning file: ${rawFilePath}...`);
80
+ const data = JSON.parse(rawJson);
81
+ const validateData = !options["no-validate"];
82
+ const cleanJson = cleanAndValidateData(data, cleaner, dataConverter.fromJson, dataConverter.toJson, validateData);
83
+ const cleanFilePath = path.join(datasetCleanDir, ...filePathArray);
84
+ fs.ensureDirSync(path.dirname(cleanFilePath));
85
+ fs.writeFileSync(cleanFilePath, cleanJson, {
86
+ encoding: "utf8"
87
+ });
88
+ }
89
+ }
83
90
  function cleanReorganizedData(options) {
84
91
  const dataDir = options.dataDir;
85
92
  Date.prototype.toJSON = patchedDateToJson;
86
93
  let exitCode = options.commit ? 10 : 0;
87
- const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
88
- options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
89
- const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
94
+ const gitGroupUrl = options.clone?.trim().replace(/\/+$/, "");
95
+ const enabledDatasets = getEnabledDatasets(options.categories);
90
96
  let chosenDatasets = filterByLegislature(datasets, options.legislature);
91
97
  if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
92
98
  for (const dataset of chosenDatasets.acteursEtOrganes) {
@@ -94,90 +100,22 @@ function cleanReorganizedData(options) {
94
100
  if (options.dataset && datasetName !== options.dataset) {
95
101
  continue;
96
102
  }
97
- if (gitGroupUrl !== undefined) {
98
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
99
- cwd: dataDir,
100
- env: process.env,
101
- encoding: "utf-8",
102
- stdio: ["ignore", "ignore", "pipe"]
103
- });
104
- }
103
+ cloneGit(gitGroupUrl, datasetName, dataDir);
105
104
  const datasetRawDir = path.join(dataDir, datasetName);
106
105
  const datasetCleanDir = datasetRawDir + "_nettoye";
107
106
  if (options.pull) {
108
- execSync(`git reset --hard origin/master`, {
109
- cwd: datasetCleanDir,
110
- env: process.env,
111
- encoding: "utf-8",
112
- stdio: ["ignore", "ignore", "pipe"]
113
- });
114
- execSync(`git pull --rebase`, {
115
- cwd: datasetCleanDir,
116
- env: process.env,
117
- encoding: "utf-8",
118
- stdio: ["ignore", "ignore", "pipe"]
119
- });
107
+ git.resetAndPull(datasetCleanDir);
120
108
  }
121
109
  analyzeAndRemove(datasetName, options);
122
- for (const acteurSplitPath of walkDir(datasetRawDir, ["acteurs"])) {
123
- const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
124
- if (!acteurFilename.endsWith(".json")) {
125
- continue;
126
- }
127
- const acteurRawFilePath = path.join(datasetRawDir, ...acteurSplitPath);
128
- if (options.verbose) {
129
- console.log(` Cleaning file: ${acteurRawFilePath}…`);
130
- }
131
- const acteurRawJson = fs.readFileSync(acteurRawFilePath, {
132
- encoding: "utf8"
133
- });
134
- const acteur = JSON.parse(acteurRawJson);
135
- cleanActeur(acteur);
136
- const acteurJson = JSON.stringify(acteur, null, 2);
137
-
138
- // Validate generated JSON.
139
- const acteurClean = ActeursEtOrganesConvert.toActeur(acteurJson);
140
- const acteurCleanJson = ActeursEtOrganesConvert.acteurToJson(acteurClean);
141
- const acteurCleanFilePath = path.join(datasetCleanDir, ...acteurSplitPath);
142
- fs.ensureDirSync(path.dirname(acteurCleanFilePath));
143
- fs.writeFileSync(acteurCleanFilePath, acteurCleanJson, {
144
- encoding: "utf8"
145
- });
146
- }
147
- for (const organeSplitPath of walkDir(datasetRawDir, ["organes"])) {
148
- const organeFilename = organeSplitPath[organeSplitPath.length - 1];
149
- if (!organeFilename.endsWith(".json")) {
150
- continue;
151
- }
152
- const organeRawFilePath = path.join(datasetRawDir, ...organeSplitPath);
153
- if (options.verbose) {
154
- console.log(` Cleaning file: ${organeRawFilePath}…`);
155
- }
156
- const organeRawJson = fs.readFileSync(organeRawFilePath, {
157
- encoding: "utf8"
158
- });
159
- const organe = JSON.parse(organeRawJson);
160
- cleanOrgane(organe);
161
- const organeJson = JSON.stringify(organe, null, 2);
162
-
163
- // Validate generated JSON.
164
- const organeClean = ActeursEtOrganesConvert.toOrgane(organeJson);
165
- const organeCleanJson = ActeursEtOrganesConvert.organeToJson(organeClean);
166
- const organeCleanFilePath = path.join(datasetCleanDir, ...organeSplitPath);
167
- fs.ensureDirSync(path.dirname(organeCleanFilePath));
168
- fs.writeFileSync(organeCleanFilePath, organeCleanJson, {
169
- encoding: "utf8"
170
- });
171
- }
172
- if (options.commit) {
173
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
174
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
175
- exitCode = errorCode;
176
- }
177
- }
178
- if (commitAndPushUid(datasetCleanDir, options, ["acteurs", "organes"]) && (exitCode === 0 || exitCode === 10)) {
179
- exitCode = 1;
180
- }
110
+ processFiles(datasetRawDir, datasetCleanDir, ["acteurs"], cleanActeur, {
111
+ fromJson: ActeursEtOrganesConvert.toActeur,
112
+ toJson: ActeursEtOrganesConvert.acteurToJson
113
+ }, options);
114
+ processFiles(datasetRawDir, datasetCleanDir, ["organes"], cleanOrgane, {
115
+ fromJson: ActeursEtOrganesConvert.toOrgane,
116
+ toJson: ActeursEtOrganesConvert.organeToJson
117
+ }, options);
118
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["acteurs", "organes"]);
181
119
  }
182
120
  }
183
121
  if (enabledDatasets & EnabledDatasets.Agendas) {
@@ -186,51 +124,15 @@ function cleanReorganizedData(options) {
186
124
  if (options.dataset && datasetName !== options.dataset) {
187
125
  continue;
188
126
  }
189
- if (gitGroupUrl !== undefined) {
190
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
191
- cwd: dataDir,
192
- env: process.env,
193
- encoding: "utf-8",
194
- stdio: ["ignore", "ignore", "pipe"]
195
- });
196
- }
127
+ cloneGit(gitGroupUrl, datasetName, dataDir);
197
128
  analyzeAndRemove(datasetName, options);
198
129
  const datasetRawDir = path.join(dataDir, datasetName);
199
130
  const datasetCleanDir = datasetRawDir + "_nettoye";
200
- for (const reunionSplitPath of walkDir(datasetRawDir)) {
201
- const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
202
- if (!reunionFilename.endsWith(".json")) {
203
- continue;
204
- }
205
- const reunionRawFilePath = path.join(datasetRawDir, ...reunionSplitPath);
206
- if (options.verbose) {
207
- console.log(` Cleaning file: ${reunionRawFilePath}…`);
208
- }
209
- const reunionRawJson = fs.readFileSync(reunionRawFilePath, {
210
- encoding: "utf8"
211
- });
212
- const reunion = JSON.parse(reunionRawJson);
213
- cleanReunion(reunion);
214
- const reunionJson = JSON.stringify(reunion, null, 2);
215
-
216
- // Validate generated JSON.
217
- const reunionClean = AgendasConvert.toReunion(reunionJson);
218
- const reunionCleanJson = AgendasConvert.reunionToJson(reunionClean);
219
- const reunionCleanFilePath = path.join(datasetCleanDir, ...reunionSplitPath);
220
- fs.ensureDirSync(path.dirname(reunionCleanFilePath));
221
- fs.writeFileSync(reunionCleanFilePath, reunionCleanJson, {
222
- encoding: "utf8"
223
- });
224
- }
225
- if (options.commit) {
226
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
227
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
228
- exitCode = errorCode;
229
- }
230
- }
231
- if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
232
- exitCode = 1;
233
- }
131
+ processFiles(datasetRawDir, datasetCleanDir, [], cleanReunion, {
132
+ fromJson: AgendasConvert.toReunion,
133
+ toJson: AgendasConvert.reunionToJson
134
+ }, options);
135
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
234
136
  }
235
137
  }
236
138
  if (enabledDatasets & EnabledDatasets.Amendements) {
@@ -239,51 +141,15 @@ function cleanReorganizedData(options) {
239
141
  if (options.dataset && datasetName !== options.dataset) {
240
142
  continue;
241
143
  }
242
- if (gitGroupUrl !== undefined) {
243
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
244
- cwd: dataDir,
245
- env: process.env,
246
- encoding: "utf-8",
247
- stdio: ["ignore", "ignore", "pipe"]
248
- });
249
- }
144
+ cloneGit(gitGroupUrl, datasetName, dataDir);
250
145
  analyzeAndRemove(datasetName, options);
251
146
  const datasetRawDir = path.join(dataDir, datasetName);
252
147
  const datasetCleanDir = datasetRawDir + "_nettoye";
253
- for (const amendementSplitPath of walkDir(datasetRawDir)) {
254
- const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
255
- if (!amendementFilename.endsWith(".json")) {
256
- continue;
257
- }
258
- const amendementRawFilePath = path.join(datasetRawDir, ...amendementSplitPath);
259
- if (options.verbose) {
260
- console.log(` Cleaning file: ${amendementRawFilePath}…`);
261
- }
262
- const amendementRawJson = fs.readFileSync(amendementRawFilePath, {
263
- encoding: "utf8"
264
- });
265
- const amendement = JSON.parse(amendementRawJson);
266
- cleanAmendement(amendement);
267
- const amendementJson = JSON.stringify(amendement, null, 2);
268
-
269
- // Validate generated JSON.
270
- const amendementClean = AmendementsConvert.toAmendement(amendementJson);
271
- const amendementCleanJson = AmendementsConvert.amendementToJson(amendementClean);
272
- const amendementCleanFilePath = path.join(datasetCleanDir, ...amendementSplitPath);
273
- fs.ensureDirSync(path.dirname(amendementCleanFilePath));
274
- fs.writeFileSync(amendementCleanFilePath, amendementCleanJson, {
275
- encoding: "utf8"
276
- });
277
- }
278
- if (options.commit) {
279
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
280
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
281
- exitCode = errorCode;
282
- }
283
- }
284
- if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
285
- exitCode = 1;
286
- }
148
+ processFiles(datasetRawDir, datasetCleanDir, [], cleanAmendement, {
149
+ fromJson: AmendementsConvert.toAmendement,
150
+ toJson: AmendementsConvert.amendementToJson
151
+ }, options);
152
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
287
153
  }
288
154
  }
289
155
  if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
@@ -292,76 +158,19 @@ function cleanReorganizedData(options) {
292
158
  if (options.dataset && datasetName !== options.dataset) {
293
159
  continue;
294
160
  }
295
- if (gitGroupUrl !== undefined) {
296
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
297
- cwd: dataDir,
298
- env: process.env,
299
- encoding: "utf-8",
300
- stdio: ["ignore", "ignore", "pipe"]
301
- });
302
- }
161
+ cloneGit(gitGroupUrl, datasetName, dataDir);
303
162
  analyzeAndRemove(datasetName, options);
304
163
  const datasetRawDir = path.join(dataDir, datasetName);
305
164
  const datasetCleanDir = datasetRawDir + "_nettoye";
306
- for (const documentSplitPath of walkDir(datasetRawDir, ["documents"])) {
307
- const documentFilename = documentSplitPath[documentSplitPath.length - 1];
308
- if (!documentFilename.endsWith(".json")) {
309
- continue;
310
- }
311
- const documentRawFilePath = path.join(datasetRawDir, ...documentSplitPath);
312
- if (options.verbose) {
313
- console.log(` Cleaning file: ${documentRawFilePath}…`);
314
- }
315
- const documentRawJson = fs.readFileSync(documentRawFilePath, {
316
- encoding: "utf8"
317
- });
318
- const document = JSON.parse(documentRawJson);
319
- cleanDocumentOrDivision(document);
320
- const documentJson = JSON.stringify(document, null, 2);
321
-
322
- // Validate generated JSON.
323
- const documentClean = DossiersLegislatifsConvert.toDocument(documentJson);
324
- const documentCleanJson = DossiersLegislatifsConvert.documentToJson(documentClean);
325
- const documentCleanFilePath = path.join(datasetCleanDir, ...documentSplitPath);
326
- fs.ensureDirSync(path.dirname(documentCleanFilePath));
327
- fs.writeFileSync(documentCleanFilePath, documentCleanJson, {
328
- encoding: "utf8"
329
- });
330
- }
331
- for (const dossierSplitPath of walkDir(datasetRawDir, ["dossiers"])) {
332
- const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
333
- if (!dossierFilename.endsWith(".json")) {
334
- continue;
335
- }
336
- const dossierRawFilePath = path.join(datasetRawDir, ...dossierSplitPath);
337
- if (options.verbose) {
338
- console.log(` Cleaning file: ${dossierRawFilePath}…`);
339
- }
340
- const dossierRawJson = fs.readFileSync(dossierRawFilePath, {
341
- encoding: "utf8"
342
- });
343
- const dossier = JSON.parse(dossierRawJson);
344
- cleanDossierParlementaire(dossier);
345
- const dossierJson = JSON.stringify(dossier, null, 2);
346
-
347
- // Validate generated JSON.
348
- const dossierClean = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
349
- const dossierCleanJson = DossiersLegislatifsConvert.dossierParlementaireToJson(dossierClean);
350
- const dossierCleanFilePath = path.join(datasetCleanDir, ...dossierSplitPath);
351
- fs.ensureDirSync(path.dirname(dossierCleanFilePath));
352
- fs.writeFileSync(dossierCleanFilePath, dossierCleanJson, {
353
- encoding: "utf8"
354
- });
355
- }
356
- if (options.commit) {
357
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
358
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
359
- exitCode = errorCode;
360
- }
361
- }
362
- if (commitAndPushUid(datasetCleanDir, options, ["documents", "dossiers"]) && (exitCode === 0 || exitCode === 10)) {
363
- exitCode = 1;
364
- }
165
+ processFiles(datasetRawDir, datasetCleanDir, ["documents"], cleanDocumentOrDivision, {
166
+ fromJson: DossiersLegislatifsConvert.toDocument,
167
+ toJson: DossiersLegislatifsConvert.documentToJson
168
+ }, options);
169
+ processFiles(datasetRawDir, datasetCleanDir, ["dossiers"], cleanDossierParlementaire, {
170
+ fromJson: DossiersLegislatifsConvert.toDossierParlementaire,
171
+ toJson: DossiersLegislatifsConvert.dossierParlementaireToJson
172
+ }, options);
173
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["documents", "dossiers"]);
365
174
  }
366
175
  }
367
176
  if (enabledDatasets & EnabledDatasets.Scrutins) {
@@ -370,51 +179,15 @@ function cleanReorganizedData(options) {
370
179
  if (options.dataset && datasetName !== options.dataset) {
371
180
  continue;
372
181
  }
373
- if (gitGroupUrl !== undefined) {
374
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
375
- cwd: dataDir,
376
- env: process.env,
377
- encoding: "utf-8",
378
- stdio: ["ignore", "ignore", "pipe"]
379
- });
380
- }
182
+ cloneGit(gitGroupUrl, datasetName, dataDir);
381
183
  analyzeAndRemove(datasetName, options);
382
184
  const datasetRawDir = path.join(dataDir, datasetName);
383
185
  const datasetCleanDir = datasetRawDir + "_nettoye";
384
- for (const scrutinSplitPath of walkDir(datasetRawDir)) {
385
- const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
386
- if (!scrutinFilename.endsWith(".json")) {
387
- continue;
388
- }
389
- const scrutinRawFilePath = path.join(datasetRawDir, ...scrutinSplitPath);
390
- if (options.verbose) {
391
- console.log(` Cleaning file: ${scrutinRawFilePath}…`);
392
- }
393
- const scrutinRawJson = fs.readFileSync(scrutinRawFilePath, {
394
- encoding: "utf8"
395
- });
396
- const scrutin = JSON.parse(scrutinRawJson);
397
- cleanScrutin(scrutin);
398
- const scrutinJson = JSON.stringify(scrutin, null, 2);
399
-
400
- // Validate generated JSON.
401
- const scrutinClean = ScrutinsConvert.toScrutin(scrutinJson);
402
- const scrutinCleanJson = ScrutinsConvert.scrutinToJson(scrutinClean);
403
- const scrutinCleanFilePath = path.join(datasetCleanDir, ...scrutinSplitPath);
404
- fs.ensureDirSync(path.dirname(scrutinCleanFilePath));
405
- fs.writeFileSync(scrutinCleanFilePath, scrutinCleanJson, {
406
- encoding: "utf8"
407
- });
408
- }
409
- if (options.commit) {
410
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
411
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
412
- exitCode = errorCode;
413
- }
414
- }
415
- if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
416
- exitCode = 1;
417
- }
186
+ processFiles(datasetRawDir, datasetCleanDir, [], cleanScrutin, {
187
+ fromJson: ScrutinsConvert.toScrutin,
188
+ toJson: ScrutinsConvert.scrutinToJson
189
+ }, options);
190
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
418
191
  }
419
192
  }
420
193
  if (enabledDatasets & EnabledDatasets.Questions) {
@@ -423,51 +196,15 @@ function cleanReorganizedData(options) {
423
196
  if (options.dataset && datasetName !== options.dataset) {
424
197
  continue;
425
198
  }
426
- if (gitGroupUrl !== undefined) {
427
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
428
- cwd: dataDir,
429
- env: process.env,
430
- encoding: "utf-8",
431
- stdio: ["ignore", "ignore", "pipe"]
432
- });
433
- }
199
+ cloneGit(gitGroupUrl, datasetName, dataDir);
434
200
  analyzeAndRemove(datasetName, options);
435
201
  const datasetRawDir = path.join(dataDir, datasetName);
436
202
  const datasetCleanDir = datasetRawDir + "_nettoye";
437
- for (const questionsSplitPath of walkDir(datasetRawDir)) {
438
- const questionFilename = questionsSplitPath[questionsSplitPath.length - 1];
439
- if (!questionFilename.endsWith(".json")) {
440
- continue;
441
- }
442
- const questionRawFilePath = path.join(datasetRawDir, ...questionsSplitPath);
443
- if (options.verbose) {
444
- console.log(` Cleaning file: ${questionRawFilePath}…`);
445
- }
446
- const questionRawJson = fs.readFileSync(questionRawFilePath, {
447
- encoding: "utf8"
448
- });
449
- const question = JSON.parse(questionRawJson);
450
- cleanQuestion(question);
451
- const questionJson = JSON.stringify(question, null, 2);
452
-
453
- // Validate generated JSON.
454
- const questionClean = QuestionsConvert.toQuestion(questionJson);
455
- const questionCleanJson = QuestionsConvert.questionToJson(questionClean);
456
- const questionCleanFilePath = path.join(datasetCleanDir, ...questionsSplitPath);
457
- fs.ensureDirSync(path.dirname(questionCleanFilePath));
458
- fs.writeFileSync(questionCleanFilePath, questionCleanJson, {
459
- encoding: "utf8"
460
- });
461
- }
462
- if (options.commit) {
463
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
464
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
465
- exitCode = errorCode;
466
- }
467
- }
468
- if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
469
- exitCode = 1;
470
- }
203
+ processFiles(datasetRawDir, datasetCleanDir, [], cleanQuestion, {
204
+ fromJson: QuestionsConvert.toQuestion,
205
+ toJson: QuestionsConvert.questionToJson
206
+ }, options);
207
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
471
208
  }
472
209
  }
473
210
  if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
@@ -476,51 +213,15 @@ function cleanReorganizedData(options) {
476
213
  if (options.dataset && datasetName !== options.dataset) {
477
214
  continue;
478
215
  }
479
- if (gitGroupUrl !== undefined) {
480
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
481
- cwd: dataDir,
482
- env: process.env,
483
- encoding: "utf-8",
484
- stdio: ["ignore", "ignore", "pipe"]
485
- });
486
- }
216
+ cloneGit(gitGroupUrl, datasetName, dataDir);
487
217
  analyzeAndRemove(datasetName, options);
488
218
  const datasetRawDir = path.join(dataDir, datasetName);
489
219
  const datasetCleanDir = datasetRawDir + "_nettoye";
490
- for (const comptesRendusSplitPath of walkDir(datasetRawDir)) {
491
- const compteRenduFilename = comptesRendusSplitPath[comptesRendusSplitPath.length - 1];
492
- if (!compteRenduFilename.endsWith(".json")) {
493
- continue;
494
- }
495
- const compteRenduRawFilePath = path.join(datasetRawDir, ...comptesRendusSplitPath);
496
- if (options.verbose) {
497
- console.log(` Cleaning file: ${compteRenduRawFilePath}…`);
498
- }
499
- const compteRenduRawJson = fs.readFileSync(compteRenduRawFilePath, {
500
- encoding: "utf8"
501
- });
502
- const compteRendu = JSON.parse(compteRenduRawJson);
503
- cleanCompteRendu(compteRendu);
504
- const compteRenduJson = JSON.stringify(compteRendu, null, 2);
505
-
506
- // Validate generated JSON.
507
- const compteRenduClean = ComptesRendusConvert.toCompteRendu(compteRenduJson);
508
- const compteRenduCleanJson = ComptesRendusConvert.compteRenduToJson(compteRenduClean);
509
- const compteRenduCleanFilePath = path.join(datasetCleanDir, ...comptesRendusSplitPath);
510
- fs.ensureDirSync(path.dirname(compteRenduCleanFilePath));
511
- fs.writeFileSync(compteRenduCleanFilePath, compteRenduCleanJson, {
512
- encoding: "utf8"
513
- });
514
- }
515
- if (options.commit) {
516
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
517
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
518
- exitCode = errorCode;
519
- }
520
- }
521
- if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
522
- exitCode = 1;
523
- }
220
+ processFiles(datasetRawDir, datasetCleanDir, [], cleanCompteRendu, {
221
+ fromJson: ComptesRendusConvert.toCompteRendu,
222
+ toJson: ComptesRendusConvert.compteRenduToJson
223
+ }, options);
224
+ exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
524
225
  }
525
226
  }
526
227
 
@@ -565,4 +266,4 @@ function main(argv) {
565
266
 
566
267
  /* istanbul ignore if */
567
268
  if (process.argv[1].endsWith("clean_reorganized_data.ts")) process.exit(main(process.argv));
568
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJjbGVhblF1ZXN0aW9uIiwiY2xlYW5Db21wdGVSZW5kdSIsImRhdGFzZXRzIiwiRW5hYmxlZERhdGFzZXRzIiwiZmlsdGVyQnlMZWdpc2xhdHVyZSIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJRdWVzdGlvbnNDb252ZXJ0IiwiQ29tcHRlc1JlbmR1c0NvbnZlcnQiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJOdW1iZXIiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJleGl0Q29kZSIsImNvbW1pdCIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsImNhdGVnb3JpZXMiLCJtYXAiLCJkYXRhc2V0TmFtZSIsIm5vdFN0cmljdEVxdWFsIiwiZW5hYmxlZERhdGFzZXRzIiwicmVkdWNlIiwiTm9uZSIsImNob3NlbkRhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJBY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldCIsImFjdGV1cnNFdE9yZ2FuZXMiLCJiYXNlbmFtZSIsImZpbGVuYW1lIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJkYXRhc2V0UmF3RGlyIiwiam9pbiIsImRhdGFzZXRDbGVhbkRpciIsInB1bGwiLCJhbmFseXplQW5kUmVtb3ZlIiwiYWN0ZXVyU3BsaXRQYXRoIiwiYWN0ZXVyRmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsImFjdGV1clJhd0ZpbGVQYXRoIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJhY3RldXJSYXdKc29uIiwicmVhZEZpbGVTeW5jIiwiYWN0ZXVyIiwiSlNPTiIsInBhcnNlIiwiYWN0ZXVySnNvbiIsInN0cmluZ2lmeSIsImFjdGV1ckNsZWFuIiwidG9BY3RldXIiLCJhY3RldXJDbGVhbkpzb24iLCJhY3RldXJUb0pzb24iLCJhY3RldXJDbGVhbkZpbGVQYXRoIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVSYXdGaWxlUGF0aCIsIm9yZ2FuZVJhd0pzb24iLCJvcmdhbmUiLCJvcmdhbmVKc29uIiwib3JnYW5lQ2xlYW4iLCJ0b09yZ2FuZSIsIm9yZ2FuZUNsZWFuSnNvbiIsIm9yZ2FuZVRvSnNvbiIsIm9yZ2FuZUNsZWFuRmlsZVBhdGgiLCJlcnJvckNvZGUiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiY29tbWl0QW5kUHVzaFVpZCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25SYXdGaWxlUGF0aCIsInJldW5pb25SYXdKc29uIiwicmV1bmlvbiIsInJldW5pb25Kc29uIiwicmV1bmlvbkNsZWFuIiwidG9SZXVuaW9uIiwicmV1bmlvbkNsZWFuSnNvbiIsInJldW5pb25Ub0pzb24iLCJyZXVuaW9uQ2xlYW5GaWxlUGF0aCIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudFJhd0ZpbGVQYXRoIiwiYW1lbmRlbWVudFJhd0pzb24iLCJhbWVuZGVtZW50IiwiYW1lbmRlbWVudEpzb24iLCJhbWVuZGVtZW50Q2xlYW4iLCJ0b0FtZW5kZW1lbnQiLCJhbWVuZGVtZW50Q2xlYW5Kc29uIiwiYW1lbmRlbWVudFRvSnNvbiIsImFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudFNwbGl0UGF0aCIsImRvY3VtZW50RmlsZW5hbWUiLCJkb2N1bWVudFJhd0ZpbGVQYXRoIiwiZG9jdW1lbnRSYXdKc29uIiwiZG9jdW1lbnQiLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudENsZWFuIiwidG9Eb2N1bWVudCIsImRvY3VtZW50Q2xlYW5Kc29uIiwiZG9jdW1lbnRUb0pzb24iLCJkb2N1bWVudENsZWFuRmlsZVBhdGgiLCJkb3NzaWVyU3BsaXRQYXRoIiwiZG9zc2llckZpbGVuYW1lIiwiZG9zc2llclJhd0ZpbGVQYXRoIiwiZG9zc2llclJhd0pzb24iLCJkb3NzaWVyIiwiZG9zc2llckpzb24iLCJkb3NzaWVyQ2xlYW4iLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llckNsZWFuSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uIiwiZG9zc2llckNsZWFuRmlsZVBhdGgiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5SYXdGaWxlUGF0aCIsInNjcnV0aW5SYXdKc29uIiwic2NydXRpbiIsInNjcnV0aW5Kc29uIiwic2NydXRpbkNsZWFuIiwidG9TY3J1dGluIiwic2NydXRpbkNsZWFuSnNvbiIsInNjcnV0aW5Ub0pzb24iLCJzY3J1dGluQ2xlYW5GaWxlUGF0aCIsIlF1ZXN0aW9ucyIsInF1ZXN0aW9ucyIsInF1ZXN0aW9uc1NwbGl0UGF0aCIsInF1ZXN0aW9uRmlsZW5hbWUiLCJxdWVzdGlvblJhd0ZpbGVQYXRoIiwicXVlc3Rpb25SYXdKc29uIiwicXVlc3Rpb24iLCJxdWVzdGlvbkpzb24iLCJxdWVzdGlvbkNsZWFuIiwidG9RdWVzdGlvbiIsInF1ZXN0aW9uQ2xlYW5Kc29uIiwicXVlc3Rpb25Ub0pzb24iLCJxdWVzdGlvbkNsZWFuRmlsZVBhdGgiLCJDb21wdGVzUmVuZHVzU2VhbmNlcyIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlc1JlbmR1c1NwbGl0UGF0aCIsImNvbXB0ZVJlbmR1RmlsZW5hbWUiLCJjb21wdGVSZW5kdVJhd0ZpbGVQYXRoIiwiY29tcHRlUmVuZHVSYXdKc29uIiwiY29tcHRlUmVuZHUiLCJjb21wdGVSZW5kdUpzb24iLCJjb21wdGVSZW5kdUNsZWFuIiwidG9Db21wdGVSZW5kdSIsImNvbXB0ZVJlbmR1Q2xlYW5Kc29uIiwiY29tcHRlUmVuZHVUb0pzb24iLCJjb21wdGVSZW5kdUNsZWFuRmlsZVBhdGgiLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJzdWJkaXJlY3RvcmllcyIsImVycm9yIiwidWlkQnJhbmNoVXBkYXRlIiwicnVuIiwiY2hpbGRQcm9jZXNzIiwibWFpbiIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9jbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQge1xuICBjbGVhbkFjdGV1cixcbiAgY2xlYW5BbWVuZGVtZW50LFxuICBjbGVhbkRvY3VtZW50T3JEaXZpc2lvbixcbiAgY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgY2xlYW5PcmdhbmUsXG4gIGNsZWFuUmV1bmlvbixcbiAgY2xlYW5TY3J1dGluLFxuICBjbGVhblF1ZXN0aW9uLFxuICBjbGVhbkNvbXB0ZVJlbmR1LFxufSBmcm9tIFwiLi4vY2xlYW5lcnNcIlxuaW1wb3J0IHsgZGF0YXNldHMsIEVuYWJsZWREYXRhc2V0cywgZmlsdGVyQnlMZWdpc2xhdHVyZSB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBleGlzdGluZ0RhdGVUb0pzb24sIHBhdGNoZWREYXRlVG9Kc29uIH0gZnJvbSBcIi4uL2RhdGVzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCAqIGFzIGdpdCBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB7XG4gIEFjdGV1cixcbiAgQ29udmVydCBhcyBBY3RldXJzRXRPcmdhbmVzQ29udmVydCxcbiAgT3JnYW5lLFxufSBmcm9tIFwiLi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWdlbmRhc0NvbnZlcnQsIFJldW5pb24gfSBmcm9tIFwiLi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBBbWVuZGVtZW50LCBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzQ29udmVydCB9IGZyb20gXCIuLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LFxuICBEb2N1bWVudCxcbiAgRG9zc2llclBhcmxlbWVudGFpcmUsXG59IGZyb20gXCIuLi90eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zQ29udmVydCwgU2NydXRpbiB9IGZyb20gXCIuLi90eXBlcy9zY3J1dGluc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFF1ZXN0aW9uc0NvbnZlcnQsIFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzL3F1ZXN0aW9uc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIENvbXB0ZXNSZW5kdXNDb252ZXJ0LCBDb21wdGVSZW5kdSB9IGZyb20gXCIuLi90eXBlcy9kZWJhdHNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgYWxpYXM6IFwiQ1wiLFxuICAgICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJjXCIsXG4gICAgICBoZWxwOiBcImNvbW1pdCBjbGVhbiBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJjb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJkXCIsXG4gICAgICBoZWxwOiBcInNpbmdsZSBkYXRhc2V0IHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG5hbWU6IFwiZGF0YXNldFwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwia1wiLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImxcIixcbiAgICAgIGhlbHA6IFwibGVnaXNsYXR1cmVzIG9mIGNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmV0cmlldmU7IGxlYXZlIGVtcHR5IG9yIHVzZSAwIGZvciBhbGxcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgICAgdHlwZTogTnVtYmVyLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwicFwiLFxuICAgICAgaGVscDogXCJwdWxsIHJlcG9zaXRvcmllcyBiZWZvcmUgcHJvY2VlZGluZ1wiLFxuICAgICAgbmFtZTogXCJwdWxsXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiclwiLFxuICAgICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInNcIixcbiAgICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZG8gbm90IHJlc2V0IC0taGFyZCBhZnRlciBjb21taXQgdG8gc2F2ZSBJL08gaWYgdGhlIHdvcmtpbmcgdHJlZSBpcyB0byBiZSBkaXNjYXJkZWRcIixcbiAgICAgIG5hbWU6IFwibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwidlwiLFxuICAgICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICBdXG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zLCB7XG4gICAgYXJndjogYXJndixcbiAgfSlcbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9uczogYW55KTogbnVtYmVyIHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBsZXQgZXhpdENvZGUgPSBvcHRpb25zLmNvbW1pdCA/IDEwIDogMDtcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcblxuICBvcHRpb25zLmNhdGVnb3JpZXMubWFwKChkYXRhc2V0TmFtZTogc3RyaW5nKSA9PlxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgVW5rbm93biBuYW1lIG9mIGRhdGFzZXQ6ICR7ZGF0YXNldE5hbWV9YCxcbiAgICApLFxuICApXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IG9wdGlvbnMuY2F0ZWdvcmllcy5yZWR1Y2UoXG4gICAgKGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLCBkYXRhc2V0TmFtZTogc3RyaW5nKTogRW5hYmxlZERhdGFzZXRzID0+XG4gICAgICBlbmFibGVkRGF0YXNldHMgfFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICBFbmFibGVkRGF0YXNldHMuTm9uZSxcbiAgKVxuXG4gIGxldCBjaG9zZW5EYXRhc2V0cyA9IGZpbHRlckJ5TGVnaXNsYXR1cmUoZGF0YXNldHMsIG9wdGlvbnMubGVnaXNsYXR1cmUpXG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgICBleGVjU3luYyhgZ2l0IHB1bGwgLS1yZWJhc2VgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJhY3RldXJzXCJdKSkge1xuICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5hY3RldXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2FjdGV1clJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFjdGV1clJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RldXIgPSBKU09OLnBhcnNlKGFjdGV1clJhd0pzb24pXG4gICAgICAgIGNsZWFuQWN0ZXVyKGFjdGV1cilcbiAgICAgICAgY29uc3QgYWN0ZXVySnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbjogQWN0ZXVyID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIoYWN0ZXVySnNvbilcbiAgICAgICAgY29uc3QgYWN0ZXVyQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LmFjdGV1clRvSnNvbihhY3RldXJDbGVhbilcblxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShhY3RldXJDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhhY3RldXJDbGVhbkZpbGVQYXRoLCBhY3RldXJDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgb3JnYW5lU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wib3JnYW5lc1wiXSkpIHtcbiAgICAgICAgY29uc3Qgb3JnYW5lRmlsZW5hbWUgPSBvcmdhbmVTcGxpdFBhdGhbb3JnYW5lU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghb3JnYW5lRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ub3JnYW5lU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtvcmdhbmVSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yZ2FuZVJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhvcmdhbmVSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgb3JnYW5lID0gSlNPTi5wYXJzZShvcmdhbmVSYXdKc29uKVxuICAgICAgICBjbGVhbk9yZ2FuZShvcmdhbmUpXG4gICAgICAgIGNvbnN0IG9yZ2FuZUpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW46IE9yZ2FuZSA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvT3JnYW5lKG9yZ2FuZUpzb24pXG4gICAgICAgIGNvbnN0IG9yZ2FuZUNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5vcmdhbmVUb0pzb24ob3JnYW5lQ2xlYW4pXG5cbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUob3JnYW5lQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMob3JnYW5lQ2xlYW5GaWxlUGF0aCwgb3JnYW5lQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJhY3RldXJzXCIsIFwib3JnYW5lc1wiXSkgJiZcbiAgICAgICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYWdlbmRhcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPSByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvblJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLnJldW5pb25TcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke3JldW5pb25SYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25SYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocmV1bmlvblJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXVuaW9uID0gSlNPTi5wYXJzZShyZXVuaW9uUmF3SnNvbilcbiAgICAgICAgY2xlYW5SZXVuaW9uKHJldW5pb24pXG4gICAgICAgIGNvbnN0IHJldW5pb25Kc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShyZXVuaW9uLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW46IFJldW5pb24gPSBBZ2VuZGFzQ29udmVydC50b1JldW5pb24ocmV1bmlvbkpzb24pXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQWdlbmRhc0NvbnZlcnQucmV1bmlvblRvSnNvbihyZXVuaW9uQ2xlYW4pXG5cbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4ucmV1bmlvblNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShyZXVuaW9uQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocmV1bmlvbkNsZWFuRmlsZVBhdGgsIHJldW5pb25DbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pICYmXG4gICAgICAgIChleGl0Q29kZSA9PT0gMCB8fCBleGl0Q29kZSA9PT0gMTApXG4gICAgICApIHtcbiAgICAgICAgZXhpdENvZGUgPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2FtZW5kZW1lbnRSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgYW1lbmRlbWVudFJhd0ZpbGVQYXRoLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBKU09OLnBhcnNlKGFtZW5kZW1lbnRSYXdKc29uKVxuICAgICAgICBjbGVhbkFtZW5kZW1lbnQoYW1lbmRlbWVudClcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFtZW5kZW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbjogQW1lbmRlbWVudCA9XG4gICAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudChhbWVuZGVtZW50SnNvbilcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBbWVuZGVtZW50c0NvbnZlcnQuYW1lbmRlbWVudFRvSnNvbihhbWVuZGVtZW50Q2xlYW4pXG5cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYW1lbmRlbWVudENsZWFuRmlsZVBhdGgsIGFtZW5kZW1lbnRDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pICYmXG4gICAgICAgIChleGl0Q29kZSA9PT0gMCB8fCBleGl0Q29kZSA9PT0gMTApXG4gICAgICApIHtcbiAgICAgICAgZXhpdENvZGUgPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImRvY3VtZW50c1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9IGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudFJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7ZG9jdW1lbnRSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvY3VtZW50UmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gSlNPTi5wYXJzZShkb2N1bWVudFJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uKGRvY3VtZW50KVxuICAgICAgICBjb25zdCBkb2N1bWVudEpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50LCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuOiBEb2N1bWVudCA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudEpzb24pXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvY3VtZW50VG9Kc29uKGRvY3VtZW50Q2xlYW4pXG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvY3VtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGRvY3VtZW50Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZG9jdW1lbnRDbGVhbkZpbGVQYXRoLCBkb2N1bWVudENsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkb3NzaWVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9zc2llcnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGRvc3NpZXJGaWxlbmFtZSA9IGRvc3NpZXJTcGxpdFBhdGhbZG9zc2llclNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWRvc3NpZXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uZG9zc2llclNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7ZG9zc2llclJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9zc2llclJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhkb3NzaWVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRvc3NpZXIgPSBKU09OLnBhcnNlKGRvc3NpZXJSYXdKc29uKVxuICAgICAgICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXIpXG4gICAgICAgIGNvbnN0IGRvc3NpZXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkb3NzaWVyLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW46IERvc3NpZXJQYXJsZW1lbnRhaXJlID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXJKc29uKVxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uKGRvc3NpZXJDbGVhbilcblxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5kb3NzaWVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGRvc3NpZXJDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb3NzaWVyQ2xlYW5GaWxlUGF0aCwgZG9zc2llckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiZG9jdW1lbnRzXCIsIFwiZG9zc2llcnNcIl0pICYmXG4gICAgICAgIChleGl0Q29kZSA9PT0gMCB8fCBleGl0Q29kZSA9PT0gMTApXG4gICAgICApIHtcbiAgICAgICAgZXhpdENvZGUgPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCBzY3J1dGluRmlsZW5hbWUgPSBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpblJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLnNjcnV0aW5TcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke3NjcnV0aW5SYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5SYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoc2NydXRpblJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBzY3J1dGluID0gSlNPTi5wYXJzZShzY3J1dGluUmF3SnNvbilcbiAgICAgICAgY2xlYW5TY3J1dGluKHNjcnV0aW4pXG4gICAgICAgIGNvbnN0IHNjcnV0aW5Kc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShzY3J1dGluLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBzY3J1dGluQ2xlYW46IFNjcnV0aW4gPSBTY3J1dGluc0NvbnZlcnQudG9TY3J1dGluKHNjcnV0aW5Kc29uKVxuICAgICAgICBjb25zdCBzY3J1dGluQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIFNjcnV0aW5zQ29udmVydC5zY3J1dGluVG9Kc29uKHNjcnV0aW5DbGVhbilcblxuICAgICAgICBjb25zdCBzY3J1dGluQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5zY3J1dGluU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKHNjcnV0aW5DbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhzY3J1dGluQ2xlYW5GaWxlUGF0aCwgc2NydXRpbkNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkgJiZcbiAgICAgICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBxdWVzdGlvbnNTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCBxdWVzdGlvbkZpbGVuYW1lID1cbiAgICAgICAgICBxdWVzdGlvbnNTcGxpdFBhdGhbcXVlc3Rpb25zU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghcXVlc3Rpb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVzdGlvblJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4ucXVlc3Rpb25zU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke3F1ZXN0aW9uUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVzdGlvblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhxdWVzdGlvblJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBxdWVzdGlvbiA9IEpTT04ucGFyc2UocXVlc3Rpb25SYXdKc29uKVxuICAgICAgICBjbGVhblF1ZXN0aW9uKHF1ZXN0aW9uKVxuICAgICAgICBjb25zdCBxdWVzdGlvbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHF1ZXN0aW9uLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBxdWVzdGlvbkNsZWFuOiBRdWVzdGlvbiA9XG4gICAgICAgICAgUXVlc3Rpb25zQ29udmVydC50b1F1ZXN0aW9uKHF1ZXN0aW9uSnNvbilcbiAgICAgICAgY29uc3QgcXVlc3Rpb25DbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgUXVlc3Rpb25zQ29udmVydC5xdWVzdGlvblRvSnNvbihxdWVzdGlvbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5xdWVzdGlvbnNTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUocXVlc3Rpb25DbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhxdWVzdGlvbkNsZWFuRmlsZVBhdGgsIHF1ZXN0aW9uQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSAmJlxuICAgICAgICAoZXhpdENvZGUgPT09IDAgfHwgZXhpdENvZGUgPT09IDEwKVxuICAgICAgKSB7XG4gICAgICAgIGV4aXRDb2RlID0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQ29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuY29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi54bWxcIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGNvbXB0ZXNSZW5kdXNTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCBjb21wdGVSZW5kdUZpbGVuYW1lID1cbiAgICAgICAgICBjb21wdGVzUmVuZHVzU3BsaXRQYXRoW2NvbXB0ZXNSZW5kdXNTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFjb21wdGVSZW5kdUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5jb21wdGVzUmVuZHVzU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2NvbXB0ZVJlbmR1UmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wdGVSZW5kdVJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICBjb21wdGVSZW5kdVJhd0ZpbGVQYXRoLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1ID0gSlNPTi5wYXJzZShjb21wdGVSZW5kdVJhd0pzb24pXG4gICAgICAgIGNsZWFuQ29tcHRlUmVuZHUoY29tcHRlUmVuZHUpXG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoY29tcHRlUmVuZHUsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1Q2xlYW46IENvbXB0ZVJlbmR1ID1cbiAgICAgICAgICBDb21wdGVzUmVuZHVzQ29udmVydC50b0NvbXB0ZVJlbmR1KGNvbXB0ZVJlbmR1SnNvbilcbiAgICAgICAgY29uc3QgY29tcHRlUmVuZHVDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQ29tcHRlc1JlbmR1c0NvbnZlcnQuY29tcHRlUmVuZHVUb0pzb24oY29tcHRlUmVuZHVDbGVhbilcblxuICAgICAgICBjb25zdCBjb21wdGVSZW5kdUNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uY29tcHRlc1JlbmR1c1NwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShjb21wdGVSZW5kdUNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbXB0ZVJlbmR1Q2xlYW5GaWxlUGF0aCwgY29tcHRlUmVuZHVDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pICYmXG4gICAgICAgIChleGl0Q29kZSA9PT0gMCB8fCBleGl0Q29kZSA9PT0gMTApXG4gICAgICApIHtcbiAgICAgICAgZXhpdENvZGUgPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBDbGVhbmluZyBkaXJlY3Rvcnk6ICR7ZGF0YXNldENsZWFuRGlyfeKApmApXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldENsZWFuRGlyKSkge1xuICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5qb2luKGRhdGFzZXRDbGVhbkRpciwgZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhwYXRobmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoVWlkKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgc3ViZGlyZWN0b3JpZXM6IGFueSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBnaXQudWlkQnJhbmNoVXBkYXRlKFxuICAgICAgcmVwb3NpdG9yeURpcixcbiAgICAgIHN1YmRpcmVjdG9yaWVzLFxuICAgICAgb3B0aW9uc1tcIm5vLXJlc2V0LWFmdGVyLWNvbW1pdFwiXSxcbiAgICApXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2Ygb3B0aW9ucy5yZW1vdGUgfHwgW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGdpdC5ydW4ocmVwb3NpdG9yeURpciwgYHB1c2ggLS1xdWlldCAke3JlbW90ZX0gdWlkOnVpZGApXG4gICAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgcmV0dXJuIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnMpXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcImNsZWFuX3Jlb3JnYW5pemVkX2RhdGEudHNcIikpXG4gIHByb2Nlc3MuZXhpdChtYWluKHByb2Nlc3MuYXJndikpXG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQU0sTUFBTSxRQUFRO0FBQzNCLFNBQVNDLFFBQVEsUUFBUSxlQUFlO0FBQ3hDLE9BQU9DLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsT0FBT0MsRUFBRSxNQUFNLFVBQVU7QUFDekIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFBQSxTQUdyQkMsV0FBVyxFQUNYQyxlQUFlLEVBQ2ZDLHVCQUF1QixFQUN2QkMseUJBQXlCLEVBQ3pCQyxXQUFXLEVBQ1hDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JDLGdCQUFnQjtBQUFBLFNBRVRDLFFBQVEsRUFBRUMsZUFBZSxFQUFFQyxtQkFBbUI7QUFBQSxTQUM5Q0Msa0JBQWtCLEVBQUVDLGlCQUFpQjtBQUFBLFNBQ3JDQyxPQUFPO0FBQUEsT0FDVCxLQUFLQyxHQUFHO0FBQUEsU0FHYkMsT0FBTyxJQUFJQyx1QkFBdUI7QUFBQSxTQUczQkQsT0FBTyxJQUFJRSxjQUFjO0FBQUEsU0FDYkYs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
269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJjbGVhblF1ZXN0aW9uIiwiY2xlYW5Db21wdGVSZW5kdSIsImRhdGFzZXRzIiwiRW5hYmxlZERhdGFzZXRzIiwiZ2V0RW5hYmxlZERhdGFzZXRzIiwiZmlsdGVyQnlMZWdpc2xhdHVyZSIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJRdWVzdGlvbnNDb252ZXJ0IiwiQ29tcHRlc1JlbmR1c0NvbnZlcnQiLCJjbG9uZU9wdGlvbiIsImNvbW1pdE9wdGlvbiIsInJlbW90ZU9wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwiY2F0ZWdvcmllc09wdGlvbiIsImRhdGFEaXJEZWZhdWx0T3B0aW9uIiwic2lsZW50T3B0aW9uIiwidmVyYm9zZU9wdGlvbiIsInB1bGxPcHRpb24iLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwib3B0aW9ucyIsImNsb25lR2l0IiwiZ2l0R3JvdXBVcmwiLCJkYXRhc2V0TmFtZSIsImRhdGFEaXIiLCJ1bmRlZmluZWQiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImNvbW1pdEdpdCIsImRhdGFzZXRDbGVhbkRpciIsImV4aXRDb2RlIiwic3ViZGlyZWN0b3JpZXMiLCJjb21taXQiLCJlcnJvckNvZGUiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiY29tbWl0QW5kUHVzaFVpZCIsImNsZWFuQW5kVmFsaWRhdGVEYXRhIiwiZGF0YSIsImNsZWFuZXIiLCJmcm9tSnNvbiIsInRvSnNvbiIsIm5vVmFsaWRhdGUiLCJqc29uRGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWxpZGF0ZWREYXRhIiwicHJvY2Vzc0ZpbGVzIiwiZGF0YXNldFJhd0RpciIsIndhbGtEaXJQYXJhbXMiLCJkYXRhQ29udmVydGVyIiwiZmlsZVBhdGhBcnJheSIsImZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJyYXdGaWxlUGF0aCIsImpvaW4iLCJyYXdKc29uIiwicmVhZEZpbGVTeW5jIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJwYXJzZSIsInZhbGlkYXRlRGF0YSIsImNsZWFuSnNvbiIsImNsZWFuRmlsZVBhdGgiLCJlbnN1cmVEaXJTeW5jIiwiZGlybmFtZSIsIndyaXRlRmlsZVN5bmMiLCJjbGVhblJlb3JnYW5pemVkRGF0YSIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwiZW5hYmxlZERhdGFzZXRzIiwiY2F0ZWdvcmllcyIsImNob3NlbkRhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJBY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldCIsImFjdGV1cnNFdE9yZ2FuZXMiLCJiYXNlbmFtZSIsInB1bGwiLCJyZXNldEFuZFB1bGwiLCJhbmFseXplQW5kUmVtb3ZlIiwidG9BY3RldXIiLCJhY3RldXJUb0pzb24iLCJ0b09yZ2FuZSIsIm9yZ2FuZVRvSnNvbiIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9SZXVuaW9uIiwicmV1bmlvblRvSnNvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnQiLCJhbWVuZGVtZW50VG9Kc29uIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJ0b0RvY3VtZW50IiwiZG9jdW1lbnRUb0pzb24iLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24iLCJTY3J1dGlucyIsInNjcnV0aW5zIiwidG9TY3J1dGluIiwic2NydXRpblRvSnNvbiIsIlF1ZXN0aW9ucyIsInF1ZXN0aW9ucyIsInRvUXVlc3Rpb24iLCJxdWVzdGlvblRvSnNvbiIsIkNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlc1JlbmR1c1NlYW5jZXMiLCJ0b0NvbXB0ZVJlbmR1IiwiY29tcHRlUmVuZHVUb0pzb24iLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJlcnJvciIsInVpZEJyYW5jaFVwZGF0ZSIsInJ1biIsImNoaWxkUHJvY2VzcyIsIm1haW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtcbiAgY2xlYW5BY3RldXIsXG4gIGNsZWFuQW1lbmRlbWVudCxcbiAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24sXG4gIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gIGNsZWFuT3JnYW5lLFxuICBjbGVhblJldW5pb24sXG4gIGNsZWFuU2NydXRpbixcbiAgY2xlYW5RdWVzdGlvbixcbiAgY2xlYW5Db21wdGVSZW5kdSxcbn0gZnJvbSBcIi4uL2NsZWFuZXJzXCJcbmltcG9ydCB7XG4gIGRhdGFzZXRzLFxuICBFbmFibGVkRGF0YXNldHMsXG4gIGdldEVuYWJsZWREYXRhc2V0cyxcbiAgZmlsdGVyQnlMZWdpc2xhdHVyZSxcbn0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgUXVlc3Rpb25zQ29udmVydCwgUXVlc3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvcXVlc3Rpb25zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQ29tcHRlc1JlbmR1c0NvbnZlcnQsIENvbXB0ZVJlbmR1IH0gZnJvbSBcIi4uL3R5cGVzL2RlYmF0c1wiXG5pbXBvcnQge1xuICBjbG9uZU9wdGlvbixcbiAgY29tbWl0T3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICBjYXRlZ29yaWVzT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBwdWxsT3B0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWQvY2xpX2hlbHBlcnNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAgY2xvbmVPcHRpb24sXG4gICAgY29tbWl0T3B0aW9uLFxuICAgIHJlbW90ZU9wdGlvbixcbiAgICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgICBjYXRlZ29yaWVzT3B0aW9uLFxuICAgIHNpbGVudE9wdGlvbixcbiAgICB2ZXJib3NlT3B0aW9uLFxuICAgIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICAgIHB1bGxPcHRpb24sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZG8gbm90IHJlc2V0IC0taGFyZCBhZnRlciBjb21taXQgdG8gc2F2ZSBJL08gaWYgdGhlIHdvcmtpbmcgdHJlZSBpcyB0byBiZSBkaXNjYXJkZWRcIixcbiAgICAgIG5hbWU6IFwibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiVlwiLFxuICAgICAgaGVscDogXCJkb24ndCB2YWxpZGF0ZSBkYXRhXCIsXG4gICAgICBuYW1lOiBcIm5vLXZhbGlkYXRlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbG9uZUdpdChcbiAgZ2l0R3JvdXBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgZGF0YURpcjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRHaXQoXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBudW1iZXIge1xuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgKVxuICAgIGlmIChcbiAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICApIHtcbiAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgfVxuICB9XG4gIGlmIChcbiAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgc3ViZGlyZWN0b3JpZXMpICYmXG4gICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgKSB7XG4gICAgZXhpdENvZGUgPSAxXG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICBkYXRhOiBhbnksXG4gIGNsZWFuZXI6IChkYXRhOiBUKSA9PiB2b2lkLFxuICBmcm9tSnNvbjogKGpzb246IHN0cmluZykgPT4gVCxcbiAgdG9Kc29uOiAoZGF0YTogVCkgPT4gc3RyaW5nLFxuICBub1ZhbGlkYXRlOiBCb29sZWFuLFxuKTogc3RyaW5nIHtcbiAgY2xlYW5lcihkYXRhKVxuICBjb25zdCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpXG4gIGlmICghbm9WYWxpZGF0ZSkge1xuICAgIHJldHVybiBqc29uRGF0YVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZhbGlkYXRlZERhdGE6IFQgPSBmcm9tSnNvbihqc29uRGF0YSlcbiAgICByZXR1cm4gdG9Kc29uKHZhbGlkYXRlZERhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzPFQ+KFxuICBkYXRhc2V0UmF3RGlyOiBzdHJpbmcsXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICB3YWxrRGlyUGFyYW1zOiBhbnlbXSxcbiAgY2xlYW5lcjogYW55LFxuICBkYXRhQ29udmVydGVyOiB7IGZyb21Kc29uOiBhbnk7IHRvSnNvbjogYW55IH0sXG4gIG9wdGlvbnM6IGFueSxcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoQXJyYXkgb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCB3YWxrRGlyUGFyYW1zKSkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZVBhdGhBcnJheVtmaWxlUGF0aEFycmF5Lmxlbmd0aCAtIDFdXG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmZpbGVQYXRoQXJyYXkpXG4gICAgY29uc3QgcmF3SnNvbiA9IGZzLnJlYWRGaWxlU3luYyhyYXdGaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSBjb25zb2xlLmxvZyhgQ2xlYW5pbmcgZmlsZTogJHtyYXdGaWxlUGF0aH0uLi5gKVxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0pzb24pXG4gICAgY29uc3QgdmFsaWRhdGVEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZVwiXVxuICAgIGNvbnN0IGNsZWFuSnNvbiA9IGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICAgICAgZGF0YSxcbiAgICAgIGNsZWFuZXIsXG4gICAgICBkYXRhQ29udmVydGVyLmZyb21Kc29uLFxuICAgICAgZGF0YUNvbnZlcnRlci50b0pzb24sXG4gICAgICB2YWxpZGF0ZURhdGEsXG4gICAgKVxuICAgIGNvbnN0IGNsZWFuRmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCAuLi5maWxlUGF0aEFycmF5KVxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGNsZWFuRmlsZVBhdGgpKVxuICAgIGZzLndyaXRlRmlsZVN5bmMoY2xlYW5GaWxlUGF0aCwgY2xlYW5Kc29uLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnM6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IGRhdGFEaXI6IHN0cmluZyA9IG9wdGlvbnMuZGF0YURpclxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuICBsZXQgZXhpdENvZGUgPSBvcHRpb25zLmNvbW1pdCA/IDEwIDogMFxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmU/LnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IGdldEVuYWJsZWREYXRhc2V0cyhvcHRpb25zLmNhdGVnb3JpZXMpXG4gIGxldCBjaG9zZW5EYXRhc2V0cyA9IGZpbHRlckJ5TGVnaXNsYXR1cmUoZGF0YXNldHMsIG9wdGlvbnMubGVnaXNsYXR1cmUpXG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgICAgIGdpdC5yZXNldEFuZFB1bGwoZGF0YXNldENsZWFuRGlyKVxuICAgICAgfVxuXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgcHJvY2Vzc0ZpbGVzPEFjdGV1cj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW1wiYWN0ZXVyc1wiXSxcbiAgICAgICAgY2xlYW5BY3RldXIsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIsXG4gICAgICAgICAgdG9Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5hY3RldXJUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgICBwcm9jZXNzRmlsZXM8T3JnYW5lPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJvcmdhbmVzXCJdLFxuICAgICAgICBjbGVhbk9yZ2FuZSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZSxcbiAgICAgICAgICB0b0pzb246IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1xuICAgICAgICBcImFjdGV1cnNcIixcbiAgICAgICAgXCJvcmdhbmVzXCIsXG4gICAgICBdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPFJldW5pb24+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhblJldW5pb24sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uLFxuICAgICAgICAgIHRvSnNvbjogQWdlbmRhc0NvbnZlcnQucmV1bmlvblRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPEFtZW5kZW1lbnQ+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhbkFtZW5kZW1lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudCxcbiAgICAgICAgICB0b0pzb246IEFtZW5kZW1lbnRzQ29udmVydC5hbWVuZGVtZW50VG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXCIuXCJdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPERvY3VtZW50PihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJkb2N1bWVudHNcIl0sXG4gICAgICAgIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9jdW1lbnQsXG4gICAgICAgICAgdG9Kc29uOiBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC5kb2N1bWVudFRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcbiAgICAgIHByb2Nlc3NGaWxlczxEb3NzaWVyUGFybGVtZW50YWlyZT4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW1wiZG9zc2llcnNcIl0sXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICB0b0pzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXG4gICAgICAgIFwiZG9jdW1lbnRzXCIsXG4gICAgICAgIFwiZG9zc2llcnNcIixcbiAgICAgIF0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG5cbiAgICAgIHByb2Nlc3NGaWxlczxTY3J1dGluPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXSxcbiAgICAgICAgY2xlYW5TY3J1dGluLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4sXG4gICAgICAgICAgdG9Kc29uOiBTY3J1dGluc0NvbnZlcnQuc2NydXRpblRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuXG4gICAgICBwcm9jZXNzRmlsZXM8UXVlc3Rpb24+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhblF1ZXN0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IFF1ZXN0aW9uc0NvbnZlcnQudG9RdWVzdGlvbixcbiAgICAgICAgICB0b0pzb246IFF1ZXN0aW9uc0NvbnZlcnQucXVlc3Rpb25Ub0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Db21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLnhtbFwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPENvbXB0ZVJlbmR1PihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXSxcbiAgICAgICAgY2xlYW5Db21wdGVSZW5kdSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBDb21wdGVzUmVuZHVzQ29udmVydC50b0NvbXB0ZVJlbmR1LFxuICAgICAgICAgIHRvSnNvbjogQ29tcHRlc1JlbmR1c0NvbnZlcnQuY29tcHRlUmVuZHVUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBDbGVhbmluZyBkaXJlY3Rvcnk6ICR7ZGF0YXNldENsZWFuRGlyfeKApmApXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldENsZWFuRGlyKSkge1xuICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5qb2luKGRhdGFzZXRDbGVhbkRpciwgZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhwYXRobmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoVWlkKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgc3ViZGlyZWN0b3JpZXM6IGFueSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBnaXQudWlkQnJhbmNoVXBkYXRlKFxuICAgICAgcmVwb3NpdG9yeURpcixcbiAgICAgIHN1YmRpcmVjdG9yaWVzLFxuICAgICAgb3B0aW9uc1tcIm5vLXJlc2V0LWFmdGVyLWNvbW1pdFwiXSxcbiAgICApXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2Ygb3B0aW9ucy5yZW1vdGUgfHwgW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGdpdC5ydW4ocmVwb3NpdG9yeURpciwgYHB1c2ggLS1xdWlldCAke3JlbW90ZX0gdWlkOnVpZGApXG4gICAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgcmV0dXJuIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnMpXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcImNsZWFuX3Jlb3JnYW5pemVkX2RhdGEudHNcIikpXG4gIHByb2Nlc3MuZXhpdChtYWluKHByb2Nlc3MuYXJndikpXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsUUFBUSxlQUFlO0FBQ3hDLE9BQU9DLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsT0FBT0MsRUFBRSxNQUFNLFVBQVU7QUFDekIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFBQSxTQUVyQkMsV0FBVyxFQUNYQyxlQUFlLEVBQ2ZDLHVCQUF1QixFQUN2QkMseUJBQXlCLEVBQ3pCQyxXQUFXLEVBQ1hDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JDLGdCQUFnQjtBQUFBLFNBR2hCQyxRQUFRLEVBQ1JDLGVBQWUsRUFDZkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUI7QUFBQSxTQUVaQyxrQkFBa0IsRUFBRUMsaUJBQWlCO0FBQUEsU0FDckNDLE9B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