@tricoteuses/assemblee 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/lib/api.js +3 -9
  2. package/lib/api.mjs +4 -5
  3. package/lib/bugs/acteur-00010/plugin.test.js +3 -50
  4. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  5. package/lib/bugs/acteur-00010.js +2 -57
  6. package/lib/bugs/acteur-00010.mjs +1 -6
  7. package/lib/bugs/agenda-00002/plugin.test.js +3 -53
  8. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -3
  9. package/lib/bugs/agenda-00002.js +3 -148
  10. package/lib/bugs/agenda-00002.mjs +1 -28
  11. package/lib/bugs/agenda-00008/plugin.test.js +3 -52
  12. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  13. package/lib/bugs/agenda-00008.js +2 -61
  14. package/lib/bugs/agenda-00008.mjs +1 -5
  15. package/lib/bugs/agenda-00011/plugin.test.js +5 -99
  16. package/lib/bugs/agenda-00011/plugin.test.mjs +3 -3
  17. package/lib/bugs/agenda-00011.js +4 -105
  18. package/lib/bugs/agenda-00011.mjs +3 -29
  19. package/lib/bugs.js +3 -164
  20. package/lib/bugs.mjs +1 -26
  21. package/lib/cleaners/actes_legislatifs.js +11 -115
  22. package/lib/cleaners/actes_legislatifs.mjs +7 -82
  23. package/lib/cleaners/acteurs.js +12 -92
  24. package/lib/cleaners/acteurs.mjs +7 -38
  25. package/lib/cleaners/amendements.js +10 -103
  26. package/lib/cleaners/amendements.mjs +4 -58
  27. package/lib/cleaners/documents.js +5 -67
  28. package/lib/cleaners/documents.mjs +1 -37
  29. package/lib/cleaners/dossiers_legislatifs.js +5 -61
  30. package/lib/cleaners/dossiers_legislatifs.mjs +1 -29
  31. package/lib/cleaners/index.js +1 -9
  32. package/lib/cleaners/index.mjs +1 -1
  33. package/lib/cleaners/organes.js +1 -33
  34. package/lib/cleaners/organes.mjs +1 -17
  35. package/lib/cleaners/reunions.js +4 -119
  36. package/lib/cleaners/reunions.mjs +1 -64
  37. package/lib/cleaners/scrutins.js +10 -102
  38. package/lib/cleaners/scrutins.mjs +1 -48
  39. package/lib/cleaners/xml.js +8 -42
  40. package/lib/cleaners/xml.mjs +6 -8
  41. package/lib/datasets.js +14 -113
  42. package/lib/datasets.mjs +6 -46
  43. package/lib/dates.js +7 -37
  44. package/lib/dates.mjs +9 -14
  45. package/lib/dossiers_legislatifs.js +6 -68
  46. package/lib/dossiers_legislatifs.mjs +5 -36
  47. package/lib/file_systems.js +56 -139
  48. package/lib/file_systems.mjs +1 -9
  49. package/lib/git.js +4 -53
  50. package/lib/git.mjs +1 -12
  51. package/lib/index.js +1 -15
  52. package/lib/index.mjs +1 -1
  53. package/lib/inserters.js +23 -146
  54. package/lib/inserters.mjs +6 -87
  55. package/lib/loaders.js +44 -316
  56. package/lib/loaders.mjs +12 -135
  57. package/lib/organes.js +1 -7
  58. package/lib/organes.mjs +1 -4
  59. package/lib/parsers/documents.js +22 -151
  60. package/lib/parsers/documents.mjs +19 -81
  61. package/lib/parsers/index.js +1 -4
  62. package/lib/parsers/index.mjs +1 -1
  63. package/lib/parsers/recherche_amendements.js +302 -527
  64. package/lib/parsers/recherche_amendements.mjs +8 -31
  65. package/lib/raw_types/acteurs_et_organes.d.ts +1 -30
  66. package/lib/raw_types/acteurs_et_organes.js +5 -124
  67. package/lib/raw_types/acteurs_et_organes.mjs +5 -105
  68. package/lib/raw_types/agendas.js +6 -89
  69. package/lib/raw_types/agendas.mjs +9 -65
  70. package/lib/raw_types/amendements.d.ts +2 -0
  71. package/lib/raw_types/amendements.js +10 -90
  72. package/lib/raw_types/amendements.mjs +11 -69
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +16 -115
  74. package/lib/raw_types/dossiers_legislatifs.js +26 -435
  75. package/lib/raw_types/dossiers_legislatifs.mjs +26 -412
  76. package/lib/raw_types/scrutins.js +6 -81
  77. package/lib/raw_types/scrutins.mjs +9 -57
  78. package/lib/scripts/bugs_helper.js +2 -181
  79. package/lib/scripts/bugs_helper.mjs +2 -39
  80. package/lib/scripts/clean_data.js +27 -143
  81. package/lib/scripts/clean_data.mjs +15 -34
  82. package/lib/scripts/clean_reorganized_data.js +76 -240
  83. package/lib/scripts/clean_reorganized_data.mjs +36 -99
  84. package/lib/scripts/diff_amendements.js +19 -79
  85. package/lib/scripts/diff_amendements.mjs +17 -35
  86. package/lib/scripts/document_dossiers_legislatifs.js +17 -142
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +6 -90
  88. package/lib/scripts/get_today_reunions.js +4 -22
  89. package/lib/scripts/get_today_reunions.mjs +1 -7
  90. package/lib/scripts/merge_scrutins.js +3 -47
  91. package/lib/scripts/merge_scrutins.mjs +1 -9
  92. package/lib/scripts/parse_textes_lois.js +15 -44
  93. package/lib/scripts/parse_textes_lois.mjs +18 -19
  94. package/lib/scripts/raw_types_from_amendements.js +3 -95
  95. package/lib/scripts/raw_types_from_amendements.mjs +1 -16
  96. package/lib/scripts/reorganize_data.js +74 -294
  97. package/lib/scripts/reorganize_data.mjs +22 -133
  98. package/lib/scripts/retrieve_deputes_photos.js +6 -119
  99. package/lib/scripts/retrieve_deputes_photos.mjs +7 -33
  100. package/lib/scripts/retrieve_documents.js +4 -192
  101. package/lib/scripts/retrieve_documents.mjs +2 -50
  102. package/lib/scripts/retrieve_open_data.js +44 -116
  103. package/lib/scripts/retrieve_open_data.mjs +14 -19
  104. package/lib/scripts/retrieve_pending_amendments.js +4 -98
  105. package/lib/scripts/retrieve_pending_amendments.mjs +1 -14
  106. package/lib/scripts/retrieve_senateurs_photos.js +18 -114
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +20 -48
  108. package/lib/scripts/retrieve_textes_lois.js +3 -122
  109. package/lib/scripts/retrieve_textes_lois.mjs +3 -21
  110. package/lib/scripts/test_load.js +2 -10
  111. package/lib/scripts/test_load.mjs +2 -1
  112. package/lib/scripts/test_load_big_files.js +2 -10
  113. package/lib/scripts/test_load_big_files.mjs +2 -1
  114. package/lib/scripts/validate_json.js +4 -119
  115. package/lib/scripts/validate_json.mjs +2 -36
  116. package/lib/shared_types/codes_actes.js +1 -24
  117. package/lib/shared_types/codes_actes.mjs +3 -10
  118. package/lib/strings.js +1 -5
  119. package/lib/strings.mjs +1 -1
  120. package/lib/types/acteurs_et_organes.js +9 -84
  121. package/lib/types/acteurs_et_organes.mjs +10 -63
  122. package/lib/types/agendas.js +8 -90
  123. package/lib/types/agendas.mjs +11 -66
  124. package/lib/types/amendements.d.ts +2 -0
  125. package/lib/types/amendements.js +12 -92
  126. package/lib/types/amendements.mjs +15 -70
  127. package/lib/types/dossiers_legislatifs.js +8 -96
  128. package/lib/types/dossiers_legislatifs.mjs +10 -72
  129. package/lib/types/legislatures.js +1 -3
  130. package/lib/types/legislatures.mjs +1 -2
  131. package/lib/types/scrutins.js +8 -82
  132. package/lib/types/scrutins.mjs +11 -58
  133. package/lib/urls.js +3 -27
  134. package/lib/urls.mjs +3 -21
  135. package/package.json +1 -1
@@ -47,10 +47,8 @@ const optionsDefinitions = [{
47
47
  }];
48
48
  const options = commandLineArgs(optionsDefinitions);
49
49
  const pipeline = util.promisify(stream.pipeline);
50
-
51
50
  function commitAndPush(repositoryDir, commit, remotes) {
52
51
  let error = false;
53
-
54
52
  if (commit) {
55
53
  execSync("git add .", {
56
54
  cwd: repositoryDir,
@@ -58,7 +56,6 @@ function commitAndPush(repositoryDir, commit, remotes) {
58
56
  encoding: "utf-8",
59
57
  stdio: ["ignore", "ignore", "pipe"]
60
58
  });
61
-
62
59
  try {
63
60
  execSync('git commit -m "Nouvelle moisson"', {
64
61
  cwd: repositoryDir,
@@ -71,7 +68,6 @@ function commitAndPush(repositoryDir, commit, remotes) {
71
68
  throw childProcess;
72
69
  }
73
70
  }
74
-
75
71
  for (const remote of remotes || []) {
76
72
  try {
77
73
  execSync(`git push ${remote} master`, {
@@ -87,10 +83,8 @@ function commitAndPush(repositoryDir, commit, remotes) {
87
83
  }
88
84
  }
89
85
  }
90
-
91
86
  return error;
92
87
  }
93
-
94
88
  async function retrievePhotosDeputes() {
95
89
  const dataDir = options.dataDir;
96
90
  const {
@@ -100,17 +94,14 @@ async function retrievePhotosDeputes() {
100
94
  const {
101
95
  mandats
102
96
  } = acteur;
103
-
104
97
  if (!mandats) {
105
98
  return false;
106
99
  }
107
-
108
100
  const mandatDeputeLegislature = mandats.filter(mandat => mandat.xsiType === TypeMandat.MandatParlementaireType && mandat.legislature === options.legislature && mandat.typeOrgane === CodeTypeOrgane.Assemblee)[0];
109
101
  return mandatDeputeLegislature !== undefined;
110
102
  }).sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
111
103
  const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
112
104
  const photosDirName = `photos_deputes_${options.legislature}`;
113
-
114
105
  if (gitGroupUrl !== undefined) {
115
106
  execSync(`git clone ${gitGroupUrl}/${photosDirName}.git`, {
116
107
  cwd: dataDir,
@@ -119,14 +110,12 @@ async function retrievePhotosDeputes() {
119
110
  stdio: ["ignore", "ignore", "pipe"]
120
111
  });
121
112
  }
113
+ const photosDir = path.join(dataDir, photosDirName);
122
114
 
123
- const photosDir = path.join(dataDir, photosDirName); // Download photos.
124
-
115
+ // Download photos.
125
116
  fs.ensureDirSync(photosDir);
126
-
127
117
  if (options.fetch) {
128
118
  const missingPhotoFilePath = "images/transparent_150x192.jpg";
129
-
130
119
  for (const depute of deputesLegislature) {
131
120
  const ident = depute.etatCivil.ident;
132
121
  const numeroDepute = depute.uid.substring(2);
@@ -135,60 +124,50 @@ async function retrievePhotosDeputes() {
135
124
  const photoTempFilename = `${numeroDepute}_temp.jpg`;
136
125
  const photoTempFilePath = path.join(photosDir, photoTempFilename);
137
126
  const urlPhoto = `http://www2.assemblee-nationale.fr/static/tribun/${options.legislature}/photos/${photoFilename}`;
138
-
139
127
  if (!options.silent) {
140
128
  console.log(`Loading photo ${urlPhoto} for ${ident.prenom} ${ident.nom}…`);
141
129
  }
142
-
143
130
  for (let retries = 0; retries < 3; retries++) {
144
131
  const response = await fetch(urlPhoto);
145
-
146
132
  if (response.ok) {
147
133
  await pipeline(response.body, fs.createWriteStream(photoTempFilePath));
148
134
  fs.renameSync(photoTempFilePath, photoFilePath);
149
135
  break;
150
136
  }
151
-
152
137
  if (retries >= 2) {
153
138
  console.warn(`Fetch failed: ${urlPhoto} (${ident.prenom} ${ident.nom})`);
154
139
  console.warn(response.status, response.statusText);
155
140
  console.warn(await response.text());
156
-
157
141
  if (fs.existsSync(photoFilePath)) {
158
142
  console.warn(" => Reusing existing image");
159
143
  } else {
160
144
  console.warn(" => Using blank image");
161
145
  fs.copyFileSync(missingPhotoFilePath, photoFilePath);
162
146
  }
163
-
164
147
  break;
165
148
  }
166
149
  }
167
150
  }
168
- } // Resize photos to 150x192, because some haven't exactly this size.
169
-
151
+ }
170
152
 
153
+ // Resize photos to 150x192, because some haven't exactly this size.
171
154
  for (const depute of deputesLegislature) {
172
155
  const ident = depute.etatCivil.ident;
173
156
  const numeroDepute = depute.uid.substring(2);
174
-
175
157
  if (!options.silent) {
176
158
  console.log(`Resizing photo ${numeroDepute} for ${ident.prenom} ${ident.nom}…`);
177
159
  }
178
-
179
160
  execSync(`gm convert -resize 150x192! ${numeroDepute}.jpg ${numeroDepute}_150x192.jpg`, {
180
161
  cwd: photosDir
181
162
  });
182
- } // Create a mosaic of photos.
183
-
163
+ }
184
164
 
165
+ // Create a mosaic of photos.
185
166
  const photoByIdDepute = {};
186
167
  const rowsFilenames = [];
187
-
188
168
  for (let deputeIndex = 0, rowIndex = 0; deputeIndex < deputesLegislature.length; deputeIndex += 25, rowIndex++) {
189
169
  const row = deputesLegislature.slice(deputeIndex, deputeIndex + 25);
190
170
  const photosFilenames = [];
191
-
192
171
  for (const [columnIndex, depute] of row.entries()) {
193
172
  const numeroDepute = depute.uid.substring(2);
194
173
  const photoFilename = `${numeroDepute}_150x192.jpg`;
@@ -202,29 +181,24 @@ async function retrievePhotosDeputes() {
202
181
  yMosaique: rowIndex * 192
203
182
  };
204
183
  }
205
-
206
184
  const rowFilename = `row-${rowIndex}.jpg`;
207
185
  execSync(`gm convert ${photosFilenames.join(" ")} +append ${rowFilename}`, {
208
186
  cwd: photosDir
209
187
  });
210
188
  rowsFilenames.push(rowFilename);
211
189
  }
212
-
213
190
  execSync(`gm convert ${rowsFilenames.join(" ")} -append deputes.jpg`, {
214
191
  cwd: photosDir
215
192
  });
216
-
217
193
  for (const rowFilename of rowsFilenames) {
218
194
  fs.unlinkSync(path.join(photosDir, rowFilename));
219
195
  }
220
-
221
196
  const jsonFilePath = path.join(photosDir, "deputes.json");
222
197
  fs.writeFileSync(jsonFilePath, JSON.stringify(photoByIdDepute, null, 2));
223
198
  return commitAndPush(photosDir, options.commit, options.remote);
224
199
  }
225
-
226
200
  retrievePhotosDeputes().then(error => process.exit(error ? 1 : 0)).catch(error => {
227
201
  console.log(error);
228
202
  process.exit(2);
229
203
  });
230
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwiZmV0Y2giLCJwYXRoIiwic3RyZWFtIiwidXRpbCIsIkVuYWJsZWREYXRhc2V0cyIsImxvYWRBc3NlbWJsZWVEYXRhIiwiQ29kZVR5cGVPcmdhbmUiLCJUeXBlTWFuZGF0Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsInBpcGVsaW5lIiwicHJvbWlzaWZ5IiwiY29tbWl0QW5kUHVzaCIsInJlcG9zaXRvcnlEaXIiLCJjb21taXQiLCJyZW1vdGVzIiwiZXJyb3IiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImNoaWxkUHJvY2VzcyIsInN0ZGVyciIsInRlc3QiLCJzdGRvdXQiLCJjb25zb2xlIiwib3V0cHV0IiwicmVtb3RlIiwicmV0cmlldmVQaG90b3NEZXB1dGVzIiwiZGF0YURpciIsImFjdGV1ckJ5VWlkIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImxlZ2lzbGF0dXJlIiwiZGVwdXRlc0xlZ2lzbGF0dXJlIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiYWN0ZXVyIiwibWFuZGF0cyIsIm1hbmRhdERlcHV0ZUxlZ2lzbGF0dXJlIiwibWFuZGF0IiwieHNpVHlwZSIsIk1hbmRhdFBhcmxlbWVudGFpcmVUeXBlIiwidHlwZU9yZ2FuZSIsIkFzc2VtYmxlZSIsInVuZGVmaW5lZCIsInNvcnQiLCJhIiwiYiIsInVpZCIsImxlbmd0aCIsImxvY2FsZUNvbXBhcmUiLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJwaG90b3NEaXJOYW1lIiwicGhvdG9zRGlyIiwiam9pbiIsImVuc3VyZURpclN5bmMiLCJtaXNzaW5nUGhvdG9GaWxlUGF0aCIsImRlcHV0ZSIsImlkZW50IiwiZXRhdENpdmlsIiwibnVtZXJvRGVwdXRlIiwic3Vic3RyaW5nIiwicGhvdG9GaWxlbmFtZSIsInBob3RvRmlsZVBhdGgiLCJwaG90b1RlbXBGaWxlbmFtZSIsInBob3RvVGVtcEZpbGVQYXRoIiwidXJsUGhvdG8iLCJzaWxlbnQiLCJsb2ciLCJwcmVub20iLCJub20iLCJyZXRyaWVzIiwicmVzcG9uc2UiLCJvayIsImJvZHkiLCJjcmVhdGVXcml0ZVN0cmVhbSIsInJlbmFtZVN5bmMiLCJ3YXJuIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInRleHQiLCJleGlzdHNTeW5jIiwiY29weUZpbGVTeW5jIiwicGhvdG9CeUlkRGVwdXRlIiwicm93c0ZpbGVuYW1lcyIsImRlcHV0ZUluZGV4Iiwicm93SW5kZXgiLCJyb3ciLCJzbGljZSIsInBob3Rvc0ZpbGVuYW1lcyIsImNvbHVtbkluZGV4IiwiZW50cmllcyIsInB1c2giLCJjaGVtaW4iLCJjaGVtaW5Nb3NhaXF1ZSIsImhhdXRldXIiLCJsYXJnZXVyIiwieE1vc2FpcXVlIiwieU1vc2FpcXVlIiwicm93RmlsZW5hbWUiLCJ1bmxpbmtTeW5jIiwianNvbkZpbGVQYXRoIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aGVuIiwiZXhpdCIsImNhdGNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfZGVwdXRlc19waG90b3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiXG5pbXBvcnQgdXRpbCBmcm9tIFwidXRpbFwiXG5cbmltcG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBsb2FkQXNzZW1ibGVlRGF0YSB9IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7XG4gIENvZGVUeXBlT3JnYW5lLFxuICBNYW5kYXQsXG4gIFBob3RvLFxuICBUeXBlTWFuZGF0LFxufSBmcm9tIFwiLi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwiQ1wiLFxuICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJjXCIsXG4gICAgaGVscDogXCJjb21taXQgcGhvdG9zXCIsXG4gICAgbmFtZTogXCJjb21taXRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiZlwiLFxuICAgIGhlbHA6IFwiZmV0Y2ggZMOpcHV0w6lzJyBwaWN0dXJlcyBpbnN0ZWFkIG9mIHJldHJpZXZpbmcgdGhlbSBmcm9tIGZpbGVzXCIsXG4gICAgbmFtZTogXCJmZXRjaFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJsXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIjE2XCIsXG4gICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5jb25zdCBwaXBlbGluZSA9IHV0aWwucHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSlcblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBjb21taXQ6IGJvb2xlYW4sXG4gIHJlbW90ZXM/OiBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAoY29tbWl0KSB7XG4gICAgZXhlY1N5bmMoXCJnaXQgYWRkIC5cIiwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGNvbW1pdCAtbSBcIk5vdXZlbGxlIG1vaXNzb25cIicsIHtcbiAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoaWxkUHJvY2VzcyBhcyBDaGlsZFByb2Nlc3MpLnN0ZGVyciA9PT0gbnVsbCB8fFxuICAgICAgICAhL25vdGhpbmcgdG8gY29tbWl0Ly50ZXN0KChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGRvdXQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlUGhvdG9zRGVwdXRlcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCB7IGFjdGV1ckJ5VWlkIH0gPSBsb2FkQXNzZW1ibGVlRGF0YShcbiAgICBkYXRhRGlyLFxuICAgIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gIClcbiAgY29uc3QgZGVwdXRlc0xlZ2lzbGF0dXJlID0gT2JqZWN0LnZhbHVlcyhhY3RldXJCeVVpZClcbiAgICAuZmlsdGVyKChhY3RldXIpID0+IHtcbiAgICAgIGNvbnN0IHsgbWFuZGF0cyB9ID0gYWN0ZXVyXG4gICAgICBpZiAoIW1hbmRhdHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBjb25zdCBtYW5kYXREZXB1dGVMZWdpc2xhdHVyZSA9IG1hbmRhdHMuZmlsdGVyKFxuICAgICAgICAobWFuZGF0OiBNYW5kYXQpID0+XG4gICAgICAgICAgbWFuZGF0LnhzaVR5cGUgPT09IFR5cGVNYW5kYXQuTWFuZGF0UGFybGVtZW50YWlyZVR5cGUgJiZcbiAgICAgICAgICBtYW5kYXQubGVnaXNsYXR1cmUgPT09IG9wdGlvbnMubGVnaXNsYXR1cmUgJiZcbiAgICAgICAgICBtYW5kYXQudHlwZU9yZ2FuZSA9PT0gQ29kZVR5cGVPcmdhbmUuQXNzZW1ibGVlLFxuICAgICAgKVswXVxuICAgICAgcmV0dXJuIG1hbmRhdERlcHV0ZUxlZ2lzbGF0dXJlICE9PSB1bmRlZmluZWRcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PlxuICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICApXG5cbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgcGhvdG9zRGlyTmFtZSA9IGBwaG90b3NfZGVwdXRlc18ke29wdGlvbnMubGVnaXNsYXR1cmV9YFxuICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtwaG90b3NEaXJOYW1lfS5naXRgLCB7XG4gICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cbiAgY29uc3QgcGhvdG9zRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIHBob3Rvc0Rpck5hbWUpXG5cbiAgLy8gRG93bmxvYWQgcGhvdG9zLlxuICBmcy5lbnN1cmVEaXJTeW5jKHBob3Rvc0RpcilcbiAgaWYgKG9wdGlvbnMuZmV0Y2gpIHtcbiAgICBjb25zdCBtaXNzaW5nUGhvdG9GaWxlUGF0aCA9IFwiaW1hZ2VzL3RyYW5zcGFyZW50XzE1MHgxOTIuanBnXCJcbiAgICBmb3IgKGNvbnN0IGRlcHV0ZSBvZiBkZXB1dGVzTGVnaXNsYXR1cmUpIHtcbiAgICAgIGNvbnN0IGlkZW50ID0gZGVwdXRlLmV0YXRDaXZpbC5pZGVudFxuICAgICAgY29uc3QgbnVtZXJvRGVwdXRlID0gZGVwdXRlLnVpZC5zdWJzdHJpbmcoMilcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtudW1lcm9EZXB1dGV9LmpwZ2BcbiAgICAgIGNvbnN0IHBob3RvRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b0ZpbGVuYW1lKVxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZW5hbWUgPSBgJHtudW1lcm9EZXB1dGV9X3RlbXAuanBnYFxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b1RlbXBGaWxlbmFtZSlcbiAgICAgIGNvbnN0IHVybFBob3RvID0gYGh0dHA6Ly93d3cyLmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvc3RhdGljL3RyaWJ1bi8ke29wdGlvbnMubGVnaXNsYXR1cmV9L3Bob3Rvcy8ke3Bob3RvRmlsZW5hbWV9YFxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgTG9hZGluZyBwaG90byAke3VybFBob3RvfSBmb3IgJHtpZGVudC5wcmVub219ICR7aWRlbnQubm9tfeKApmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMzsgcmV0cmllcysrKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsUGhvdG8pXG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgIGF3YWl0IHBpcGVsaW5lKHJlc3BvbnNlLmJvZHksIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBob3RvVGVtcEZpbGVQYXRoKSlcbiAgICAgICAgICBmcy5yZW5hbWVTeW5jKHBob3RvVGVtcEZpbGVQYXRoLCBwaG90b0ZpbGVQYXRoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldHJpZXMgPj0gMikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBGZXRjaCBmYWlsZWQ6ICR7dXJsUGhvdG99ICgke2lkZW50LnByZW5vbX0gJHtpZGVudC5ub219KWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnNvbGUud2FybihyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgICAgICAgY29uc29sZS53YXJuKGF3YWl0IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwaG90b0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiICA9PiBSZXVzaW5nIGV4aXN0aW5nIGltYWdlXCIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIiAgPT4gVXNpbmcgYmxhbmsgaW1hZ2VcIilcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhtaXNzaW5nUGhvdG9GaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2l6ZSBwaG90b3MgdG8gMTUweDE5MiwgYmVjYXVzZSBzb21lIGhhdmVuJ3QgZXhhY3RseSB0aGlzIHNpemUuXG4gIGZvciAoY29uc3QgZGVwdXRlIG9mIGRlcHV0ZXNMZWdpc2xhdHVyZSkge1xuICAgIGNvbnN0IGlkZW50ID0gZGVwdXRlLmV0YXRDaXZpbC5pZGVudFxuICAgIGNvbnN0IG51bWVyb0RlcHV0ZSA9IGRlcHV0ZS51aWQuc3Vic3RyaW5nKDIpXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBSZXNpemluZyBwaG90byAke251bWVyb0RlcHV0ZX0gZm9yICR7aWRlbnQucHJlbm9tfSAke2lkZW50Lm5vbX3igKZgLFxuICAgICAgKVxuICAgIH1cbiAgICBleGVjU3luYyhcbiAgICAgIGBnbSBjb252ZXJ0IC1yZXNpemUgMTUweDE5MiEgJHtudW1lcm9EZXB1dGV9LmpwZyAke251bWVyb0RlcHV0ZX1fMTUweDE5Mi5qcGdgLFxuICAgICAge1xuICAgICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbW9zYWljIG9mIHBob3Rvcy5cbiAgY29uc3QgcGhvdG9CeUlkRGVwdXRlOiB7IFt1aWQ6IHN0cmluZ106IFBob3RvIH0gPSB7fVxuICBjb25zdCByb3dzRmlsZW5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoXG4gICAgbGV0IGRlcHV0ZUluZGV4ID0gMCwgcm93SW5kZXggPSAwO1xuICAgIGRlcHV0ZUluZGV4IDwgZGVwdXRlc0xlZ2lzbGF0dXJlLmxlbmd0aDtcbiAgICBkZXB1dGVJbmRleCArPSAyNSwgcm93SW5kZXgrK1xuICApIHtcbiAgICBjb25zdCByb3cgPSBkZXB1dGVzTGVnaXNsYXR1cmUuc2xpY2UoZGVwdXRlSW5kZXgsIGRlcHV0ZUluZGV4ICsgMjUpXG4gICAgY29uc3QgcGhvdG9zRmlsZW5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gICAgZm9yIChjb25zdCBbY29sdW1uSW5kZXgsIGRlcHV0ZV0gb2Ygcm93LmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgbnVtZXJvRGVwdXRlID0gZGVwdXRlLnVpZC5zdWJzdHJpbmcoMilcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtudW1lcm9EZXB1dGV9XzE1MHgxOTIuanBnYFxuICAgICAgcGhvdG9zRmlsZW5hbWVzLnB1c2gocGhvdG9GaWxlbmFtZSlcbiAgICAgIHBob3RvQnlJZERlcHV0ZVtkZXB1dGUudWlkXSA9IHtcbiAgICAgICAgY2hlbWluOiBgcGhvdG9zX2RlcHV0ZXNfJHtvcHRpb25zLmxlZ2lzbGF0dXJlfS8ke3Bob3RvRmlsZW5hbWV9YCxcbiAgICAgICAgY2hlbWluTW9zYWlxdWU6IGBwaG90b3NfZGVwdXRlc18ke29wdGlvbnMubGVnaXNsYXR1cmV9L2RlcHV0ZXMuanBnYCxcbiAgICAgICAgaGF1dGV1cjogMTkyLFxuICAgICAgICBsYXJnZXVyOiAxNTAsXG4gICAgICAgIHhNb3NhaXF1ZTogY29sdW1uSW5kZXggKiAxNTAsXG4gICAgICAgIHlNb3NhaXF1ZTogcm93SW5kZXggKiAxOTIsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvd0ZpbGVuYW1lID0gYHJvdy0ke3Jvd0luZGV4fS5qcGdgXG4gICAgZXhlY1N5bmMoYGdtIGNvbnZlcnQgJHtwaG90b3NGaWxlbmFtZXMuam9pbihcIiBcIil9ICthcHBlbmQgJHtyb3dGaWxlbmFtZX1gLCB7XG4gICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICB9KVxuICAgIHJvd3NGaWxlbmFtZXMucHVzaChyb3dGaWxlbmFtZSlcbiAgfVxuICBleGVjU3luYyhgZ20gY29udmVydCAke3Jvd3NGaWxlbmFtZXMuam9pbihcIiBcIil9IC1hcHBlbmQgZGVwdXRlcy5qcGdgLCB7XG4gICAgY3dkOiBwaG90b3NEaXIsXG4gIH0pXG4gIGZvciAoY29uc3Qgcm93RmlsZW5hbWUgb2Ygcm93c0ZpbGVuYW1lcykge1xuICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKHBob3Rvc0Rpciwgcm93RmlsZW5hbWUpKVxuICB9XG5cbiAgY29uc3QganNvbkZpbGVQYXRoID0gcGF0aC5qb2luKHBob3Rvc0RpciwgXCJkZXB1dGVzLmpzb25cIilcbiAgZnMud3JpdGVGaWxlU3luYyhqc29uRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBob3RvQnlJZERlcHV0ZSwgbnVsbCwgMikpXG5cbiAgcmV0dXJuIGNvbW1pdEFuZFB1c2gocGhvdG9zRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG59XG5cbnJldHJpZXZlUGhvdG9zRGVwdXRlcygpXG4gIC50aGVuKChlcnJvcikgPT4gcHJvY2Vzcy5leGl0KGVycm9yID8gMSA6IDApKVxuICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgcHJvY2Vzcy5leGl0KDIpXG4gIH0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQXVCQSxRQUF2QixRQUF1QyxlQUF2QztBQUNBLE9BQU9DLGVBQVAsTUFBNEIsbUJBQTVCO0FBQ0EsT0FBT0MsRUFBUCxNQUFlLFVBQWY7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLFlBQWxCO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixNQUFqQjtBQUNBLE9BQU9DLE1BQVAsTUFBbUIsUUFBbkI7QUFDQSxPQUFPQyxJQUFQLE1BQWlCLE1BQWpCO1NBRVNDLGU7U0FDQUMsaUI7U0FFUEMsYyxFQUdBQyxVO0FBR0YsTUFBTUMsa0JBQWtCLEdBQUcsQ0FDekI7RUFDRUMsS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLCtEQUZSO0VBR0VDLElBQUksRUFBRSxPQUhSO0VBSUVDLElBQUksRUFBRUM7QUFKUixDQUR5QixFQU96QjtFQUNFSixLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsZUFGUjtFQUdFQyxJ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
204
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwiZmV0Y2giLCJwYXRoIiwic3RyZWFtIiwidXRpbCIsIkVuYWJsZWREYXRhc2V0cyIsImxvYWRBc3NlbWJsZWVEYXRhIiwiQ29kZVR5cGVPcmdhbmUiLCJUeXBlTWFuZGF0Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsInBpcGVsaW5lIiwicHJvbWlzaWZ5IiwiY29tbWl0QW5kUHVzaCIsInJlcG9zaXRvcnlEaXIiLCJjb21taXQiLCJyZW1vdGVzIiwiZXJyb3IiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImNoaWxkUHJvY2VzcyIsInN0ZGVyciIsInRlc3QiLCJzdGRvdXQiLCJjb25zb2xlIiwib3V0cHV0IiwicmVtb3RlIiwicmV0cmlldmVQaG90b3NEZXB1dGVzIiwiZGF0YURpciIsImFjdGV1ckJ5VWlkIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImxlZ2lzbGF0dXJlIiwiZGVwdXRlc0xlZ2lzbGF0dXJlIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiYWN0ZXVyIiwibWFuZGF0cyIsIm1hbmRhdERlcHV0ZUxlZ2lzbGF0dXJlIiwibWFuZGF0IiwieHNpVHlwZSIsIk1hbmRhdFBhcmxlbWVudGFpcmVUeXBlIiwidHlwZU9yZ2FuZSIsIkFzc2VtYmxlZSIsInVuZGVmaW5lZCIsInNvcnQiLCJhIiwiYiIsInVpZCIsImxlbmd0aCIsImxvY2FsZUNvbXBhcmUiLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJwaG90b3NEaXJOYW1lIiwicGhvdG9zRGlyIiwiam9pbiIsImVuc3VyZURpclN5bmMiLCJtaXNzaW5nUGhvdG9GaWxlUGF0aCIsImRlcHV0ZSIsImlkZW50IiwiZXRhdENpdmlsIiwibnVtZXJvRGVwdXRlIiwic3Vic3RyaW5nIiwicGhvdG9GaWxlbmFtZSIsInBob3RvRmlsZVBhdGgiLCJwaG90b1RlbXBGaWxlbmFtZSIsInBob3RvVGVtcEZpbGVQYXRoIiwidXJsUGhvdG8iLCJzaWxlbnQiLCJsb2ciLCJwcmVub20iLCJub20iLCJyZXRyaWVzIiwicmVzcG9uc2UiLCJvayIsImJvZHkiLCJjcmVhdGVXcml0ZVN0cmVhbSIsInJlbmFtZVN5bmMiLCJ3YXJuIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInRleHQiLCJleGlzdHNTeW5jIiwiY29weUZpbGVTeW5jIiwicGhvdG9CeUlkRGVwdXRlIiwicm93c0ZpbGVuYW1lcyIsImRlcHV0ZUluZGV4Iiwicm93SW5kZXgiLCJyb3ciLCJzbGljZSIsInBob3Rvc0ZpbGVuYW1lcyIsImNvbHVtbkluZGV4IiwiZW50cmllcyIsInB1c2giLCJjaGVtaW4iLCJjaGVtaW5Nb3NhaXF1ZSIsImhhdXRldXIiLCJsYXJnZXVyIiwieE1vc2FpcXVlIiwieU1vc2FpcXVlIiwicm93RmlsZW5hbWUiLCJ1bmxpbmtTeW5jIiwianNvbkZpbGVQYXRoIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aGVuIiwiZXhpdCIsImNhdGNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfZGVwdXRlc19waG90b3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiXG5pbXBvcnQgdXRpbCBmcm9tIFwidXRpbFwiXG5cbmltcG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBsb2FkQXNzZW1ibGVlRGF0YSB9IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7XG4gIENvZGVUeXBlT3JnYW5lLFxuICBNYW5kYXQsXG4gIFBob3RvLFxuICBUeXBlTWFuZGF0LFxufSBmcm9tIFwiLi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwiQ1wiLFxuICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJjXCIsXG4gICAgaGVscDogXCJjb21taXQgcGhvdG9zXCIsXG4gICAgbmFtZTogXCJjb21taXRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiZlwiLFxuICAgIGhlbHA6IFwiZmV0Y2ggZMOpcHV0w6lzJyBwaWN0dXJlcyBpbnN0ZWFkIG9mIHJldHJpZXZpbmcgdGhlbSBmcm9tIGZpbGVzXCIsXG4gICAgbmFtZTogXCJmZXRjaFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJsXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIjE2XCIsXG4gICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5jb25zdCBwaXBlbGluZSA9IHV0aWwucHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSlcblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBjb21taXQ6IGJvb2xlYW4sXG4gIHJlbW90ZXM/OiBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAoY29tbWl0KSB7XG4gICAgZXhlY1N5bmMoXCJnaXQgYWRkIC5cIiwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGNvbW1pdCAtbSBcIk5vdXZlbGxlIG1vaXNzb25cIicsIHtcbiAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoaWxkUHJvY2VzcyBhcyBDaGlsZFByb2Nlc3MpLnN0ZGVyciA9PT0gbnVsbCB8fFxuICAgICAgICAhL25vdGhpbmcgdG8gY29tbWl0Ly50ZXN0KChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGRvdXQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlUGhvdG9zRGVwdXRlcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCB7IGFjdGV1ckJ5VWlkIH0gPSBsb2FkQXNzZW1ibGVlRGF0YShcbiAgICBkYXRhRGlyLFxuICAgIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gIClcbiAgY29uc3QgZGVwdXRlc0xlZ2lzbGF0dXJlID0gT2JqZWN0LnZhbHVlcyhhY3RldXJCeVVpZClcbiAgICAuZmlsdGVyKChhY3RldXIpID0+IHtcbiAgICAgIGNvbnN0IHsgbWFuZGF0cyB9ID0gYWN0ZXVyXG4gICAgICBpZiAoIW1hbmRhdHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBjb25zdCBtYW5kYXREZXB1dGVMZWdpc2xhdHVyZSA9IG1hbmRhdHMuZmlsdGVyKFxuICAgICAgICAobWFuZGF0OiBNYW5kYXQpID0+XG4gICAgICAgICAgbWFuZGF0LnhzaVR5cGUgPT09IFR5cGVNYW5kYXQuTWFuZGF0UGFybGVtZW50YWlyZVR5cGUgJiZcbiAgICAgICAgICBtYW5kYXQubGVnaXNsYXR1cmUgPT09IG9wdGlvbnMubGVnaXNsYXR1cmUgJiZcbiAgICAgICAgICBtYW5kYXQudHlwZU9yZ2FuZSA9PT0gQ29kZVR5cGVPcmdhbmUuQXNzZW1ibGVlLFxuICAgICAgKVswXVxuICAgICAgcmV0dXJuIG1hbmRhdERlcHV0ZUxlZ2lzbGF0dXJlICE9PSB1bmRlZmluZWRcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PlxuICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICApXG5cbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgcGhvdG9zRGlyTmFtZSA9IGBwaG90b3NfZGVwdXRlc18ke29wdGlvbnMubGVnaXNsYXR1cmV9YFxuICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtwaG90b3NEaXJOYW1lfS5naXRgLCB7XG4gICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cbiAgY29uc3QgcGhvdG9zRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIHBob3Rvc0Rpck5hbWUpXG5cbiAgLy8gRG93bmxvYWQgcGhvdG9zLlxuICBmcy5lbnN1cmVEaXJTeW5jKHBob3Rvc0RpcilcbiAgaWYgKG9wdGlvbnMuZmV0Y2gpIHtcbiAgICBjb25zdCBtaXNzaW5nUGhvdG9GaWxlUGF0aCA9IFwiaW1hZ2VzL3RyYW5zcGFyZW50XzE1MHgxOTIuanBnXCJcbiAgICBmb3IgKGNvbnN0IGRlcHV0ZSBvZiBkZXB1dGVzTGVnaXNsYXR1cmUpIHtcbiAgICAgIGNvbnN0IGlkZW50ID0gZGVwdXRlLmV0YXRDaXZpbC5pZGVudFxuICAgICAgY29uc3QgbnVtZXJvRGVwdXRlID0gZGVwdXRlLnVpZC5zdWJzdHJpbmcoMilcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtudW1lcm9EZXB1dGV9LmpwZ2BcbiAgICAgIGNvbnN0IHBob3RvRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b0ZpbGVuYW1lKVxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZW5hbWUgPSBgJHtudW1lcm9EZXB1dGV9X3RlbXAuanBnYFxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b1RlbXBGaWxlbmFtZSlcbiAgICAgIGNvbnN0IHVybFBob3RvID0gYGh0dHA6Ly93d3cyLmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvc3RhdGljL3RyaWJ1bi8ke29wdGlvbnMubGVnaXNsYXR1cmV9L3Bob3Rvcy8ke3Bob3RvRmlsZW5hbWV9YFxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgTG9hZGluZyBwaG90byAke3VybFBob3RvfSBmb3IgJHtpZGVudC5wcmVub219ICR7aWRlbnQubm9tfeKApmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMzsgcmV0cmllcysrKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsUGhvdG8pXG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgIGF3YWl0IHBpcGVsaW5lKHJlc3BvbnNlLmJvZHksIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBob3RvVGVtcEZpbGVQYXRoKSlcbiAgICAgICAgICBmcy5yZW5hbWVTeW5jKHBob3RvVGVtcEZpbGVQYXRoLCBwaG90b0ZpbGVQYXRoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldHJpZXMgPj0gMikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBGZXRjaCBmYWlsZWQ6ICR7dXJsUGhvdG99ICgke2lkZW50LnByZW5vbX0gJHtpZGVudC5ub219KWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnNvbGUud2FybihyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgICAgICAgY29uc29sZS53YXJuKGF3YWl0IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwaG90b0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiICA9PiBSZXVzaW5nIGV4aXN0aW5nIGltYWdlXCIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIiAgPT4gVXNpbmcgYmxhbmsgaW1hZ2VcIilcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhtaXNzaW5nUGhvdG9GaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2l6ZSBwaG90b3MgdG8gMTUweDE5MiwgYmVjYXVzZSBzb21lIGhhdmVuJ3QgZXhhY3RseSB0aGlzIHNpemUuXG4gIGZvciAoY29uc3QgZGVwdXRlIG9mIGRlcHV0ZXNMZWdpc2xhdHVyZSkge1xuICAgIGNvbnN0IGlkZW50ID0gZGVwdXRlLmV0YXRDaXZpbC5pZGVudFxuICAgIGNvbnN0IG51bWVyb0RlcHV0ZSA9IGRlcHV0ZS51aWQuc3Vic3RyaW5nKDIpXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBSZXNpemluZyBwaG90byAke251bWVyb0RlcHV0ZX0gZm9yICR7aWRlbnQucHJlbm9tfSAke2lkZW50Lm5vbX3igKZgLFxuICAgICAgKVxuICAgIH1cbiAgICBleGVjU3luYyhcbiAgICAgIGBnbSBjb252ZXJ0IC1yZXNpemUgMTUweDE5MiEgJHtudW1lcm9EZXB1dGV9LmpwZyAke251bWVyb0RlcHV0ZX1fMTUweDE5Mi5qcGdgLFxuICAgICAge1xuICAgICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbW9zYWljIG9mIHBob3Rvcy5cbiAgY29uc3QgcGhvdG9CeUlkRGVwdXRlOiB7IFt1aWQ6IHN0cmluZ106IFBob3RvIH0gPSB7fVxuICBjb25zdCByb3dzRmlsZW5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoXG4gICAgbGV0IGRlcHV0ZUluZGV4ID0gMCwgcm93SW5kZXggPSAwO1xuICAgIGRlcHV0ZUluZGV4IDwgZGVwdXRlc0xlZ2lzbGF0dXJlLmxlbmd0aDtcbiAgICBkZXB1dGVJbmRleCArPSAyNSwgcm93SW5kZXgrK1xuICApIHtcbiAgICBjb25zdCByb3cgPSBkZXB1dGVzTGVnaXNsYXR1cmUuc2xpY2UoZGVwdXRlSW5kZXgsIGRlcHV0ZUluZGV4ICsgMjUpXG4gICAgY29uc3QgcGhvdG9zRmlsZW5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gICAgZm9yIChjb25zdCBbY29sdW1uSW5kZXgsIGRlcHV0ZV0gb2Ygcm93LmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgbnVtZXJvRGVwdXRlID0gZGVwdXRlLnVpZC5zdWJzdHJpbmcoMilcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtudW1lcm9EZXB1dGV9XzE1MHgxOTIuanBnYFxuICAgICAgcGhvdG9zRmlsZW5hbWVzLnB1c2gocGhvdG9GaWxlbmFtZSlcbiAgICAgIHBob3RvQnlJZERlcHV0ZVtkZXB1dGUudWlkXSA9IHtcbiAgICAgICAgY2hlbWluOiBgcGhvdG9zX2RlcHV0ZXNfJHtvcHRpb25zLmxlZ2lzbGF0dXJlfS8ke3Bob3RvRmlsZW5hbWV9YCxcbiAgICAgICAgY2hlbWluTW9zYWlxdWU6IGBwaG90b3NfZGVwdXRlc18ke29wdGlvbnMubGVnaXNsYXR1cmV9L2RlcHV0ZXMuanBnYCxcbiAgICAgICAgaGF1dGV1cjogMTkyLFxuICAgICAgICBsYXJnZXVyOiAxNTAsXG4gICAgICAgIHhNb3NhaXF1ZTogY29sdW1uSW5kZXggKiAxNTAsXG4gICAgICAgIHlNb3NhaXF1ZTogcm93SW5kZXggKiAxOTIsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvd0ZpbGVuYW1lID0gYHJvdy0ke3Jvd0luZGV4fS5qcGdgXG4gICAgZXhlY1N5bmMoYGdtIGNvbnZlcnQgJHtwaG90b3NGaWxlbmFtZXMuam9pbihcIiBcIil9ICthcHBlbmQgJHtyb3dGaWxlbmFtZX1gLCB7XG4gICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICB9KVxuICAgIHJvd3NGaWxlbmFtZXMucHVzaChyb3dGaWxlbmFtZSlcbiAgfVxuICBleGVjU3luYyhgZ20gY29udmVydCAke3Jvd3NGaWxlbmFtZXMuam9pbihcIiBcIil9IC1hcHBlbmQgZGVwdXRlcy5qcGdgLCB7XG4gICAgY3dkOiBwaG90b3NEaXIsXG4gIH0pXG4gIGZvciAoY29uc3Qgcm93RmlsZW5hbWUgb2Ygcm93c0ZpbGVuYW1lcykge1xuICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKHBob3Rvc0Rpciwgcm93RmlsZW5hbWUpKVxuICB9XG5cbiAgY29uc3QganNvbkZpbGVQYXRoID0gcGF0aC5qb2luKHBob3Rvc0RpciwgXCJkZXB1dGVzLmpzb25cIilcbiAgZnMud3JpdGVGaWxlU3luYyhqc29uRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBob3RvQnlJZERlcHV0ZSwgbnVsbCwgMikpXG5cbiAgcmV0dXJuIGNvbW1pdEFuZFB1c2gocGhvdG9zRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG59XG5cbnJldHJpZXZlUGhvdG9zRGVwdXRlcygpXG4gIC50aGVuKChlcnJvcikgPT4gcHJvY2Vzcy5leGl0KGVycm9yID8gMSA6IDApKVxuICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgcHJvY2Vzcy5leGl0KDIpXG4gIH0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQXVCQSxRQUFRLFFBQVEsZUFBZTtBQUN0RCxPQUFPQyxlQUFlLE1BQU0sbUJBQW1CO0FBQy9DLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLEtBQUssTUFBTSxZQUFZO0FBQzlCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQ3ZCLE9BQU9DLE1BQU0sTUFBTSxRQUFRO0FBQzNCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQUEsU0FFZEMsZUFBZTtBQUFBLFNBQ2ZDLGlCQUFpQjtBQUFBLFNBRXhCQyxjQUFjLEVBR2RDLFVBQVU7QUFHWixNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtFQUNFQyxLQUFLLEVBQUUsR0FBRztFQUNWQyxJQUFJLEVBQUUsK0RBQStEO0VBQ3JFQyxJQUFJLEVBQUUsT0FBTztFQUNiQyxJQUFJLEVBQUVDO0FBQ1IsQ0FBQyxFQUNEO0VBQ0VKLEtBQUssRUFBRSxHQUFHO0VBQ1ZD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