@speleotica/frcsdata 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FrcsPlotFile.js +5 -1
- package/FrcsPlotShot.js +5 -1
- package/FrcsShot.js +4 -5
- package/FrcsSurveyFile.js +5 -1
- package/FrcsTrip.js +5 -1
- package/FrcsTripSummary.js +5 -1
- package/FrcsTripSummaryFile.js +5 -1
- package/es/FrcsPlotFile.js +5 -1
- package/es/FrcsPlotShot.js +5 -1
- package/es/FrcsShot.js +5 -6
- package/es/FrcsSurveyFile.js +5 -1
- package/es/FrcsTrip.js +5 -1
- package/es/FrcsTripSummary.js +5 -1
- package/es/FrcsTripSummaryFile.js +5 -1
- package/es/formatFrcsShot.js +5 -19
- package/es/formatFrcsShot.spec.js +8 -17
- package/es/index.js +21 -33
- package/es/node/index.js +2 -10
- package/es/node/parseFrcsPlotFile.spec.js +1 -5
- package/es/node/parseFrcsSurveyFile.spec.js +2 -6
- package/es/node/parseFrcsTripSummaryFile.spec.js +1 -5
- package/es/parseFrcsPlotFile.js +1 -26
- package/es/parseFrcsSurveyFile.js +45 -95
- package/es/parseFrcsTripSummaryFile.js +1 -12
- package/es/string/index.js +2 -9
- package/es/string/parseFrcsPlotFile.spec.js +1 -5
- package/es/string/parseFrcsSurveyFile.spec.js +8 -14
- package/formatFrcsShot.js +5 -19
- package/formatFrcsShot.spec.js +4 -15
- package/index.js +20 -32
- package/node/index.js +1 -9
- package/node/parseFrcsPlotFile.spec.js +165 -180
- package/node/parseFrcsSurveyFile.spec.js +306 -321
- package/node/parseFrcsTripSummaryFile.spec.js +83 -106
- package/package.json +15 -15
- package/parseFrcsPlotFile.js +224 -318
- package/parseFrcsSurveyFile.js +411 -452
- package/parseFrcsTripSummaryFile.js +102 -142
- package/string/index.js +10 -27
- package/string/parseFrcsPlotFile.spec.js +165 -180
- package/string/parseFrcsSurveyFile.spec.js +598 -689
- package/yarn.lock +1285 -702
|
@@ -4,106 +4,86 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = parseFrcsSurveyFile;
|
|
7
|
-
|
|
8
7
|
var _parseSegment = require("parse-segment");
|
|
9
|
-
|
|
10
8
|
var _unitized = require("@speleotica/unitized");
|
|
11
|
-
|
|
12
9
|
var _FrcsShot = require("./FrcsShot");
|
|
13
|
-
|
|
14
10
|
function parseNumber(s, unit) {
|
|
15
11
|
const value = parseFloat(s);
|
|
16
12
|
if (isNaN(value)) return null;
|
|
17
13
|
return new _unitized.UnitizedNumber(value, unit);
|
|
18
14
|
}
|
|
19
|
-
|
|
20
15
|
function parseAzimuth(s, unit) {
|
|
21
16
|
const parsed = parseNumber(s, unit);
|
|
22
17
|
return (parsed === null || parsed === void 0 ? void 0 : parsed.get(_unitized.Angle.degrees)) === 360 ? _unitized.Unitize.degrees(0) : parsed;
|
|
23
18
|
}
|
|
24
|
-
|
|
25
19
|
function parseKind(kind) {
|
|
26
20
|
switch (kind) {
|
|
27
21
|
case 'H':
|
|
28
22
|
return _FrcsShot.FrcsShotKind.Horizontal;
|
|
29
|
-
|
|
30
23
|
case 'D':
|
|
31
24
|
return _FrcsShot.FrcsShotKind.Diagonal;
|
|
32
|
-
|
|
33
25
|
default:
|
|
34
26
|
return _FrcsShot.FrcsShotKind.Normal;
|
|
35
27
|
}
|
|
36
28
|
}
|
|
37
|
-
|
|
38
29
|
function parseLengthUnit(unit) {
|
|
39
30
|
switch (unit) {
|
|
40
31
|
case 'FI':
|
|
41
32
|
return _unitized.Length.inches;
|
|
42
|
-
|
|
33
|
+
case 'FF':
|
|
43
34
|
case 'FT':
|
|
44
35
|
return _unitized.Length.feet;
|
|
45
|
-
|
|
36
|
+
case 'MT':
|
|
46
37
|
case 'M ':
|
|
47
38
|
return _unitized.Length.meters;
|
|
48
39
|
}
|
|
49
|
-
|
|
50
40
|
return null;
|
|
51
41
|
}
|
|
52
|
-
|
|
53
42
|
function parseAngleUnit(unit) {
|
|
54
43
|
switch (unit) {
|
|
55
44
|
case 'D':
|
|
56
45
|
return _unitized.Angle.degrees;
|
|
57
|
-
|
|
58
46
|
case 'G':
|
|
59
47
|
return _unitized.Angle.gradians;
|
|
60
|
-
|
|
61
48
|
case 'M':
|
|
62
49
|
return _unitized.Angle.milsNATO;
|
|
63
50
|
}
|
|
64
|
-
|
|
65
51
|
return null;
|
|
66
|
-
}
|
|
67
|
-
|
|
52
|
+
}
|
|
68
53
|
|
|
54
|
+
// determines if a cell contains a valid station name.
|
|
69
55
|
function isValidStation(s) {
|
|
70
56
|
return /^\s*\S+\s*$/.test(s);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
57
|
+
}
|
|
58
|
+
// determines if a cell contains a valid unsigned integer.
|
|
74
59
|
function isValidUInt(s) {
|
|
75
60
|
return /^\s*[0-9]+\s*$/.test(s);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
61
|
+
}
|
|
62
|
+
// determines if a cell contains a valid float.
|
|
79
63
|
function isValidFloat(s) {
|
|
80
64
|
return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
65
|
+
}
|
|
66
|
+
// determines if a cell contains a valid unsigned float or whitespace.
|
|
84
67
|
function isValidOptFloat(s) {
|
|
85
68
|
return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
69
|
+
}
|
|
70
|
+
// determines if a cell contains a valid unsigned float or whitespace.
|
|
89
71
|
function isValidOptUFloat(s) {
|
|
90
72
|
return /^\s*[0-9]*(\.[0-9]*)?\s*$/.test(s);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
73
|
+
}
|
|
74
|
+
// determines if a cell contains a valid unsigned float.
|
|
94
75
|
function isValidUFloat(s) {
|
|
95
76
|
return /^\s*([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
77
|
+
}
|
|
78
|
+
// determines if a cell contains a valid inclination or whitespace.
|
|
99
79
|
function isValidOptInclination(s) {
|
|
100
80
|
return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
|
|
101
81
|
}
|
|
102
|
-
|
|
103
82
|
function parseLrud(s, unit) {
|
|
104
83
|
const value = parseFloat(s);
|
|
105
84
|
return !Number.isFinite(value) || value < 0 ? null : new _unitized.UnitizedNumber(value, unit);
|
|
106
85
|
}
|
|
86
|
+
|
|
107
87
|
/**
|
|
108
88
|
* Parses a raw cdata.fr survey file. These look like so:
|
|
109
89
|
*
|
|
@@ -149,9 +129,8 @@ FI B DD
|
|
|
149
129
|
...</pre>
|
|
150
130
|
*
|
|
151
131
|
*/
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
async function parseFrcsSurveyFile(file, // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
132
|
+
async function parseFrcsSurveyFile(file,
|
|
133
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
155
134
|
lines) {
|
|
156
135
|
let cave = null;
|
|
157
136
|
let location = null;
|
|
@@ -168,20 +147,16 @@ lines) {
|
|
|
168
147
|
let trip = null;
|
|
169
148
|
let inBlockComment = false;
|
|
170
149
|
let section;
|
|
171
|
-
|
|
172
150
|
function getComment() {
|
|
173
151
|
if (!commentLines) return null;
|
|
174
152
|
const comment = commentLines.join('\n').trim();
|
|
175
153
|
commentLines = null;
|
|
176
154
|
return comment || null;
|
|
177
155
|
}
|
|
178
|
-
|
|
179
156
|
let lineNumber = 0;
|
|
180
|
-
|
|
181
157
|
for await (const line of lines) {
|
|
182
158
|
let errored = false;
|
|
183
159
|
const thisLineNumber = lineNumber;
|
|
184
|
-
|
|
185
160
|
const error = (message, startColumn, endColumn) => {
|
|
186
161
|
errored = true;
|
|
187
162
|
errors.push(new _parseSegment.SegmentParseError(message, new _parseSegment.Segment({
|
|
@@ -191,34 +166,25 @@ lines) {
|
|
|
191
166
|
startCol: 0
|
|
192
167
|
}).substring(startColumn, endColumn)));
|
|
193
168
|
};
|
|
194
|
-
|
|
195
169
|
const validate = (startColumn, endColumn, fieldName, validator) => {
|
|
196
170
|
const field = line.substring(startColumn, endColumn);
|
|
197
|
-
|
|
198
171
|
if (!validator(field)) {
|
|
199
172
|
error((field.trim() ? 'Invalid ' : 'Missing ') + fieldName, startColumn, endColumn);
|
|
200
173
|
}
|
|
201
|
-
|
|
202
174
|
return field;
|
|
203
175
|
};
|
|
204
|
-
|
|
205
176
|
lineNumber++;
|
|
206
|
-
|
|
207
177
|
if (lineNumber === 1) {
|
|
208
178
|
const match = /^\s*([^,]+)(,(.*))?/.exec(line);
|
|
209
|
-
|
|
210
179
|
if (match) {
|
|
211
180
|
cave = match[1].trim();
|
|
212
|
-
|
|
213
181
|
if (match[3]) {
|
|
214
182
|
location = match[3].trim();
|
|
215
183
|
}
|
|
216
184
|
}
|
|
217
185
|
}
|
|
218
|
-
|
|
219
186
|
if (line.charAt(0) === ' ' && line.charAt(1) === '*') {
|
|
220
187
|
inTripComment = !inTripComment;
|
|
221
|
-
|
|
222
188
|
if (inTripComment) {
|
|
223
189
|
section = undefined;
|
|
224
190
|
tripComment = [];
|
|
@@ -231,7 +197,6 @@ lines) {
|
|
|
231
197
|
tripName = line && line.trim();
|
|
232
198
|
} else if (lineNumber === tripCommentStartLine + 2) {
|
|
233
199
|
const match = /^(.+?)\s*[-.]\s*(\d+)\/(\d+)\/(\d+)$/.exec(line && line.trim());
|
|
234
|
-
|
|
235
200
|
if (match) {
|
|
236
201
|
let k = 1;
|
|
237
202
|
const team = match[k++];
|
|
@@ -244,9 +209,7 @@ lines) {
|
|
|
244
209
|
} else if (lineNumber > 1) {
|
|
245
210
|
tripComment.push(line);
|
|
246
211
|
}
|
|
247
|
-
|
|
248
212
|
const match = /^\*\*\*([^*])\*\*\*/.exec(line);
|
|
249
|
-
|
|
250
213
|
if (match) {
|
|
251
214
|
section = match[1].trim();
|
|
252
215
|
}
|
|
@@ -262,39 +225,30 @@ lines) {
|
|
|
262
225
|
// FT CC DD
|
|
263
226
|
// 01234567
|
|
264
227
|
let distanceUnit = parseLengthUnit(line.slice(0, 2));
|
|
265
|
-
|
|
266
228
|
if (!distanceUnit) {
|
|
267
229
|
distanceUnit = _unitized.Length.feet;
|
|
268
230
|
error('Invalid distance unit', 0, 2);
|
|
269
231
|
}
|
|
270
|
-
|
|
271
232
|
let azimuthUnit = parseAngleUnit(line[6]);
|
|
272
|
-
|
|
273
233
|
if (!azimuthUnit) {
|
|
274
234
|
azimuthUnit = _unitized.Angle.degrees;
|
|
275
235
|
error('Invalid azimuth unit', 6, 7);
|
|
276
236
|
}
|
|
277
|
-
|
|
278
237
|
let inclinationUnit = parseAngleUnit(line[7]);
|
|
279
|
-
|
|
280
238
|
if (!inclinationUnit) {
|
|
281
239
|
inclinationUnit = _unitized.Angle.degrees;
|
|
282
240
|
error('Invalid inclination unit', 7, 8);
|
|
283
241
|
}
|
|
284
|
-
|
|
285
242
|
const backsightAzimuthCorrected = line[3] === 'C';
|
|
286
243
|
const backsightInclinationCorrected = line[4] === 'C';
|
|
287
244
|
const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-';
|
|
288
245
|
const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-';
|
|
289
|
-
|
|
290
246
|
if (!/[-CB ]/.test(line[3])) {
|
|
291
247
|
error('Invalid backsight azimuth type', 3, 4);
|
|
292
248
|
}
|
|
293
|
-
|
|
294
249
|
if (!/[-CB ]/.test(line[4])) {
|
|
295
250
|
error('Invalid backsight inclination type', 4, 5);
|
|
296
251
|
}
|
|
297
|
-
|
|
298
252
|
trip = {
|
|
299
253
|
header: {
|
|
300
254
|
name: tripName || '',
|
|
@@ -325,16 +279,19 @@ lines) {
|
|
|
325
279
|
distanceUnit
|
|
326
280
|
} = trip.header;
|
|
327
281
|
const inches = distanceUnit === _unitized.Length.inches;
|
|
328
|
-
if (inches) distanceUnit = _unitized.Length.feet;
|
|
282
|
+
if (inches) distanceUnit = _unitized.Length.feet;
|
|
283
|
+
|
|
284
|
+
// rigorously check the values in all the columns to make sure this
|
|
329
285
|
// is really a survey shot line, just in case any stray comments are
|
|
330
286
|
// not properly delimited.
|
|
331
|
-
// from station name
|
|
332
287
|
|
|
288
|
+
// from station name
|
|
333
289
|
if (!/\S/.test(line.substring(5, 10))) continue;
|
|
334
|
-
const fromStr = validate(5, 10, 'from station', isValidStation);
|
|
290
|
+
const fromStr = validate(5, 10, 'from station', isValidStation);
|
|
291
|
+
|
|
292
|
+
// Sadly I have found negative LRUD values in Chip's format and apparently
|
|
335
293
|
// his program doesn't fail on them, so I have to accept them here
|
|
336
294
|
// isValidOptFloat instead of isValidOptUFloat
|
|
337
|
-
|
|
338
295
|
const lStr = validate(40, 43, 'left', isValidOptFloat);
|
|
339
296
|
const rStr = validate(43, 46, 'right', isValidOptFloat);
|
|
340
297
|
const uStr = validate(46, 49, 'up', isValidOptFloat);
|
|
@@ -343,10 +300,10 @@ lines) {
|
|
|
343
300
|
const up = parseLrud(uStr, distanceUnit);
|
|
344
301
|
const down = parseLrud(dStr, distanceUnit);
|
|
345
302
|
const left = parseLrud(lStr, distanceUnit);
|
|
346
|
-
const right = parseLrud(rStr, distanceUnit);
|
|
303
|
+
const right = parseLrud(rStr, distanceUnit);
|
|
347
304
|
|
|
305
|
+
// to station name
|
|
348
306
|
const toStr = line.substring(0, 5);
|
|
349
|
-
|
|
350
307
|
if (!toStr.trim()) {
|
|
351
308
|
const shot = {
|
|
352
309
|
from: fromStr.trim(),
|
|
@@ -369,14 +326,11 @@ lines) {
|
|
|
369
326
|
shots.push(shot);
|
|
370
327
|
continue;
|
|
371
328
|
}
|
|
372
|
-
|
|
373
329
|
if (!isValidStation(toStr)) {
|
|
374
330
|
error('Invalid station name', 0, 5);
|
|
375
331
|
}
|
|
376
|
-
|
|
377
332
|
const fromLrudMatch = new RegExp(`^\\s+${fromStr.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}((\\s+(\\d+(\\.\\d*)?|\\.\\d+)){4})`).exec(line.substring(52));
|
|
378
333
|
let fromLruds;
|
|
379
|
-
|
|
380
334
|
if (fromLrudMatch) {
|
|
381
335
|
const [left, right, up, down] = fromLrudMatch[1].trim().split(/\s+/g).map(s => parseLrud(s, distanceUnit));
|
|
382
336
|
fromLruds = {
|
|
@@ -385,9 +339,9 @@ lines) {
|
|
|
385
339
|
up,
|
|
386
340
|
down
|
|
387
341
|
};
|
|
388
|
-
}
|
|
389
|
-
|
|
342
|
+
}
|
|
390
343
|
|
|
344
|
+
// azimuth and inclination
|
|
391
345
|
const azmFsStr = validate(19, 25, 'azimuth', isValidOptUFloat);
|
|
392
346
|
const azmBsStr = validate(25, 30, 'azimuth', isValidOptUFloat);
|
|
393
347
|
const incFsStr = line.substring(30, 35);
|
|
@@ -400,26 +354,27 @@ lines) {
|
|
|
400
354
|
let frontsightInclination;
|
|
401
355
|
let backsightInclination;
|
|
402
356
|
let excludeDistance;
|
|
403
|
-
let isSplay;
|
|
357
|
+
let isSplay;
|
|
404
358
|
|
|
359
|
+
// parse distance
|
|
405
360
|
if (inches) {
|
|
406
361
|
const feetStr = line.substring(10, 14);
|
|
407
|
-
const inchesStr = line.substring(14, 17);
|
|
408
|
-
|
|
362
|
+
const inchesStr = line.substring(14, 17);
|
|
363
|
+
// feet and inches are not both optional
|
|
409
364
|
if (!isValidUInt(feetStr) && !isValidUInt(inchesStr)) {
|
|
410
365
|
const invalid = feetStr.trim() || inchesStr.trim();
|
|
411
366
|
error(invalid ? 'Invalid distance' : 'Missing distance', 10, 17);
|
|
412
367
|
continue;
|
|
413
|
-
}
|
|
414
|
-
// for feet to be omitted as well
|
|
415
|
-
|
|
368
|
+
}
|
|
416
369
|
|
|
370
|
+
// sometimes inches are omitted, hence the || 0...I'm assuming it's possible
|
|
371
|
+
// for feet to be omitted as well
|
|
417
372
|
distance = _unitized.Unitize.inches(parseFloat(inchesStr) || 0).add(_unitized.Unitize.feet(parseFloat(feetStr) || 0));
|
|
418
|
-
kind = parseKind(line[17]);
|
|
373
|
+
kind = parseKind(line[17]);
|
|
374
|
+
// NOTE there are two columns around here that can contain a *.
|
|
419
375
|
// I think they might represent different values, but thisis confused by
|
|
420
376
|
// the fact that for ft/in shots, if there is a D or H flag it occupies the
|
|
421
377
|
// first column that can contain a * for decimal feet shots
|
|
422
|
-
|
|
423
378
|
excludeDistance = line[18] === '*' || line[18] === 's';
|
|
424
379
|
isSplay = line[18] === 's';
|
|
425
380
|
} else {
|
|
@@ -430,15 +385,14 @@ lines) {
|
|
|
430
385
|
excludeDistance = line[17] === '*' || line[17] === 's';
|
|
431
386
|
isSplay = line[17] === 's';
|
|
432
387
|
}
|
|
433
|
-
|
|
434
388
|
if (kind !== _FrcsShot.FrcsShotKind.Normal) {
|
|
435
389
|
validate(30, 35, 'vertical-distance', isValidFloat);
|
|
436
|
-
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// convert horizontal and diagonal shots to standard
|
|
437
393
|
// in this case incFs is the vertical offset between stations
|
|
438
394
|
// fortunately it appears we can always count on incFs being specified
|
|
439
395
|
// and incBs not being specified for these types of shots
|
|
440
|
-
|
|
441
|
-
|
|
442
396
|
if (kind === _FrcsShot.FrcsShotKind.Horizontal) {
|
|
443
397
|
// distance is horizontal offset and incFsStr is vertical offset
|
|
444
398
|
horizontalDistance = distance;
|
|
@@ -457,21 +411,18 @@ lines) {
|
|
|
457
411
|
backsightInclination = null;
|
|
458
412
|
} else {
|
|
459
413
|
// frontsight inclination
|
|
460
|
-
validate(30, 35, 'inclination', isValidOptInclination);
|
|
461
|
-
|
|
414
|
+
validate(30, 35, 'inclination', isValidOptInclination);
|
|
415
|
+
// frontsight inclination
|
|
462
416
|
validate(35, 40, 'inclination', isValidOptInclination);
|
|
463
417
|
frontsightInclination = parseNumber(incFsStr, inclinationUnit);
|
|
464
418
|
backsightInclination = parseNumber(incBsStr, inclinationUnit);
|
|
465
419
|
}
|
|
466
|
-
|
|
467
420
|
if (errored) continue;
|
|
468
421
|
const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit);
|
|
469
422
|
const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit);
|
|
470
|
-
|
|
471
423
|
if (!frontsightInclination && !backsightInclination) {
|
|
472
424
|
frontsightInclination = _unitized.Unitize.degrees(0);
|
|
473
425
|
}
|
|
474
|
-
|
|
475
426
|
const shot = {
|
|
476
427
|
from: fromStr.trim(),
|
|
477
428
|
to: toStr.trim(),
|
|
@@ -497,7 +448,6 @@ lines) {
|
|
|
497
448
|
shots.push(shot);
|
|
498
449
|
}
|
|
499
450
|
}
|
|
500
|
-
|
|
501
451
|
return {
|
|
502
452
|
cave,
|
|
503
453
|
location,
|
|
@@ -505,4 +455,4 @@ lines) {
|
|
|
505
455
|
errors
|
|
506
456
|
};
|
|
507
457
|
}
|
|
508
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUZyY3NTdXJ2ZXlGaWxlLnRzIl0sIm5hbWVzIjpbInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJmcm9tU3RyIiwibFN0ciIsInJTdHIiLCJ1U3RyIiwiZFN0ciIsInVwIiwiZG93biIsImxlZnQiLCJyaWdodCIsInRvU3RyIiwic2hvdCIsImZyb20iLCJ0byIsImRpc3RhbmNlIiwiZnJvbnRzaWdodEF6aW11dGgiLCJiYWNrc2lnaHRBemltdXRoIiwiZnJvbnRzaWdodEluY2xpbmF0aW9uIiwiYmFja3NpZ2h0SW5jbGluYXRpb24iLCJmcm9tTHJ1ZHMiLCJleGNsdWRlRGlzdGFuY2UiLCJmcm9tTHJ1ZE1hdGNoIiwiUmVnRXhwIiwicmVwbGFjZSIsIm1hcCIsImF6bUZzU3RyIiwiYXptQnNTdHIiLCJpbmNGc1N0ciIsImluY0JzU3RyIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwidmVydGljYWxEaXN0YW5jZSIsImlzU3BsYXkiLCJmZWV0U3RyIiwiaW5jaGVzU3RyIiwiaW52YWxpZCIsImFkZCIsImgiLCJ2IiwiTWF0aCIsInNxcnQiLCJhdGFuMiIsImQiLCJhc2luIiwidG9McnVkcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUNBOztBQVFBOztBQUVBLFNBQVNBLFdBQVQsQ0FD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bGUgfSBmcm9tICcuL0ZyY3NTdXJ2ZXlGaWxlJ1xuaW1wb3J0IHsgRnJjc1RyaXAgfSBmcm9tICcuL0ZyY3NUcmlwJ1xuaW1wb3J0IHsgU2VnbWVudCwgU2VnbWVudFBhcnNlRXJyb3IgfSBmcm9tICdwYXJzZS1zZWdtZW50J1xuaW1wb3J0IHtcbiAgQW5nbGUsXG4gIExlbmd0aCxcbiAgVW5pdCxcbiAgVW5pdGl6ZWROdW1iZXIsXG4gIFVuaXRUeXBlLFxuICBVbml0aXplLFxufSBmcm9tICdAc3BlbGVvdGljYS91bml0aXplZCdcbmltcG9ydCB7IEZyY3NTaG90LCBGcmNzU2hvdEtpbmQgfSBmcm9tICcuL0ZyY3NTaG90J1xuXG5mdW5jdGlvbiBwYXJzZU51bWJlcjxUIGV4dGVuZHMgVW5pdFR5cGU8VD4+KFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8VD5cbik6IFVuaXRpemVkTnVtYmVyPFQ+IHwgbnVsbCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChzKVxuICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gbnVsbFxuICByZXR1cm4gbmV3IFVuaXRpemVkTnVtYmVyKHZhbHVlLCB1bml0KVxufVxuXG5mdW5jdGlvbiBwYXJzZUF6aW11dGgoXG4gIHM6IHN0cmluZyxcbiAgdW5pdDogVW5pdDxBbmdsZT5cbik6IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGwge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU51bWJlcihzLCB1bml0KVxuICByZXR1cm4gcGFyc2VkPy5nZXQoQW5nbGUuZGVncmVlcykgPT09IDM2MCA/IFVuaXRpemUuZGVncmVlcygwKSA6IHBhcnNlZFxufVxuXG5mdW5jdGlvbiBwYXJzZUtpbmQoa2luZDogc3RyaW5nKTogRnJjc1Nob3RLaW5kIHtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAnSCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkhvcml6b250YWxcbiAgICBjYXNlICdEJzpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuRGlhZ29uYWxcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ob3JtYWxcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxlbmd0aFVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxMZW5ndGg+IHwgbnVsbCB7XG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ0ZJJzpcbiAgICAgIHJldHVybiBMZW5ndGguaW5jaGVzXG4gICAgY2FzZSAnRlQnOlxuICAgICAgcmV0dXJuIExlbmd0aC5mZWV0XG4gICAgY2FzZSAnTSAnOlxuICAgICAgcmV0dXJuIExlbmd0aC5tZXRlcnNcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuZnVuY3Rpb24gcGFyc2VBbmdsZVVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxBbmdsZT4gfCBudWxsIHtcbiAgc3dpdGNoICh1bml0KSB7XG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gQW5nbGUuZGVncmVlc1xuICAgIGNhc2UgJ0cnOlxuICAgICAgcmV0dXJuIEFuZ2xlLmdyYWRpYW5zXG4gICAgY2FzZSAnTSc6XG4gICAgICByZXR1cm4gQW5nbGUubWlsc05BVE9cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHN0YXRpb24gbmFtZS5cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0aW9uKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqXFxTK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGludGVnZXIuXG5mdW5jdGlvbiBpc1ZhbGlkVUludChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT8oWzAtOV0rKFxcLlswLTldKik/fFxcLlswLTldKylcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT9bMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKihbMC05XSsoXFwuWzAtOV0qKT98XFwuWzAtOV0rKVxccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGluY2xpbmF0aW9uIG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0SW5jbGluYXRpb24oczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdP1swLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG5mdW5jdGlvbiBwYXJzZUxydWQ8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PExlbmd0aD5cbik6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCBudWxsIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHMpXG4gIHJldHVybiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDBcbiAgICA/IG51bGxcbiAgICA6IG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSByYXcgY2RhdGEuZnIgc3VydmV5IGZpbGUuICBUaGVzZSBsb29rIGxpa2Ugc286XG4gKlxuPHByZT4gICAgICBGaXNoZXIgUmlkZ2UgQ2F2ZSBTeXN0ZW0sIEhhcnQgQ28uLCBLWVxuRU5UUkFOQ0UgRFJPUFMsIEpPRSdTIFwiSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0VcIiwgVFJJQ0tZIFRSQVZFUlNFXG5QRVRFUiBRVUlDSywgS0VJVEggT1JUSVogICAtICAyLTE1LTgxXG5UaGlzIEZpbGUgaGFzIENydW1wcyB0ZXN0IGNvbm5lY3RlZC4gIDExLzIwLzEyXG4gKlxuRlQgQyAgREQgICAgQVxuICAgICAgQUUyMCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgMyAgMCAgMlxuKiAgICAgICVGU1xuKiAgICAgQUUyMCAgICAgMCAgICAgICAgMCAgICAgICAgMCAgICAgICAgQnVnLWNhbid0IHB1dCBiZWZvcmUgc28gcHV0IGFmdGVyLXNvIGNhbid0IG1ha2UgMiBmaXhlZCAxMC8yOC8xMlxuIEFFMTkgQUUyMCAgIDkuMyAgICA2MC4wICA2MC4wLTM2LjAgICAgICAgMiAxMiAgMCAyMFxuIEFFMTggQUUxOSAgMjQuNSAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgNiAxMCAyNSAgMFxuIEFFMTcgQUUxOCAgIDguMCAgIDM1MC41IDM1MC41IDE3LjAgICAgICAgMyAgNSAgMCAgMFxuIEFFMTYgQUUxNyAgIDYuNyAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgMyAgNSAgNiAgMVxuIEFFMTUgQUUxNiAgMTIuNiAgICA3MC41ICA3MS4wLTE4LjAgICAgICAgNCAgMCAgMiAgMVxuIEFFMTQgQUUxNSAgMTAuMCAgICAyMS41ICAyMC4wICA2LjAgICAgICAgNSAgNSAgMCAgM1xuIEFFMTMgQUUxNCAgMjYuOCAgIDI4OC4wIDI4Ni4wLTUwLjAgICAgICAgMCAgNyAyMCAgNVxuKlxuKlNIT1JUIENBTllPTiBBVCBUSEUgQkFTRSBPRiBUSEUgU0VDT05EIERST1BcbiBBRTEyIEFFMTMgIDIwLjcgICAyMzYuMCAyMzYuMCAzNC4wICAgICAgIDMgIDUgIDQgIDRcbiBBRTExIEFFMTIgIDEyLjQgICAyMTAuMCAyMTAuMCAzNS4wICAgICAgIDcgIDQgIDUgIDFcbiBBRTEwIEFFMTMgIDI1LjcgICAgNDAuMCAgNDAuMCAtOS4wICAgICAgIDIgIDIgIDMgIDZcbipcbipBRTEwIEFUIEpPRSdTIFwiIEkgTE9WRSBNWSBXSUZFIFRSQVZFUlNFIFwiXG4gIEFFOSBBRTEwICAxNy44ICAgIDMyLjUgIDMxLjAgMjMuMCAgICAgICA0ICA1IDIwIDE1XG4gIEFFMSAgQUU5ICAxMy43ICAgIDgyLjAgIDgyLjAtMTMuMFxuICAgQTEgIEFFMSAgMzQuMyAgICA0Ni4wICA0OC4wLTE3LjVcbipcbipTVVJWRVkgVE8gRE9NRSBORUFSIFRIRSBFTlRSQU5DRSBET01FIChBQk9WRSBUSEUgU0VDT05EIERST1ApXG4gIEFEMSBBRTE1ICAgOC4wICAgMjAwLjAgMjAwLjAgIDAuMCAgICAgICAzICAxICAxICAxXG4gIEFEMiAgQUQxICAxNy43ICAgMTYxLjAgMTYxLjAgIDcuMCAgICAgICAxICA0IDI1ICAxXG4gIEFEMyAgQUQyICAxMC40ICAgMTgwLjAgMTgwLjAgNTAuMCAgICAgICA0ICAxIDE1ICA1XG4gKlxuVFJJQ0tZIFRSQVZFUlNFIEFORCBUSEVOIEZJUlNUIFNVUlZFWSBJTiBVUFBFUiBDUk9XTFdBWVxuREFOIENST1dMLCBLRUlUSCBPUlRJWiwgQ0hJUCBIT1BQRVIsIFBFVEVSIFFVSUNLLCBMQVJSWSBCRUFOICAgIDE0IEZFQiAxOTgxXG4gKlxuRkkgQiAgRERcbiAgIEEyICAgQTEgIDQ4IDEwICAyOTIuMCAxMTAuMC00Mi4wICAgICAgIDUgMTAgMzUgIDVcbiAgIEEzICAgQTIgIDEyICA1ICAzMzMuNSAxNTMuNSAzNS4wICAgICAgIDMgIDEgMTUgIDVcbiAgIEE0ICAgQTMgICA0ICAyICAgIDAuMCAgIDAuMCA5MC4wICAgICAgIDMgIDEgMTAgMTBcbi4uLjwvcHJlPlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcGFyc2VGcmNzU3VydmV5RmlsZShcbiAgZmlsZTogYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbGluZXM6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuKTogUHJvbWlzZTxGcmNzU3VydmV5RmlsZT4ge1xuICBsZXQgY2F2ZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBjb25zdCB0cmlwczogQXJyYXk8RnJjc1RyaXA+ID0gW11cbiAgY29uc3QgZXJyb3JzOiBBcnJheTxTZWdtZW50UGFyc2VFcnJvcj4gPSBbXVxuXG4gIGxldCB0cmlwTmFtZVxuICBsZXQgdHJpcFRlYW1cbiAgbGV0IHRyaXBEYXRlXG4gIGxldCBpblRyaXBDb21tZW50ID0gdHJ1ZVxuICBsZXQgdHJpcENvbW1lbnRTdGFydExpbmUgPSAxXG4gIGxldCB0cmlwQ29tbWVudEVuZExpbmUgPSAtMVxuICBsZXQgdHJpcENvbW1lbnQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBsZXQgY29tbWVudExpbmVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IG51bGxcbiAgbGV0IHRyaXA6IEZyY3NUcmlwIHwgbnVsbCA9IG51bGxcbiAgbGV0IGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgbGV0IHNlY3Rpb25cblxuICBmdW5jdGlvbiBnZXRDb21tZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29tbWVudExpbmVzKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50TGluZXMuam9pbignXFxuJykudHJpbSgpXG4gICAgY29tbWVudExpbmVzID0gbnVsbFxuICAgIHJldHVybiBjb21tZW50IHx8IG51bGxcbiAgfVxuXG4gIGxldCBsaW5lTnVtYmVyID0gMFxuXG4gIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGxldCBlcnJvcmVkID0gZmFsc2VcblxuICAgIGNvbnN0IHRoaXNMaW5lTnVtYmVyID0gbGluZU51bWJlclxuXG4gICAgY29uc3QgZXJyb3IgPSAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgZW5kQ29sdW1uOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IFNlZ21lbnRQYXJzZUVycm9yKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbmV3IFNlZ21lbnQoe1xuICAgICAgICAgICAgdmFsdWU6IGxpbmUsXG4gICAgICAgICAgICBzb3VyY2U6IGZpbGUsXG4gICAgICAgICAgICBzdGFydExpbmU6IHRoaXNMaW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2w6IDAsXG4gICAgICAgICAgfSkuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IChcbiAgICAgIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBlbmRDb2x1bW46IG51bWJlcixcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gYm9vbGVhblxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICBpZiAoIXZhbGlkYXRvcihmaWVsZCkpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgKGZpZWxkLnRyaW0oKSA/ICdJbnZhbGlkICcgOiAnTWlzc2luZyAnKSArIGZpZWxkTmFtZSxcbiAgICAgICAgICBzdGFydENvbHVtbixcbiAgICAgICAgICBlbmRDb2x1bW5cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkXG4gICAgfVxuXG4gICAgbGluZU51bWJlcisrXG5cbiAgICBpZiAobGluZU51bWJlciA9PT0gMSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxccyooW14sXSspKCwoLiopKT8vLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjYXZlID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgIGxvY2F0aW9uID0gbWF0Y2hbM10udHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09ICcgJyAmJiBsaW5lLmNoYXJBdCgxKSA9PT0gJyonKSB7XG4gICAgICBpblRyaXBDb21tZW50ID0gIWluVHJpcENvbW1lbnRcbiAgICAgIGlmIChpblRyaXBDb21tZW50KSB7XG4gICAgICAgIHNlY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgICAgdHJpcENvbW1lbnQgPSBbXVxuICAgICAgICB0cmlwQ29tbWVudFN0YXJ0TGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXBDb21tZW50RW5kTGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluVHJpcENvbW1lbnQpIHtcbiAgICAgIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudFN0YXJ0TGluZSArIDEpIHtcbiAgICAgICAgdHJpcE5hbWUgPSBsaW5lICYmIGxpbmUudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50U3RhcnRMaW5lICsgMikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4rPylcXHMqWy0uXVxccyooXFxkKylcXC8oXFxkKylcXC8oXFxkKykkLy5leGVjKFxuICAgICAgICAgIGxpbmUgJiYgbGluZS50cmltKClcbiAgICAgICAgKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgayA9IDFcbiAgICAgICAgICBjb25zdCB0ZWFtID0gbWF0Y2hbaysrXVxuICAgICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIHRyaXBEYXRlID0gbmV3IERhdGUoeWVhciA8IDcwID8geWVhciArIDIwMDAgOiB5ZWFyLCBtb250aCAtIDEsIGRheSlcbiAgICAgICAgICB0cmlwVGVhbSA9IHRlYW0uc3BsaXQoXG4gICAgICAgICAgICB0ZWFtLmluZGV4T2YoJzsnKSA+PSAwID8gL1xccyo7XFxzKi9nIDogL1xccyosXFxzKi9nXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPiAxKSB7XG4gICAgICAgIHRyaXBDb21tZW50LnB1c2gobGluZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXCpcXCpcXCooW14qXSlcXCpcXCpcXCovLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBzZWN0aW9uID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICBpbkJsb2NrQ29tbWVudCA9ICFpbkJsb2NrQ29tbWVudFxuICAgICAgaWYgKGluQmxvY2tDb21tZW50KSBjb21tZW50TGluZXMgPSBbXVxuICAgICAgZWxzZSBpZiAoY29tbWVudExpbmVzKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBsaW5lLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgaWYgKHBhcnQgJiYgY29tbWVudExpbmVzKSBjb21tZW50TGluZXMucHVzaChwYXJ0KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgIGlmIChjb21tZW50TGluZXMpIGNvbW1lbnRMaW5lcy5wdXNoKGxpbmUpXG4gICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudEVuZExpbmUgKyAxKSB7XG4gICAgICAvLyBGVCBDQyBERFxuICAgICAgLy8gMDEyMzQ1NjdcbiAgICAgIGxldCBkaXN0YW5jZVVuaXQgPSBwYXJzZUxlbmd0aFVuaXQobGluZS5zbGljZSgwLCAyKSlcbiAgICAgIGlmICghZGlzdGFuY2VVbml0KSB7XG4gICAgICAgIGRpc3RhbmNlVW5pdCA9IExlbmd0aC5mZWV0XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIHVuaXQnLCAwLCAyKVxuICAgICAgfVxuICAgICAgbGV0IGF6aW11dGhVbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs2XSlcbiAgICAgIGlmICghYXppbXV0aFVuaXQpIHtcbiAgICAgICAgYXppbXV0aFVuaXQgPSBBbmdsZS5kZWdyZWVzXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGF6aW11dGggdW5pdCcsIDYsIDcpXG4gICAgICB9XG4gICAgICBsZXQgaW5jbGluYXRpb25Vbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs3XSlcbiAgICAgIGlmICghaW5jbGluYXRpb25Vbml0KSB7XG4gICAgICAgIGluY2xpbmF0aW9uVW5pdCA9IEFuZ2xlLmRlZ3JlZXNcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgaW5jbGluYXRpb24gdW5pdCcsIDcsIDgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrc2lnaHRBemltdXRoQ29ycmVjdGVkID0gbGluZVszXSA9PT0gJ0MnXG4gICAgICBjb25zdCBiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCA9IGxpbmVbNF0gPT09ICdDJ1xuICAgICAgY29uc3QgaGFzQmFja3NpZ2h0QXppbXV0aCA9IGxpbmVbM10gIT09ICcgJyAmJiBsaW5lWzNdICE9PSAnLSdcbiAgICAgIGNvbnN0IGhhc0JhY2tzaWdodEluY2xpbmF0aW9uID0gbGluZVs0XSAhPT0gJyAnICYmIGxpbmVbNF0gIT09ICctJ1xuXG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVszXSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGF6aW11dGggdHlwZScsIDMsIDQpXG4gICAgICB9XG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVs0XSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGluY2xpbmF0aW9uIHR5cGUnLCA0LCA1KVxuICAgICAgfVxuXG4gICAgICB0cmlwID0ge1xuICAgICAgICBoZWFkZXI6IHtcbiAgICAgICAgICBuYW1lOiB0cmlwTmFtZSB8fCAnJyxcbiAgICAgICAgICBjb21tZW50OiAodHJpcENvbW1lbnQgJiYgdHJpcENvbW1lbnQuam9pbignXFxuJykpIHx8IG51bGwsXG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICBkYXRlOiB0cmlwRGF0ZSxcbiAgICAgICAgICB0ZWFtOiB0cmlwVGVhbSxcbiAgICAgICAgICBkaXN0YW5jZVVuaXQsXG4gICAgICAgICAgYXppbXV0aFVuaXQsXG4gICAgICAgICAgaW5jbGluYXRpb25Vbml0LFxuICAgICAgICAgIGJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQsXG4gICAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb25Db3JyZWN0ZWQsXG4gICAgICAgICAgaGFzQmFja3NpZ2h0QXppbXV0aCxcbiAgICAgICAgICBoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvdHM6IFtdLFxuICAgICAgfVxuICAgICAgdHJpcHMucHVzaCh0cmlwKVxuICAgIH0gZWxzZSBpZiAodHJpcCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaG90cyxcbiAgICAgICAgaGVhZGVyOiB7IGF6aW11dGhVbml0LCBpbmNsaW5hdGlvblVuaXQgfSxcbiAgICAgIH0gPSB0cmlwXG4gICAgICBsZXQgeyBkaXN0YW5jZVVuaXQgfSA9IHRyaXAuaGVhZGVyXG5cbiAgICAgIGNvbnN0IGluY2hlcyA9IGRpc3RhbmNlVW5pdCA9PT0gTGVuZ3RoLmluY2hlc1xuICAgICAgaWYgKGluY2hlcykgZGlzdGFuY2VVbml0ID0gTGVuZ3RoLmZlZXRcblxuICAgICAgLy8gcmlnb3JvdXNseSBjaGVjayB0aGUgdmFsdWVzIGluIGFsbCB0aGUgY29sdW1ucyB0byBtYWtlIHN1cmUgdGhpc1xuICAgICAgLy8gaXMgcmVhbGx5IGEgc3VydmV5IHNob3QgbGluZSwganVzdCBpbiBjYXNlIGFueSBzdHJheSBjb21tZW50cyBhcmVcbiAgICAgIC8vIG5vdCBwcm9wZXJseSBkZWxpbWl0ZWQuXG5cbiAgICAgIC8vIGZyb20gc3RhdGlvbiBuYW1lXG4gICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS5zdWJzdHJpbmcoNSwgMTApKSkgY29udGludWVcbiAgICAgIGNvbnN0IGZyb21TdHIgPSB2YWxpZGF0ZSg1LCAxMCwgJ2Zyb20gc3RhdGlvbicsIGlzVmFsaWRTdGF0aW9uKVxuXG4gICAgICAvLyBTYWRseSBJIGhhdmUgZm91bmQgbmVnYXRpdmUgTFJVRCB2YWx1ZXMgaW4gQ2hpcCdzIGZvcm1hdCBhbmQgYXBwYXJlbnRseVxuICAgICAgLy8gaGlzIHByb2dyYW0gZG9lc24ndCBmYWlsIG9uIHRoZW0sIHNvIEkgaGF2ZSB0byBhY2NlcHQgdGhlbSBoZXJlXG4gICAgICAvLyBpc1ZhbGlkT3B0RmxvYXQgaW5zdGVhZCBvZiBpc1ZhbGlkT3B0VUZsb2F0XG4gICAgICBjb25zdCBsU3RyID0gdmFsaWRhdGUoNDAsIDQzLCAnbGVmdCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHJTdHIgPSB2YWxpZGF0ZSg0MywgNDYsICdyaWdodCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHVTdHIgPSB2YWxpZGF0ZSg0NiwgNDksICd1cCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IGRTdHIgPSB2YWxpZGF0ZSg0OSwgNTIsICdkb3duJywgaXNWYWxpZE9wdEZsb2F0KVxuXG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgY29uc3QgdXAgPSBwYXJzZUxydWQodVN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgZG93biA9IHBhcnNlTHJ1ZChkU3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCBsZWZ0ID0gcGFyc2VMcnVkKGxTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VMcnVkKHJTdHIsIGRpc3RhbmNlVW5pdClcblxuICAgICAgLy8gdG8gc3RhdGlvbiBuYW1lXG4gICAgICBjb25zdCB0b1N0ciA9IGxpbmUuc3Vic3RyaW5nKDAsIDUpXG4gICAgICBpZiAoIXRvU3RyLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBzaG90OiBGcmNzU2hvdCA9IHtcbiAgICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgICB0bzogbnVsbCxcbiAgICAgICAgICBraW5kOiBGcmNzU2hvdEtpbmQuTm9ybWFsLFxuICAgICAgICAgIGRpc3RhbmNlOiBuZXcgVW5pdGl6ZWROdW1iZXIoMCwgZGlzdGFuY2VVbml0KSxcbiAgICAgICAgICBmcm9udHNpZ2h0QXppbXV0aDogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRBemltdXRoOiBudWxsLFxuICAgICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBmcm9tTHJ1ZHM6IHtcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHVwLFxuICAgICAgICAgICAgZG93bixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4Y2x1ZGVEaXN0YW5jZTogdHJ1ZSxcbiAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KCksXG4gICAgICAgIH1cbiAgICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKCFpc1ZhbGlkU3RhdGlvbih0b1N0cikpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgc3RhdGlvbiBuYW1lJywgMCwgNSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUxydWRNYXRjaCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeXFxcXHMrJHtmcm9tU3RyXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLFxuICAgICAgICAgICAgJ1xcXFwkJidcbiAgICAgICAgICApfSgoXFxcXHMrKFxcXFxkKyhcXFxcLlxcXFxkKik/fFxcXFwuXFxcXGQrKSl7NH0pYFxuICAgICAgKS5leGVjKGxpbmUuc3Vic3RyaW5nKDUyKSlcbiAgICAgIGxldCBmcm9tTHJ1ZHNcbiAgICAgIGlmIChmcm9tTHJ1ZE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodCwgdXAsIGRvd25dID0gZnJvbUxydWRNYXRjaFsxXVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoL1xccysvZylcbiAgICAgICAgICAubWFwKHMgPT4gcGFyc2VMcnVkKHMsIGRpc3RhbmNlVW5pdCkpXG4gICAgICAgIGZyb21McnVkcyA9IHsgbGVmdCwgcmlnaHQsIHVwLCBkb3duIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXppbXV0aCBhbmQgaW5jbGluYXRpb25cbiAgICAgIGNvbnN0IGF6bUZzU3RyID0gdmFsaWRhdGUoMTksIDI1LCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBhem1Cc1N0ciA9IHZhbGlkYXRlKDI1LCAzMCwgJ2F6aW11dGgnLCBpc1ZhbGlkT3B0VUZsb2F0KVxuICAgICAgY29uc3QgaW5jRnNTdHIgPSBsaW5lLnN1YnN0cmluZygzMCwgMzUpXG4gICAgICBjb25zdCBpbmNCc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDM1LCA0MClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGxldCBraW5kOiBGcmNzU2hvdEtpbmRcbiAgICAgIGxldCBkaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPlxuICAgICAgbGV0IGhvcml6b250YWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHZlcnRpY2FsRGlzdGFuY2U6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCB1bmRlZmluZWRcbiAgICAgIGxldCBmcm9udHNpZ2h0SW5jbGluYXRpb246IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGxcbiAgICAgIGxldCBiYWNrc2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGV4Y2x1ZGVEaXN0YW5jZTogYm9vbGVhblxuICAgICAgbGV0IGlzU3BsYXk6IGJvb2xlYW5cblxuICAgICAgLy8gcGFyc2UgZGlzdGFuY2VcbiAgICAgIGlmIChpbmNoZXMpIHtcbiAgICAgICAgY29uc3QgZmVldFN0ciA9IGxpbmUuc3Vic3RyaW5nKDEwLCAxNClcbiAgICAgICAgY29uc3QgaW5jaGVzU3RyID0gbGluZS5zdWJzdHJpbmcoMTQsIDE3KVxuICAgICAgICAvLyBmZWV0IGFuZCBpbmNoZXMgYXJlIG5vdCBib3RoIG9wdGlvbmFsXG4gICAgICAgIGlmICghaXNWYWxpZFVJbnQoZmVldFN0cikgJiYgIWlzVmFsaWRVSW50KGluY2hlc1N0cikpIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkID0gZmVldFN0ci50cmltKCkgfHwgaW5jaGVzU3RyLnRyaW0oKVxuICAgICAgICAgIGVycm9yKGludmFsaWQgPyAnSW52YWxpZCBkaXN0YW5jZScgOiAnTWlzc2luZyBkaXN0YW5jZScsIDEwLCAxNylcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29tZXRpbWVzIGluY2hlcyBhcmUgb21pdHRlZCwgaGVuY2UgdGhlIHx8IDAuLi5JJ20gYXNzdW1pbmcgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyBmb3IgZmVldCB0byBiZSBvbWl0dGVkIGFzIHdlbGxcbiAgICAgICAgZGlzdGFuY2UgPSBVbml0aXplLmluY2hlcyhwYXJzZUZsb2F0KGluY2hlc1N0cikgfHwgMCkuYWRkKFxuICAgICAgICAgIFVuaXRpemUuZmVldChwYXJzZUZsb2F0KGZlZXRTdHIpIHx8IDApXG4gICAgICAgIClcblxuICAgICAgICBraW5kID0gcGFyc2VLaW5kKGxpbmVbMTddKVxuICAgICAgICAvLyBOT1RFIHRoZXJlIGFyZSB0d28gY29sdW1ucyBhcm91bmQgaGVyZSB0aGF0IGNhbiBjb250YWluIGEgKi5cbiAgICAgICAgLy8gSSB0aGluayB0aGV5IG1pZ2h0IHJlcHJlc2VudCBkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhpc2lzIGNvbmZ1c2VkIGJ5XG4gICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgZm9yIGZ0L2luIHNob3RzLCBpZiB0aGVyZSBpcyBhIEQgb3IgSCBmbGFnIGl0IG9jY3VwaWVzIHRoZVxuICAgICAgICAvLyBmaXJzdCBjb2x1bW4gdGhhdCBjYW4gY29udGFpbiBhICogZm9yIGRlY2ltYWwgZmVldCBzaG90c1xuICAgICAgICBleGNsdWRlRGlzdGFuY2UgPSBsaW5lWzE4XSA9PT0gJyonIHx8IGxpbmVbMThdID09PSAncydcbiAgICAgICAgaXNTcGxheSA9IGxpbmVbMThdID09PSAncydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlY2ltYWwgZmVldCBhcmUgbm90IG9wdGlvbmFsXG4gICAgICAgIGNvbnN0IGZlZXRTdHIgPSB2YWxpZGF0ZSgxMCwgMTYsICdkaXN0YW5jZScsIGlzVmFsaWRVRmxvYXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHBhcnNlRmxvYXQoZmVldFN0ciksIGRpc3RhbmNlVW5pdClcbiAgICAgICAga2luZCA9IHBhcnNlS2luZChsaW5lWzE2XSlcbiAgICAgICAgZXhjbHVkZURpc3RhbmNlID0gbGluZVsxN10gPT09ICcqJyB8fCBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICAgIGlzU3BsYXkgPSBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kICE9PSBGcmNzU2hvdEtpbmQuTm9ybWFsKSB7XG4gICAgICAgIHZhbGlkYXRlKDMwLCAzNSwgJ3ZlcnRpY2FsLWRpc3RhbmNlJywgaXNWYWxpZEZsb2F0KVxuICAgICAgfVxuXG4gICAgICAvLyBjb252ZXJ0IGhvcml6b250YWwgYW5kIGRpYWdvbmFsIHNob3RzIHRvIHN0YW5kYXJkXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgaW5jRnMgaXMgdGhlIHZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIHN0YXRpb25zXG4gICAgICAvLyBmb3J0dW5hdGVseSBpdCBhcHBlYXJzIHdlIGNhbiBhbHdheXMgY291bnQgb24gaW5jRnMgYmVpbmcgc3BlY2lmaWVkXG4gICAgICAvLyBhbmQgaW5jQnMgbm90IGJlaW5nIHNwZWNpZmllZCBmb3IgdGhlc2UgdHlwZXMgb2Ygc2hvdHNcbiAgICAgIGlmIChraW5kID09PSBGcmNzU2hvdEtpbmQuSG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBkaXN0YW5jZSBpcyBob3Jpem9udGFsIG9mZnNldCBhbmQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGhvcml6b250YWxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgIGNvbnN0IGggPSBob3Jpem9udGFsRGlzdGFuY2UuZ2V0KGRpc3RhbmNlVW5pdClcbiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoaW5jRnNTdHIpXG4gICAgICAgIHZlcnRpY2FsRGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIodiwgZGlzdGFuY2VVbml0KVxuICAgICAgICBkaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcihNYXRoLnNxcnQoaCAqIGggKyB2ICogdiksIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gQW5nbGUuYXRhbjIoXG4gICAgICAgICAgdmVydGljYWxEaXN0YW5jZSxcbiAgICAgICAgICBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgICAgKVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gRnJjc1Nob3RLaW5kLkRpYWdvbmFsKSB7XG4gICAgICAgIC8vIGRpc3RhbmNlIGlzIGFzIHVzdWFsLCBidXQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZS5nZXQoZGlzdGFuY2VVbml0KVxuICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChpbmNGc1N0cilcbiAgICAgICAgdmVydGljYWxEaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcih2LCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IEFuZ2xlLmFzaW4odiAvIGQpXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzMCwgMzUsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzNSwgNDAsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gcGFyc2VOdW1iZXIoaW5jRnNTdHIsIGluY2xpbmF0aW9uVW5pdClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBwYXJzZU51bWJlcihpbmNCc1N0ciwgaW5jbGluYXRpb25Vbml0KVxuICAgICAgfVxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZyb250c2lnaHRBemltdXRoID0gcGFyc2VBemltdXRoKGF6bUZzU3RyLCBhemltdXRoVW5pdClcbiAgICAgIGNvbnN0IGJhY2tzaWdodEF6aW11dGggPSBwYXJzZUF6aW11dGgoYXptQnNTdHIsIGF6aW11dGhVbml0KVxuXG4gICAgICBpZiAoIWZyb250c2lnaHRJbmNsaW5hdGlvbiAmJiAhYmFja3NpZ2h0SW5jbGluYXRpb24pIHtcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gVW5pdGl6ZS5kZWdyZWVzKDApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3Q6IEZyY3NTaG90ID0ge1xuICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgdG86IHRvU3RyLnRyaW0oKSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGZyb250c2lnaHRBemltdXRoLFxuICAgICAgICBiYWNrc2lnaHRBemltdXRoLFxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICB0b0xydWRzOiB7XG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICByaWdodCxcbiAgICAgICAgICB1cCxcbiAgICAgICAgICBkb3duLFxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRGlzdGFuY2UsXG4gICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgIH1cbiAgICAgIGlmIChpc1NwbGF5KSBzaG90LmlzU3BsYXkgPSB0cnVlXG4gICAgICBpZiAoZnJvbUxydWRzKSBzaG90LmZyb21McnVkcyA9IGZyb21McnVkc1xuICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSkgc2hvdC5ob3Jpem9udGFsRGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgIGlmICh2ZXJ0aWNhbERpc3RhbmNlKSBzaG90LnZlcnRpY2FsRGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlXG4gICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXZlLFxuICAgIGxvY2F0aW9uLFxuICAgIHRyaXBzLFxuICAgIGVycm9ycyxcbiAgfVxufVxuIl19
|
|
458
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGFyc2VTZWdtZW50IiwicmVxdWlyZSIsIl91bml0aXplZCIsIl9GcmNzU2hvdCIsInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJmcm9tU3RyIiwibFN0ciIsInJTdHIiLCJ1U3RyIiwiZFN0ciIsInVwIiwiZG93biIsImxlZnQiLCJyaWdodCIsInRvU3RyIiwic2hvdCIsImZyb20iLCJ0byIsImRpc3RhbmNlIiwiZnJvbnRzaWdodEF6aW11dGgiLCJiYWNrc2lnaHRBemltdXRoIiwiZnJvbnRzaWdodEluY2xpbmF0aW9uIiwiYmFja3NpZ2h0SW5jbGluYXRpb24iLCJmcm9tTHJ1ZHMiLCJleGNsdWRlRGlzdGFuY2UiLCJmcm9tTHJ1ZE1hdGNoIiwiUmVnRXhwIiwicmVwbGFjZSIsIm1hcCIsImF6bUZzU3RyIiwiYXptQnNTdHIiLCJpbmNGc1N0ciIsImluY0JzU3RyIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwidmVydGljYWxEaXN0YW5jZSIsImlzU3BsYXkiLCJmZWV0U3RyIiwiaW5jaGVzU3RyIiwiaW52YWxpZCIsImFkZCIsImgiLCJ2IiwiTWF0aCIsInNxcnQiLCJhdGFuMiIsImQiLCJhc2luIiwidG9McnVkcyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUZyY3NTdXJ2ZXlGaWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZyY3NTdXJ2ZXlGaWxlIH0gZnJvbSAnLi9GcmNzU3VydmV5RmlsZSdcbmltcG9ydCB7IEZyY3NUcmlwIH0gZnJvbSAnLi9GcmNzVHJpcCdcbmltcG9ydCB7IFNlZ21lbnQsIFNlZ21lbnRQYXJzZUVycm9yIH0gZnJvbSAncGFyc2Utc2VnbWVudCdcbmltcG9ydCB7XG4gIEFuZ2xlLFxuICBMZW5ndGgsXG4gIFVuaXQsXG4gIFVuaXRpemVkTnVtYmVyLFxuICBVbml0VHlwZSxcbiAgVW5pdGl6ZSxcbn0gZnJvbSAnQHNwZWxlb3RpY2EvdW5pdGl6ZWQnXG5pbXBvcnQgeyBGcmNzU2hvdCwgRnJjc1Nob3RLaW5kIH0gZnJvbSAnLi9GcmNzU2hvdCdcblxuZnVuY3Rpb24gcGFyc2VOdW1iZXI8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PFQ+XG4pOiBVbml0aXplZE51bWJlcjxUPiB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQocylcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuZnVuY3Rpb24gcGFyc2VBemltdXRoKFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8QW5nbGU+XG4pOiBVbml0aXplZE51bWJlcjxBbmdsZT4gfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VOdW1iZXIocywgdW5pdClcbiAgcmV0dXJuIHBhcnNlZD8uZ2V0KEFuZ2xlLmRlZ3JlZXMpID09PSAzNjAgPyBVbml0aXplLmRlZ3JlZXMoMCkgOiBwYXJzZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VLaW5kKGtpbmQ6IHN0cmluZyk6IEZyY3NTaG90S2luZCB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ0gnOlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ib3Jpem9udGFsXG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkRpYWdvbmFsXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuTm9ybWFsXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMZW5ndGhVbml0KHVuaXQ6IHN0cmluZyk6IFVuaXQ8TGVuZ3RoPiB8IG51bGwge1xuICBzd2l0Y2ggKHVuaXQpIHtcbiAgICBjYXNlICdGSSc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmluY2hlc1xuICAgIGNhc2UgJ0ZGJzpcbiAgICBjYXNlICdGVCc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmZlZXRcbiAgICBjYXNlICdNVCc6XG4gICAgY2FzZSAnTSAnOlxuICAgICAgcmV0dXJuIExlbmd0aC5tZXRlcnNcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuZnVuY3Rpb24gcGFyc2VBbmdsZVVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxBbmdsZT4gfCBudWxsIHtcbiAgc3dpdGNoICh1bml0KSB7XG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gQW5nbGUuZGVncmVlc1xuICAgIGNhc2UgJ0cnOlxuICAgICAgcmV0dXJuIEFuZ2xlLmdyYWRpYW5zXG4gICAgY2FzZSAnTSc6XG4gICAgICByZXR1cm4gQW5nbGUubWlsc05BVE9cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHN0YXRpb24gbmFtZS5cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0aW9uKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqXFxTK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGludGVnZXIuXG5mdW5jdGlvbiBpc1ZhbGlkVUludChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT8oWzAtOV0rKFxcLlswLTldKik/fFxcLlswLTldKylcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT9bMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKihbMC05XSsoXFwuWzAtOV0qKT98XFwuWzAtOV0rKVxccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGluY2xpbmF0aW9uIG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0SW5jbGluYXRpb24oczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdP1swLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG5mdW5jdGlvbiBwYXJzZUxydWQ8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PExlbmd0aD5cbik6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCBudWxsIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHMpXG4gIHJldHVybiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDBcbiAgICA/IG51bGxcbiAgICA6IG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSByYXcgY2RhdGEuZnIgc3VydmV5IGZpbGUuICBUaGVzZSBsb29rIGxpa2Ugc286XG4gKlxuPHByZT4gICAgICBGaXNoZXIgUmlkZ2UgQ2F2ZSBTeXN0ZW0sIEhhcnQgQ28uLCBLWVxuRU5UUkFOQ0UgRFJPUFMsIEpPRSdTIFwiSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0VcIiwgVFJJQ0tZIFRSQVZFUlNFXG5QRVRFUiBRVUlDSywgS0VJVEggT1JUSVogICAtICAyLTE1LTgxXG5UaGlzIEZpbGUgaGFzIENydW1wcyB0ZXN0IGNvbm5lY3RlZC4gIDExLzIwLzEyXG4gKlxuRlQgQyAgREQgICAgQVxuICAgICAgQUUyMCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgMyAgMCAgMlxuKiAgICAgICVGU1xuKiAgICAgQUUyMCAgICAgMCAgICAgICAgMCAgICAgICAgMCAgICAgICAgQnVnLWNhbid0IHB1dCBiZWZvcmUgc28gcHV0IGFmdGVyLXNvIGNhbid0IG1ha2UgMiBmaXhlZCAxMC8yOC8xMlxuIEFFMTkgQUUyMCAgIDkuMyAgICA2MC4wICA2MC4wLTM2LjAgICAgICAgMiAxMiAgMCAyMFxuIEFFMTggQUUxOSAgMjQuNSAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgNiAxMCAyNSAgMFxuIEFFMTcgQUUxOCAgIDguMCAgIDM1MC41IDM1MC41IDE3LjAgICAgICAgMyAgNSAgMCAgMFxuIEFFMTYgQUUxNyAgIDYuNyAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgMyAgNSAgNiAgMVxuIEFFMTUgQUUxNiAgMTIuNiAgICA3MC41ICA3MS4wLTE4LjAgICAgICAgNCAgMCAgMiAgMVxuIEFFMTQgQUUxNSAgMTAuMCAgICAyMS41ICAyMC4wICA2LjAgICAgICAgNSAgNSAgMCAgM1xuIEFFMTMgQUUxNCAgMjYuOCAgIDI4OC4wIDI4Ni4wLTUwLjAgICAgICAgMCAgNyAyMCAgNVxuKlxuKlNIT1JUIENBTllPTiBBVCBUSEUgQkFTRSBPRiBUSEUgU0VDT05EIERST1BcbiBBRTEyIEFFMTMgIDIwLjcgICAyMzYuMCAyMzYuMCAzNC4wICAgICAgIDMgIDUgIDQgIDRcbiBBRTExIEFFMTIgIDEyLjQgICAyMTAuMCAyMTAuMCAzNS4wICAgICAgIDcgIDQgIDUgIDFcbiBBRTEwIEFFMTMgIDI1LjcgICAgNDAuMCAgNDAuMCAtOS4wICAgICAgIDIgIDIgIDMgIDZcbipcbipBRTEwIEFUIEpPRSdTIFwiIEkgTE9WRSBNWSBXSUZFIFRSQVZFUlNFIFwiXG4gIEFFOSBBRTEwICAxNy44ICAgIDMyLjUgIDMxLjAgMjMuMCAgICAgICA0ICA1IDIwIDE1XG4gIEFFMSAgQUU5ICAxMy43ICAgIDgyLjAgIDgyLjAtMTMuMFxuICAgQTEgIEFFMSAgMzQuMyAgICA0Ni4wICA0OC4wLTE3LjVcbipcbipTVVJWRVkgVE8gRE9NRSBORUFSIFRIRSBFTlRSQU5DRSBET01FIChBQk9WRSBUSEUgU0VDT05EIERST1ApXG4gIEFEMSBBRTE1ICAgOC4wICAgMjAwLjAgMjAwLjAgIDAuMCAgICAgICAzICAxICAxICAxXG4gIEFEMiAgQUQxICAxNy43ICAgMTYxLjAgMTYxLjAgIDcuMCAgICAgICAxICA0IDI1ICAxXG4gIEFEMyAgQUQyICAxMC40ICAgMTgwLjAgMTgwLjAgNTAuMCAgICAgICA0ICAxIDE1ICA1XG4gKlxuVFJJQ0tZIFRSQVZFUlNFIEFORCBUSEVOIEZJUlNUIFNVUlZFWSBJTiBVUFBFUiBDUk9XTFdBWVxuREFOIENST1dMLCBLRUlUSCBPUlRJWiwgQ0hJUCBIT1BQRVIsIFBFVEVSIFFVSUNLLCBMQVJSWSBCRUFOICAgIDE0IEZFQiAxOTgxXG4gKlxuRkkgQiAgRERcbiAgIEEyICAgQTEgIDQ4IDEwICAyOTIuMCAxMTAuMC00Mi4wICAgICAgIDUgMTAgMzUgIDVcbiAgIEEzICAgQTIgIDEyICA1ICAzMzMuNSAxNTMuNSAzNS4wICAgICAgIDMgIDEgMTUgIDVcbiAgIEE0ICAgQTMgICA0ICAyICAgIDAuMCAgIDAuMCA5MC4wICAgICAgIDMgIDEgMTAgMTBcbi4uLjwvcHJlPlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcGFyc2VGcmNzU3VydmV5RmlsZShcbiAgZmlsZTogYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbGluZXM6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuKTogUHJvbWlzZTxGcmNzU3VydmV5RmlsZT4ge1xuICBsZXQgY2F2ZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBjb25zdCB0cmlwczogQXJyYXk8RnJjc1RyaXA+ID0gW11cbiAgY29uc3QgZXJyb3JzOiBBcnJheTxTZWdtZW50UGFyc2VFcnJvcj4gPSBbXVxuXG4gIGxldCB0cmlwTmFtZVxuICBsZXQgdHJpcFRlYW1cbiAgbGV0IHRyaXBEYXRlXG4gIGxldCBpblRyaXBDb21tZW50ID0gdHJ1ZVxuICBsZXQgdHJpcENvbW1lbnRTdGFydExpbmUgPSAxXG4gIGxldCB0cmlwQ29tbWVudEVuZExpbmUgPSAtMVxuICBsZXQgdHJpcENvbW1lbnQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBsZXQgY29tbWVudExpbmVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IG51bGxcbiAgbGV0IHRyaXA6IEZyY3NUcmlwIHwgbnVsbCA9IG51bGxcbiAgbGV0IGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgbGV0IHNlY3Rpb25cblxuICBmdW5jdGlvbiBnZXRDb21tZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29tbWVudExpbmVzKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50TGluZXMuam9pbignXFxuJykudHJpbSgpXG4gICAgY29tbWVudExpbmVzID0gbnVsbFxuICAgIHJldHVybiBjb21tZW50IHx8IG51bGxcbiAgfVxuXG4gIGxldCBsaW5lTnVtYmVyID0gMFxuXG4gIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGxldCBlcnJvcmVkID0gZmFsc2VcblxuICAgIGNvbnN0IHRoaXNMaW5lTnVtYmVyID0gbGluZU51bWJlclxuXG4gICAgY29uc3QgZXJyb3IgPSAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgZW5kQ29sdW1uOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IFNlZ21lbnRQYXJzZUVycm9yKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbmV3IFNlZ21lbnQoe1xuICAgICAgICAgICAgdmFsdWU6IGxpbmUsXG4gICAgICAgICAgICBzb3VyY2U6IGZpbGUsXG4gICAgICAgICAgICBzdGFydExpbmU6IHRoaXNMaW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2w6IDAsXG4gICAgICAgICAgfSkuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IChcbiAgICAgIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBlbmRDb2x1bW46IG51bWJlcixcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gYm9vbGVhblxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICBpZiAoIXZhbGlkYXRvcihmaWVsZCkpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgKGZpZWxkLnRyaW0oKSA/ICdJbnZhbGlkICcgOiAnTWlzc2luZyAnKSArIGZpZWxkTmFtZSxcbiAgICAgICAgICBzdGFydENvbHVtbixcbiAgICAgICAgICBlbmRDb2x1bW5cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkXG4gICAgfVxuXG4gICAgbGluZU51bWJlcisrXG5cbiAgICBpZiAobGluZU51bWJlciA9PT0gMSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxccyooW14sXSspKCwoLiopKT8vLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjYXZlID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgIGxvY2F0aW9uID0gbWF0Y2hbM10udHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09ICcgJyAmJiBsaW5lLmNoYXJBdCgxKSA9PT0gJyonKSB7XG4gICAgICBpblRyaXBDb21tZW50ID0gIWluVHJpcENvbW1lbnRcbiAgICAgIGlmIChpblRyaXBDb21tZW50KSB7XG4gICAgICAgIHNlY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgICAgdHJpcENvbW1lbnQgPSBbXVxuICAgICAgICB0cmlwQ29tbWVudFN0YXJ0TGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXBDb21tZW50RW5kTGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluVHJpcENvbW1lbnQpIHtcbiAgICAgIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudFN0YXJ0TGluZSArIDEpIHtcbiAgICAgICAgdHJpcE5hbWUgPSBsaW5lICYmIGxpbmUudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50U3RhcnRMaW5lICsgMikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4rPylcXHMqWy0uXVxccyooXFxkKylcXC8oXFxkKylcXC8oXFxkKykkLy5leGVjKFxuICAgICAgICAgIGxpbmUgJiYgbGluZS50cmltKClcbiAgICAgICAgKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgayA9IDFcbiAgICAgICAgICBjb25zdCB0ZWFtID0gbWF0Y2hbaysrXVxuICAgICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIHRyaXBEYXRlID0gbmV3IERhdGUoeWVhciA8IDcwID8geWVhciArIDIwMDAgOiB5ZWFyLCBtb250aCAtIDEsIGRheSlcbiAgICAgICAgICB0cmlwVGVhbSA9IHRlYW0uc3BsaXQoXG4gICAgICAgICAgICB0ZWFtLmluZGV4T2YoJzsnKSA+PSAwID8gL1xccyo7XFxzKi9nIDogL1xccyosXFxzKi9nXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPiAxKSB7XG4gICAgICAgIHRyaXBDb21tZW50LnB1c2gobGluZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXCpcXCpcXCooW14qXSlcXCpcXCpcXCovLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBzZWN0aW9uID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICBpbkJsb2NrQ29tbWVudCA9ICFpbkJsb2NrQ29tbWVudFxuICAgICAgaWYgKGluQmxvY2tDb21tZW50KSBjb21tZW50TGluZXMgPSBbXVxuICAgICAgZWxzZSBpZiAoY29tbWVudExpbmVzKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBsaW5lLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgaWYgKHBhcnQgJiYgY29tbWVudExpbmVzKSBjb21tZW50TGluZXMucHVzaChwYXJ0KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgIGlmIChjb21tZW50TGluZXMpIGNvbW1lbnRMaW5lcy5wdXNoKGxpbmUpXG4gICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudEVuZExpbmUgKyAxKSB7XG4gICAgICAvLyBGVCBDQyBERFxuICAgICAgLy8gMDEyMzQ1NjdcbiAgICAgIGxldCBkaXN0YW5jZVVuaXQgPSBwYXJzZUxlbmd0aFVuaXQobGluZS5zbGljZSgwLCAyKSlcbiAgICAgIGlmICghZGlzdGFuY2VVbml0KSB7XG4gICAgICAgIGRpc3RhbmNlVW5pdCA9IExlbmd0aC5mZWV0XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIHVuaXQnLCAwLCAyKVxuICAgICAgfVxuICAgICAgbGV0IGF6aW11dGhVbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs2XSlcbiAgICAgIGlmICghYXppbXV0aFVuaXQpIHtcbiAgICAgICAgYXppbXV0aFVuaXQgPSBBbmdsZS5kZWdyZWVzXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGF6aW11dGggdW5pdCcsIDYsIDcpXG4gICAgICB9XG4gICAgICBsZXQgaW5jbGluYXRpb25Vbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs3XSlcbiAgICAgIGlmICghaW5jbGluYXRpb25Vbml0KSB7XG4gICAgICAgIGluY2xpbmF0aW9uVW5pdCA9IEFuZ2xlLmRlZ3JlZXNcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgaW5jbGluYXRpb24gdW5pdCcsIDcsIDgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrc2lnaHRBemltdXRoQ29ycmVjdGVkID0gbGluZVszXSA9PT0gJ0MnXG4gICAgICBjb25zdCBiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCA9IGxpbmVbNF0gPT09ICdDJ1xuICAgICAgY29uc3QgaGFzQmFja3NpZ2h0QXppbXV0aCA9IGxpbmVbM10gIT09ICcgJyAmJiBsaW5lWzNdICE9PSAnLSdcbiAgICAgIGNvbnN0IGhhc0JhY2tzaWdodEluY2xpbmF0aW9uID0gbGluZVs0XSAhPT0gJyAnICYmIGxpbmVbNF0gIT09ICctJ1xuXG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVszXSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGF6aW11dGggdHlwZScsIDMsIDQpXG4gICAgICB9XG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVs0XSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGluY2xpbmF0aW9uIHR5cGUnLCA0LCA1KVxuICAgICAgfVxuXG4gICAgICB0cmlwID0ge1xuICAgICAgICBoZWFkZXI6IHtcbiAgICAgICAgICBuYW1lOiB0cmlwTmFtZSB8fCAnJyxcbiAgICAgICAgICBjb21tZW50OiAodHJpcENvbW1lbnQgJiYgdHJpcENvbW1lbnQuam9pbignXFxuJykpIHx8IG51bGwsXG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICBkYXRlOiB0cmlwRGF0ZSxcbiAgICAgICAgICB0ZWFtOiB0cmlwVGVhbSxcbiAgICAgICAgICBkaXN0YW5jZVVuaXQsXG4gICAgICAgICAgYXppbXV0aFVuaXQsXG4gICAgICAgICAgaW5jbGluYXRpb25Vbml0LFxuICAgICAgICAgIGJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQsXG4gICAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb25Db3JyZWN0ZWQsXG4gICAgICAgICAgaGFzQmFja3NpZ2h0QXppbXV0aCxcbiAgICAgICAgICBoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvdHM6IFtdLFxuICAgICAgfVxuICAgICAgdHJpcHMucHVzaCh0cmlwKVxuICAgIH0gZWxzZSBpZiAodHJpcCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaG90cyxcbiAgICAgICAgaGVhZGVyOiB7IGF6aW11dGhVbml0LCBpbmNsaW5hdGlvblVuaXQgfSxcbiAgICAgIH0gPSB0cmlwXG4gICAgICBsZXQgeyBkaXN0YW5jZVVuaXQgfSA9IHRyaXAuaGVhZGVyXG5cbiAgICAgIGNvbnN0IGluY2hlcyA9IGRpc3RhbmNlVW5pdCA9PT0gTGVuZ3RoLmluY2hlc1xuICAgICAgaWYgKGluY2hlcykgZGlzdGFuY2VVbml0ID0gTGVuZ3RoLmZlZXRcblxuICAgICAgLy8gcmlnb3JvdXNseSBjaGVjayB0aGUgdmFsdWVzIGluIGFsbCB0aGUgY29sdW1ucyB0byBtYWtlIHN1cmUgdGhpc1xuICAgICAgLy8gaXMgcmVhbGx5IGEgc3VydmV5IHNob3QgbGluZSwganVzdCBpbiBjYXNlIGFueSBzdHJheSBjb21tZW50cyBhcmVcbiAgICAgIC8vIG5vdCBwcm9wZXJseSBkZWxpbWl0ZWQuXG5cbiAgICAgIC8vIGZyb20gc3RhdGlvbiBuYW1lXG4gICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS5zdWJzdHJpbmcoNSwgMTApKSkgY29udGludWVcbiAgICAgIGNvbnN0IGZyb21TdHIgPSB2YWxpZGF0ZSg1LCAxMCwgJ2Zyb20gc3RhdGlvbicsIGlzVmFsaWRTdGF0aW9uKVxuXG4gICAgICAvLyBTYWRseSBJIGhhdmUgZm91bmQgbmVnYXRpdmUgTFJVRCB2YWx1ZXMgaW4gQ2hpcCdzIGZvcm1hdCBhbmQgYXBwYXJlbnRseVxuICAgICAgLy8gaGlzIHByb2dyYW0gZG9lc24ndCBmYWlsIG9uIHRoZW0sIHNvIEkgaGF2ZSB0byBhY2NlcHQgdGhlbSBoZXJlXG4gICAgICAvLyBpc1ZhbGlkT3B0RmxvYXQgaW5zdGVhZCBvZiBpc1ZhbGlkT3B0VUZsb2F0XG4gICAgICBjb25zdCBsU3RyID0gdmFsaWRhdGUoNDAsIDQzLCAnbGVmdCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHJTdHIgPSB2YWxpZGF0ZSg0MywgNDYsICdyaWdodCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHVTdHIgPSB2YWxpZGF0ZSg0NiwgNDksICd1cCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IGRTdHIgPSB2YWxpZGF0ZSg0OSwgNTIsICdkb3duJywgaXNWYWxpZE9wdEZsb2F0KVxuXG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgY29uc3QgdXAgPSBwYXJzZUxydWQodVN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgZG93biA9IHBhcnNlTHJ1ZChkU3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCBsZWZ0ID0gcGFyc2VMcnVkKGxTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VMcnVkKHJTdHIsIGRpc3RhbmNlVW5pdClcblxuICAgICAgLy8gdG8gc3RhdGlvbiBuYW1lXG4gICAgICBjb25zdCB0b1N0ciA9IGxpbmUuc3Vic3RyaW5nKDAsIDUpXG4gICAgICBpZiAoIXRvU3RyLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBzaG90OiBGcmNzU2hvdCA9IHtcbiAgICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgICB0bzogbnVsbCxcbiAgICAgICAgICBraW5kOiBGcmNzU2hvdEtpbmQuTm9ybWFsLFxuICAgICAgICAgIGRpc3RhbmNlOiBuZXcgVW5pdGl6ZWROdW1iZXIoMCwgZGlzdGFuY2VVbml0KSxcbiAgICAgICAgICBmcm9udHNpZ2h0QXppbXV0aDogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRBemltdXRoOiBudWxsLFxuICAgICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBmcm9tTHJ1ZHM6IHtcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHVwLFxuICAgICAgICAgICAgZG93bixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4Y2x1ZGVEaXN0YW5jZTogdHJ1ZSxcbiAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KCksXG4gICAgICAgIH1cbiAgICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKCFpc1ZhbGlkU3RhdGlvbih0b1N0cikpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgc3RhdGlvbiBuYW1lJywgMCwgNSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUxydWRNYXRjaCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeXFxcXHMrJHtmcm9tU3RyXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLFxuICAgICAgICAgICAgJ1xcXFwkJidcbiAgICAgICAgICApfSgoXFxcXHMrKFxcXFxkKyhcXFxcLlxcXFxkKik/fFxcXFwuXFxcXGQrKSl7NH0pYFxuICAgICAgKS5leGVjKGxpbmUuc3Vic3RyaW5nKDUyKSlcbiAgICAgIGxldCBmcm9tTHJ1ZHNcbiAgICAgIGlmIChmcm9tTHJ1ZE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodCwgdXAsIGRvd25dID0gZnJvbUxydWRNYXRjaFsxXVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoL1xccysvZylcbiAgICAgICAgICAubWFwKHMgPT4gcGFyc2VMcnVkKHMsIGRpc3RhbmNlVW5pdCkpXG4gICAgICAgIGZyb21McnVkcyA9IHsgbGVmdCwgcmlnaHQsIHVwLCBkb3duIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXppbXV0aCBhbmQgaW5jbGluYXRpb25cbiAgICAgIGNvbnN0IGF6bUZzU3RyID0gdmFsaWRhdGUoMTksIDI1LCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBhem1Cc1N0ciA9IHZhbGlkYXRlKDI1LCAzMCwgJ2F6aW11dGgnLCBpc1ZhbGlkT3B0VUZsb2F0KVxuICAgICAgY29uc3QgaW5jRnNTdHIgPSBsaW5lLnN1YnN0cmluZygzMCwgMzUpXG4gICAgICBjb25zdCBpbmNCc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDM1LCA0MClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGxldCBraW5kOiBGcmNzU2hvdEtpbmRcbiAgICAgIGxldCBkaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPlxuICAgICAgbGV0IGhvcml6b250YWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHZlcnRpY2FsRGlzdGFuY2U6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCB1bmRlZmluZWRcbiAgICAgIGxldCBmcm9udHNpZ2h0SW5jbGluYXRpb246IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGxcbiAgICAgIGxldCBiYWNrc2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGV4Y2x1ZGVEaXN0YW5jZTogYm9vbGVhblxuICAgICAgbGV0IGlzU3BsYXk6IGJvb2xlYW5cblxuICAgICAgLy8gcGFyc2UgZGlzdGFuY2VcbiAgICAgIGlmIChpbmNoZXMpIHtcbiAgICAgICAgY29uc3QgZmVldFN0ciA9IGxpbmUuc3Vic3RyaW5nKDEwLCAxNClcbiAgICAgICAgY29uc3QgaW5jaGVzU3RyID0gbGluZS5zdWJzdHJpbmcoMTQsIDE3KVxuICAgICAgICAvLyBmZWV0IGFuZCBpbmNoZXMgYXJlIG5vdCBib3RoIG9wdGlvbmFsXG4gICAgICAgIGlmICghaXNWYWxpZFVJbnQoZmVldFN0cikgJiYgIWlzVmFsaWRVSW50KGluY2hlc1N0cikpIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkID0gZmVldFN0ci50cmltKCkgfHwgaW5jaGVzU3RyLnRyaW0oKVxuICAgICAgICAgIGVycm9yKGludmFsaWQgPyAnSW52YWxpZCBkaXN0YW5jZScgOiAnTWlzc2luZyBkaXN0YW5jZScsIDEwLCAxNylcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29tZXRpbWVzIGluY2hlcyBhcmUgb21pdHRlZCwgaGVuY2UgdGhlIHx8IDAuLi5JJ20gYXNzdW1pbmcgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyBmb3IgZmVldCB0byBiZSBvbWl0dGVkIGFzIHdlbGxcbiAgICAgICAgZGlzdGFuY2UgPSBVbml0aXplLmluY2hlcyhwYXJzZUZsb2F0KGluY2hlc1N0cikgfHwgMCkuYWRkKFxuICAgICAgICAgIFVuaXRpemUuZmVldChwYXJzZUZsb2F0KGZlZXRTdHIpIHx8IDApXG4gICAgICAgIClcblxuICAgICAgICBraW5kID0gcGFyc2VLaW5kKGxpbmVbMTddKVxuICAgICAgICAvLyBOT1RFIHRoZXJlIGFyZSB0d28gY29sdW1ucyBhcm91bmQgaGVyZSB0aGF0IGNhbiBjb250YWluIGEgKi5cbiAgICAgICAgLy8gSSB0aGluayB0aGV5IG1pZ2h0IHJlcHJlc2VudCBkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhpc2lzIGNvbmZ1c2VkIGJ5XG4gICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgZm9yIGZ0L2luIHNob3RzLCBpZiB0aGVyZSBpcyBhIEQgb3IgSCBmbGFnIGl0IG9jY3VwaWVzIHRoZVxuICAgICAgICAvLyBmaXJzdCBjb2x1bW4gdGhhdCBjYW4gY29udGFpbiBhICogZm9yIGRlY2ltYWwgZmVldCBzaG90c1xuICAgICAgICBleGNsdWRlRGlzdGFuY2UgPSBsaW5lWzE4XSA9PT0gJyonIHx8IGxpbmVbMThdID09PSAncydcbiAgICAgICAgaXNTcGxheSA9IGxpbmVbMThdID09PSAncydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlY2ltYWwgZmVldCBhcmUgbm90IG9wdGlvbmFsXG4gICAgICAgIGNvbnN0IGZlZXRTdHIgPSB2YWxpZGF0ZSgxMCwgMTYsICdkaXN0YW5jZScsIGlzVmFsaWRVRmxvYXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHBhcnNlRmxvYXQoZmVldFN0ciksIGRpc3RhbmNlVW5pdClcbiAgICAgICAga2luZCA9IHBhcnNlS2luZChsaW5lWzE2XSlcbiAgICAgICAgZXhjbHVkZURpc3RhbmNlID0gbGluZVsxN10gPT09ICcqJyB8fCBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICAgIGlzU3BsYXkgPSBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kICE9PSBGcmNzU2hvdEtpbmQuTm9ybWFsKSB7XG4gICAgICAgIHZhbGlkYXRlKDMwLCAzNSwgJ3ZlcnRpY2FsLWRpc3RhbmNlJywgaXNWYWxpZEZsb2F0KVxuICAgICAgfVxuXG4gICAgICAvLyBjb252ZXJ0IGhvcml6b250YWwgYW5kIGRpYWdvbmFsIHNob3RzIHRvIHN0YW5kYXJkXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgaW5jRnMgaXMgdGhlIHZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIHN0YXRpb25zXG4gICAgICAvLyBmb3J0dW5hdGVseSBpdCBhcHBlYXJzIHdlIGNhbiBhbHdheXMgY291bnQgb24gaW5jRnMgYmVpbmcgc3BlY2lmaWVkXG4gICAgICAvLyBhbmQgaW5jQnMgbm90IGJlaW5nIHNwZWNpZmllZCBmb3IgdGhlc2UgdHlwZXMgb2Ygc2hvdHNcbiAgICAgIGlmIChraW5kID09PSBGcmNzU2hvdEtpbmQuSG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBkaXN0YW5jZSBpcyBob3Jpem9udGFsIG9mZnNldCBhbmQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGhvcml6b250YWxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgIGNvbnN0IGggPSBob3Jpem9udGFsRGlzdGFuY2UuZ2V0KGRpc3RhbmNlVW5pdClcbiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoaW5jRnNTdHIpXG4gICAgICAgIHZlcnRpY2FsRGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIodiwgZGlzdGFuY2VVbml0KVxuICAgICAgICBkaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcihNYXRoLnNxcnQoaCAqIGggKyB2ICogdiksIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gQW5nbGUuYXRhbjIoXG4gICAgICAgICAgdmVydGljYWxEaXN0YW5jZSxcbiAgICAgICAgICBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgICAgKVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gRnJjc1Nob3RLaW5kLkRpYWdvbmFsKSB7XG4gICAgICAgIC8vIGRpc3RhbmNlIGlzIGFzIHVzdWFsLCBidXQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZS5nZXQoZGlzdGFuY2VVbml0KVxuICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChpbmNGc1N0cilcbiAgICAgICAgdmVydGljYWxEaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcih2LCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IEFuZ2xlLmFzaW4odiAvIGQpXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzMCwgMzUsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzNSwgNDAsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gcGFyc2VOdW1iZXIoaW5jRnNTdHIsIGluY2xpbmF0aW9uVW5pdClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBwYXJzZU51bWJlcihpbmNCc1N0ciwgaW5jbGluYXRpb25Vbml0KVxuICAgICAgfVxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZyb250c2lnaHRBemltdXRoID0gcGFyc2VBemltdXRoKGF6bUZzU3RyLCBhemltdXRoVW5pdClcbiAgICAgIGNvbnN0IGJhY2tzaWdodEF6aW11dGggPSBwYXJzZUF6aW11dGgoYXptQnNTdHIsIGF6aW11dGhVbml0KVxuXG4gICAgICBpZiAoIWZyb250c2lnaHRJbmNsaW5hdGlvbiAmJiAhYmFja3NpZ2h0SW5jbGluYXRpb24pIHtcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gVW5pdGl6ZS5kZWdyZWVzKDApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3Q6IEZyY3NTaG90ID0ge1xuICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgdG86IHRvU3RyLnRyaW0oKSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGZyb250c2lnaHRBemltdXRoLFxuICAgICAgICBiYWNrc2lnaHRBemltdXRoLFxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICB0b0xydWRzOiB7XG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICByaWdodCxcbiAgICAgICAgICB1cCxcbiAgICAgICAgICBkb3duLFxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRGlzdGFuY2UsXG4gICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgIH1cbiAgICAgIGlmIChpc1NwbGF5KSBzaG90LmlzU3BsYXkgPSB0cnVlXG4gICAgICBpZiAoZnJvbUxydWRzKSBzaG90LmZyb21McnVkcyA9IGZyb21McnVkc1xuICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSkgc2hvdC5ob3Jpem9udGFsRGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgIGlmICh2ZXJ0aWNhbERpc3RhbmNlKSBzaG90LnZlcnRpY2FsRGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlXG4gICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXZlLFxuICAgIGxvY2F0aW9uLFxuICAgIHRyaXBzLFxuICAgIGVycm9ycyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFRQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQSxTQUFTRyxXQUFXQSxDQUNsQkMsQ0FBUyxFQUNUQyxJQUFhLEVBQ2E7RUFDMUIsTUFBTUMsS0FBSyxHQUFHQyxVQUFVLENBQUNILENBQUMsQ0FBQztFQUMzQixJQUFJSSxLQUFLLENBQUNGLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUM3QixPQUFPLElBQUlHLHdCQUFjLENBQUNILEtBQUssRUFBRUQsSUFBSSxDQUFDO0FBQ3hDO0FBRUEsU0FBU0ssWUFBWUEsQ0FDbkJOLENBQVMsRUFDVEMsSUFBaUIsRUFDYTtFQUM5QixNQUFNTSxNQUFNLEdBQUdSLFdBQVcsQ0FBQ0MsQ0FBQyxFQUFFQyxJQUFJLENBQUM7RUFDbkMsT0FBTyxDQUFBTSxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRUMsR0FBRyxDQUFDQyxlQUFLLENBQUNDLE9BQU8sQ0FBQyxNQUFLLEdBQUcsR0FBR0MsaUJBQU8sQ0FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHSCxNQUFNO0FBQ3pFO0FBRUEsU0FBU0ssU0FBU0EsQ0FBQ0Ms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
|