@tricoteuses/assemblee 1.0.7 → 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.
- package/lib/api.js +3 -9
- package/lib/api.mjs +4 -5
- package/lib/bugs/acteur-00010/plugin.test.js +3 -50
- package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
- package/lib/bugs/acteur-00010.js +2 -57
- package/lib/bugs/acteur-00010.mjs +1 -6
- package/lib/bugs/agenda-00002/plugin.test.js +3 -53
- package/lib/bugs/agenda-00002/plugin.test.mjs +1 -3
- package/lib/bugs/agenda-00002.js +3 -148
- package/lib/bugs/agenda-00002.mjs +1 -28
- package/lib/bugs/agenda-00008/plugin.test.js +3 -52
- package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00008.js +2 -61
- package/lib/bugs/agenda-00008.mjs +1 -5
- package/lib/bugs/agenda-00011/plugin.test.js +5 -99
- package/lib/bugs/agenda-00011/plugin.test.mjs +3 -3
- package/lib/bugs/agenda-00011.js +4 -105
- package/lib/bugs/agenda-00011.mjs +3 -29
- package/lib/bugs.js +3 -164
- package/lib/bugs.mjs +1 -26
- package/lib/cleaners/actes_legislatifs.js +11 -115
- package/lib/cleaners/actes_legislatifs.mjs +7 -82
- package/lib/cleaners/acteurs.js +12 -92
- package/lib/cleaners/acteurs.mjs +7 -38
- package/lib/cleaners/amendements.js +10 -103
- package/lib/cleaners/amendements.mjs +4 -58
- package/lib/cleaners/documents.js +5 -67
- package/lib/cleaners/documents.mjs +1 -37
- package/lib/cleaners/dossiers_legislatifs.js +5 -61
- package/lib/cleaners/dossiers_legislatifs.mjs +1 -29
- package/lib/cleaners/index.js +1 -9
- package/lib/cleaners/index.mjs +1 -1
- package/lib/cleaners/organes.js +1 -33
- package/lib/cleaners/organes.mjs +1 -17
- package/lib/cleaners/reunions.js +4 -119
- package/lib/cleaners/reunions.mjs +1 -64
- package/lib/cleaners/scrutins.js +10 -102
- package/lib/cleaners/scrutins.mjs +1 -48
- package/lib/cleaners/xml.js +8 -42
- package/lib/cleaners/xml.mjs +6 -8
- package/lib/datasets.js +14 -113
- package/lib/datasets.mjs +6 -46
- package/lib/dates.js +7 -37
- package/lib/dates.mjs +9 -14
- package/lib/dossiers_legislatifs.js +6 -68
- package/lib/dossiers_legislatifs.mjs +5 -36
- package/lib/file_systems.js +56 -139
- package/lib/file_systems.mjs +1 -9
- package/lib/git.js +4 -53
- package/lib/git.mjs +1 -12
- package/lib/index.js +1 -15
- package/lib/index.mjs +1 -1
- package/lib/inserters.js +23 -146
- package/lib/inserters.mjs +6 -87
- package/lib/loaders.js +44 -316
- package/lib/loaders.mjs +12 -135
- package/lib/organes.js +1 -7
- package/lib/organes.mjs +1 -4
- package/lib/parsers/documents.js +22 -151
- package/lib/parsers/documents.mjs +19 -81
- package/lib/parsers/index.js +1 -4
- package/lib/parsers/index.mjs +1 -1
- package/lib/parsers/recherche_amendements.js +302 -527
- package/lib/parsers/recherche_amendements.mjs +8 -31
- package/lib/raw_types/acteurs_et_organes.d.ts +1 -30
- package/lib/raw_types/acteurs_et_organes.js +5 -124
- package/lib/raw_types/acteurs_et_organes.mjs +5 -105
- package/lib/raw_types/agendas.js +6 -89
- package/lib/raw_types/agendas.mjs +9 -65
- package/lib/raw_types/amendements.d.ts +2 -0
- package/lib/raw_types/amendements.js +10 -90
- package/lib/raw_types/amendements.mjs +11 -69
- package/lib/raw_types/dossiers_legislatifs.js +6 -96
- package/lib/raw_types/dossiers_legislatifs.mjs +6 -73
- package/lib/raw_types/scrutins.js +6 -81
- package/lib/raw_types/scrutins.mjs +9 -57
- package/lib/scripts/bugs_helper.js +2 -181
- package/lib/scripts/bugs_helper.mjs +2 -39
- package/lib/scripts/clean_data.js +27 -143
- package/lib/scripts/clean_data.mjs +15 -34
- package/lib/scripts/clean_reorganized_data.js +76 -240
- package/lib/scripts/clean_reorganized_data.mjs +36 -99
- package/lib/scripts/diff_amendements.js +19 -79
- package/lib/scripts/diff_amendements.mjs +17 -35
- package/lib/scripts/document_dossiers_legislatifs.js +17 -142
- package/lib/scripts/document_dossiers_legislatifs.mjs +6 -90
- package/lib/scripts/get_today_reunions.js +4 -22
- package/lib/scripts/get_today_reunions.mjs +1 -7
- package/lib/scripts/merge_scrutins.js +3 -47
- package/lib/scripts/merge_scrutins.mjs +1 -9
- package/lib/scripts/parse_textes_lois.js +15 -44
- package/lib/scripts/parse_textes_lois.mjs +18 -19
- package/lib/scripts/raw_types_from_amendements.js +3 -95
- package/lib/scripts/raw_types_from_amendements.mjs +1 -16
- package/lib/scripts/reorganize_data.js +74 -294
- package/lib/scripts/reorganize_data.mjs +22 -133
- package/lib/scripts/retrieve_deputes_photos.js +6 -119
- package/lib/scripts/retrieve_deputes_photos.mjs +7 -33
- package/lib/scripts/retrieve_documents.js +4 -192
- package/lib/scripts/retrieve_documents.mjs +2 -50
- package/lib/scripts/retrieve_open_data.js +44 -116
- package/lib/scripts/retrieve_open_data.mjs +14 -19
- package/lib/scripts/retrieve_pending_amendments.js +4 -98
- package/lib/scripts/retrieve_pending_amendments.mjs +1 -14
- package/lib/scripts/retrieve_senateurs_photos.js +18 -114
- package/lib/scripts/retrieve_senateurs_photos.mjs +20 -48
- package/lib/scripts/retrieve_textes_lois.js +3 -122
- package/lib/scripts/retrieve_textes_lois.mjs +3 -21
- package/lib/scripts/test_load.js +2 -10
- package/lib/scripts/test_load.mjs +2 -1
- package/lib/scripts/test_load_big_files.js +2 -10
- package/lib/scripts/test_load_big_files.mjs +2 -1
- package/lib/scripts/validate_json.js +4 -119
- package/lib/scripts/validate_json.mjs +2 -36
- package/lib/shared_types/codes_actes.js +1 -24
- package/lib/shared_types/codes_actes.mjs +3 -10
- package/lib/strings.js +1 -5
- package/lib/strings.mjs +1 -1
- package/lib/types/acteurs_et_organes.js +9 -84
- package/lib/types/acteurs_et_organes.mjs +10 -63
- package/lib/types/agendas.js +8 -90
- package/lib/types/agendas.mjs +11 -66
- package/lib/types/amendements.d.ts +2 -0
- package/lib/types/amendements.js +12 -92
- package/lib/types/amendements.mjs +15 -70
- package/lib/types/dossiers_legislatifs.js +8 -96
- package/lib/types/dossiers_legislatifs.mjs +10 -72
- package/lib/types/legislatures.js +1 -3
- package/lib/types/legislatures.mjs +1 -2
- package/lib/types/scrutins.js +8 -82
- package/lib/types/scrutins.mjs +11 -58
- package/lib/urls.js +3 -27
- package/lib/urls.mjs +3 -21
- package/package.json +1 -1
|
@@ -29,6 +29,12 @@ const optionsDefinitions = [{
|
|
|
29
29
|
multiple: true,
|
|
30
30
|
name: "categories",
|
|
31
31
|
type: String
|
|
32
|
+
}, {
|
|
33
|
+
alias: "l",
|
|
34
|
+
help: "legislatures of categories of datasets to retrieve",
|
|
35
|
+
multiple: true,
|
|
36
|
+
name: "legislature",
|
|
37
|
+
type: Number
|
|
32
38
|
}, {
|
|
33
39
|
alias: "r",
|
|
34
40
|
help: "push commit to given remote",
|
|
@@ -56,10 +62,8 @@ const optionsDefinitions = [{
|
|
|
56
62
|
name: "dataDir",
|
|
57
63
|
type: String
|
|
58
64
|
}];
|
|
59
|
-
|
|
60
65
|
function commitAndPush(repositoryDir, commit, remotes) {
|
|
61
66
|
let error = false;
|
|
62
|
-
|
|
63
67
|
if (commit) {
|
|
64
68
|
execSync(`git add .`, {
|
|
65
69
|
cwd: repositoryDir,
|
|
@@ -67,7 +71,6 @@ function commitAndPush(repositoryDir, commit, remotes) {
|
|
|
67
71
|
encoding: "utf-8",
|
|
68
72
|
stdio: ["ignore", "ignore", "pipe"]
|
|
69
73
|
});
|
|
70
|
-
|
|
71
74
|
try {
|
|
72
75
|
execSync('git commit -m "Nouvelle moisson"', {
|
|
73
76
|
cwd: repositoryDir,
|
|
@@ -80,7 +83,6 @@ function commitAndPush(repositoryDir, commit, remotes) {
|
|
|
80
83
|
throw childProcess;
|
|
81
84
|
}
|
|
82
85
|
}
|
|
83
|
-
|
|
84
86
|
for (const remote of remotes || []) {
|
|
85
87
|
try {
|
|
86
88
|
execSync(`git push ${remote} master`, {
|
|
@@ -96,10 +98,8 @@ function commitAndPush(repositoryDir, commit, remotes) {
|
|
|
96
98
|
}
|
|
97
99
|
}
|
|
98
100
|
}
|
|
99
|
-
|
|
100
101
|
return error;
|
|
101
102
|
}
|
|
102
|
-
|
|
103
103
|
function reorganizeData(options) {
|
|
104
104
|
const dataDir = options.dataDir;
|
|
105
105
|
Date.prototype.toJSON = patchedDateToJson;
|
|
@@ -108,17 +108,20 @@ function reorganizeData(options) {
|
|
|
108
108
|
const validateRawData = !options["no-validate-raw"];
|
|
109
109
|
options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
|
|
110
110
|
const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
|
|
111
|
-
|
|
111
|
+
let choosenDatasets = datasets;
|
|
112
|
+
if (options.legislature) {
|
|
113
|
+
const enabledLegislatures = options.legislature.map(legislature => legislature.toString());
|
|
114
|
+
for (let [key, value] of Object.entries(choosenDatasets)) {
|
|
115
|
+
choosenDatasets[key] = value.filter(dataset => enabledLegislatures.includes(dataset.legislature));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
112
118
|
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
113
|
-
for (const dataset of
|
|
119
|
+
for (const dataset of choosenDatasets.acteursEtOrganes) {
|
|
114
120
|
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
115
|
-
|
|
116
121
|
if (!options.silent) {
|
|
117
122
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
118
123
|
}
|
|
119
|
-
|
|
120
124
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
121
|
-
|
|
122
125
|
if (gitGroupUrl !== undefined) {
|
|
123
126
|
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
124
127
|
cwd: dataDir,
|
|
@@ -127,23 +130,18 @@ function reorganizeData(options) {
|
|
|
127
130
|
stdio: ["ignore", "ignore", "pipe"]
|
|
128
131
|
});
|
|
129
132
|
}
|
|
130
|
-
|
|
131
133
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
132
134
|
fs.ensureDirSync(datasetReorganizedDir);
|
|
133
|
-
|
|
134
135
|
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
135
136
|
if (filename[0] === ".") {
|
|
136
137
|
continue;
|
|
137
138
|
}
|
|
138
|
-
|
|
139
139
|
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
140
140
|
}
|
|
141
|
-
|
|
142
141
|
const acteursReorganizedDir = path.join(datasetReorganizedDir, "acteurs");
|
|
143
142
|
fs.mkdirSync(acteursReorganizedDir);
|
|
144
143
|
const organesReorganizedDir = path.join(datasetReorganizedDir, "organes");
|
|
145
144
|
fs.mkdirSync(organesReorganizedDir);
|
|
146
|
-
|
|
147
145
|
switch (dataset.structure) {
|
|
148
146
|
case DatasetStructure.SingleFile:
|
|
149
147
|
{
|
|
@@ -151,14 +149,12 @@ function reorganizeData(options) {
|
|
|
151
149
|
encoding: "utf8"
|
|
152
150
|
});
|
|
153
151
|
const originalData = validateRawData ? ActeursEtOrganesRawConvert.toActeursEtOrganes(originalJson) : JSON.parse(originalJson);
|
|
154
|
-
|
|
155
152
|
for (const acteur of originalData.export.acteurs.acteur) {
|
|
156
153
|
const reorganizedJsonFilePath = path.join(acteursReorganizedDir, acteur.uid["#text"] + ".json");
|
|
157
154
|
fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
|
|
158
155
|
encoding: "utf8"
|
|
159
156
|
});
|
|
160
157
|
}
|
|
161
|
-
|
|
162
158
|
for (const organe of originalData.export.organes.organe) {
|
|
163
159
|
const reorganizedJsonFilePath = path.join(organesReorganizedDir, organe.uid + ".json");
|
|
164
160
|
fs.writeFileSync(reorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
|
|
@@ -167,92 +163,69 @@ function reorganizeData(options) {
|
|
|
167
163
|
}
|
|
168
164
|
}
|
|
169
165
|
break;
|
|
170
|
-
|
|
171
166
|
case DatasetStructure.SegmentedFiles:
|
|
172
167
|
{
|
|
173
168
|
const deportsByActeurUid = {};
|
|
174
|
-
|
|
175
169
|
if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "deport"))) {
|
|
176
170
|
for (const deportSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["deport"])) {
|
|
177
171
|
const deportFilename = deportSplitPath[deportSplitPath.length - 1];
|
|
178
|
-
|
|
179
172
|
if (!deportFilename.endsWith(".json")) {
|
|
180
173
|
continue;
|
|
181
174
|
}
|
|
182
|
-
|
|
183
175
|
const deportOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...deportSplitPath);
|
|
184
|
-
|
|
185
176
|
if (options.verbose) {
|
|
186
177
|
console.log(` Loading "deport" file: ${deportOriginalFilePath}…`);
|
|
187
178
|
}
|
|
188
|
-
|
|
189
179
|
const deportOriginalJson = fs.readFileSync(deportOriginalFilePath, {
|
|
190
180
|
encoding: "utf8"
|
|
191
181
|
});
|
|
192
182
|
const deportOriginal = validateRawData ? ActeursEtOrganesRawConvert.toDeport(deportOriginalJson) : JSON.parse(deportOriginalJson);
|
|
193
183
|
const deport = deportOriginal.deport;
|
|
194
184
|
let deports = deportsByActeurUid[deport.acteurRef];
|
|
195
|
-
|
|
196
185
|
if (deports === undefined) {
|
|
197
186
|
deports = deportsByActeurUid[deport.acteurRef] = [];
|
|
198
187
|
}
|
|
199
|
-
|
|
200
188
|
deports.push(deport);
|
|
201
189
|
}
|
|
202
|
-
|
|
203
190
|
for (const deports of Object.values(deportsByActeurUid)) {
|
|
204
191
|
deports.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
|
|
205
192
|
}
|
|
206
193
|
}
|
|
207
|
-
|
|
208
194
|
const mandatsByActeurUid = {};
|
|
209
|
-
|
|
210
195
|
if (fs.existsSync(path.join(originalJsonDirectoryOrFilePath, "mandat"))) {
|
|
211
196
|
for (const mandatSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["mandat"])) {
|
|
212
197
|
const mandatFilename = mandatSplitPath[mandatSplitPath.length - 1];
|
|
213
|
-
|
|
214
198
|
if (!mandatFilename.endsWith(".json")) {
|
|
215
199
|
continue;
|
|
216
200
|
}
|
|
217
|
-
|
|
218
201
|
const mandatOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...mandatSplitPath);
|
|
219
|
-
|
|
220
202
|
if (options.verbose) {
|
|
221
203
|
console.log(` Loading "mandat" file: ${mandatOriginalFilePath}…`);
|
|
222
204
|
}
|
|
223
|
-
|
|
224
205
|
const mandatOriginalJson = fs.readFileSync(mandatOriginalFilePath, {
|
|
225
206
|
encoding: "utf8"
|
|
226
207
|
});
|
|
227
208
|
const mandatOriginal = validateRawData ? ActeursEtOrganesRawConvert.toMandatWrapper(mandatOriginalJson) : JSON.parse(mandatOriginalJson);
|
|
228
209
|
const mandat = mandatOriginal.mandat;
|
|
229
210
|
let mandats = mandatsByActeurUid[mandat.acteurRef];
|
|
230
|
-
|
|
231
211
|
if (mandats === undefined) {
|
|
232
212
|
mandats = mandatsByActeurUid[mandat.acteurRef] = [];
|
|
233
213
|
}
|
|
234
|
-
|
|
235
214
|
mandats.push(mandat);
|
|
236
215
|
}
|
|
237
|
-
|
|
238
216
|
for (const mandats of Object.values(mandatsByActeurUid)) {
|
|
239
217
|
mandats.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
|
|
240
218
|
}
|
|
241
219
|
}
|
|
242
|
-
|
|
243
220
|
for (const acteurSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["acteur"])) {
|
|
244
221
|
const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
|
|
245
|
-
|
|
246
222
|
if (!acteurFilename.endsWith(".json")) {
|
|
247
223
|
continue;
|
|
248
224
|
}
|
|
249
|
-
|
|
250
225
|
const acteurOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...acteurSplitPath);
|
|
251
|
-
|
|
252
226
|
if (options.verbose) {
|
|
253
227
|
console.log(` Reorganizing "acteur" file: ${acteurOriginalFilePath}…`);
|
|
254
228
|
}
|
|
255
|
-
|
|
256
229
|
const acteurOriginalJson = fs.readFileSync(acteurOriginalFilePath, {
|
|
257
230
|
encoding: "utf8"
|
|
258
231
|
});
|
|
@@ -260,42 +233,33 @@ function reorganizeData(options) {
|
|
|
260
233
|
const acteur = acteurOriginal.acteur;
|
|
261
234
|
const acteurUid = acteur.uid["#text"];
|
|
262
235
|
const deports = deportsByActeurUid[acteurUid];
|
|
263
|
-
|
|
264
236
|
if (deports !== undefined) {
|
|
265
237
|
assert.strictEqual(acteur.deports, undefined);
|
|
266
238
|
acteur.deports = {
|
|
267
239
|
deport: deports
|
|
268
240
|
};
|
|
269
241
|
}
|
|
270
|
-
|
|
271
242
|
const mandats = mandatsByActeurUid[acteurUid];
|
|
272
|
-
|
|
273
243
|
if (mandats !== undefined) {
|
|
274
244
|
assert.strictEqual(acteur.mandats, undefined);
|
|
275
245
|
acteur.mandats = {
|
|
276
246
|
mandat: mandats
|
|
277
247
|
};
|
|
278
248
|
}
|
|
279
|
-
|
|
280
249
|
const acteurReorganizedJsonFilePath = path.join(acteursReorganizedDir, acteurUid + ".json");
|
|
281
250
|
fs.writeFileSync(acteurReorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
|
|
282
251
|
encoding: "utf8"
|
|
283
252
|
});
|
|
284
253
|
}
|
|
285
|
-
|
|
286
254
|
for (const organeSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["organe"])) {
|
|
287
255
|
const organeFilename = organeSplitPath[organeSplitPath.length - 1];
|
|
288
|
-
|
|
289
256
|
if (!organeFilename.endsWith(".json")) {
|
|
290
257
|
continue;
|
|
291
258
|
}
|
|
292
|
-
|
|
293
259
|
const organeOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...organeSplitPath);
|
|
294
|
-
|
|
295
260
|
if (options.verbose) {
|
|
296
261
|
console.log(` Reorganizing "organe" file: ${organeOriginalFilePath}…`);
|
|
297
262
|
}
|
|
298
|
-
|
|
299
263
|
const organeOriginalJson = fs.readFileSync(organeOriginalFilePath, {
|
|
300
264
|
encoding: "utf8"
|
|
301
265
|
});
|
|
@@ -309,23 +273,18 @@ function reorganizeData(options) {
|
|
|
309
273
|
}
|
|
310
274
|
break;
|
|
311
275
|
}
|
|
312
|
-
|
|
313
276
|
if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
|
|
314
277
|
error = true;
|
|
315
278
|
}
|
|
316
279
|
}
|
|
317
280
|
}
|
|
318
|
-
|
|
319
281
|
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
320
|
-
for (const dataset of
|
|
282
|
+
for (const dataset of choosenDatasets.agendas) {
|
|
321
283
|
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
322
|
-
|
|
323
284
|
if (!options.silent) {
|
|
324
285
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
325
286
|
}
|
|
326
|
-
|
|
327
287
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
328
|
-
|
|
329
288
|
if (gitGroupUrl !== undefined) {
|
|
330
289
|
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
331
290
|
cwd: dataDir,
|
|
@@ -334,18 +293,14 @@ function reorganizeData(options) {
|
|
|
334
293
|
stdio: ["ignore", "ignore", "pipe"]
|
|
335
294
|
});
|
|
336
295
|
}
|
|
337
|
-
|
|
338
296
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
339
297
|
fs.ensureDirSync(datasetReorganizedDir);
|
|
340
|
-
|
|
341
298
|
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
342
299
|
if (filename[0] === ".") {
|
|
343
300
|
continue;
|
|
344
301
|
}
|
|
345
|
-
|
|
346
302
|
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
347
303
|
}
|
|
348
|
-
|
|
349
304
|
switch (dataset.structure) {
|
|
350
305
|
case DatasetStructure.SingleFile:
|
|
351
306
|
{
|
|
@@ -353,28 +308,22 @@ function reorganizeData(options) {
|
|
|
353
308
|
encoding: "utf8"
|
|
354
309
|
});
|
|
355
310
|
const originalData = validateRawData ? AgendasRawConvert.toAgendas(originalJson) : JSON.parse(originalJson);
|
|
356
|
-
|
|
357
311
|
for (const reunion of originalData.reunions.reunion) {
|
|
358
312
|
writeReunionReorganizedJson(datasetReorganizedDir, reunion);
|
|
359
313
|
}
|
|
360
314
|
}
|
|
361
315
|
break;
|
|
362
|
-
|
|
363
316
|
case DatasetStructure.SegmentedFiles:
|
|
364
317
|
{
|
|
365
318
|
for (const reunionSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["reunion"])) {
|
|
366
319
|
const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
|
|
367
|
-
|
|
368
320
|
if (!reunionFilename.endsWith(".json")) {
|
|
369
321
|
continue;
|
|
370
322
|
}
|
|
371
|
-
|
|
372
323
|
const reunionOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...reunionSplitPath);
|
|
373
|
-
|
|
374
324
|
if (options.verbose) {
|
|
375
325
|
console.log(` Reorganizing "reunion" file: ${reunionOriginalFilePath}…`);
|
|
376
326
|
}
|
|
377
|
-
|
|
378
327
|
const reunionOriginalJson = fs.readFileSync(reunionOriginalFilePath, {
|
|
379
328
|
encoding: "utf8"
|
|
380
329
|
});
|
|
@@ -385,23 +334,18 @@ function reorganizeData(options) {
|
|
|
385
334
|
}
|
|
386
335
|
break;
|
|
387
336
|
}
|
|
388
|
-
|
|
389
337
|
if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
|
|
390
338
|
error = true;
|
|
391
339
|
}
|
|
392
340
|
}
|
|
393
341
|
}
|
|
394
|
-
|
|
395
342
|
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
396
|
-
for (const dataset of
|
|
343
|
+
for (const dataset of choosenDatasets.amendements) {
|
|
397
344
|
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
398
|
-
|
|
399
345
|
if (!options.silent) {
|
|
400
346
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
401
347
|
}
|
|
402
|
-
|
|
403
348
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
404
|
-
|
|
405
349
|
if (gitGroupUrl !== undefined) {
|
|
406
350
|
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
407
351
|
cwd: dataDir,
|
|
@@ -410,18 +354,14 @@ function reorganizeData(options) {
|
|
|
410
354
|
stdio: ["ignore", "ignore", "pipe"]
|
|
411
355
|
});
|
|
412
356
|
}
|
|
413
|
-
|
|
414
357
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
415
358
|
fs.ensureDirSync(datasetReorganizedDir);
|
|
416
|
-
|
|
417
359
|
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
418
360
|
if (filename[0] === ".") {
|
|
419
361
|
continue;
|
|
420
362
|
}
|
|
421
|
-
|
|
422
363
|
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
423
364
|
}
|
|
424
|
-
|
|
425
365
|
switch (dataset.structure) {
|
|
426
366
|
case DatasetStructure.SingleFile:
|
|
427
367
|
{
|
|
@@ -429,7 +369,6 @@ function reorganizeData(options) {
|
|
|
429
369
|
encoding: "utf8"
|
|
430
370
|
});
|
|
431
371
|
const originalData = validateRawData ? AmendementsRawConvert.toAmendements(originalJson) : JSON.parse(originalJson);
|
|
432
|
-
|
|
433
372
|
for (const texteLegislatif of originalData.textesEtAmendements.texteleg) {
|
|
434
373
|
for (const amendement of texteLegislatif.amendements) {
|
|
435
374
|
writeAmendementReorganizedJson(datasetReorganizedDir, amendement);
|
|
@@ -437,22 +376,17 @@ function reorganizeData(options) {
|
|
|
437
376
|
}
|
|
438
377
|
}
|
|
439
378
|
break;
|
|
440
|
-
|
|
441
379
|
case DatasetStructure.SegmentedFiles:
|
|
442
380
|
{
|
|
443
381
|
for (const amendementSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
|
|
444
382
|
const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
|
|
445
|
-
|
|
446
383
|
if (!amendementFilename.endsWith(".json")) {
|
|
447
384
|
continue;
|
|
448
385
|
}
|
|
449
|
-
|
|
450
386
|
const amendementOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...amendementSplitPath);
|
|
451
|
-
|
|
452
387
|
if (options.verbose) {
|
|
453
388
|
console.log(` Reorganizing "amendement" file: ${amendementOriginalFilePath}…`);
|
|
454
389
|
}
|
|
455
|
-
|
|
456
390
|
const amendementOriginalJson = fs.readFileSync(amendementOriginalFilePath, {
|
|
457
391
|
encoding: "utf8"
|
|
458
392
|
});
|
|
@@ -463,23 +397,18 @@ function reorganizeData(options) {
|
|
|
463
397
|
}
|
|
464
398
|
break;
|
|
465
399
|
}
|
|
466
|
-
|
|
467
400
|
if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
|
|
468
401
|
error = true;
|
|
469
402
|
}
|
|
470
403
|
}
|
|
471
404
|
}
|
|
472
|
-
|
|
473
405
|
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
474
|
-
for (const dataset of
|
|
406
|
+
for (const dataset of choosenDatasets.dossiersLegislatifs) {
|
|
475
407
|
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
476
|
-
|
|
477
408
|
if (!options.silent) {
|
|
478
409
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
479
410
|
}
|
|
480
|
-
|
|
481
411
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
482
|
-
|
|
483
412
|
if (gitGroupUrl !== undefined) {
|
|
484
413
|
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
485
414
|
cwd: dataDir,
|
|
@@ -488,23 +417,18 @@ function reorganizeData(options) {
|
|
|
488
417
|
stdio: ["ignore", "ignore", "pipe"]
|
|
489
418
|
});
|
|
490
419
|
}
|
|
491
|
-
|
|
492
420
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
493
421
|
fs.ensureDirSync(datasetReorganizedDir);
|
|
494
|
-
|
|
495
422
|
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
496
423
|
if (filename[0] === ".") {
|
|
497
424
|
continue;
|
|
498
425
|
}
|
|
499
|
-
|
|
500
426
|
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
501
427
|
}
|
|
502
|
-
|
|
503
428
|
const documentsDir = path.join(datasetReorganizedDir, "documents");
|
|
504
429
|
fs.mkdirSync(documentsDir);
|
|
505
430
|
const dossiersDir = path.join(datasetReorganizedDir, "dossiers");
|
|
506
431
|
fs.mkdirSync(dossiersDir);
|
|
507
|
-
|
|
508
432
|
switch (dataset.structure) {
|
|
509
433
|
case DatasetStructure.SingleFile:
|
|
510
434
|
{
|
|
@@ -512,11 +436,9 @@ function reorganizeData(options) {
|
|
|
512
436
|
encoding: "utf8"
|
|
513
437
|
});
|
|
514
438
|
const originalData = validateRawData ? DossiersLegislatifsRawConvert.toDossiersLegislatifs(originalJson) : JSON.parse(originalJson);
|
|
515
|
-
|
|
516
439
|
for (const document of originalData.export.textesLegislatifs.document) {
|
|
517
440
|
writeDocumentReorganizedJson(documentsDir, document);
|
|
518
441
|
}
|
|
519
|
-
|
|
520
442
|
for (const {
|
|
521
443
|
dossierParlementaire
|
|
522
444
|
} of originalData.export.dossiersLegislatifs.dossier) {
|
|
@@ -524,22 +446,17 @@ function reorganizeData(options) {
|
|
|
524
446
|
}
|
|
525
447
|
}
|
|
526
448
|
break;
|
|
527
|
-
|
|
528
449
|
case DatasetStructure.SegmentedFiles:
|
|
529
450
|
{
|
|
530
451
|
for (const documentSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["document"])) {
|
|
531
452
|
const documentFilename = documentSplitPath[documentSplitPath.length - 1];
|
|
532
|
-
|
|
533
453
|
if (!documentFilename.endsWith(".json")) {
|
|
534
454
|
continue;
|
|
535
455
|
}
|
|
536
|
-
|
|
537
456
|
const documentOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...documentSplitPath);
|
|
538
|
-
|
|
539
457
|
if (options.verbose) {
|
|
540
458
|
console.log(` Reorganizing "document" file: ${documentOriginalFilePath}…`);
|
|
541
459
|
}
|
|
542
|
-
|
|
543
460
|
const documentOriginalJson = fs.readFileSync(documentOriginalFilePath, {
|
|
544
461
|
encoding: "utf8"
|
|
545
462
|
});
|
|
@@ -547,20 +464,15 @@ function reorganizeData(options) {
|
|
|
547
464
|
const document = documentOriginal.document;
|
|
548
465
|
writeDocumentReorganizedJson(documentsDir, document);
|
|
549
466
|
}
|
|
550
|
-
|
|
551
467
|
for (const dossierParlementaireSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["dossierParlementaire"])) {
|
|
552
468
|
const dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
|
|
553
|
-
|
|
554
469
|
if (!dossierParlementaireFilename.endsWith(".json")) {
|
|
555
470
|
continue;
|
|
556
471
|
}
|
|
557
|
-
|
|
558
472
|
const dossierParlementaireOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...dossierParlementaireSplitPath);
|
|
559
|
-
|
|
560
473
|
if (options.verbose) {
|
|
561
474
|
console.log(` Reorganizing "dossierParlementaire" file: ${dossierParlementaireOriginalFilePath}…`);
|
|
562
475
|
}
|
|
563
|
-
|
|
564
476
|
const dossierParlementaireOriginalJson = fs.readFileSync(dossierParlementaireOriginalFilePath, {
|
|
565
477
|
encoding: "utf8"
|
|
566
478
|
});
|
|
@@ -571,23 +483,18 @@ function reorganizeData(options) {
|
|
|
571
483
|
}
|
|
572
484
|
break;
|
|
573
485
|
}
|
|
574
|
-
|
|
575
486
|
if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
|
|
576
487
|
error = true;
|
|
577
488
|
}
|
|
578
489
|
}
|
|
579
490
|
}
|
|
580
|
-
|
|
581
491
|
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
582
|
-
for (
|
|
492
|
+
for (let dataset of choosenDatasets.scrutins) {
|
|
583
493
|
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
584
|
-
|
|
585
494
|
if (!options.silent) {
|
|
586
495
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
587
496
|
}
|
|
588
|
-
|
|
589
497
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
590
|
-
|
|
591
498
|
if (gitGroupUrl !== undefined) {
|
|
592
499
|
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
593
500
|
cwd: dataDir,
|
|
@@ -596,18 +503,14 @@ function reorganizeData(options) {
|
|
|
596
503
|
stdio: ["ignore", "ignore", "pipe"]
|
|
597
504
|
});
|
|
598
505
|
}
|
|
599
|
-
|
|
600
506
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
601
507
|
fs.ensureDirSync(datasetReorganizedDir);
|
|
602
|
-
|
|
603
508
|
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
604
509
|
if (filename[0] === ".") {
|
|
605
510
|
continue;
|
|
606
511
|
}
|
|
607
|
-
|
|
608
512
|
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
609
513
|
}
|
|
610
|
-
|
|
611
514
|
switch (dataset.structure) {
|
|
612
515
|
case DatasetStructure.SingleFile:
|
|
613
516
|
{
|
|
@@ -615,28 +518,22 @@ function reorganizeData(options) {
|
|
|
615
518
|
encoding: "utf8"
|
|
616
519
|
});
|
|
617
520
|
const originalData = validateRawData ? ScrutinsRawConvert.toScrutins(originalJson) : JSON.parse(originalJson);
|
|
618
|
-
|
|
619
521
|
for (const scrutin of originalData.scrutins.scrutin) {
|
|
620
522
|
writeScrutinReorganizedJson(datasetReorganizedDir, scrutin);
|
|
621
523
|
}
|
|
622
524
|
}
|
|
623
525
|
break;
|
|
624
|
-
|
|
625
526
|
case DatasetStructure.SegmentedFiles:
|
|
626
527
|
{
|
|
627
528
|
for (const scrutinSplitPath of walkDir(originalJsonDirectoryOrFilePath)) {
|
|
628
529
|
const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
|
|
629
|
-
|
|
630
530
|
if (!scrutinFilename.endsWith(".json")) {
|
|
631
531
|
continue;
|
|
632
532
|
}
|
|
633
|
-
|
|
634
533
|
const scrutinOriginalFilePath = path.join(originalJsonDirectoryOrFilePath, ...scrutinSplitPath);
|
|
635
|
-
|
|
636
534
|
if (options.verbose) {
|
|
637
535
|
console.log(` Reorganizing "scrutin" file: ${scrutinOriginalFilePath}…`);
|
|
638
536
|
}
|
|
639
|
-
|
|
640
537
|
const scrutinOriginalJson = fs.readFileSync(scrutinOriginalFilePath, {
|
|
641
538
|
encoding: "utf8"
|
|
642
539
|
});
|
|
@@ -647,18 +544,16 @@ function reorganizeData(options) {
|
|
|
647
544
|
}
|
|
648
545
|
break;
|
|
649
546
|
}
|
|
650
|
-
|
|
651
547
|
if (commitAndPush(datasetReorganizedDir, options.commit, options.remote)) {
|
|
652
548
|
error = true;
|
|
653
549
|
}
|
|
654
550
|
}
|
|
655
|
-
}
|
|
656
|
-
|
|
551
|
+
}
|
|
657
552
|
|
|
553
|
+
// Restore standard conversion of dates to JSON.
|
|
658
554
|
Date.prototype.toJSON = existingDateToJson;
|
|
659
555
|
return error;
|
|
660
556
|
}
|
|
661
|
-
|
|
662
557
|
function writeAmendementReorganizedJson(datasetReorganizedDir, amendement) {
|
|
663
558
|
const uidTexteLegislatif = amendement.texteLegislatifRef;
|
|
664
559
|
assert.notStrictEqual(uidTexteLegislatif, undefined);
|
|
@@ -669,44 +564,38 @@ function writeAmendementReorganizedJson(datasetReorganizedDir, amendement) {
|
|
|
669
564
|
encoding: "utf8"
|
|
670
565
|
});
|
|
671
566
|
}
|
|
672
|
-
|
|
673
567
|
function writeDocumentReorganizedJson(documentsDir, document) {
|
|
674
568
|
const basename = pathFromDocumentUid(documentsDir, document.uid);
|
|
675
569
|
fs.writeFileSync(`${basename}.json`, JSON.stringify(document, null, 2), {
|
|
676
570
|
encoding: "utf8"
|
|
677
571
|
});
|
|
678
572
|
}
|
|
679
|
-
|
|
680
573
|
function writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire) {
|
|
681
574
|
const basename = pathFromDossierParlementaireUid(dossiersDir, dossierParlementaire.uid);
|
|
682
575
|
fs.writeFileSync(`${basename}.json`, JSON.stringify(dossierParlementaire, null, 2), {
|
|
683
576
|
encoding: "utf8"
|
|
684
577
|
});
|
|
685
578
|
}
|
|
686
|
-
|
|
687
579
|
function writeReunionReorganizedJson(reunionsDir, reunion) {
|
|
688
580
|
const basename = pathFromReunionUid(reunionsDir, reunion.uid);
|
|
689
581
|
fs.writeFileSync(`${basename}.json`, JSON.stringify(reunion, null, 2), {
|
|
690
582
|
encoding: "utf8"
|
|
691
583
|
});
|
|
692
584
|
}
|
|
693
|
-
|
|
694
585
|
function writeScrutinReorganizedJson(scrutinsDir, scrutin) {
|
|
695
586
|
const basename = pathFromScrutinUid(scrutinsDir, scrutin.uid);
|
|
696
587
|
fs.writeFileSync(`${basename}.json`, JSON.stringify(scrutin, null, 2), {
|
|
697
588
|
encoding: "utf8"
|
|
698
589
|
});
|
|
699
590
|
}
|
|
700
|
-
/* istanbul ignore if */
|
|
701
|
-
|
|
702
591
|
|
|
592
|
+
/* istanbul ignore if */
|
|
703
593
|
if (process.argv[1].endsWith("reorganize_data.ts")) {
|
|
704
594
|
const options = commandLineArgs(optionsDefinitions);
|
|
705
|
-
|
|
706
595
|
if (reorganizeData(options)) {
|
|
707
596
|
process.exit(1);
|
|
708
597
|
} else {
|
|
709
598
|
process.exit(0);
|
|
710
599
|
}
|
|
711
600
|
}
|
|
712
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImRhdGFzZXRzIiwiRGF0YXNldFN0cnVjdHVyZSIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsInBhdGhGcm9tRG9jdW1lbnRVaWQiLCJwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicGF0aEZyb21TY3J1dGluVWlkIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiU3RyaW5nIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsImNvbW1pdEFuZFB1c2giLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwicmVtb3RlcyIsImVycm9yIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJjaGlsZFByb2Nlc3MiLCJzdGRlcnIiLCJ0ZXN0Iiwic3Rkb3V0IiwiY29uc29sZSIsIm91dHB1dCIsInJlbW90ZSIsInJlb3JnYW5pemVEYXRhIiwib3B0aW9ucyIsImRhdGFEaXIiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwidmFsaWRhdGVSYXdEYXRhIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwibm90U3RyaWN0RXF1YWwiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwib3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCIsImpvaW4iLCJmaWxlbmFtZSIsInNpbGVudCIsImxvZyIsImJhc2VuYW1lIiwiZGF0YXNldFJlb3JnYW5pemVkRGlyIiwiZW5zdXJlRGlyU3luYyIsInJlYWRkaXJTeW5jIiwicmVtb3ZlU3luYyIsImFjdGV1cnNSZW9yZ2FuaXplZERpciIsIm1rZGlyU3luYyIsIm9yZ2FuZXNSZW9yZ2FuaXplZERpciIsInN0cnVjdHVyZSIsIlNpbmdsZUZpbGUiLCJvcmlnaW5hbEpzb24iLCJyZWFkRmlsZVN5bmMiLCJvcmlnaW5hbERhdGEiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJKU09OIiwicGFyc2UiLCJhY3RldXIiLCJleHBvcnQiLCJhY3RldXJzIiwicmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJ1aWQiLCJ3cml0ZUZpbGVTeW5jIiwic3RyaW5naWZ5Iiwib3JnYW5lIiwib3JnYW5lcyIsIlNlZ21lbnRlZEZpbGVzIiwiZGVwb3J0c0J5QWN0ZXVyVWlkIiwiZXhpc3RzU3luYyIsImRlcG9ydFNwbGl0UGF0aCIsImRlcG9ydEZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJkZXBvcnRPcmlnaW5hbEZpbGVQYXRoIiwidmVyYm9zZSIsImRlcG9ydE9yaWdpbmFsSnNvbiIsImRlcG9ydE9yaWdpbmFsIiwidG9EZXBvcnQiLCJkZXBvcnQiLCJkZXBvcnRzIiwiYWN0ZXVyUmVmIiwicHVzaCIsIk9iamVjdCIsInZhbHVlcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJtYW5kYXRzQnlBY3RldXJVaWQiLCJtYW5kYXRTcGxpdFBhdGgiLCJtYW5kYXRGaWxlbmFtZSIsIm1hbmRhdE9yaWdpbmFsRmlsZVBhdGgiLCJtYW5kYXRPcmlnaW5hbEpzb24iLCJtYW5kYXRPcmlnaW5hbCIsInRvTWFuZGF0V3JhcHBlciIsIm1hbmRhdCIsIm1hbmRhdHMiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImFjdGV1ck9yaWdpbmFsRmlsZVBhdGgiLCJhY3RldXJPcmlnaW5hbEpzb24iLCJhY3RldXJPcmlnaW5hbCIsInRvQWN0ZXVyIiwiYWN0ZXVyVWlkIiwic3RyaWN0RXF1YWwiLCJhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lT3JpZ2luYWxGaWxlUGF0aCIsIm9yZ2FuZU9yaWdpbmFsSnNvbiIsIm9yZ2FuZU9yaWdpbmFsIiwidG9PcmdhbmUiLCJvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9BZ2VuZGFzIiwicmV1bmlvbiIsInJldW5pb25zIiwid3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25PcmlnaW5hbEZpbGVQYXRoIiwicmV1bmlvbk9yaWdpbmFsSnNvbiIsInJldW5pb25PcmlnaW5hbCIsInRvUmV1bmlvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVMZWdpc2xhdGlmIiwidGV4dGVzRXRBbWVuZGVtZW50cyIsInRleHRlbGVnIiwiYW1lbmRlbWVudCIsIndyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbiIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCIsImFtZW5kZW1lbnRPcmlnaW5hbEpzb24iLCJhbWVuZGVtZW50T3JpZ2luYWwiLCJ0b0FtZW5kZW1lbnRXcmFwcGVyIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudHNEaXIiLCJkb3NzaWVyc0RpciIsInRvRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50IiwidGV4dGVzTGVnaXNsYXRpZnMiLCJ3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uIiwiZG9zc2llclBhcmxlbWVudGFpcmUiLCJkb3NzaWVyIiwid3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbiIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCIsImRvY3VtZW50T3JpZ2luYWxKc29uIiwiZG9jdW1lbnRPcmlnaW5hbCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwiLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInRvU2NydXRpbnMiLCJzY3J1dGluIiwid3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoIiwic2NydXRpbk9yaWdpbmFsSnNvbiIsInNjcnV0aW5PcmlnaW5hbCIsInRvU2NydXRpbldyYXBwZXIiLCJ1aWRUZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZSZWYiLCJ0ZXh0ZUxlZ2lzbGF0aWZEaXIiLCJyZXVuaW9uc0RpciIsInNjcnV0aW5zRGlyIiwiYXJndiIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZW9yZ2FuaXplX2RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IENoaWxkUHJvY2VzcywgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgZGF0YXNldHMsIERhdGFzZXRTdHJ1Y3R1cmUsIEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBleGlzdGluZ0RhdGVUb0pzb24sIHBhdGNoZWREYXRlVG9Kc29uIH0gZnJvbSBcIi4uL2RhdGVzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7XG4gIHBhdGhGcm9tRG9jdW1lbnRVaWQsXG4gIHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQsXG4gIHBhdGhGcm9tUmV1bmlvblVpZCxcbiAgcGF0aEZyb21TY3J1dGluVWlkLFxufSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL3NjcnV0aW5zXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwiQ1wiLFxuICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJjXCIsXG4gICAgaGVscDogXCJjb21taXQgc3BsaXQgZmlsZXNcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJrXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgaGVscDogXCJjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJlb3JnYW5pemVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJyXCIsXG4gICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIlZcIixcbiAgICBoZWxwOiBcImRvbid0IHZhbGlkYXRlIHJhdyBkYXRhXCIsXG4gICAgbmFtZTogXCJuby12YWxpZGF0ZS1yYXdcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwidlwiLFxuICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBjb21taXQ6IGJvb2xlYW4sXG4gIHJlbW90ZXM/OiBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAoY29tbWl0KSB7XG4gICAgZXhlY1N5bmMoYGdpdCBhZGQgLmAsIHtcbiAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmMoJ2dpdCBjb21taXQgLW0gXCJOb3V2ZWxsZSBtb2lzc29uXCInLCB7XG4gICAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChjaGlsZFByb2Nlc3MgYXMgQ2hpbGRQcm9jZXNzKS5zdGRlcnIgPT09IG51bGwgfHxcbiAgICAgICAgIS9ub3RoaW5nIHRvIGNvbW1pdC8udGVzdCgoY2hpbGRQcm9jZXNzIGFzIGFueSkuc3Rkb3V0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLm91dHB1dClcbiAgICAgICAgdGhyb3cgY2hpbGRQcm9jZXNzXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIHJlbW90ZXMgfHwgW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgcHVzaCAke3JlbW90ZX0gbWFzdGVyYCwge1xuICAgICAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3RvcCB3aGVuIHB1c2ggZmFpbHMuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLm91dHB1dClcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiByZW9yZ2FuaXplRGF0YShvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuXG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHZhbGlkYXRlUmF3RGF0YSA9ICFvcHRpb25zW1wibm8tdmFsaWRhdGUtcmF3XCJdXG5cbiAgb3B0aW9ucy5jYXRlZ29yaWVzLm1hcCgoZGF0YXNldE5hbWU6IHN0cmluZykgPT5cbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYFVua25vd24gbmFtZSBvZiBkYXRhc2V0OiAke2RhdGFzZXROYW1lfWAsXG4gICAgKSxcbiAgKVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBvcHRpb25zLmNhdGVnb3JpZXMucmVkdWNlKFxuICAgIChlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cywgZGF0YXNldE5hbWU6IHN0cmluZyk6IEVuYWJsZWREYXRhc2V0cyA9PlxuICAgICAgZW5hYmxlZERhdGFzZXRzIHxcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgRW5hYmxlZERhdGFzZXRzLk5vbmUsXG4gIClcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJhY3RldXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoYWN0ZXVyc1Jlb3JnYW5pemVkRGlyKVxuICAgICAgY29uc3Qgb3JnYW5lc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJvcmdhbmVzXCIpXG4gICAgICBmcy5ta2RpclN5bmMob3JnYW5lc1Jlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cnNFdE9yZ2FuZXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGV1ciBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LmFjdGV1cnMuYWN0ZXVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGFjdGV1ci51aWRbXCIjdGV4dFwiXSArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC5vcmdhbmVzLm9yZ2FuZSkge1xuICAgICAgICAgICAgICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGVwb3J0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJkZXBvcnRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wiZGVwb3J0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgZGVwb3J0U3BsaXRQYXRoW2RlcG9ydFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghZGVwb3J0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5kZXBvcnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwiZGVwb3J0XCIgZmlsZTogJHtkZXBvcnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0RlcG9ydChkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZGVwb3J0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydCA9IGRlcG9ydE9yaWdpbmFsLmRlcG9ydFxuICAgICAgICAgICAgICAgIGxldCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdXG4gICAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFtkZXBvcnQuYWN0ZXVyUmVmXSA9IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlcG9ydHMucHVzaChkZXBvcnQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydHMgb2YgT2JqZWN0LnZhbHVlcyhkZXBvcnRzQnlBY3RldXJVaWQpKSB7XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICAgICAgICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFuZGF0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJtYW5kYXRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wibWFuZGF0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgbWFuZGF0U3BsaXRQYXRoW21hbmRhdFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghbWFuZGF0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5tYW5kYXRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwibWFuZGF0XCIgZmlsZTogJHttYW5kYXRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b01hbmRhdFdyYXBwZXIobWFuZGF0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG1hbmRhdE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXQgPSBtYW5kYXRPcmlnaW5hbC5tYW5kYXRcbiAgICAgICAgICAgICAgICBsZXQgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChtYW5kYXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYW5kYXRzLnB1c2gobWFuZGF0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRzIG9mIE9iamVjdC52YWx1ZXMobWFuZGF0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIG1hbmRhdHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImFjdGV1clwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyRmlsZW5hbWUgPSBhY3RldXJTcGxpdFBhdGhbYWN0ZXVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYWN0ZXVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhY3RldXJcIiBmaWxlOiAke2FjdGV1ck9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cihhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyID0gYWN0ZXVyT3JpZ2luYWwuYWN0ZXVyXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clVpZCA9IGFjdGV1ci51aWRbXCIjdGV4dFwiXVxuICAgICAgICAgICAgICBjb25zdCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIuZGVwb3J0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5kZXBvcnRzID0geyBkZXBvcnQ6IGRlcG9ydHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAobWFuZGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5tYW5kYXRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLm1hbmRhdHMgPSB7IG1hbmRhdDogbWFuZGF0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyVWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJvcmdhbmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwib3JnYW5lXCIgZmlsZTogJHtvcmdhbmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9PcmdhbmUob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZSA9IG9yZ2FuZU9yaWdpbmFsLm9yZ2FuZVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQWdlbmRhc1Jhd0NvbnZlcnQudG9BZ2VuZGFzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCByZXVuaW9uIG9mIG9yaWdpbmFsRGF0YS5yZXVuaW9ucy5yZXVuaW9uKSB7XG4gICAgICAgICAgICAgIHdyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHJldW5pb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wicmV1bmlvblwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInJldW5pb25cIiBmaWxlOiAke3JldW5pb25PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWdlbmRhc1Jhd0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKHJldW5pb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb24gPSByZXVuaW9uT3JpZ2luYWwucmV1bmlvblxuICAgICAgICAgICAgICB3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCByZXVuaW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBbWVuZGVtZW50c1Jhd0NvbnZlcnQudG9BbWVuZGVtZW50cyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGV4dGVMZWdpc2xhdGlmIG9mIG9yaWdpbmFsRGF0YS50ZXh0ZXNFdEFtZW5kZW1lbnRzXG4gICAgICAgICAgICAgIC50ZXh0ZWxlZykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnQgb2YgdGV4dGVMZWdpc2xhdGlmLmFtZW5kZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgICAgYW1lbmRlbWVudCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiYW1lbmRlbWVudFwiIGZpbGU6ICR7YW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBbWVuZGVtZW50c1Jhd0NvbnZlcnQudG9BbWVuZGVtZW50V3JhcHBlcihcbiAgICAgICAgICAgICAgICAgICAgYW1lbmRlbWVudE9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoYW1lbmRlbWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudCA9IGFtZW5kZW1lbnRPcmlnaW5hbC5hbWVuZGVtZW50XG4gICAgICAgICAgICAgIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGFtZW5kZW1lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgZG9jdW1lbnRzRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJkb2N1bWVudHNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhkb2N1bWVudHNEaXIpXG4gICAgICBjb25zdCBkb3NzaWVyc0RpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiZG9zc2llcnNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhkb3NzaWVyc0RpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyc0xlZ2lzbGF0aWZzKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkb2N1bWVudCBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LnRleHRlc0xlZ2lzbGF0aWZzXG4gICAgICAgICAgICAgIC5kb2N1bWVudCkge1xuICAgICAgICAgICAgICB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKGRvY3VtZW50c0RpciwgZG9jdW1lbnQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBkb3NzaWVyUGFybGVtZW50YWlyZSB9IG9mIG9yaWdpbmFsRGF0YS5leHBvcnRcbiAgICAgICAgICAgICAgLmRvc3NpZXJzTGVnaXNsYXRpZnMuZG9zc2llcikge1xuICAgICAgICAgICAgICB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvY3VtZW50XCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb2N1bWVudFNwbGl0UGF0aFtkb2N1bWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiZG9jdW1lbnRcIiBmaWxlOiAke2RvY3VtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9jdW1lbnQoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvY3VtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGRvY3VtZW50T3JpZ2luYWwuZG9jdW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbihkb2N1bWVudHNEaXIsIGRvY3VtZW50KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiIGZpbGU6ICR7ZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShcbiAgICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbC5kb3NzaWVyUGFybGVtZW50YWlyZVxuICAgICAgICAgICAgICB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IFNjcnV0aW5zUmF3Q29udmVydC50b1NjcnV0aW5zKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzY3J1dGluIG9mIG9yaWdpbmFsRGF0YS5zY3J1dGlucy5zY3J1dGluKSB7XG4gICAgICAgICAgICAgIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHNjcnV0aW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5zY3J1dGluU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInNjcnV0aW5cIiBmaWxlOiAke3NjcnV0aW5PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbldyYXBwZXIoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbiA9IHNjcnV0aW5PcmlnaW5hbC5zY3J1dGluXG4gICAgICAgICAgICAgIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHNjcnV0aW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihcbiAgZGF0YXNldFJlb3JnYW5pemVkRGlyOiBzdHJpbmcsXG4gIGFtZW5kZW1lbnQ6IHtcbiAgICB1aWQ6IHN0cmluZ1xuICAgIHRleHRlTGVnaXNsYXRpZlJlZjogc3RyaW5nXG4gIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgdWlkVGV4dGVMZWdpc2xhdGlmID0gYW1lbmRlbWVudC50ZXh0ZUxlZ2lzbGF0aWZSZWZcbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHVpZFRleHRlTGVnaXNsYXRpZiwgdW5kZWZpbmVkKVxuICBjb25zdCB0ZXh0ZUxlZ2lzbGF0aWZEaXIgPSBwYXRoLmpvaW4oXG4gICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgIHVpZFRleHRlTGVnaXNsYXRpZixcbiAgKVxuICBmcy5lbnN1cmVEaXJTeW5jKHRleHRlTGVnaXNsYXRpZkRpcilcbiAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgdGV4dGVMZWdpc2xhdGlmRGlyLFxuICAgIGFtZW5kZW1lbnQudWlkICsgXCIuanNvblwiLFxuICApXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgSlNPTi5zdHJpbmdpZnkoYW1lbmRlbWVudCwgbnVsbCwgMiksXG4gICAge1xuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgIH0sXG4gIClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbihcbiAgZG9jdW1lbnRzRGlyOiBzdHJpbmcsXG4gIGRvY3VtZW50OiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbURvY3VtZW50VWlkKGRvY3VtZW50c0RpciwgZG9jdW1lbnQudWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQsIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICBkb3NzaWVyc0Rpcjogc3RyaW5nLFxuICBkb3NzaWVyUGFybGVtZW50YWlyZTogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZChcbiAgICBkb3NzaWVyc0RpcixcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZS51aWQsXG4gIClcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBgJHtiYXNlbmFtZX0uanNvbmAsXG4gICAgSlNPTi5zdHJpbmdpZnkoZG9zc2llclBhcmxlbWVudGFpcmUsIG51bGwsIDIpLFxuICAgIHtcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICB9LFxuICApXG59XG5cbmZ1bmN0aW9uIHdyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbihcbiAgcmV1bmlvbnNEaXI6IHN0cmluZyxcbiAgcmV1bmlvbjogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21SZXVuaW9uVWlkKHJldW5pb25zRGlyLCByZXVuaW9uLnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KHJldW5pb24sIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVNjcnV0aW5SZW9yZ2FuaXplZEpzb24oXG4gIHNjcnV0aW5zRGlyOiBzdHJpbmcsXG4gIHNjcnV0aW46IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tU2NydXRpblVpZChzY3J1dGluc0Rpciwgc2NydXRpbi51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShzY3J1dGluLCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwicmVvcmdhbml6ZV9kYXRhLnRzXCIpKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG4gIGlmIChyZW9yZ2FuaXplRGF0YShvcHRpb25zKSkge1xuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZXhpdCgwKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQVAsTUFBbUIsUUFBbkI7QUFDQSxTQUF1QkMsUUFBdkIsUUFBdUMsZUFBdkM7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLEVBQVAsTUFBZSxVQUFmO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixNQUFqQjtTQUVTQyxRLEVBQVVDLGdCLEVBQWtCQyxlO1NBQzVCQyxrQixFQUFvQkMsaUI7U0FDcEJDLE87U0FFUEMsbUIsRUFDQUMsK0IsRUFDQUMsa0IsRUFDQUMsa0I7U0FFT0MsT0FBTyxJQUFJQywwQjtTQUNYRCxPQUFPLElBQUlFLGlCO1NBQ1hGLE9BQU8sSUFBSUcscUI7U0FDWEgsT0FBTyxJQUFJSSw2QjtTQUNYSixPQUFPLElBQUlLLGtCO0FBRXBCLE1BQU1DLGtCQUFrQixHQUFHLENBQ3pCO0VBQ0VDLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSwrREFGUjtFQUdFQyxJQUFJLEVBQUUsT0FIUjtFQUlFQyxJQUFJLEVBQUVDO0FBSlIsQ0FEeUIsRUFPekI7RUFDRUosS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLG9CQUZSO0VBR0VDLElBQUksRUFBRSxRQUhSO0VBSUVDLElBQUksRUFBRUU7QUFKUixDQVB5QixFQWF6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFTSxZQUFZLEVBQUUsQ0FBQyxLQUFELENBRmhCO0VBR0VMLElBQUksRUFBRSxzQ0FIUjtFQUlFTSxRQUFRLEVBQUUsSUFKWjtFQUtFTCxJQUFJLEVBQUUsWUFMUjtFQU1FQyxJQUFJLEVBQUVDO0FBTlIsQ0FieUIsRUFxQnpCO0VBQ0VKLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSw2QkFGUjtFQUdFTSxRQUFRLEVBQUUsSUFIWjtFQUlFTCxJQUFJLEVBQUUsUUFKUjtFQUtFQyxJQUFJLEVBQUVDO0FBTFIsQ0FyQnlCLEVBNEJ6QjtFQUNFSixLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsb0JBRlI7RUFHRUMsSUFBSSxFQUFFLFFBSFI7RUFJRUMsSUFBSSxFQUFFRTtBQUpSLENBNUJ5QixFQWtDekI7RUFDRUwsS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLHlCQUZSO0VBR0VDLElBQUksRUFBRSxpQkFIUjtFQUlFQyxJQUFJLEVBQUVFO0FBSlIsQ0FsQ3lCLEVBd0N6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsY0FGUjtFQUdFQyxJQUFJLEVBQUUsU0FIUjtFQUlFQyxJQUFJLEVBQUVFO0FBSlIsQ0F4Q3lCLEVBOEN6QjtFQUNFRyxhQUFhLEVBQUUsSUFEakI7RUFFRVAsSUFBSSxFQUFFLGdEQUZSO0VBR0VDLElBQUksRUFBRSxTQUhSO0VBSUVDLElBQUksRUFBRUM7QUFKUixDQTlDeUIsQ0FBM0I7O0FBc0RBLFNBQVNLLGFBQVQsQ0FDRUMsYUFERixFQUVFQyxNQUZGLEVBR0VDLE9BSEYsRUFJVztFQUNULElBQUlDLEtBQUssR0FBRyxLQUFaOztFQUNBLElBQUlGLE1BQUosRUFBWTtJQUNWaEMsUUFBUSxDQUFFLFdBQUYsRUFBYztNQUNwQm1DLEdBQUcsRUFBRUosYUFEZTtNQUVwQkssR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBRk87TUFHcEJFLFFBQVEsRUFBRSxPQUhVO01BSXBCQyxLQUFLLEVBQUUsQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixNQUFyQjtJQUphLENBQWQsQ0FBUjs7SUFNQSxJQUFJO01BQ0Z2QyxRQUFRLENBQUMsa0NBQUQsRUFBcUM7UUFDM0NtQyxHQUFHLEVBQUVKLGFBRHNDO1FBRTNDSyxHQUFHLEVBQUVDLE9BQU8sQ0FBQ0QsR0FGOEI7UUFHM0NFLFFBQVEsRUFBRTtNQUhpQyxDQUFyQyxDQUFSO0lBS0QsQ0FORCxDQU1FLE9BQU9FLFlBQVAsRUFBcUI7TUFDckIsSUFDR0EsWUFBRCxDQUErQkMsTUFBL0IsS0FBMEMsSUFBMUMsSUFDQSxDQUFDLG9CQUFvQkMsSUFBcEIsQ0FBMEJGLFlBQUQsQ0FBc0JHLE1BQS9DLENBRkgsRUFHRTtRQUNBQyxPQUFPLENBQUNWLEtBQVIsQ0FBZU0sWUFBRCxDQUFzQkssTUFBcEM7UUFDQSxNQUFNTCxZQUFOO01BQ0Q7SUFDRjs7SUFDRCxLQUFLLE1BQU1NLE1BQVgsSUFBcUJiLE9BQU8sSUFBSSxFQUFoQyxFQUFvQztNQUNsQyxJQUFJO1FBQ0ZqQyxRQUFRLENBQUUsWUFBVzhDLE1BQU8sU0FBcEIsRUFBOEI7VUFDcENYLEdBQUcsRUFBRUosYUFEK0I7VUFFcENLLEdBQUcsRUFBRUMsT0FBTyxDQUFDRCxHQUZ1QjtVQUdwQ0UsUUFBUSxFQUFFLE9BSDBCO1VBSXBDQyxLQUFLLEVBQUUsQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixNQUFyQjtRQUo2QixDQUE5QixDQUFSO01BTUQsQ0FQRCxDQU9FLE9BQU9DLFlBQVAsRUFBcUI7UUFDckI7UUFDQUksT0FBTyxDQUFDVixLQUFSLENBQWVNLFlBQUQsQ0FBc0JLLE1BQXBDO1FBQ0FYLEtBQUssR0FBRyxJQUFSO01BQ0Q7SUFDRjtFQUNGOztFQUNELE9BQU9BLEtBQVA7QUFDRDs7QUFFRCxTQUFTYSxjQUFULENBQXdCQyxPQUF4QixFQUErQztFQUM3QyxNQUFNQyxPQUFPLEdBQUdELE9BQU8sQ0FBQ0MsT0FBeEI7RUFDQUMsSUFBSSxDQUFDQyxTQUFMLENBQWVDLE1BQWYsR0FBd0I1QyxpQkFBeEI7RUFFQSxJQUFJMEIsS0FBSyxHQUFHLEtBQVo7RUFDQSxNQUFNbUIsV0FBVyxHQUFHTCxPQUFPLENBQUNNLEtBQVIsR0FDaEJOLE9BQU8sQ0FBQ00sS0FBUixDQUFjQyxJQUFkLEdBQXFCQyxPQUFyQixDQUE2QixNQUE3QixFQUFxQyxFQUFyQyxDQURnQixHQUVoQkMsU0FGSjtFQUdBLE1BQU1DLGVBQWUsR0FBRyxDQUFDVixPQUFPLENBQUMsaUJBQUQsQ0FBaEM7RUFFQUEsT0FBTyxDQUFDVyxVQUFSLENBQW1CQyxHQUFuQixDQUF3QkMsV0FBRCxJQUNyQjlELE1BQU0sQ0FBQytELGNBQVAsQ0FDR3hELGVBQUQsQ0FDRXVELFdBREYsQ0FERixFQUlFSixTQUpGLEVBS0csNEJBQTJCSSxXQUFZLEVBTDFDLENBREY7RUFTQSxNQUFNRSxlQUFlLEdBQUdmLE9BQU8sQ0FBQ1csVUFBUixDQUFtQkssTUFBbkIsQ0FDdEIsQ0FBQ0QsZUFBRCxFQUFtQ0YsV0FBbkMsS0FDRUUsZUFBZSxHQUNkekQsZUFBRCxDQUNFdUQsV0FERixDQUhvQixFQU10QnZELGVBQWUsQ0FBQzJELElBTk0sQ0FBeEI7O0VBU0EsSUFBSUYsZUFBZSxHQUFHekQsZUFBZSxDQUFDNEQsZ0JBQXRDLEVBQXdEO0lBQ3RELEtBQUssTUFBTUMsT0FBWCxJQUFzQi9ELFFBQVEsQ0FBQ2dFLGdCQUEvQixFQUFpRDtNQUMvQyxNQUFNQywrQkFBdUMsR0FBR2xFLElBQUksQ0FBQ21FLElBQUwsQ0FDOUNyQixPQUQ4QyxFQUU5Q2tCLE9BQU8sQ0FBQ0ksUUFGc0MsQ0FBaEQ7O01BSUEsSUFBSSxDQUFDdkIsT0FBTyxDQUFDd0IsTUFBYixFQUFxQjtRQUNuQjVCLE9BQU8sQ0FBQzZCLEdBQVIsQ0FBYSxnQkFBZUosK0JBQWdDLEVBQTVEO01BQ0Q7O01BRUQsTUFBTVIsV0FBVyxHQUFHMUQsSUFBSSxDQUFDdUUsUUFBTCxDQUNsQkwsK0JBRGtCLEVBRWxCLE9BRmtCLENBQXBCOztNQUlBLElBQUloQixXQUFXLEtBQUtJLFNBQXBCLEVBQStCO1FBQzdCekQsUUFBUSxDQUFFLGFBQVlxRCxXQUFZLElBQUdRLFdBQVksTUFBekMsRUFBZ0Q7VUFDdEQxQixHQUFHLEVBQUVjLE9BRGlEO1VBRXREYixHQUFHLEVBQUVDLE9BQU8sQ0FBQ0QsR0FGeUM7VUFHdERFLFFBQVEsRUFBRSxPQUg0QztVQUl0REMsS0FBSyxFQUFFLENBQUMsUUFBRCxFQUFXLFFBQVgsRUFBcUIsTUFBckI7UUFKK0MsQ0FBaEQsQ0FBUjtNQU1EOztNQUVELE1BQU1vQyxxQkFBcUIsR0FBR3hFLElBQUksQ0FBQ21FLElBQUwsQ0FBVXJCLE9BQVYsRUFBbUJZLFdBQW5CLENBQTlCO01BQ0EzRCxFQUFFLENBQUMwRSxhQUFILENBQWlCRCxxQkFBakI7O01BQ0EsS0FBSyxNQUFNSixRQUFYLElBQXVCckUsRUFBRSxDQUFDMkUsV0FBSCxDQUFlRixxQkFBZixDQUF2QixFQUE4RDtRQUM1RCxJQUFJSixRQUFRLENBQUMsQ0FBRCxDQUFSLEtBQWdCLEdBQXBCLEVBQXlCO1VBQ3ZCO1FBQ0Q7O1FBQ0RyRSxFQUFFLENBQUM0RSxVQUFILENBQWMzRSxJQUFJLENBQUNtRSxJQUFMLENBQVVLLHFCQUFWLEVBQWlDSixRQUFqQyxDQUFkO01BQ0Q7O01BQ0QsTUFBTVEscUJBQXFCLEdBQUc1RSxJQUFJLENBQUNtRSxJQUFMLENBQVVLLHFCQUFWLEVBQWlDLFNBQWpDLENBQTlCO01BQ0F6RSxFQUFFLENBQUM4RSxTQUFILENBQWFELHFCQUFiO01BQ0EsTUFBTUUscUJBQXFCLEdBQUc5RSxJQUFJLENBQUNtRSxJQUFMLENBQVVLLHFCQUFWLEVBQWlDLFNBQWpDLENBQTlCO01BQ0F6RSxFQUFFLENBQUM4RSxTQUFILENBQWFDLHFCQUFiOztNQUVBLFFBQVFkLE9BQU8sQ0FBQ2UsU0FBaEI7UUFDRSxLQUFLN0UsZ0JBQWdCLENBQUM4RSxVQUF0QjtVQUNFO1lBQ0UsTUFBTUMsWUFBb0IsR0FBR2xGLEVBQUUsQ0FBQ21GLFlBQUgsQ0FDM0JoQiwrQkFEMkIsRUFFM0I7Y0FDRS9CLFFBQVEsRUFBRTtZQURaLENBRjJCLENBQTdCO1lBTUEsTUFBTWdELFlBQWlCLEdBQUc1QixlQUFlLEdBQ3JDM0MsMEJBQTBCLENBQUN3RSxrQkFBM0IsQ0FBOENILFlBQTlDLENBRHFDLEdBRXJDSSxJQUFJLENBQUNDLEtBQUwsQ0FBV0wsWUFBWCxDQUZKOztZQUlBLEtBQUssTUFBTU0sTUFBWCxJQUFxQkosWUFBWSxDQUFDSyxNQUFiLENBQW9CQyxPQUFwQixDQUE0QkYsTUFBakQsRUFBeUQ7Y0FDdkQsTUFBTUcsdUJBQStCLEdBQUcxRixJQUFJLENBQUNtRSxJQUFMLENBQ3RDUyxxQkFEc0MsRUFFdENXLE1BQU0sQ0FBQ0ksR0FBUCxDQUFXLE9BQVgsSUFBc0IsT0FGZ0IsQ0FBeEM7Y0FJQTVGLEVBQUUsQ0FBQzZGLGFBQUgsQ0FDRUYsdUJBREYsRUFFRUwsSUFBSSxDQUFDUSxTQUFMLENBQWVOLE1BQWYsRUFBdUIsSUFBdkIsRUFBNkIsQ0FBN0IsQ0FGRixFQUdFO2dCQUNFcEQsUUFBUSxFQUFFO2NBRFosQ0FIRjtZQU9EOztZQUVELEtBQUssTUFBTTJELE1BQVgsSUFBcUJYLFlBQVksQ0FBQ0ssTUFBYixDQUFvQk8sT0FBcEIsQ0FBNEJELE1BQWpELEVBQXlEO2NBQ3ZELE1BQU1KLHVCQUErQixHQUFHMUYsSUFBSSxDQUFDbUUsSUFBTCxDQUN0Q1cscUJBRHNDLEVBRXRDZ0IsTUFBTSxDQUFDSCxHQUFQLEdBQWEsT0FGeUIsQ0FBeEM7Y0FJQTVGLEVBQUUsQ0FBQzZGLGFBQUgsQ0FDRUYsdUJBREYsRUFFRUwsSUFBSSxDQUFDUSxTQUFMLENBQWVDLE1BQWYsRUFBdUIsSUFBdkIsRUFBNkIsQ0FBN0IsQ0FGRixFQUdFO2dCQUNFM0QsUUFBUSxFQUFFO2NBRFosQ0FIRjtZQU9EO1VBQ0Y7VUFDRDs7UUFDRixLQUFLakMsZ0JBQWdCLENBQUM4RixjQUF0QjtVQUNFO1lBQ0UsTUFBTUMsa0JBRUwsR0FBRyxFQUZKOztZQUdBLElBQ0VsRyxFQUFFLENBQUNtRyxVQUFILENBQ0VsRyxJQUFJLENBQUNtRSxJQUFMLENBQVVELCtCQUFWLEVBQTJDLFFBQTNDLENBREYsQ0FERixFQUlFO2NBQ0EsS0FBSyxNQUFNaUMsZUFBWCxJQUE4QjdGLE9BQU8sQ0FDbkM0RCwrQkFEbUMsRUFFbkMsQ0FBQyxRQUFELENBRm1DLENBQXJDLEVBR0c7Z0JBQ0QsTUFBTWtDLGNBQWMsR0FDbEJELGVBQWUsQ0FBQ0EsZUFBZSxDQUFDRSxNQUFoQixHQUF5QixDQUExQixDQURqQjs7Z0JBRUEsSUFBSSxDQUFDRCxjQUFjLENBQUNFLFFBQWYsQ0FBd0IsT0FBeEIsQ0FBTCxFQUF1QztrQkFDckM7Z0JBQ0Q7O2dCQUNELE1BQU1DLHNCQUFzQixHQUFHdkcsSUFBSSxDQUFDbUUsSUFBTCxDQUM3QkQsK0JBRDZCLEVBRTdCLEdBQUdpQyxlQUYwQixDQUEvQjs7Z0JBSUEsSUFBSXRELE9BQU8sQ0FBQzJELE9BQVosRUFBcUI7a0JBQ25CL0QsT0FBTyxDQUFDNkIsR0FBUixDQUNHLDRCQUEyQmlDLHNCQUF1QixHQURyRDtnQkFHRDs7Z0JBQ0QsTUFBTUUsa0JBQTBCLEdBQUcxRyxFQUFFLENBQUNtRixZQUFILENBQ2pDcUIsc0JBRGlDLEVBRWpDO2tCQUNFcEUsUUFBUSxFQUFFO2dCQURaLENBRmlDLENBQW5DO2dCQU1BLE1BQU11RSxjQUFtQixHQUFHbkQsZUFBZSxHQUN2QzNDLDBCQUEwQixDQUFDK0YsUUFBM0IsQ0FBb0NGLGtCQUFwQyxDQUR1QyxHQUV2Q3BCLElBQUksQ0FBQ0MsS0FBTCxDQUFXbUIsa0JBQVgsQ0FGSjtnQkFHQSxNQUFNRyxNQUFNLEdBQUdGLGNBQWMsQ0FBQ0UsTUFBOUI7Z0JBQ0EsSUFBSUMsT0FBTyxHQUFHWixrQkFBa0IsQ0FBQ1csTUFBTSxDQUFDRSxTQUFSLENBQWhDOztnQkFDQSxJQUFJRCxPQUFPLEtBQUt2RCxTQUFoQixFQUEyQjtrQkFDekJ1RCxPQUFPLEdBQUdaLGtCQUFrQixDQUFDVyxNQUFNLENBQUNFLFNBQVIsQ0FBbEIsR0FBdUMsRUFBakQ7Z0JBQ0Q7O2dCQUNERCxPQUFPLENBQUNFLElBQVIsQ0FBYUgsTUFBYjtjQUNEOztjQUVELEtBQUssTUFBTUMsT0FBWCxJQUFzQkcsTUFBTSxDQUFDQyxNQUFQLENBQWNoQixrQkFBZCxDQUF0QixFQUF5RDtnQkFDdkRZLE9BQU8sQ0FBQ0ssSUFBUixDQUFhLENBQUNDLENBQUQsRUFBSUMsQ0FBSixLQUNYRCxDQUFDLENBQUN4QixHQUFGLENBQU1VLE1BQU4sS0FBaUJlLENBQUMsQ0FBQ3pCLEdBQUYsQ0FBTVUsTUFBdkIsR0FDSWMsQ0FBQyxDQUFDeEIsR0FBRixDQUFNMEIsYUFBTixDQUFvQkQsQ0FBQyxDQUFDekIsR0FBdEIsQ0FESixHQUVJd0IsQ0FBQyxDQUFDeEIsR0FBRixDQUFNVSxNQUFOLEdBQWVlLENBQUMsQ0FBQ3pCLEdBQUYsQ0FBTVUsTUFIM0I7Y0FLRDtZQUNGOztZQUVELE1BQU1pQixrQkFFTCxHQUFHLEVBRko7O1lBR0EsSUFDRXZILEVBQUUsQ0FBQ21HLFVBQUgsQ0FDRWxHLElBQUksQ0FBQ21FLElBQUwsQ0FBVUQsK0JBQVYsRUFBMkMsUUFBM0MsQ0FERixDQURGLEVBSUU7Y0FDQSxLQUFLLE1BQU1xRCxlQUFYLElBQThCakgsT0FBTyxDQUNuQzRELCtCQURtQyxFQUVuQyxDQUFDLFFBQUQsQ0FGbUMsQ0FBckMsRUFHRztnQkFDRCxNQUFNc0QsY0FBYyxHQUNsQkQsZUFBZSxDQUFDQSxlQUFlLENBQUNsQixNQUFoQixHQUF5QixDQUExQixDQURqQjs7Z0JBRUEsSUFBSSxDQUFDbUIsY0FBYyxDQUFDbEIsUUFBZixDQUF3QixPQUF4QixDQUFMLEVBQXVDO2tCQUNyQztnQkFDRDs7Z0JBQ0QsTUFBTW1CLHNCQUFzQixHQUFHekgsSUFBSSxDQUFDbUUsSUFBTCxDQUM3QkQsK0JBRDZCLEVBRTdCLEdBQUdxRCxlQUYwQixDQUEvQjs7Z0JBSUEsSUFBSTFFLE9BQU8sQ0FBQzJELE9BQVosRUFBcUI7a0JBQ25CL0QsT0FBTyxDQUFDNkIsR0FBUixDQUNHLDRCQUEyQm1ELHNCQUF1QixHQURyRDtnQkFHRDs7Z0JBQ0QsTUFBTUMsa0JBQTBCLEdBQUczSCxFQUFFLENBQUNtRixZQUFILENBQ2pDdUMsc0JBRGlDLEVBRWpDO2tCQUNFdEYsUUFBUSxFQUFFO2dCQURaLENBRmlDLENBQW5DO2dCQU1BLE1BQU13RixjQUFtQixHQUFHcEUsZUFBZSxHQUN2QzNDLDBCQUEwQixDQUFDZ0gsZUFBM0IsQ0FBMkNGLGtCQUEzQyxDQUR1QyxHQUV2Q3JDLElBQUksQ0FBQ0MsS0FBTCxDQUFXb0Msa0JBQVgsQ0FGSjtnQkFHQSxNQUFNRyxNQUFNLEdBQUdGLGNBQWMsQ0FBQ0UsTUFBOUI7Z0JBQ0EsSUFBSUMsT0FBTyxHQUFHUixrQkFBa0IsQ0FBQ08sTUFBTSxDQUFDZixTQUFSLENBQWhDOztnQkFDQSxJQUFJZ0IsT0FBTyxLQUFLeEUsU0FBaEIsRUFBMkI7a0JBQ3pCd0UsT0FBTyxHQUFHUixrQkFBa0IsQ0FBQ08sTUFBTSxDQUFDZixTQUFSLENBQWxCLEdBQXVDLEVBQWpEO2dCQUNEOztnQkFDRGdCLE9BQU8sQ0FBQ2YsSUFBUixDQUFhYyxNQUFiO2NBQ0Q7O2NBRUQsS0FBSyxNQUFNQyxPQUFYLElBQXNCZCxNQUFNLENBQUNDLE1BQVAsQ0FBY0ssa0JBQWQsQ0FBdEIsRUFBeUQ7Z0JBQ3ZEUSxPQUFPLENBQUNaLElBQVIsQ0FBYSxDQUFDQyxDQUFELEVBQUlDLENBQUosS0FDWEQsQ0FBQyxDQUFDeEIsR0FBRixDQUFNVSxNQUFOLEtBQWlCZSxDQUFDLENBQUN6QixHQUFGLENBQU1VLE1BQXZCLEdBQ0ljLENBQUMsQ0FBQ3hCLEdBQUYsQ0FBTTBCLGFBQU4sQ0FBb0JELENBQUMsQ0FBQ3pCLEdBQXRCLENBREosR0FFSXdCLENBQUMsQ0FBQ3hCLEdBQUYsQ0FBTVUsTUFBTixHQUFlZSxDQUFDLENBQUN6QixHQUFGLENBQU1VLE1BSDNCO2NBS0Q7WUFDRjs7WUFFRCxLQUFLLE1BQU0wQixlQUFYLElBQThCekgsT0FBTyxDQUNuQzRELCtCQURtQyxFQUVuQyxDQUFDLFFBQUQsQ0FGbUMsQ0FBckMsRUFHRztjQUNELE1BQU04RCxjQUFjLEdBQUdELGVBQWUsQ0FBQ0EsZUFBZSxDQUFDMUIsTUFBaEIsR0FBeUIsQ0FBMUIsQ0FBdEM7O2NBQ0EsSUFBSSxDQUFDMkIsY0FBYyxDQUFDMUIsUUFBZixDQUF3QixPQUF4QixDQUFMLEVBQXVDO2dCQUNyQztjQUNEOztjQUNELE1BQU0yQixzQkFBc0IsR0FBR2pJLElBQUksQ0FBQ21FLElBQUwsQ0FDN0JELCtCQUQ2QixFQUU3QixHQUFHNkQsZUFGMEIsQ0FBL0I7O2NBSUEsSUFBSWxGLE9BQU8sQ0FBQzJELE9BQVosRUFBcUI7Z0JBQ25CL0QsT0FBTyxDQUFDNkIsR0FBUixDQUNHLGlDQUFnQzJELHNCQUF1QixHQUQxRDtjQUdEOztjQUNELE1BQU1DLGtCQUEwQixHQUFHbkksRUFBRSxDQUFDbUYsWUFBSCxDQUNqQytDLHNCQURpQyxFQUVqQztnQkFDRTlGLFFBQVEsRUFBRTtjQURaLENBRmlDLENBQW5DO2NBTUEsTUFBTWdHLGNBQW1CLEdBQUc1RSxlQUFlLEdBQ3ZDM0MsMEJBQTBCLENBQUN3SCxRQUEzQixDQUFvQ0Ysa0JBQXBDLENBRHVDLEdBRXZDN0MsSUFBSSxDQUFDQyxLQUFMLENBQVc0QyxrQkFBWCxDQUZKO2NBR0EsTUFBTTNDLE1BQU0sR0FBRzRDLGNBQWMsQ0FBQzVDLE1BQTlCO2NBQ0EsTUFBTThDLFNBQVMsR0FBRzlDLE1BQU0sQ0FBQ0ksR0FBUCxDQUFXLE9BQVgsQ0FBbEI7Y0FDQSxNQUFNa0IsT0FBTyxHQUFHWixrQkFBa0IsQ0FBQ29DLFNBQUQsQ0FBbEM7O2NBQ0EsSUFBSXhCLE9BQU8sS0FBS3ZELFNBQWhCLEVBQTJCO2dCQUN6QjFELE1BQU0sQ0FBQzBJLFdBQVAsQ0FBbUIvQyxNQUFNLENBQUNzQixPQUExQixFQUFtQ3ZELFNBQW5DO2dCQUNBaUMsTUFBTSxDQUFDc0IsT0FBUCxHQUFpQjtrQkFBRUQsTUFBTSxFQUFFQztnQkFBVixDQUFqQjtjQUNEOztjQUNELE1BQU1pQixPQUFPLEdBQUdSLGtCQUFrQixDQUFDZSxTQUFELENBQWxDOztjQUNBLElBQUlQLE9BQU8sS0FBS3hFLFNBQWhCLEVBQTJCO2dCQUN6QjFELE1BQU0sQ0FBQzBJLFdBQVAsQ0FBbUIvQyxNQUFNLENBQUN1QyxPQUExQixFQUFtQ3hFLFNBQW5DO2dCQUNBaUMsTUFBTSxDQUFDdUMsT0FBUCxHQUFpQjtrQkFBRUQsTUFBTSxFQUFFQztnQkFBVixDQUFqQjtjQUNEOztjQUNELE1BQU1TLDZCQUFxQyxHQUFHdkksSUFBSSxDQUFDbUUsSUFBTCxDQUM1Q1MscUJBRDRDLEVBRTVDeUQsU0FBUyxHQUFHLE9BRmdDLENBQTlDO2NBSUF0SSxFQUFFLENBQUM2RixhQUFILENBQ0UyQyw2QkFERixFQUVFbEQsSUFBSSxDQUFDUSxTQUFMLENBQWVOLE1BQWYsRUFBdUIsSUFBdkIsRUFBNkIsQ0FBN0IsQ0FGRixFQUdFO2dCQUNFcEQsUUFBUSxFQUFFO2NBRFosQ0FIRjtZQU9EOztZQUVELEtBQUssTUFBTXFHLGVBQVgsSUFBOEJsSSxPQUFPLENBQ25DNEQsK0JBRG1DLEVBRW5DLENBQUMsUUFBRCxDQUZtQyxDQUFyQyxFQUdHO2NBQ0QsTUFBTXVFLGNBQWMsR0FBR0QsZUFBZSxDQUFDQSxlQUFlLENBQUNuQyxNQUFoQixHQUF5QixDQUExQixDQUF0Qzs7Y0FDQSxJQUFJLENBQUNvQyxjQUFjLENBQUNuQyxRQUFmLENBQXdCLE9BQXhCLENBQUwsRUFBdUM7Z0JBQ3JDO2NBQ0Q7O2NBQ0QsTUFBTW9DLHNCQUFzQixHQUFHMUksSUFBSSxDQUFDbUUsSUFBTCxDQUM3QkQsK0JBRDZCLEVBRTdCLEdBQUdzRSxlQUYwQixDQUEvQjs7Y0FJQSxJQUFJM0YsT0FBTyxDQUFDMkQsT0FBWixFQUFxQjtnQkFDbkIvRCxPQUFPLENBQUM2QixHQUFSLENBQ0csaUNBQWdDb0Usc0JBQXVCLEdBRDFEO2NBR0Q7O2NBQ0QsTUFBTUMsa0JBQTBCLEdBQUc1SSxFQUFFLENBQUNtRixZQUFILENBQ2pDd0Qsc0JBRGlDLEVBRWpDO2dCQUNFdkcsUUFBUSxFQUFFO2NBRFosQ0FGaUMsQ0FBbkM7Y0FNQSxNQUFNeUcsY0FBbUIsR0FBR3JGLGVBQWUsR0FDdkMzQywwQkFBMEIsQ0FBQ2lJLFFBQTNCLENBQW9DRixrQkFBcEMsQ0FEdUMsR0FFdkN0RCxJQUFJLENBQUNDLEtBQUwsQ0FBV3FELGtCQUFYLENBRko7Y0FHQSxNQUFNN0MsTUFBTSxHQUFHOEMsY0FBYyxDQUFDOUMsTUFBOUI7Y0FDQSxNQUFNZ0QsNkJBQXFDLEdBQUc5SSxJQUFJLENBQUNtRSxJQUFMLENBQzVDVyxxQkFENEMsRUFFNUNnQixNQUFNLENBQUNILEdBQVAsR0FBYSxPQUYrQixDQUE5QztjQUlBNUYsRUFBRSxDQUFDNkYsYUFBSCxDQUNFa0QsNkJBREYsRUFFRXpELElBQUksQ0FBQ1EsU0FBTCxDQUFlQyxNQUFmLEVBQXVCLElBQXZCLEVBQTZCLENBQTdCLENBRkYsRUFHRTtnQkFDRTNELFFBQVEsRUFBRTtjQURaLENBSEY7WUFPRDtVQUNGO1VBQ0Q7TUEvT0o7O01Ba1BBLElBQ0VSLGFBQWEsQ0FBQzZDLHFCQUFELEVBQXdCM0IsT0FBTyxDQUFDaEIsTUFBaEMsRUFBd0NnQixPQUFPLENBQUNGLE1BQWhELENBRGYsRUFFRTtRQUNBWixLQUFLLEdBQUcsSUFBUjtNQUNEO0lBQ0Y7RUFDRjs7RUFFRCxJQUFJNkIsZUFBZSxHQUFHekQsZUFBZSxDQUFDNEksT0FBdEMsRUFBK0M7SUFDN0MsS0FBSyxNQUFNL0UsT0FBWCxJQUFzQi9ELFFBQVEsQ0FBQytJLE9BQS9CLEVBQXdDO01BQ3RDLE1BQU05RSwrQkFBdUMsR0FBR2xFLElBQUksQ0FBQ21FLElBQUwsQ0FDOUNyQixPQUQ4QyxFQUU5Q2tCLE9BQU8sQ0FBQ0ksUUFGc0MsQ0FBaEQ7O01BSUEsSUFBSSxDQUFDdkIsT0FBTyxDQUFDd0IsTUFBYixFQUFxQjtRQUNuQjVCLE9BQU8sQ0FBQzZCLEdBQVIsQ0FBYSxnQkFBZUosK0JBQWdDLEVBQTVEO01BQ0Q7O01BRUQsTUFBTVIsV0FBVyxHQUFHMUQsSUFBSSxDQUFDdUUsUUFBTCxDQUNsQkwsK0JBRGtCLEVBRWxCLE9BRmtCLENBQXBCOztNQUlBLElBQUloQixXQUFXLEtBQUtJLFNBQXBCLEVBQStCO1FBQzdCekQsUUFBUSxDQUFFLGFBQVlxRCxXQUFZLElBQUdRLFdBQVksTUFBekMsRUFBZ0Q7VUFDdEQxQixHQUFHLEVBQUVjLE9BRGlEO1VBRXREYixHQUFHLEVBQUVDLE9BQU8sQ0FBQ0QsR0FGeUM7VUFHdERFLFFBQVEsRUFBRSxPQUg0QztVQUl0REMsS0FBSyxFQUFFLENBQUMsUUFBRCxFQUFXLFFBQVgsRUFBcUIsTUFBckI7UUFKK0MsQ0FBaEQsQ0FBUjtNQU1EOztNQUVELE1BQU1vQyxxQkFBcUIsR0FBR3hFLElBQUksQ0FBQ21FLElBQUwsQ0FBVXJCLE9BQVYsRUFBbUJZLFdBQW5CLENBQTlCO01BQ0EzRCxFQUFFLENBQUMwRSxhQUFILENBQWlCRCxxQkFBakI7O01BQ0EsS0FBSyxNQUFNSixRQUFYLElBQXVCckUsRUFBRSxDQUFDMkUsV0FBSCxDQUFlRixxQkFBZixDQUF2QixFQUE4RDtRQUM1RCxJQUFJSixRQUFRLENBQUMsQ0FBRCxDQUFSLEtBQWdCLEdBQXBCLEVBQXlCO1VBQ3ZCO1FBQ0Q7O1FBQ0RyRSxFQUFFLENBQUM0RSxVQUFILENBQWMzRSxJQUFJLENBQUNtRSxJQUFMLENBQVVLLHFCQUFWLEVBQWlDSixRQUFqQyxDQUFkO01BQ0Q7O01BRUQsUUFBUUosT0FBTyxDQUFDZSxTQUFoQjtRQUNFLEtBQUs3RSxnQkFBZ0IsQ0FBQzhFLFVBQXRCO1VBQ0U7WUFDRSxNQUFNQyxZQUFvQixHQUFHbEYsRUFBRSxDQUFDbUYsWUFBSCxDQUMzQmhCLCtCQUQyQixFQUUzQjtjQUNFL0IsUUFBUSxFQUFFO1lBRFosQ0FGMkIsQ0FBN0I7WUFNQSxNQUFNZ0QsWUFBaUIsR0FBRzVCLGVBQWUsR0FDckMxQyxpQkFBaUIsQ0FBQ29JLFNBQWxCLENBQTRCaEUsWUFBNUIsQ0FEcUMsR0FFckNJLElBQUksQ0FBQ0MsS0FBTCxDQUFXTCxZQUFYLENBRko7O1lBSUEsS0FBSyxNQUFNaUUsT0FBWCxJQUFzQi9ELFlBQVksQ0FBQ2dFLFFBQWIsQ0FBc0JELE9BQTVDLEVBQXFEO2NBQ25ERSwyQkFBMkIsQ0FBQzVFLHFCQUFELEVBQXdCMEUsT0FBeEIsQ0FBM0I7WUFDRDtVQUNGO1VBQ0Q7O1FBQ0YsS0FBS2hKLGdCQUFnQixDQUFDOEYsY0FBdEI7VUFDRTtZQUNFLEtBQUssTUFBTXFELGdCQUFYLElBQStCL0ksT0FBTyxDQUNwQzRELCtCQURvQyxFQUVwQyxDQUFDLFNBQUQsQ0FGb0MsQ0FBdEMsRUFHRztjQUNELE1BQU1vRixlQUFlLEdBQ25CRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUNoRCxNQUFqQixHQUEwQixDQUEzQixDQURsQjs7Y0FFQSxJQUFJLENBQUNpRCxlQUFlLENBQUNoRCxRQUFoQixDQUF5QixPQUF6QixDQUFMLEVBQXdDO2dCQUN0QztjQUNEOztjQUNELE1BQU1pRCx1QkFBdUIsR0FBR3ZKLElBQUksQ0FBQ21FLElBQUwsQ0FDOUJELCtCQUQ4QixFQUU5QixHQUFHbUYsZ0JBRjJCLENBQWhDOztjQUlBLElBQUl4RyxPQUFPLENBQUMyRCxPQUFaLEVBQXFCO2dCQUNuQi9ELE9BQU8sQ0FBQzZCLEdBQVIsQ0FDRyxrQ0FBaUNpRix1QkFBd0IsR0FENUQ7Y0FHRDs7Y0FDRCxNQUFNQyxtQkFBMkIsR0FBR3pKLEVBQUUsQ0FBQ21GLFlBQUgsQ0FDbENxRSx1QkFEa0MsRUFFbEM7Z0JBQ0VwSCxRQUFRLEVBQUU7Y0FEWixDQUZrQyxDQUFwQztjQU1BLE1BQU1zSCxlQUFvQixHQUFHbEcsZUFBZSxHQUN4QzFDLGlCQUFpQixDQUFDNkksU0FBbEIsQ0FBNEJGLG1CQUE1QixDQUR3QyxHQUV4Q25FLElBQUksQ0FBQ0MsS0FBTCxDQUFXa0UsbUJBQVgsQ0FGSjtjQUdBLE1BQU1OLE9BQU8sR0FBR08sZUFBZSxDQUFDUCxPQUFoQztjQUNBRSwyQkFBMkIsQ0FBQzVFLHFCQUFELEVBQXdCMEUsT0FBeEIsQ0FBM0I7WUFDRDtVQUNGO1VBQ0Q7TUFuREo7O01Bc0RBLElBQ0V2SCxhQUFhLENBQUM2QyxxQkFBRCxFQUF3QjNCLE9BQU8sQ0FBQ2hCLE1BQWhDLEVBQXdDZ0IsT0FBTyxDQUFDRixNQUFoRCxDQURmLEVBRUU7UUFDQVosS0FBSyxHQUFHLElBQVI7TUFDRDtJQUNGO0VBQ0Y7O0VBRUQsSUFBSTZCLGVBQWUsR0FBR3pELGVBQWUsQ0FBQ3dKLFdBQXRDLEVBQW1EO0lBQ2pELEtBQUssTUFBTTNGLE9BQVgsSUFBc0IvRCxRQUFRLENBQUMySixXQUEvQixFQUE0QztNQUMxQyxNQUFNMUYsK0JBQXVDLEdBQUdsRSxJQUFJLENBQUNtRSxJQUFMLENBQzlDckIsT0FEOEMsRUFFOUNrQixPQUFPLENBQUNJLFFBRnNDLENBQWhEOztNQUlBLElBQUksQ0FBQ3ZCLE9BQU8sQ0FBQ3dCLE1BQWIsRUFBcUI7UUFDbkI1QixPQUFPLENBQUM2QixHQUFSLENBQWEsZ0JBQWVKLCtCQUFnQyxFQUE1RDtNQUNEOztNQUVELE1BQU1SLFdBQVcsR0FBRzFELElBQUksQ0FBQ3VFLFFBQUwsQ0FDbEJMLCtCQURrQixFQUVsQixPQUZrQixDQUFwQjs7TUFJQSxJQUFJaEIsV0FBVyxLQUFLSSxTQUFwQixFQUErQjtRQUM3QnpELFFBQVEsQ0FBRSxhQUFZcUQsV0FBWSxJQUFHUSxXQUFZLE1BQXpDLEVBQWdEO1VBQ3REMUIsR0FBRyxFQUFFYyxPQURpRDtVQUV0RGIsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBRnlDO1VBR3RERSxRQUFRLEVBQUUsT0FINEM7VUFJdERDLEtBQUssRUFBRSxDQUFDLFFBQUQsRUFBVyxRQUFYLEVBQXFCLE1BQXJCO1FBSitDLENBQWhELENBQVI7TUFNRDs7TUFFRCxNQUFNb0MscUJBQXFCLEdBQUd4RSxJQUFJLENBQUNtRSxJQUFMLENBQVVyQixPQUFWLEVBQW1CWSxXQUFuQixDQUE5QjtNQUNBM0QsRUFBRSxDQUFDMEUsYUFBSCxDQUFpQkQscUJBQWpCOztNQUNBLEtBQUssTUFBTUosUUFBWCxJQUF1QnJFLEVBQUUsQ0FBQzJFLFdBQUgsQ0FBZUYscUJBQWYsQ0FBdkIsRUFBOEQ7UUFDNUQsSUFBSUosUUFBUSxDQUFDLENBQUQsQ0FBUixLQUFnQixHQUFwQixFQUF5QjtVQUN2QjtRQUNEOztRQUNEckUsRUFBRSxDQUFDNEUsVUFBSCxDQUFjM0UsSUFBSSxDQUFDbUUsSUFBTCxDQUFVSyxxQkFBVixFQUFpQ0osUUFBakMsQ0FBZDtNQUNEOztNQUVELFFBQVFKLE9BQU8sQ0FBQ2UsU0FBaEI7UUFDRSxLQUFLN0UsZ0JBQWdCLENBQUM4RSxVQUF0QjtVQUNFO1lBQ0UsTUFBTUMsWUFBb0IsR0FBR2xGLEVBQUUsQ0FBQ21GLFlBQUgsQ0FDM0JoQiwrQkFEMkIsRUFFM0I7Y0FDRS9CLFFBQVEsRUFBRTtZQURaLENBRjJCLENBQTdCO1lBTUEsTUFBTWdELFlBQWlCLEdBQUc1QixlQUFlLEdBQ3JDekMscUJBQXFCLENBQUMrSSxhQUF0QixDQUFvQzVFLFlBQXBDLENBRHFDLEdBRXJDSSxJQUFJLENBQUNDLEtBQUwsQ0FBV0wsWUFBWCxDQUZKOztZQUlBLEtBQUssTUFBTTZFLGVBQVgsSUFBOEIzRSxZQUFZLENBQUM0RSxtQkFBYixDQUMzQkMsUUFESCxFQUNhO2NBQ1gsS0FBSyxNQUFNQyxVQUFYLElBQXlCSCxlQUFlLENBQUNGLFdBQXpDLEVBQXNEO2dCQUNwRE0sOEJBQThCLENBQzVCMUYscUJBRDRCLEVBRTVCeUYsVUFGNEIsQ0FBOUI7Y0FJRDtZQUNGO1VBQ0Y7VUFDRDs7UUFDRixLQUFLL0osZ0JBQWdCLENBQUM4RixjQUF0QjtVQUNFO1lBQ0UsS0FBSyxNQUFNbUUsbUJBQVgsSUFBa0M3SixPQUFPLENBQ3ZDNEQsK0JBRHVDLENBQXpDLEVBRUc7Y0FDRCxNQUFNa0csa0JBQWtCLEdBQ3RCRCxtQkFBbUIsQ0FBQ0EsbUJBQW1CLENBQUM5RCxNQUFwQixHQUE2QixDQUE5QixDQURyQjs7Y0FFQSxJQUFJLENBQUMrRCxrQkFBa0IsQ0FBQzlELFFBQW5CLENBQTRCLE9BQTVCLENBQUwsRUFBMkM7Z0JBQ3pDO2NBQ0Q7O2NBQ0QsTUFBTStELDBCQUEwQixHQUFHckssSUFBSSxDQUFDbUUsSUFBTCxDQUNqQ0QsK0JBRGlDLEVBRWpDLEdBQUdpRyxtQkFGOEIsQ0FBbkM7O2NBSUEsSUFBSXRILE9BQU8sQ0FBQzJELE9BQVosRUFBcUI7Z0JBQ25CL0QsT0FBTyxDQUFDNkIsR0FBUixDQUNHLHFDQUFvQytGLDBCQUEyQixHQURsRTtjQUdEOztjQUNELE1BQU1DLHNCQUE4QixHQUFHdkssRUFBRSxDQUFDbUYsWUFBSCxDQUNyQ21GLDBCQURxQyxFQUVyQztnQkFDRWxJLFFBQVEsRUFBRTtjQURaLENBRnFDLENBQXZDO2NBTUEsTUFBTW9JLGtCQUF1QixHQUFHaEgsZUFBZSxHQUMzQ3pDLHFCQUFxQixDQUFDMEosbUJBQXRCLENBQ0VGLHNCQURGLENBRDJDLEdBSTNDakYsSUFBSSxDQUFDQyxLQUFMLENBQVdnRixzQkFBWCxDQUpKO2NBS0EsTUFBTUwsVUFBVSxHQUFHTSxrQkFBa0IsQ0FBQ04sVUFBdEM7Y0FDQUMsOEJBQThCLENBQUMxRixxQkFBRCxFQUF3QnlGLFVBQXhCLENBQTlCO1lBQ0Q7VUFDRjtVQUNEO01BMURKOztNQTZEQSxJQUNFdEksYUFBYSxDQUFDNkMscUJBQUQsRUFBd0IzQixPQUFPLENBQUNoQixNQUFoQyxFQUF3Q2dCLE9BQU8sQ0FBQ0YsTUFBaEQsQ0FEZixFQUVFO1FBQ0FaLEtBQUssR0FBRyxJQUFSO01BQ0Q7SUFDRjtFQUNGOztFQUVELElBQUk2QixlQUFlLEdBQUd6RCxlQUFlLENBQUNzSyxtQkFBdEMsRUFBMkQ7SUFDekQsS0FBSyxNQUFNekcsT0FBWCxJQUFzQi9ELFFBQVEsQ0FBQ3lLLG1CQUEvQixFQUFvRDtNQUNsRCxNQUFNeEcsK0JBQXVDLEdBQUdsRSxJQUFJLENBQUNtRSxJQUFMLENBQzlDckIsT0FEOEMsRUFFOUNrQixPQUFPLENBQUNJLFFBRnNDLENBQWhEOztNQUlBLElBQUksQ0FBQ3ZCLE9BQU8sQ0FBQ3dCLE1BQWIsRUFBcUI7UUFDbkI1QixPQUFPLENBQUM2QixHQUFSLENBQWEsZ0JBQWVKLCtCQUFnQyxFQUE1RDtNQUNEOztNQUVELE1BQU1SLFdBQVcsR0FBRzFELElBQUksQ0FBQ3VFLFFBQUwsQ0FDbEJMLCtCQURrQixFQUVsQixPQUZrQixDQUFwQjs7TUFJQSxJQUFJaEIsV0FBVyxLQUFLSSxTQUFwQixFQUErQjtRQUM3QnpELFFBQVEsQ0FBRSxhQUFZcUQsV0FBWSxJQUFHUSxXQUFZLE1BQXpDLEVBQWdEO1VBQ3REMUIsR0FBRyxFQUFFYyxPQURpRDtVQUV0RGIsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBRnlDO1VBR3RERSxRQUFRLEVBQUUsT0FINEM7VUFJdERDLEtBQUssRUFBRSxDQUFDLFFBQUQsRUFBVyxRQUFYLEVBQXFCLE1BQXJCO1FBSitDLENBQWhELENBQVI7TUFNRDs7TUFFRCxNQUFNb0MscUJBQXFCLEdBQUd4RSxJQUFJLENBQUNtRSxJQUFMLENBQVVyQixPQUFWLEVBQW1CWSxXQUFuQixDQUE5QjtNQUNBM0QsRUFBRSxDQUFDMEUsYUFBSCxDQUFpQkQscUJBQWpCOztNQUNBLEtBQUssTUFBTUosUUFBWCxJQUF1QnJFLEVBQUUsQ0FBQzJFLFdBQUgsQ0FBZUYscUJBQWYsQ0FBdkIsRUFBOEQ7UUFDNUQsSUFBSUosUUFBUSxDQUFDLENBQUQsQ0FBUixLQUFnQixHQUFwQixFQUF5QjtVQUN2QjtRQUNEOztRQUNEckUsRUFBRSxDQUFDNEUsVUFBSCxDQUFjM0UsSUFBSSxDQUFDbUUsSUFBTCxDQUFVSyxxQkFBVixFQUFpQ0osUUFBakMsQ0FBZDtNQUNEOztNQUNELE1BQU11RyxZQUFZLEdBQUczSyxJQUFJLENBQUNtRSxJQUFMLENBQVVLLHFCQUFWLEVBQWlDLFdBQWpDLENBQXJCO01BQ0F6RSxFQUFFLENBQUM4RSxTQUFILENBQWE4RixZQUFiO01BQ0EsTUFBTUMsV0FBVyxHQUFHNUssSUFBSSxDQUFDbUUsSUFBTCxDQUFVSyxxQkFBVixFQUFpQyxVQUFqQyxDQUFwQjtNQUNBekUsRUFBRSxDQUFDOEUsU0FBSCxDQUFhK0YsV0FBYjs7TUFFQSxRQUFRNUcsT0FBTyxDQUFDZSxTQUFoQjtRQUNFLEtBQUs3RSxnQkFBZ0IsQ0FBQzhFLFVBQXRCO1VBQ0U7WUFDRSxNQUFNQyxZQUFvQixHQUFHbEYsRUFBRSxDQUFDbUYsWUFBSCxDQUMzQmhCLCtCQUQyQixFQUUzQjtjQUNFL0IsUUFBUSxFQUFFO1lBRFosQ0FGMkIsQ0FBN0I7WUFNQSxNQUFNZ0QsWUFBaUIsR0FBRzVCLGVBQWUsR0FDckN4Qyw2QkFBNkIsQ0FBQzhKLHFCQUE5QixDQUNFNUYsWUFERixDQURxQyxHQUlyQ0ksSUFBSSxDQUFDQyxLQUFMLENBQVdMLFlBQVgsQ0FKSjs7WUFNQSxLQUFLLE1BQU02RixRQUFYLElBQXVCM0YsWUFBWSxDQUFDSyxNQUFiLENBQW9CdUYsaUJBQXBCLENBQ3BCRCxRQURILEVBQ2E7Y0FDWEUsNEJBQTRCLENBQUNMLFlBQUQsRUFBZUcsUUFBZixDQUE1QjtZQUNEOztZQUVELEtBQUssTUFBTTtjQUFFRztZQUFGLENBQVgsSUFBdUM5RixZQUFZLENBQUNLLE1BQWIsQ0FDcENrRixtQkFEb0MsQ0FDaEJRLE9BRHZCLEVBQ2dDO2NBQzlCQyx3Q0FBd0MsQ0FDdENQLFdBRHNDLEVBRXRDSyxvQkFGc0MsQ0FBeEM7WUFJRDtVQUNGO1VBQ0Q7O1FBQ0YsS0FBSy9LLGdCQUFnQixDQUFDOEYsY0FBdEI7VUFDRTtZQUNFLEtBQUssTUFBTW9GLGlCQUFYLElBQWdDOUssT0FBTyxDQUNyQzRELCtCQURxQyxFQUVyQyxDQUFDLFVBQUQsQ0FGcUMsQ0FBdkMsRUFHRztjQUNELE1BQU1tSCxnQkFBZ0IsR0FDcEJELGlCQUFpQixDQUFDQSxpQkFBaUIsQ0FBQy9FLE1BQWxCLEdBQTJCLENBQTVCLENBRG5COztjQUVBLElBQUksQ0FBQ2dGLGdCQUFnQixDQUFDL0UsUUFBakIsQ0FBMEIsT0FBMUIsQ0FBTCxFQUF5QztnQkFDdkM7Y0FDRDs7Y0FDRCxNQUFNZ0Ysd0JBQXdCLEdBQUd0TCxJQUFJLENBQUNtRSxJQUFMLENBQy9CRCwrQkFEK0IsRUFFL0IsR0FBR2tILGlCQUY0QixDQUFqQzs7Y0FJQSxJQUFJdkksT0FBTyxDQUFDMkQsT0FBWixFQUFxQjtnQkFDbkIvRCxPQUFPLENBQUM2QixHQUFSLENBQ0csbUNBQWtDZ0gsd0JBQXlCLEdBRDlEO2NBR0Q7O2NBQ0QsTUFBTUMsb0JBQTRCLEdBQUd4TCxFQUFFLENBQUNtRixZQUFILENBQ25Db0csd0JBRG1DLEVBRW5DO2dCQUNFbkosUUFBUSxFQUFFO2NBRFosQ0FGbUMsQ0FBckM7Y0FNQSxNQUFNcUosZ0JBQXFCLEdBQUdqSSxlQUFlLEdBQ3pDeEMsNkJBQTZCLENBQUMwSyxVQUE5QixDQUF5Q0Ysb0JBQXpDLENBRHlDLEdBRXpDbEcsSUFBSSxDQUFDQyxLQUFMLENBQVdpRyxvQkFBWCxDQUZKO2NBR0EsTUFBTVQsUUFBUSxHQUFHVSxnQkFBZ0IsQ0FBQ1YsUUFBbEM7Y0FDQUUsNEJBQTRCLENBQUNMLFlBQUQsRUFBZUcsUUFBZixDQUE1QjtZQUNEOztZQUVELEtBQUssTUFBTVksNkJBQVgsSUFBNENwTCxPQUFPLENBQ2pENEQsK0JBRGlELEVBRWpELENBQUMsc0JBQUQsQ0FGaUQsQ0FBbkQsRUFHRztjQUNELE1BQU15SCw0QkFBNEIsR0FDaENELDZCQUE2QixDQUMzQkEsNkJBQTZCLENBQUNyRixNQUE5QixHQUF1QyxDQURaLENBRC9COztjQUlBLElBQUksQ0FBQ3NGLDRCQUE0QixDQUFDckYsUUFBN0IsQ0FBc0MsT0FBdEMsQ0FBTCxFQUFxRDtnQkFDbkQ7Y0FDRDs7Y0FDRCxNQUFNc0Ysb0NBQW9DLEdBQUc1TCxJQUFJLENBQUNtRSxJQUFMLENBQzNDRCwrQkFEMkMsRUFFM0MsR0FBR3dILDZCQUZ3QyxDQUE3Qzs7Y0FJQSxJQUFJN0ksT0FBTyxDQUFDMkQsT0FBWixFQUFxQjtnQkFDbkIvRCxPQUFPLENBQUM2QixHQUFSLENBQ0csK0NBQThDc0gsb0NBQXFDLEdBRHRGO2NBR0Q7O2NBQ0QsTUFBTUMsZ0NBQXdDLEdBQUc5TCxFQUFFLENBQUNtRixZQUFILENBQy9DMEcsb0NBRCtDLEVBRS9DO2dCQUNFekosUUFBUSxFQUFFO2NBRFosQ0FGK0MsQ0FBakQ7Y0FNQSxNQUFNMkosNEJBQWlDLEdBQUd2SSxlQUFlLEdBQ3JEeEMsNkJBQTZCLENBQUNnTCxzQkFBOUIsQ0FDRUYsZ0NBREYsQ0FEcUQsR0FJckR4RyxJQUFJLENBQUNDLEtBQUwsQ0FBV3VHLGdDQUFYLENBSko7Y0FLQSxNQUFNWixvQkFBb0IsR0FDeEJhLDRCQUE0QixDQUFDYixvQkFEL0I7Y0FFQUUsd0NBQXdDLENBQ3RDUCxXQURzQyxFQUV0Q0ssb0JBRnNDLENBQXhDO1lBSUQ7VUFDRjtVQUNEO01BckdKOztNQXdHQSxJQUNFdEosYUFBYSxDQUFDNkMscUJBQUQsRUFBd0IzQixPQUFPLENBQUNoQixNQUFoQyxFQUF3Q2dCLE9BQU8sQ0FBQ0YsTUFBaEQsQ0FEZixFQUVFO1FBQ0FaLEtBQUssR0FBRyxJQUFSO01BQ0Q7SUFDRjtFQUNGOztFQUVELElBQUk2QixlQUFlLEdBQUd6RCxlQUFlLENBQUM2TCxRQUF0QyxFQUFnRDtJQUM5QyxLQUFLLE1BQU1oSSxPQUFYLElBQXNCL0QsUUFBUSxDQUFDZ00sUUFBL0IsRUFBeUM7TUFDdkMsTUFBTS9ILCtCQUF1QyxHQUFHbEUsSUFBSSxDQUFDbUUsSUFBTCxDQUM5Q3JCLE9BRDhDLEVBRTlDa0IsT0FBTyxDQUFDSSxRQUZzQyxDQUFoRDs7TUFJQSxJQUFJLENBQUN2QixPQUFPLENBQUN3QixNQUFiLEVBQXFCO1FBQ25CNUIsT0FBTyxDQUFDNkIsR0FBUixDQUFhLGdCQUFlSiwrQkFBZ0MsRUFBNUQ7TUFDRDs7TUFFRCxNQUFNUixXQUFXLEdBQUcxRCxJQUFJLENBQUN1RSxRQUFMLENBQ2xCTCwrQkFEa0IsRUFFbEIsT0FGa0IsQ0FBcEI7O01BSUEsSUFBSWhCLFdBQVcsS0FBS0ksU0FBcEIsRUFBK0I7UUFDN0J6RCxRQUFRLENBQUUsYUFBWXFELFdBQVksSUFBR1EsV0FBWSxNQUF6QyxFQUFnRDtVQUN0RDFCLEdBQUcsRUFBRWMsT0FEaUQ7VUFFdERiLEdBQUcsRUFBRUMsT0FBTyxDQUFDRCxHQUZ5QztVQUd0REUsUUFBUSxFQUFFLE9BSDRDO1VBSXREQyxLQUFLLEVBQUUsQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixNQUFyQjtRQUorQyxDQUFoRCxDQUFSO01BTUQ7O01BRUQsTUFBTW9DLHFCQUFxQixHQUFHeEUsSUFBSSxDQUFDbUUsSUFBTCxDQUFVckIsT0FBVixFQUFtQlksV0FBbkIsQ0FBOUI7TUFDQTNELEVBQUUsQ0FBQzBFLGFBQUgsQ0FBaUJELHFCQUFqQjs7TUFDQSxLQUFLLE1BQU1KLFFBQVgsSUFBdUJyRSxFQUFFLENBQUMyRSxXQUFILENBQWVGLHFCQUFmLENBQXZCLEVBQThEO1FBQzVELElBQUlKLFFBQVEsQ0FBQyxDQUFELENBQVIsS0FBZ0IsR0FBcEIsRUFBeUI7VUFDdkI7UUFDRDs7UUFDRHJFLEVBQUUsQ0FBQzRFLFVBQUgsQ0FBYzNFLElBQUksQ0FBQ21FLElBQUwsQ0FBVUsscUJBQVYsRUFBaUNKLFFBQWpDLENBQWQ7TUFDRDs7TUFFRCxRQUFRSixPQUFPLENBQUNlLFNBQWhCO1FBQ0UsS0FBSzdFLGdCQUFnQixDQUFDOEUsVUFBdEI7VUFDRTtZQUNFLE1BQU1DLFlBQW9CLEdBQUdsRixFQUFFLENBQUNtRixZQUFILENBQzNCaEIsK0JBRDJCLEVBRTNCO2NBQ0UvQixRQUFRLEVBQUU7WUFEWixDQUYyQixDQUE3QjtZQU1BLE1BQU1nRCxZQUFpQixHQUFHNUIsZUFBZSxHQUNyQ3ZDLGtCQUFrQixDQUFDa0wsVUFBbkIsQ0FBOEJqSCxZQUE5QixDQURxQyxHQUVyQ0ksSUFBSSxDQUFDQyxLQUFMLENBQVdMLFlBQVgsQ0FGSjs7WUFJQSxLQUFLLE1BQU1rSCxPQUFYLElBQXNCaEgsWUFBWSxDQUFDOEcsUUFBYixDQUFzQkUsT0FBNUMsRUFBcUQ7Y0FDbkRDLDJCQUEyQixDQUFDNUgscUJBQUQsRUFBd0IySCxPQUF4QixDQUEzQjtZQUNEO1VBQ0Y7VUFDRDs7UUFDRixLQUFLak0sZ0JBQWdCLENBQUM4RixjQUF0QjtVQUNFO1lBQ0UsS0FBSyxNQUFNcUcsZ0JBQVgsSUFBK0IvTCxPQUFPLENBQ3BDNEQsK0JBRG9DLENBQXRDLEVBRUc7Y0FDRCxNQUFNb0ksZUFBZSxHQUNuQkQsZ0JBQWdCLENBQUNBLGdCQUFnQixDQUFDaEcsTUFBakIsR0FBMEIsQ0FBM0IsQ0FEbEI7O2NBRUEsSUFBSSxDQUFDaUcsZUFBZSxDQUFDaEcsUUFBaEIsQ0FBeUIsT0FBekIsQ0FBTCxFQUF3QztnQkFDdEM7Y0FDRDs7Y0FDRCxNQUFNaUcsdUJBQXVCLEdBQUd2TSxJQUFJLENBQUNtRSxJQUFMLENBQzlCRCwrQkFEOEIsRUFFOUIsR0FBR21JLGdCQUYyQixDQUFoQzs7Y0FJQSxJQUFJeEosT0FBTyxDQUFDMkQsT0FBWixFQUFxQjtnQkFDbkIvRCxPQUFPLENBQUM2QixHQUFSLENBQ0csa0NBQWlDaUksdUJBQXdCLEdBRDVEO2NBR0Q7O2NBQ0QsTUFBTUMsbUJBQTJCLEdBQUd6TSxFQUFFLENBQUNtRixZQUFILENBQ2xDcUgsdUJBRGtDLEVBRWxDO2dCQUNFcEssUUFBUSxFQUFFO2NBRFosQ0FGa0MsQ0FBcEM7Y0FNQSxNQUFNc0ssZUFBb0IsR0FBR2xKLGVBQWUsR0FDeEN2QyxrQkFBa0IsQ0FBQzBMLGdCQUFuQixDQUFvQ0YsbUJBQXBDLENBRHdDLEdBRXhDbkgsSUFBSSxDQUFDQyxLQUFMLENBQVdrSCxtQkFBWCxDQUZKO2NBR0EsTUFBTUwsT0FBTyxHQUFHTSxlQUFlLENBQUNOLE9BQWhDO2NBQ0FDLDJCQUEyQixDQUFDNUgscUJBQUQsRUFBd0IySCxPQUF4QixDQUEzQjtZQUNEO1VBQ0Y7VUFDRDtNQWxESjs7TUFxREEsSUFDRXhLLGFBQWEsQ0FBQzZDLHFCQUFELEVBQXdCM0IsT0FBTyxDQUFDaEIsTUFBaEMsRUFBd0NnQixPQUFPLENBQUNGLE1BQWhELENBRGYsRUFFRTtRQUNBWixLQUFLLEdBQUcsSUFBUjtNQUNEO0lBQ0Y7RUFDRixDQTV1QjRDLENBOHVCN0M7OztFQUNBZ0IsSUFBSSxDQUFDQyxTQUFMLENBQWVDLE1BQWYsR0FBd0I3QyxrQkFBeEI7RUFFQSxPQUFPMkIsS0FBUDtBQUNEOztBQUVELFNBQVNtSSw4QkFBVCxDQUNFMUYscUJBREYsRUFFRXlGLFVBRkYsRUFNUTtFQUNOLE1BQU0wQyxrQkFBa0IsR0FBRzFDLFVBQVUsQ0FBQzJDLGtCQUF0QztFQUNBaE4sTUFBTSxDQUFDK0QsY0FBUCxDQUFzQmdKLGtCQUF0QixFQUEwQ3JKLFNBQTFDO0VBQ0EsTUFBTXVKLGtCQUFrQixHQUFHN00sSUFBSSxDQUFDbUUsSUFBTCxDQUN6QksscUJBRHlCLEVBRXpCbUksa0JBRnlCLENBQTNCO0VBSUE1TSxFQUFFLENBQUMwRSxhQUFILENBQWlCb0ksa0JBQWpCO0VBQ0EsTUFBTW5ILHVCQUF1QixHQUFHMUYsSUFBSSxDQUFDbUUsSUFBTCxDQUM5QjBJLGtCQUQ4QixFQUU5QjVDLFVBQVUsQ0FBQ3RFLEdBQVgsR0FBaUIsT0FGYSxDQUFoQztFQUlBNUYsRUFBRSxDQUFDNkYsYUFBSCxDQUNFRix1QkFERixFQUVFTCxJQUFJLENBQUNRLFNBQUwsQ0FBZW9FLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUMsQ0FBakMsQ0FGRixFQUdFO0lBQ0U5SCxRQUFRLEVBQUU7RUFEWixDQUhGO0FBT0Q7O0FBRUQsU0FBUzZJLDRCQUFULENBQ0VMLFlBREYsRUFFRUcsUUFGRixFQUdRO0VBQ04sTUFBTXZHLFFBQVEsR0FBR2hFLG1CQUFtQixDQUFDb0ssWUFBRCxFQUFlRyxRQUFRLENBQUNuRixHQUF4QixDQUFwQztFQUNBNUYsRUFBRSxDQUFDNkYsYUFBSCxDQUFrQixHQUFFckIsUUFBUyxPQUE3QixFQUFxQ2MsSUFBSSxDQUFDUSxTQUFMLENBQWVpRixRQUFmLEVBQXlCLElBQXpCLEVBQStCLENBQS9CLENBQXJDLEVBQXdFO0lBQ3RFM0ksUUFBUSxFQUFFO0VBRDRELENBQXhFO0FBR0Q7O0FBRUQsU0FBU2dKLHdDQUFULENBQ0VQLFdBREYsRUFFRUssb0JBRkYsRUFHUTtFQUNOLE1BQU0xRyxRQUFRLEdBQUcvRCwrQkFBK0IsQ0FDOUNvSyxXQUQ4QyxFQUU5Q0ssb0JBQW9CLENBQUN0RixHQUZ5QixDQUFoRDtFQUlBNUYsRUFBRSxDQUFDNkYsYUFBSCxDQUNHLEdBQUVyQixRQUFTLE9BRGQsRUFFRWMsSUFBSSxDQUFDUSxTQUFMLENBQWVvRixvQkFBZixFQUFxQyxJQUFyQyxFQUEyQyxDQUEzQyxDQUZGLEVBR0U7SUFDRTlJLFFBQVEsRUFBRTtFQURaLENBSEY7QUFPRDs7QUFFRCxTQUFTaUgsMkJBQVQsQ0FDRTBELFdBREYsRUFFRTVELE9BRkYsRUFHUTtFQUNOLE1BQU0zRSxRQUFRLEdBQUc5RCxrQkFBa0IsQ0FBQ3FNLFdBQUQsRUFBYzVELE9BQU8sQ0FBQ3ZELEdBQXRCLENBQW5DO0VBQ0E1RixFQUFFLENBQUM2RixhQUFILENBQWtCLEdBQUVyQixRQUFTLE9BQTdCLEVBQXFDYyxJQUFJLENBQUNRLFNBQUwsQ0FBZXFELE9BQWYsRUFBd0IsSUFBeEIsRUFBOEIsQ0FBOUIsQ0FBckMsRUFBdUU7SUFDckUvRyxRQUFRLEVBQUU7RUFEMkQsQ0FBdkU7QUFHRDs7QUFFRCxTQUFTaUssMkJBQVQsQ0FDRVcsV0FERixFQUVFWixPQUZGLEVBR1E7RUFDTixNQUFNNUgsUUFBUSxHQUFHN0Qsa0JBQWtCLENBQUNxTSxXQUFELEVBQWNaLE9BQU8sQ0FBQ3hHLEdBQXRCLENBQW5DO0VBQ0E1RixFQUFFLENBQUM2RixhQUFILENBQWtCLEdBQUVyQixRQUFTLE9BQTdCLEVBQXFDYyxJQUFJLENBQUNRLFNBQUwsQ0FBZXNHLE9BQWYsRUFBd0IsSUFBeEIsRUFBOEIsQ0FBOUIsQ0FBckMsRUFBdUU7SUFDckVoSyxRQUFRLEVBQUU7RUFEMkQsQ0FBdkU7QUFHRDtBQUVEOzs7QUFDQSxJQUFJRCxPQUFPLENBQUM4SyxJQUFSLENBQWEsQ0FBYixFQUFnQjFHLFFBQWhCLENBQXlCLG9CQUF6QixDQUFKLEVBQW9EO0VBQ2xELE1BQU16RCxPQUFPLEdBQUcvQyxlQUFlLENBQUNtQixrQkFBRCxDQUEvQjs7RUFFQSxJQUFJMkIsY0FBYyxDQUFDQyxPQUFELENBQWxCLEVBQTZCO0lBQzNCWCxPQUFPLENBQUMrSyxJQUFSLENBQWEsQ0FBYjtFQUNELENBRkQsTUFFTztJQUNML0ssT0FBTyxDQUFDK0ssSUFBUixDQUFhLENBQWI7RUFDRDtBQUNGIn0=
|
|
601
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImRhdGFzZXRzIiwiRGF0YXNldFN0cnVjdHVyZSIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsInBhdGhGcm9tRG9jdW1lbnRVaWQiLCJwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicGF0aEZyb21TY3J1dGluVWlkIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiU3RyaW5nIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIm11bHRpcGxlIiwiTnVtYmVyIiwiZGVmYXVsdE9wdGlvbiIsImNvbW1pdEFuZFB1c2giLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwicmVtb3RlcyIsImVycm9yIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJjaGlsZFByb2Nlc3MiLCJzdGRlcnIiLCJ0ZXN0Iiwic3Rkb3V0IiwiY29uc29sZSIsIm91dHB1dCIsInJlbW90ZSIsInJlb3JnYW5pemVEYXRhIiwib3B0aW9ucyIsImRhdGFEaXIiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwidmFsaWRhdGVSYXdEYXRhIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwibm90U3RyaWN0RXF1YWwiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiY2hvb3NlbkRhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJlbmFibGVkTGVnaXNsYXR1cmVzIiwidG9TdHJpbmciLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJmaWx0ZXIiLCJkYXRhc2V0IiwiaW5jbHVkZXMiLCJBY3RldXJzRXRPcmdhbmVzIiwiYWN0ZXVyc0V0T3JnYW5lcyIsIm9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgiLCJqb2luIiwiZmlsZW5hbWUiLCJzaWxlbnQiLCJsb2ciLCJiYXNlbmFtZSIsImRhdGFzZXRSZW9yZ2FuaXplZERpciIsImVuc3VyZURpclN5bmMiLCJyZWFkZGlyU3luYyIsInJlbW92ZVN5bmMiLCJhY3RldXJzUmVvcmdhbml6ZWREaXIiLCJta2RpclN5bmMiLCJvcmdhbmVzUmVvcmdhbml6ZWREaXIiLCJzdHJ1Y3R1cmUiLCJTaW5nbGVGaWxlIiwib3JpZ2luYWxKc29uIiwicmVhZEZpbGVTeW5jIiwib3JpZ2luYWxEYXRhIiwidG9BY3RldXJzRXRPcmdhbmVzIiwiSlNPTiIsInBhcnNlIiwiYWN0ZXVyIiwiZXhwb3J0IiwiYWN0ZXVycyIsInJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwidWlkIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsIm9yZ2FuZSIsIm9yZ2FuZXMiLCJTZWdtZW50ZWRGaWxlcyIsImRlcG9ydHNCeUFjdGV1clVpZCIsImV4aXN0c1N5bmMiLCJkZXBvcnRTcGxpdFBhdGgiLCJkZXBvcnRGaWxlbmFtZSIsImxlbmd0aCIsImVuZHNXaXRoIiwiZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCIsInZlcmJvc2UiLCJkZXBvcnRPcmlnaW5hbEpzb24iLCJkZXBvcnRPcmlnaW5hbCIsInRvRGVwb3J0IiwiZGVwb3J0IiwiZGVwb3J0cyIsImFjdGV1clJlZiIsInB1c2giLCJ2YWx1ZXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwibWFuZGF0c0J5QWN0ZXVyVWlkIiwibWFuZGF0U3BsaXRQYXRoIiwibWFuZGF0RmlsZW5hbWUiLCJtYW5kYXRPcmlnaW5hbEZpbGVQYXRoIiwibWFuZGF0T3JpZ2luYWxKc29uIiwibWFuZGF0T3JpZ2luYWwiLCJ0b01hbmRhdFdyYXBwZXIiLCJtYW5kYXQiLCJtYW5kYXRzIiwiYWN0ZXVyU3BsaXRQYXRoIiwiYWN0ZXVyRmlsZW5hbWUiLCJhY3RldXJPcmlnaW5hbEZpbGVQYXRoIiwiYWN0ZXVyT3JpZ2luYWxKc29uIiwiYWN0ZXVyT3JpZ2luYWwiLCJ0b0FjdGV1ciIsImFjdGV1clVpZCIsInN0cmljdEVxdWFsIiwiYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJvcmdhbmVTcGxpdFBhdGgiLCJvcmdhbmVGaWxlbmFtZSIsIm9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgiLCJvcmdhbmVPcmlnaW5hbEpzb24iLCJvcmdhbmVPcmlnaW5hbCIsInRvT3JnYW5lIiwib3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJBZ2VuZGFzIiwiYWdlbmRhcyIsInRvQWdlbmRhcyIsInJldW5pb24iLCJyZXVuaW9ucyIsIndyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbiIsInJldW5pb25TcGxpdFBhdGgiLCJyZXVuaW9uRmlsZW5hbWUiLCJyZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCIsInJldW5pb25PcmlnaW5hbEpzb24iLCJyZXVuaW9uT3JpZ2luYWwiLCJ0b1JldW5pb24iLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwidG9BbWVuZGVtZW50cyIsInRleHRlTGVnaXNsYXRpZiIsInRleHRlc0V0QW1lbmRlbWVudHMiLCJ0ZXh0ZWxlZyIsImFtZW5kZW1lbnQiLCJ3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24iLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGgiLCJhbWVuZGVtZW50T3JpZ2luYWxKc29uIiwiYW1lbmRlbWVudE9yaWdpbmFsIiwidG9BbWVuZGVtZW50V3JhcHBlciIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnRzRGlyIiwiZG9zc2llcnNEaXIiLCJ0b0Rvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudCIsInRleHRlc0xlZ2lzbGF0aWZzIiwid3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llciIsIndyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24iLCJkb2N1bWVudFNwbGl0UGF0aCIsImRvY3VtZW50RmlsZW5hbWUiLCJkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGgiLCJkb2N1bWVudE9yaWdpbmFsSnNvbiIsImRvY3VtZW50T3JpZ2luYWwiLCJ0b0RvY3VtZW50IiwiZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsIlNjcnV0aW5zIiwic2NydXRpbnMiLCJ0b1NjcnV0aW5zIiwic2NydXRpbiIsIndyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbiIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCIsInNjcnV0aW5PcmlnaW5hbEpzb24iLCJzY3J1dGluT3JpZ2luYWwiLCJ0b1NjcnV0aW5XcmFwcGVyIiwidWlkVGV4dGVMZWdpc2xhdGlmIiwidGV4dGVMZWdpc2xhdGlmUmVmIiwidGV4dGVMZWdpc2xhdGlmRGlyIiwicmV1bmlvbnNEaXIiLCJzY3J1dGluc0RpciIsImFyZ3YiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmVvcmdhbml6ZV9kYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBDaGlsZFByb2Nlc3MsIGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCB7IGRhdGFzZXRzLCBEYXRhc2V0U3RydWN0dXJlLCBFbmFibGVkRGF0YXNldHMgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZXhpc3RpbmdEYXRlVG9Kc29uLCBwYXRjaGVkRGF0ZVRvSnNvbiB9IGZyb20gXCIuLi9kYXRlc1wiXG5pbXBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQge1xuICBwYXRoRnJvbURvY3VtZW50VWlkLFxuICBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkLFxuICBwYXRoRnJvbVJldW5pb25VaWQsXG4gIHBhdGhGcm9tU2NydXRpblVpZCxcbn0gZnJvbSBcIi4uL2xvYWRlcnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWdlbmRhc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FnZW5kYXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBbWVuZGVtZW50c1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9zY3J1dGluc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcIkNcIixcbiAgICBoZWxwOiBcImNsb25lIHJlcG9zaXRvcmllcyBmcm9tIGdpdmVuIGdyb3VwIChvciBvcmdhbml6YXRpb24pIGdpdCBVUkxcIixcbiAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiY1wiLFxuICAgIGhlbHA6IFwiY29tbWl0IHNwbGl0IGZpbGVzXCIsXG4gICAgbmFtZTogXCJjb21taXRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwia1wiLFxuICAgIGRlZmF1bHRWYWx1ZTogW1wiQWxsXCJdLFxuICAgIGhlbHA6IFwiY2F0ZWdvcmllcyBvZiBkYXRhc2V0cyB0byByZW9yZ2FuaXplXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJjYXRlZ29yaWVzXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwibFwiLFxuICAgIGhlbHA6IFwibGVnaXNsYXR1cmVzIG9mIGNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmV0cmlldmVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcImxlZ2lzbGF0dXJlXCIsXG4gICAgdHlwZTogTnVtYmVyLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiclwiLFxuICAgIGhlbHA6IFwicHVzaCBjb21taXQgdG8gZ2l2ZW4gcmVtb3RlXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJzXCIsXG4gICAgaGVscDogXCJkb24ndCBsb2cgYW55dGhpbmdcIixcbiAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJWXCIsXG4gICAgaGVscDogXCJkb24ndCB2YWxpZGF0ZSByYXcgZGF0YVwiLFxuICAgIG5hbWU6IFwibm8tdmFsaWRhdGUtcmF3XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInZcIixcbiAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2goXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgY29tbWl0OiBib29sZWFuLFxuICByZW1vdGVzPzogc3RyaW5nW10sXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKGNvbW1pdCkge1xuICAgIGV4ZWNTeW5jKGBnaXQgYWRkIC5gLCB7XG4gICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCdnaXQgY29tbWl0IC1tIFwiTm91dmVsbGUgbW9pc3NvblwiJywge1xuICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgaWYgKFxuICAgICAgICAoY2hpbGRQcm9jZXNzIGFzIENoaWxkUHJvY2Vzcykuc3RkZXJyID09PSBudWxsIHx8XG4gICAgICAgICEvbm90aGluZyB0byBjb21taXQvLnRlc3QoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLnN0ZG91dClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIHRocm93IGNoaWxkUHJvY2Vzc1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gcmVvcmdhbml6ZURhdGEob3B0aW9uczogYW55KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCB2YWxpZGF0ZVJhd0RhdGEgPSAhb3B0aW9uc1tcIm5vLXZhbGlkYXRlLXJhd1wiXVxuXG4gIG9wdGlvbnMuY2F0ZWdvcmllcy5tYXAoKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBVbmtub3duIG5hbWUgb2YgZGF0YXNldDogJHtkYXRhc2V0TmFtZX1gLFxuICAgICksXG4gIClcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gb3B0aW9ucy5jYXRlZ29yaWVzLnJlZHVjZShcbiAgICAoZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsIGRhdGFzZXROYW1lOiBzdHJpbmcpOiBFbmFibGVkRGF0YXNldHMgPT5cbiAgICAgIGVuYWJsZWREYXRhc2V0cyB8XG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgIEVuYWJsZWREYXRhc2V0cy5Ob25lLFxuICApXG5cbiAgbGV0IGNob29zZW5EYXRhc2V0cyA9IGRhdGFzZXRzXG4gIGlmKG9wdGlvbnMubGVnaXNsYXR1cmUpIHtcbiAgICBjb25zdCBlbmFibGVkTGVnaXNsYXR1cmVzID0gb3B0aW9ucy5sZWdpc2xhdHVyZS5tYXAoKGxlZ2lzbGF0dXJlOiBudW1iZXIpID0+IGxlZ2lzbGF0dXJlLnRvU3RyaW5nKCkpXG4gICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNob29zZW5EYXRhc2V0cykpIHtcbiAgICAgIGNob29zZW5EYXRhc2V0c1trZXkgYXMga2V5b2YgdHlwZW9mIGNob29zZW5EYXRhc2V0c10gPSB2YWx1ZS5maWx0ZXIoKGRhdGFzZXQ6IHsgbGVnaXNsYXR1cmU6IGFueSB9KSA9PiBlbmFibGVkTGVnaXNsYXR1cmVzLmluY2x1ZGVzKGRhdGFzZXQubGVnaXNsYXR1cmUpKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJhY3RldXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoYWN0ZXVyc1Jlb3JnYW5pemVkRGlyKVxuICAgICAgY29uc3Qgb3JnYW5lc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJvcmdhbmVzXCIpXG4gICAgICBmcy5ta2RpclN5bmMob3JnYW5lc1Jlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cnNFdE9yZ2FuZXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGV1ciBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LmFjdGV1cnMuYWN0ZXVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGFjdGV1ci51aWRbXCIjdGV4dFwiXSArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC5vcmdhbmVzLm9yZ2FuZSkge1xuICAgICAgICAgICAgICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGVwb3J0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJkZXBvcnRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wiZGVwb3J0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgZGVwb3J0U3BsaXRQYXRoW2RlcG9ydFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghZGVwb3J0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5kZXBvcnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwiZGVwb3J0XCIgZmlsZTogJHtkZXBvcnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0RlcG9ydChkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZGVwb3J0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydCA9IGRlcG9ydE9yaWdpbmFsLmRlcG9ydFxuICAgICAgICAgICAgICAgIGxldCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdXG4gICAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFtkZXBvcnQuYWN0ZXVyUmVmXSA9IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlcG9ydHMucHVzaChkZXBvcnQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydHMgb2YgT2JqZWN0LnZhbHVlcyhkZXBvcnRzQnlBY3RldXJVaWQpKSB7XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICAgICAgICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFuZGF0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJtYW5kYXRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wibWFuZGF0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgbWFuZGF0U3BsaXRQYXRoW21hbmRhdFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghbWFuZGF0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5tYW5kYXRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwibWFuZGF0XCIgZmlsZTogJHttYW5kYXRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b01hbmRhdFdyYXBwZXIobWFuZGF0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG1hbmRhdE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXQgPSBtYW5kYXRPcmlnaW5hbC5tYW5kYXRcbiAgICAgICAgICAgICAgICBsZXQgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChtYW5kYXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYW5kYXRzLnB1c2gobWFuZGF0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRzIG9mIE9iamVjdC52YWx1ZXMobWFuZGF0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIG1hbmRhdHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImFjdGV1clwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyRmlsZW5hbWUgPSBhY3RldXJTcGxpdFBhdGhbYWN0ZXVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYWN0ZXVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhY3RldXJcIiBmaWxlOiAke2FjdGV1ck9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cihhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyID0gYWN0ZXVyT3JpZ2luYWwuYWN0ZXVyXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clVpZCA9IGFjdGV1ci51aWRbXCIjdGV4dFwiXVxuICAgICAgICAgICAgICBjb25zdCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIuZGVwb3J0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5kZXBvcnRzID0geyBkZXBvcnQ6IGRlcG9ydHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAobWFuZGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5tYW5kYXRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLm1hbmRhdHMgPSB7IG1hbmRhdDogbWFuZGF0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyVWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJvcmdhbmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwib3JnYW5lXCIgZmlsZTogJHtvcmdhbmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9PcmdhbmUob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZSA9IG9yZ2FuZU9yaWdpbmFsLm9yZ2FuZVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2goZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob29zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFnZW5kYXNSYXdDb252ZXJ0LnRvQWdlbmRhcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvbiBvZiBvcmlnaW5hbERhdGEucmV1bmlvbnMucmV1bmlvbikge1xuICAgICAgICAgICAgICB3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCByZXVuaW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXVuaW9uU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcInJldW5pb25cIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgcmV1bmlvblNwbGl0UGF0aFtyZXVuaW9uU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghcmV1bmlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4ucmV1bmlvblNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJyZXVuaW9uXCIgZmlsZTogJHtyZXVuaW9uT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmV1bmlvbk9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFnZW5kYXNSYXdDb252ZXJ0LnRvUmV1bmlvbihyZXVuaW9uT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShyZXVuaW9uT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uID0gcmV1bmlvbk9yaWdpbmFsLnJldW5pb25cbiAgICAgICAgICAgICAgd3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgcmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvb3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXh0ZUxlZ2lzbGF0aWYgb2Ygb3JpZ2luYWxEYXRhLnRleHRlc0V0QW1lbmRlbWVudHNcbiAgICAgICAgICAgICAgLnRleHRlbGVnKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgICBhbWVuZGVtZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhbWVuZGVtZW50XCIgZmlsZTogJHthbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShhbWVuZGVtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gYW1lbmRlbWVudE9yaWdpbmFsLmFtZW5kZW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgYW1lbmRlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgZG9jdW1lbnRzRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJkb2N1bWVudHNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhkb2N1bWVudHNEaXIpXG4gICAgICBjb25zdCBkb3NzaWVyc0RpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiZG9zc2llcnNcIilcbiAgICAgIGZzLm1rZGlyU3luYyhkb3NzaWVyc0RpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyc0xlZ2lzbGF0aWZzKFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkb2N1bWVudCBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LnRleHRlc0xlZ2lzbGF0aWZzXG4gICAgICAgICAgICAgIC5kb2N1bWVudCkge1xuICAgICAgICAgICAgICB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKGRvY3VtZW50c0RpciwgZG9jdW1lbnQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBkb3NzaWVyUGFybGVtZW50YWlyZSB9IG9mIG9yaWdpbmFsRGF0YS5leHBvcnRcbiAgICAgICAgICAgICAgLmRvc3NpZXJzTGVnaXNsYXRpZnMuZG9zc2llcikge1xuICAgICAgICAgICAgICB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvY3VtZW50XCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb2N1bWVudFNwbGl0UGF0aFtkb2N1bWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiZG9jdW1lbnRcIiBmaWxlOiAke2RvY3VtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9jdW1lbnQoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvY3VtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGRvY3VtZW50T3JpZ2luYWwuZG9jdW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVEb2N1bWVudFJlb3JnYW5pemVkSnNvbihkb2N1bWVudHNEaXIsIGRvY3VtZW50KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiIGZpbGU6ICR7ZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShcbiAgICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbC5kb3NzaWVyUGFybGVtZW50YWlyZVxuICAgICAgICAgICAgICB3cml0ZURvc3NpZXJQYXJsZW1lbnRhaXJlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMuY29tbWl0LCBvcHRpb25zLnJlbW90ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChsZXQgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbnMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygb3JpZ2luYWxEYXRhLnNjcnV0aW5zLnNjcnV0aW4pIHtcbiAgICAgICAgICAgICAgd3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgc2NydXRpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwic2NydXRpblwiIGZpbGU6ICR7c2NydXRpbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBTY3J1dGluc1Jhd0NvbnZlcnQudG9TY3J1dGluV3JhcHBlcihzY3J1dGluT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShzY3J1dGluT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluID0gc2NydXRpbk9yaWdpbmFsLnNjcnV0aW5cbiAgICAgICAgICAgICAgd3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgc2NydXRpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc3RvcmUgc3RhbmRhcmQgY29udmVyc2lvbiBvZiBkYXRlcyB0byBKU09OLlxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBleGlzdGluZ0RhdGVUb0pzb25cblxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKFxuICBkYXRhc2V0UmVvcmdhbml6ZWREaXI6IHN0cmluZyxcbiAgYW1lbmRlbWVudDoge1xuICAgIHVpZDogc3RyaW5nXG4gICAgdGV4dGVMZWdpc2xhdGlmUmVmOiBzdHJpbmdcbiAgfSxcbik6IHZvaWQge1xuICBjb25zdCB1aWRUZXh0ZUxlZ2lzbGF0aWYgPSBhbWVuZGVtZW50LnRleHRlTGVnaXNsYXRpZlJlZlxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwodWlkVGV4dGVMZWdpc2xhdGlmLCB1bmRlZmluZWQpXG4gIGNvbnN0IHRleHRlTGVnaXNsYXRpZkRpciA9IHBhdGguam9pbihcbiAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgdWlkVGV4dGVMZWdpc2xhdGlmLFxuICApXG4gIGZzLmVuc3VyZURpclN5bmModGV4dGVMZWdpc2xhdGlmRGlyKVxuICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICB0ZXh0ZUxlZ2lzbGF0aWZEaXIsXG4gICAgYW1lbmRlbWVudC51aWQgKyBcIi5qc29uXCIsXG4gIClcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50LCBudWxsLCAyKSxcbiAgICB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSxcbiAgKVxufVxuXG5mdW5jdGlvbiB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKFxuICBkb2N1bWVudHNEaXI6IHN0cmluZyxcbiAgZG9jdW1lbnQ6IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tRG9jdW1lbnRVaWQoZG9jdW1lbnRzRGlyLCBkb2N1bWVudC51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShkb2N1bWVudCwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24oXG4gIGRvc3NpZXJzRGlyOiBzdHJpbmcsXG4gIGRvc3NpZXJQYXJsZW1lbnRhaXJlOiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkKFxuICAgIGRvc3NpZXJzRGlyLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLnVpZCxcbiAgKVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIGAke2Jhc2VuYW1lfS5qc29uYCxcbiAgICBKU09OLnN0cmluZ2lmeShkb3NzaWVyUGFybGVtZW50YWlyZSwgbnVsbCwgMiksXG4gICAge1xuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgIH0sXG4gIClcbn1cblxuZnVuY3Rpb24gd3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uKFxuICByZXVuaW9uc0Rpcjogc3RyaW5nLFxuICByZXVuaW9uOiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbVJldW5pb25VaWQocmV1bmlvbnNEaXIsIHJldW5pb24udWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkocmV1bmlvbiwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihcbiAgc2NydXRpbnNEaXI6IHN0cmluZyxcbiAgc2NydXRpbjogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21TY3J1dGluVWlkKHNjcnV0aW5zRGlyLCBzY3J1dGluLnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KHNjcnV0aW4sIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJyZW9yZ2FuaXplX2RhdGEudHNcIikpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbiAgaWYgKHJlb3JnYW5pemVEYXRhKG9wdGlvbnMpKSB7XG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5leGl0KDApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBdUJDLFFBQVEsUUFBUSxlQUFlO0FBQ3RELE9BQU9DLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsT0FBT0MsRUFBRSxNQUFNLFVBQVU7QUFDekIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFBQSxTQUVkQyxRQUFRLEVBQUVDLGdCQUFnQixFQUFFQyxlQUFlO0FBQUEsU0FDM0NDLGtCQUFrQixFQUFFQyxpQkFBaUI7QUFBQSxTQUNyQ0MsT0FBTztBQUFBLFNBRWRDLG1CQUFtQixFQUNuQkMsK0JBQStCLEVBQy9CQyxrQkFBa0IsRUFDbEJDLGtCQUFrQjtBQUFBLFNBRVhDLE9BQU8sSUFBSUMsMEJBQTBCO0FBQUEsU0FDckNELE9BQU8sSUFBSUUsaUJBQWlCO0FBQUEsU0FDNUJGLE9BQU8sSUFBSUcscUJBQXFCO0FBQUEsU0FDaENILE9BQU8sSUFB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
|