@rudderstack/integrations-lib 0.2.30 → 0.2.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/build/constants.d.ts +5 -64
  2. package/build/constants.d.ts.map +1 -1
  3. package/build/constants.js +1 -1
  4. package/build/logger.d.ts +1 -1
  5. package/build/logger.d.ts.map +1 -1
  6. package/build/logger.js +1 -1
  7. package/build/sdks/googleAdsRestAPI/googleAds.d.ts +2 -2
  8. package/build/sdks/googleAdsRestAPI/googleAds.d.ts.map +1 -1
  9. package/build/sdks/googleAdsRestAPI/googleAds.js +2 -2
  10. package/build/sdks/sfmc/index.d.ts +1 -1
  11. package/build/sdks/sfmc/index.d.ts.map +1 -1
  12. package/build/sdks/sfmc/index.js +11 -3
  13. package/build/sdks/sfmc/type.d.ts +5 -0
  14. package/build/sdks/sfmc/type.d.ts.map +1 -1
  15. package/build/sdks/sfmc/type.js +1 -1
  16. package/build/sdks/sfmc/utils.d.ts +6 -5
  17. package/build/sdks/sfmc/utils.d.ts.map +1 -1
  18. package/build/sdks/sfmc/utils.js +6 -6
  19. package/build/sdks/zoho/types.d.ts +2 -20
  20. package/build/sdks/zoho/types.d.ts.map +1 -1
  21. package/build/sdks/zoho/types.js +1 -1
  22. package/build/utils/misc.d.ts +7 -7
  23. package/build/utils/misc.d.ts.map +1 -1
  24. package/build/utils/misc.js +1 -1
  25. package/build/utils/request.d.ts +8 -1
  26. package/build/utils/request.d.ts.map +1 -1
  27. package/build/utils/request.js +1 -1
  28. package/package.json +2 -1
  29. package/build/lib/set-value/set-value.test.d.ts +0 -2
  30. package/build/lib/set-value/set-value.test.d.ts.map +0 -1
  31. package/build/lib/set-value/set-value.test.js +0 -105
  32. package/build/network/clients/axios_client.test.d.ts +0 -2
  33. package/build/network/clients/axios_client.test.d.ts.map +0 -1
  34. package/build/network/clients/axios_client.test.js +0 -276
  35. package/build/network/factory.test.d.ts +0 -2
  36. package/build/network/factory.test.d.ts.map +0 -1
  37. package/build/network/factory.test.js +0 -51
  38. package/build/sdks/customerio_audience/index.test.d.ts +0 -2
  39. package/build/sdks/customerio_audience/index.test.d.ts.map +0 -1
  40. package/build/sdks/customerio_audience/index.test.js +0 -121
  41. package/build/sdks/googleAdsRestAPI/googleAds.test.d.ts +0 -2
  42. package/build/sdks/googleAdsRestAPI/googleAds.test.d.ts.map +0 -1
  43. package/build/sdks/googleAdsRestAPI/googleAds.test.js +0 -771
  44. package/build/sdks/sfmc/index.test.d.ts +0 -2
  45. package/build/sdks/sfmc/index.test.d.ts.map +0 -1
  46. package/build/sdks/sfmc/index.test.js +0 -751
  47. package/build/sdks/sfmc/utils.test.d.ts +0 -2
  48. package/build/sdks/sfmc/utils.test.d.ts.map +0 -1
  49. package/build/sdks/sfmc/utils.test.js +0 -32
  50. package/build/sdks/zoho/zoho.test.d.ts +0 -2
  51. package/build/sdks/zoho/zoho.test.d.ts.map +0 -1
  52. package/build/sdks/zoho/zoho.test.js +0 -472
  53. package/build/structured-logger.test.d.ts +0 -2
  54. package/build/structured-logger.test.d.ts.map +0 -1
  55. package/build/structured-logger.test.js +0 -93
  56. package/build/utils/json-schema-generator.test.d.ts +0 -2
  57. package/build/utils/json-schema-generator.test.d.ts.map +0 -1
  58. package/build/utils/json-schema-generator.test.js +0 -368
  59. package/build/utils/misc.test.d.ts +0 -2
  60. package/build/utils/misc.test.d.ts.map +0 -1
  61. package/build/utils/misc.test.js +0 -2260
  62. package/build/utils/request.test.d.ts +0 -2
  63. package/build/utils/request.test.d.ts.map +0 -1
  64. package/build/utils/request.test.js +0 -72
  65. package/build/utils/tests.test.d.ts +0 -2
  66. package/build/utils/tests.test.d.ts.map +0 -1
  67. package/build/utils/tests.test.js +0 -89
  68. package/build/utils/zod.test.d.ts +0 -2
  69. package/build/utils/zod.test.d.ts.map +0 -1
  70. package/build/utils/zod.test.js +0 -48
@@ -1,2260 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const misc_1 = require("./misc");
4
- const tests_1 = require("./tests");
5
- describe('misc', () => {
6
- describe('isDefined', () => {
7
- // Tests that the function returns true when a defined value is passed as an argument
8
- it('should return true when a defined value is passed as an argument', () => {
9
- expect((0, misc_1.isDefined)(5)).toBe(true);
10
- });
11
- // Tests that the function returns true when a non-null value is passed as an argument
12
- it('should return true when a non-null value is passed as an argument', () => {
13
- expect((0, misc_1.isDefined)('hello')).toBe(true);
14
- });
15
- // Tests that the function returns true when an empty string is passed as an argument
16
- it('should return true when an empty string is passed as an argument', () => {
17
- expect((0, misc_1.isDefined)('')).toBe(true);
18
- });
19
- // Tests that the function returns true when a number is passed as an argument
20
- it('should return true when a number is passed as an argument', () => {
21
- expect((0, misc_1.isDefined)(10)).toBe(true);
22
- });
23
- // Tests that the function returns true when a boolean is passed as an argument
24
- it('should return true when a boolean is passed as an argument', () => {
25
- expect((0, misc_1.isDefined)(true)).toBe(true);
26
- });
27
- // Tests that the function returns false when an undefined value is passed as an argument
28
- it('should return false when an undefined value is passed as an argument', () => {
29
- expect((0, misc_1.isDefined)(undefined)).toBe(false);
30
- });
31
- // Tests that the function returns true when null is passed as an argument
32
- it('should return true when null is passed as an argument', () => {
33
- expect((0, misc_1.isDefined)(null)).toBe(true);
34
- });
35
- // Tests that the function returns true when an empty object is passed as an argument
36
- it('should return true when an empty object is passed as an argument', () => {
37
- expect((0, misc_1.isDefined)({})).toBe(true);
38
- });
39
- // Tests that the function returns true when an empty array is passed as an argument
40
- it('should return true when an empty array is passed as an argument', () => {
41
- expect((0, misc_1.isDefined)([])).toBe(true);
42
- });
43
- // Tests that the function returns true when NaN is passed as an argument
44
- it('should return true when NaN is passed as an argument', () => {
45
- expect((0, misc_1.isDefined)(NaN)).toBe(true);
46
- });
47
- // Tests that the function returns true when a function is passed as an argument
48
- it('should return true when a function is passed as an argument', () => {
49
- expect((0, misc_1.isDefined)(() => { })).toBe(true);
50
- });
51
- // Tests that the function returns true when a symbol is passed as an argument
52
- it('should return true when a symbol is passed as an argument', () => {
53
- expect((0, misc_1.isDefined)(Symbol())).toBe(true);
54
- });
55
- // To verify that the function returns true when an empty Map object is passed as an argument
56
- it('should return true when an empty Map object is passed as an argument', () => {
57
- const map = new Map();
58
- expect((0, misc_1.isDefined)(map)).toBe(true);
59
- });
60
- // The objective of this test is to verify that the function returns true when an empty Set object is passed as an argument.
61
- it('should return true when an empty Set object is passed as an argument', () => {
62
- const setObj = new Set();
63
- expect((0, misc_1.isDefined)(setObj)).toBe(true);
64
- });
65
- // The objective of this test is to verify that the function returns true when an empty WeakMap object is passed as an argument.
66
- it('should return true when an empty WeakMap object is passed as an argument', () => {
67
- const emptyWeakMap = new WeakMap();
68
- expect((0, misc_1.isDefined)(emptyWeakMap)).toBe(true);
69
- });
70
- });
71
- describe('isNotEmpty', () => {
72
- // Tests that isNotEmpty returns true for non-empty arrays
73
- it('should return true when the input is a non-empty array', () => {
74
- const result = (0, misc_1.isNotEmpty)([1, 2, 3]);
75
- expect(result).toBe(true);
76
- });
77
- // Tests that isNotEmpty returns false for empty arrays
78
- it('should return false when the input is an empty array', () => {
79
- const result = (0, misc_1.isNotEmpty)([]);
80
- expect(result).toBe(false);
81
- });
82
- // Tests that isNotEmpty returns true for non-empty objects
83
- it('should return true when the input is a non-empty object', () => {
84
- const result = (0, misc_1.isNotEmpty)({ key: 'value' });
85
- expect(result).toBe(true);
86
- });
87
- // Tests that isNotEmpty returns false for empty objects
88
- it('should return false when the input is an empty object', () => {
89
- const result = (0, misc_1.isNotEmpty)({});
90
- expect(result).toBe(false);
91
- });
92
- // Tests that isNotEmpty returns true for non-empty strings
93
- it('should return true when the input is a non-empty string', () => {
94
- const result = (0, misc_1.isNotEmpty)('hello');
95
- expect(result).toBe(true);
96
- });
97
- // Tests that isNotEmpty returns false for empty strings
98
- it('should return false when the input is an empty string', () => {
99
- const result = (0, misc_1.isNotEmpty)('');
100
- expect(result).toBe(false);
101
- });
102
- // Tests that isNotEmpty returns false for non-zero numbers
103
- it('should return false when the input is a non-zero number', () => {
104
- const result = (0, misc_1.isNotEmpty)(42);
105
- expect(result).toBe(false);
106
- });
107
- // Tests that isNotEmpty returns false for zero
108
- it('should return false when the input is zero', () => {
109
- const result = (0, misc_1.isNotEmpty)(0);
110
- expect(result).toBe(false);
111
- });
112
- // Tests that isNotEmpty returns false for null
113
- it('should return false when the input is null', () => {
114
- const result = (0, misc_1.isNotEmpty)(null);
115
- expect(result).toBe(false);
116
- });
117
- // Tests that isNotEmpty returns false for undefined
118
- it('should return false when the input is undefined', () => {
119
- const result = (0, misc_1.isNotEmpty)(undefined);
120
- expect(result).toBe(false);
121
- });
122
- // Tests that isNotEmpty returns false for NaN
123
- it('should return false when the input is NaN', () => {
124
- const result = (0, misc_1.isNotEmpty)(NaN);
125
- expect(result).toBe(false);
126
- });
127
- // Tests that isNotEmpty returns false for false boolean
128
- it('should return false when the input is false', () => {
129
- const result = (0, misc_1.isNotEmpty)(false);
130
- expect(result).toBe(false);
131
- });
132
- // Tests that isNotEmpty returns false for true boolean
133
- it('should return false when the input is a true boolean', () => {
134
- const result = (0, misc_1.isNotEmpty)(true);
135
- expect(result).toBe(false);
136
- });
137
- });
138
- describe('isNotNull', () => {
139
- // Tests that isNotNull returns true when a non-null value is passed
140
- it('should return true when a non-null value is passed', () => {
141
- expect((0, misc_1.isNotNull)('test')).toBe(true);
142
- });
143
- // Tests that isNotNull returns true when a truthy value is passed
144
- it('should return true when a truthy value is passed', () => {
145
- expect((0, misc_1.isNotNull)(true)).toBe(true);
146
- });
147
- // Tests that isNotNull returns true when an empty string is passed
148
- it('should return true when an empty string is passed', () => {
149
- expect((0, misc_1.isNotNull)('')).toBe(true);
150
- });
151
- // Tests that isNotNull returns true when a number is passed
152
- it('should return true when a number is passed', () => {
153
- expect((0, misc_1.isNotNull)(123)).toBe(true);
154
- });
155
- // Tests that isNotNull returns true when a boolean value is passed
156
- it('should return true when a boolean value is passed', () => {
157
- expect((0, misc_1.isNotNull)(true)).toBe(true);
158
- });
159
- // Tests that isNotNull returns false when null is passed
160
- it('should return false when null is passed', () => {
161
- expect((0, misc_1.isNotNull)(null)).toBe(false);
162
- });
163
- // Tests that isNotNull returns false when undefined is passed
164
- it('should return false when undefined is passed', () => {
165
- expect((0, misc_1.isNotNull)(undefined)).toBe(false);
166
- });
167
- // Tests that isNotNull returns true when an empty object is passed
168
- it('should return true when an empty object is passed', () => {
169
- expect((0, misc_1.isNotNull)({})).toBe(true);
170
- });
171
- // Tests that isNotNull returns true when an empty array is passed
172
- it('should return true when an empty array is passed', () => {
173
- expect((0, misc_1.isNotNull)([])).toBe(true);
174
- });
175
- // Tests that isNotNull returns true when a function is passed
176
- it('should return true when a function is passed', () => {
177
- expect((0, misc_1.isNotNull)(() => { })).toBe(true);
178
- });
179
- // Tests that isNotNull returns true when NaN is passed
180
- it('should return true when NaN is passed', () => {
181
- expect((0, misc_1.isNotNull)(NaN)).toBe(true);
182
- });
183
- // Tests that isNotNull returns true when a symbol is passed
184
- it('should return true when a symbol is passed', () => {
185
- expect((0, misc_1.isNotNull)(Symbol())).toBe(true);
186
- });
187
- // Tests that isNotNull returns true when a function is passed
188
- it('should return true when a function is passed', () => {
189
- expect((0, misc_1.isNotNull)(() => { })).toBe(true);
190
- });
191
- // Tests that isNotNull returns true when NaN is passed
192
- it('should return true when NaN is passed', () => {
193
- expect((0, misc_1.isNotNull)(NaN)).toBe(true);
194
- });
195
- // Tests that isNotNull returns true when a symbol is passed
196
- it('should return true when a symbol is passed', () => {
197
- const symbol = Symbol();
198
- expect((0, misc_1.isNotNull)(symbol)).toBe(true);
199
- });
200
- });
201
- describe('isDefinedAndNotNull', () => {
202
- // Tests that the function returns true when a defined and not null value is passed as an argument
203
- it('should return true when a defined and not null value is passed as an argument', () => {
204
- const result = (0, misc_1.isDefinedAndNotNull)('test');
205
- expect(result).toBe(true);
206
- });
207
- // Tests that the function returns true when a string value is passed as an argument
208
- it('should return true when a string value is passed as an argument', () => {
209
- const result = (0, misc_1.isDefinedAndNotNull)('test');
210
- expect(result).toBe(true);
211
- });
212
- // Tests that the function returns true when a number value is passed as an argument
213
- it('should return true when a number value is passed as an argument', () => {
214
- const result = (0, misc_1.isDefinedAndNotNull)(123);
215
- expect(result).toBe(true);
216
- });
217
- // Tests that the function returns true when a boolean value is passed as an argument
218
- it('should return true when a boolean value is passed as an argument', () => {
219
- const result = (0, misc_1.isDefinedAndNotNull)(true);
220
- expect(result).toBe(true);
221
- });
222
- // Tests that the function returns true when an object value is passed as an argument
223
- it('should return true when an object value is passed as an argument', () => {
224
- const result = (0, misc_1.isDefinedAndNotNull)({ key: 'value' });
225
- expect(result).toBe(true);
226
- });
227
- // Tests that the function returns true when an array value is passed as an argument
228
- it('should return true when an array value is passed as an argument', () => {
229
- const result = (0, misc_1.isDefinedAndNotNull)([1, 2, 3]);
230
- expect(result).toBe(true);
231
- });
232
- // Tests that the function returns true when an empty string value is passed as an argument
233
- it('should return true when an empty string value is passed as an argument', () => {
234
- const result = (0, misc_1.isDefinedAndNotNull)('');
235
- expect(result).toBe(true);
236
- });
237
- // Tests that the function returns true when an empty array value is passed as an argument
238
- it('should return true when an empty array value is passed as an argument', () => {
239
- const result = (0, misc_1.isDefinedAndNotNull)([]);
240
- expect(result).toBe(true);
241
- });
242
- // Tests that the function returns true when an empty object value is passed as an argument
243
- it('should return true when an empty object value is passed as an argument', () => {
244
- const result = (0, misc_1.isDefinedAndNotNull)({});
245
- expect(result).toBe(true);
246
- });
247
- // Tests that the function returns false when undefined is passed as an argument
248
- it('should return false when undefined is passed as an argument', () => {
249
- const result = (0, misc_1.isDefinedAndNotNull)(undefined);
250
- expect(result).toBe(false);
251
- });
252
- // Tests that the function returns false when null is passed as an argument
253
- it('should return false when null is passed as an argument', () => {
254
- const result = (0, misc_1.isDefinedAndNotNull)(null);
255
- expect(result).toBe(false);
256
- });
257
- // Tests that the function returns true when NaN is passed as an argument
258
- it('should return true when NaN is passed as an argument', () => {
259
- const result = (0, misc_1.isDefinedAndNotNull)(NaN);
260
- expect(result).toBe(true);
261
- });
262
- });
263
- describe('isDefinedAndNotNullAndNotEmpty', () => {
264
- // Tests that the function returns true when passed a non-empty string
265
- it('should return true when passed a non-empty string', () => {
266
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)('hello')).toBe(true);
267
- });
268
- // Tests that the function returns true when passed a non-empty object
269
- it('should return true when passed a non-empty object', () => {
270
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)({ name: 'John', age: 25 })).toBe(true);
271
- });
272
- // Tests that the function returns true when passed a non-empty array
273
- it('should return true when passed a non-empty array', () => {
274
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)([1, 2, 3])).toBe(true);
275
- });
276
- // Tests that the function returns false when passed a boolean value
277
- it('should return false when passed a boolean value', () => {
278
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(true)).toBe(false);
279
- });
280
- // Tests that the function returns false when passed a number value
281
- it('should return false when passed a number value', () => {
282
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(42)).toBe(false);
283
- });
284
- // Tests that the function returns false when passed an empty string
285
- it('should return false when passed an empty string', () => {
286
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)('')).toBe(false);
287
- });
288
- // Tests that the function returns false when passed an empty object
289
- it('should return false when passed an empty object', () => {
290
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)({})).toBe(false);
291
- });
292
- // Tests that the function returns false when passed an empty array
293
- it('should return false when passed an empty array', () => {
294
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)([])).toBe(false);
295
- });
296
- // Tests that the function returns false when passed null
297
- it('should return false when passed null', () => {
298
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(null)).toBe(false);
299
- });
300
- // Tests that the function returns false when passed undefined
301
- it('should return false when passed undefined', () => {
302
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(undefined)).toBe(false);
303
- });
304
- // Tests that the function returns true when passed a string with only whitespace characters
305
- it('should return true when passed a string with only whitespace characters', () => {
306
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(' ')).toBe(true);
307
- });
308
- // Tests that the function returns true when passed an object with only null or undefined values
309
- it('should return true when passed an object with only null or undefined values', () => {
310
- expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)({ prop1: null, prop2: undefined })).toBe(true);
311
- });
312
- });
313
- describe('isBlank', () => {
314
- // Tests that isBlank returns true for an empty string
315
- it('should return true when value is an empty string', () => {
316
- expect((0, misc_1.isBlank)('')).toBe(true);
317
- });
318
- // Tests that isBlank returns true for an empty array
319
- it('should return true when value is an empty array', () => {
320
- expect((0, misc_1.isBlank)([])).toBe(true);
321
- });
322
- // Tests that isBlank returns false for an empty object
323
- it('should return true when value is an empty object', () => {
324
- expect((0, misc_1.isBlank)({})).toBe(false);
325
- });
326
- // Tests that isBlank returns false for a non-empty string
327
- it('should return false when value is a non-empty string', () => {
328
- expect((0, misc_1.isBlank)('hello')).toBe(false);
329
- });
330
- // Tests that isBlank returns false for a non-empty array
331
- it('should return false when value is a non-empty array', () => {
332
- expect((0, misc_1.isBlank)([1, 2, 3])).toBe(false);
333
- });
334
- // Tests that isBlank returns false for a non-empty object
335
- it('should return false when value is a non-empty object', () => {
336
- expect((0, misc_1.isBlank)({ key: 'value' })).toBe(false);
337
- });
338
- // Tests that isBlank returns true for a null value
339
- it('should return true when value is null', () => {
340
- expect((0, misc_1.isBlank)(null)).toBe(true);
341
- });
342
- // Tests that isBlank returns true for an undefined value
343
- it('should return true when value is undefined', () => {
344
- expect((0, misc_1.isBlank)(undefined)).toBe(true);
345
- });
346
- // Tests that isBlank returns false for a boolean value
347
- it('should return false when value is a boolean', () => {
348
- expect((0, misc_1.isBlank)(true)).toBe(false);
349
- expect((0, misc_1.isBlank)(false)).toBe(false);
350
- });
351
- // Tests that isBlank returns false for a number value
352
- it('should return false when value is a number', () => {
353
- expect((0, misc_1.isBlank)(123)).toBe(false);
354
- expect((0, misc_1.isBlank)(0)).toBe(false);
355
- expect((0, misc_1.isBlank)(-1)).toBe(false);
356
- });
357
- // Tests that isBlank returns false for a whitespace string
358
- it('should return false when value is a whitespace string', () => {
359
- expect((0, misc_1.isBlank)(' ')).toBe(false);
360
- expect((0, misc_1.isBlank)('\t')).toBe(false);
361
- expect((0, misc_1.isBlank)('\n')).toBe(false);
362
- });
363
- // Tests that isBlank returns false for NaN value
364
- it('should return true when value is NaN', () => {
365
- expect((0, misc_1.isBlank)(NaN)).toBe(false);
366
- });
367
- });
368
- describe('removeUndefinedValues', () => {
369
- // Tests that the function returns the same object if it is not an object
370
- it('should return the same object when the input is not an object', () => {
371
- const input = 123;
372
- const result = (0, misc_1.removeUndefinedValues)(input);
373
- expect(result).toBe(input);
374
- });
375
- // Tests that the function returns an object without undefined values if all values are defined
376
- it('should return an object without undefined values when all values are defined', () => {
377
- const input = { a: 1, b: 'hello', c: true };
378
- const result = (0, misc_1.removeUndefinedValues)(input);
379
- expect(result).toEqual(input);
380
- });
381
- // Tests that the function returns an object without undefined values if some values are defined
382
- it('should return an object without undefined values when some values are defined', () => {
383
- const input = { a: 1, b: undefined, c: true };
384
- const expected = { a: 1, c: true };
385
- const result = (0, misc_1.removeUndefinedValues)(input);
386
- expect(result).toEqual(expected);
387
- });
388
- // Tests that the function returns an empty object if the input is an empty object
389
- it('should return an empty object when the input is an empty object', () => {
390
- const input = {};
391
- const result = (0, misc_1.removeUndefinedValues)(input);
392
- expect(result).toEqual({});
393
- });
394
- // Tests that the function returns null if the input is null
395
- it('should return null when the input is null', () => {
396
- const input = null;
397
- const result = (0, misc_1.removeUndefinedValues)(input);
398
- expect(result).toBeNull();
399
- });
400
- // Tests that the function returns undefined if the input is undefined
401
- it('should return undefined when the input is undefined', () => {
402
- const input = undefined;
403
- const result = (0, misc_1.removeUndefinedValues)(input);
404
- expect(result).toBeUndefined();
405
- });
406
- // Tests that the function returns an object without undefined values if some nested values are undefined
407
- it('should return an object without undefined values when some nested values are undefined', () => {
408
- const input = { a: { b: 1, c: undefined }, d: 2 };
409
- const expected = { a: { b: 1 }, d: 2 };
410
- const result = (0, misc_1.removeUndefinedValues)(input);
411
- expect(result).toEqual(expected);
412
- });
413
- // Tests that the function returns an object without undefined values if some nested values are null
414
- it('should return an object without undefined values when some nested values are null', () => {
415
- const input = { a: { b: 1, c: null }, d: 2 };
416
- const expected = { a: { b: 1, c: null }, d: 2 };
417
- const result = (0, misc_1.removeUndefinedValues)(input);
418
- expect(result).toEqual(expected);
419
- });
420
- // Tests that the function returns an object without undefined values if some nested values are empty strings
421
- it('should return an object without undefined values when some nested values are empty strings', () => {
422
- const input = { a: { b: 1, c: '' }, d: 2 };
423
- const expected = { a: { b: 1, c: '' }, d: 2 };
424
- const result = (0, misc_1.removeUndefinedValues)(input);
425
- expect(result).toEqual(expected);
426
- });
427
- // Tests that the function returns an object without undefined values if some nested values are false
428
- it('should return an object without undefined values when some nested values are false', () => {
429
- const input = { a: { b: 1, c: false }, d: 2 };
430
- const expected = { a: { b: 1, c: false }, d: 2 };
431
- const result = (0, misc_1.removeUndefinedValues)(input);
432
- expect(result).toEqual(expected);
433
- });
434
- // Tests that the function returns an object without undefined values if some nested values are zero
435
- it('should return an object without undefined values when some nested values are zero', () => {
436
- const input = { a: { b: 1, c: 0 }, d: 2 };
437
- const expected = { a: { b: 1, c: 0 }, d: 2 };
438
- const result = (0, misc_1.removeUndefinedValues)(input);
439
- expect(result).toEqual(expected);
440
- });
441
- // Tests that the function returns an object without undefined values if some nested values are NaN
442
- it('should return an object without undefined values when some nested values are NaN', () => {
443
- const input = { a: { b: 1, c: NaN }, d: 2 };
444
- const expected = { a: { b: 1, c: NaN }, d: 2 };
445
- const result = (0, misc_1.removeUndefinedValues)(input);
446
- expect(result).toEqual(expected);
447
- });
448
- });
449
- describe('removeNullValues', () => {
450
- // Tests that the function correctly handles an empty object as input
451
- it('should return an empty object when input is an empty object', () => {
452
- const input = {};
453
- const expected = {};
454
- const result = (0, misc_1.removeNullValues)(input);
455
- expect(result).toEqual(expected);
456
- });
457
- // Tests that the function correctly handles an object with no null values
458
- it('should return the same object when input has no null values', () => {
459
- const input = { a: 1, b: 'hello', c: [1, 2, 3] };
460
- const expected = { a: 1, b: 'hello', c: [1, 2, 3] };
461
- const result = (0, misc_1.removeNullValues)(input);
462
- expect(result).toEqual(expected);
463
- });
464
- // Tests that the function correctly handles null as input
465
- it('should return null when input is null', () => {
466
- const input = null;
467
- const expected = null;
468
- const result = (0, misc_1.removeNullValues)(input);
469
- expect(result).toEqual(expected);
470
- });
471
- // Tests that the function correctly handles undefined as input
472
- it('should return undefined when input is undefined', () => {
473
- const input = undefined;
474
- const expected = undefined;
475
- const result = (0, misc_1.removeNullValues)(input);
476
- expect(result).toEqual(expected);
477
- });
478
- // Tests that the function correctly handles a string as input
479
- it('should return the same string when input is a string', () => {
480
- const input = 'hello';
481
- const expected = 'hello';
482
- const result = (0, misc_1.removeNullValues)(input);
483
- expect(result).toEqual(expected);
484
- });
485
- // Tests that the function correctly handles a number as input
486
- it('should return the same number when input is a number', () => {
487
- const input = 123;
488
- const expected = 123;
489
- const result = (0, misc_1.removeNullValues)(input);
490
- expect(result).toEqual(expected);
491
- });
492
- // Tests that the function correctly handles an array as input
493
- it('should return the same array when input is an array', () => {
494
- const input = [1, 2, 3];
495
- const expected = { '0': 1, '1': 2, '2': 3 };
496
- const result = (0, misc_1.removeNullValues)(input);
497
- expect(result).toEqual(expected);
498
- });
499
- // Tests that the function correctly handles an object with only null values
500
- it('should return an empty object when input has only null values', () => {
501
- const input = { a: null, b: null, c: null };
502
- const expected = {};
503
- const result = (0, misc_1.removeNullValues)(input);
504
- expect(result).toEqual(expected);
505
- });
506
- // Tests that the function correctly handles an object with nested null values
507
- it('should remove nested null values from the object', () => {
508
- const input = { a: { b: null }, c: { d: { e: null } } };
509
- const expected = { a: {}, c: { d: {} } };
510
- const result = (0, misc_1.removeNullValues)(input);
511
- expect(result).not.toEqual(expected);
512
- });
513
- // Tests that the function correctly handles an object with nested non-null values
514
- it('should return the same object when input has nested non-null values', () => {
515
- const input = { a: { b: 1 }, c: { d: { e: 'hello' } } };
516
- const expected = { a: { b: 1 }, c: { d: { e: 'hello' } } };
517
- const result = (0, misc_1.removeNullValues)(input);
518
- expect(result).toEqual(expected);
519
- });
520
- // Tests that the function correctly handles an object with mixed nested null and non-null values
521
- it('should remove nested null values and keep non-null values in the object', () => {
522
- const input = { a: { b: null, c: 1 }, d: { e: null, f: 'hello' } };
523
- const expected = { a: { c: 1 }, d: { f: 'hello' } };
524
- const result = (0, misc_1.removeNullValues)(input);
525
- expect(result).not.toEqual(expected);
526
- });
527
- // Tests that the function correctly handles an object with null values and falsy non-null values
528
- it('should remove null values and keep falsy non-null values in the object', () => {
529
- const input = { a: null, b: false, c: 0, d: '' };
530
- const expected = { b: false, c: 0, d: '' };
531
- const result = (0, misc_1.removeNullValues)(input);
532
- expect(result).toEqual(expected);
533
- });
534
- });
535
- describe('removeUndefinedAndNullValues', () => {
536
- // Tests that the function returns the same object when passed an object with defined and not null values
537
- it('should return the same object when passed an object with defined and not null values', () => {
538
- const obj = { a: 1, b: 'test', c: true };
539
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(obj);
540
- });
541
- // Tests that the function returns the object without null values when passed an object with defined and null values
542
- it('should return the object without null values when passed an object with defined and null values', () => {
543
- const obj = { a: 1, b: null, c: 'test', d: null };
544
- const expected = { a: 1, c: 'test' };
545
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(expected);
546
- });
547
- // Tests that the function returns an empty object when passed an empty object
548
- it('should return an empty object when passed an empty object', () => {
549
- const obj = {};
550
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual({});
551
- });
552
- // Tests that the function returns the object without undefined and null values when passed an object with undefined and null values
553
- it('should return the object without undefined and null values when passed an object with undefined and null values', () => {
554
- const obj = { a: 1, b: undefined, c: 'test', d: null };
555
- const expected = { a: 1, c: 'test' };
556
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(expected);
557
- });
558
- // Tests that the function returns the same value when passed a non-object value
559
- it('should return the same value when passed a non-object value', () => {
560
- const value = 123;
561
- expect((0, misc_1.removeUndefinedAndNullValues)(value)).toEqual(value);
562
- });
563
- // Tests that the function returns the same object with nested defined and not null values when passed an object with nested properties containing defined and not null values
564
- it('should return the same object with nested defined and not null values when passed an object with nested properties containing defined and not null values', () => {
565
- const obj = { a: 1, b: { c: 'test', d: true }, e: 'test' };
566
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(obj);
567
- });
568
- // Tests that the function returns the same object with properties containing defined and not null values when passed an object with properties containing defined and not null values
569
- it('should return the same object with properties containing defined and not null values when passed an object with properties containing defined and not null values', () => {
570
- const obj = { a: 1, b: 'test', c: true };
571
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(obj);
572
- });
573
- // Tests that the function returns the object without null values when passed an object with properties containing defined and null values
574
- it('should return the object without null values when passed an object with properties containing defined and null values', () => {
575
- const obj = { a: 1, b: null, c: 'test', d: null };
576
- const expected = { a: 1, c: 'test' };
577
- expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(expected);
578
- });
579
- });
580
- describe('removeUndefinedAndNullAndEmptyValues', () => {
581
- // TODO: NEED TO FIX THIS TESTS
582
- // // Tests that the function returns the same object when all values are defined, not null, and not empty
583
- // it('should return the same object when all values are defined, not null, and not empty', () => {
584
- // const obj = {
585
- // prop1: 'value1',
586
- // prop2: 123,
587
- // prop3: [1, 2, 3],
588
- // prop4: { nestedProp: 'nestedValue' },
589
- // };
590
- // expect(removeUndefinedAndNullAndEmptyValues(obj)).toEqual(obj);
591
- // });
592
- // // Tests that the function returns the same object when all values are defined and not null
593
- // it('should return the same object when all values are defined and not null', () => {
594
- // const obj = {
595
- // prop1: 'value1',
596
- // prop2: 123,
597
- // prop3: [1, 2, 3],
598
- // prop4: { nestedProp: 'nestedValue' },
599
- // };
600
- // expect(removeUndefinedAndNullAndEmptyValues(obj)).toEqual(obj);
601
- // });
602
- // Tests that the function returns an empty object when the input is an empty object
603
- it('should return an empty object when the input is an empty object', () => {
604
- const obj = {};
605
- expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toEqual({});
606
- });
607
- // Tests that the function returns null when the input is null
608
- it('should return null when the input is null', () => {
609
- const obj = null;
610
- expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toBeNull();
611
- });
612
- // Tests that the function returns undefined when the input is undefined
613
- it('should return undefined when the input is undefined', () => {
614
- const obj = undefined;
615
- expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toBeUndefined();
616
- });
617
- // Tests that the function returns an empty object when the input object has only empty values
618
- it('should return an empty object when the input object has only empty values', () => {
619
- const obj = {
620
- prop1: '',
621
- prop2: ' ',
622
- prop3: [],
623
- prop4: {},
624
- };
625
- expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toEqual({ prop2: ' ' });
626
- });
627
- // Tests that the function returns a new object and does not modify the original object
628
- it('should return a new object and not modify the original object', () => {
629
- const obj = {
630
- prop1: 'value1',
631
- prop2: null,
632
- prop3: '',
633
- };
634
- const result = (0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj);
635
- expect(result).toEqual({ prop1: 'value1' });
636
- expect(result).not.toBe(obj);
637
- });
638
- });
639
- describe('flattenMap', () => {
640
- // Tests that the function returns the input if it is not an array or object
641
- it('should return the input when it is not an array or object', () => {
642
- const input = 5;
643
- const result = (0, misc_1.flattenMap)(input);
644
- expect(result).toBe(input);
645
- });
646
- // Tests that the function returns a flattened array if the input is an array
647
- // Only 1 level of flattening is performed
648
- it('should return a flattened array when the input is an array', () => {
649
- const input = [1, [2, 3], [4, [5, 6]]];
650
- const result = (0, misc_1.flattenMap)(input);
651
- expect(result).toEqual([1, 2, 3, 4, [5, 6]]);
652
- });
653
- // Tests that the function returns a flattened array if the input is an object with array values
654
- it('should return a flattened array when the input is an object with array values', () => {
655
- const input = { a: [1, 2], b: [3, 4] };
656
- const result = (0, misc_1.flattenMap)(input);
657
- expect(result).toEqual([1, 2, 3, 4]);
658
- });
659
- // Tests that the function returns an empty array if the input is an empty array
660
- it('should return an empty array when the input is an empty array', () => {
661
- const input = [];
662
- const result = (0, misc_1.flattenMap)(input);
663
- expect(result).toEqual([]);
664
- });
665
- // Tests that the function returns an empty collection if the input is an empty object
666
- it('should return an empty collection when the input is an empty object', () => {
667
- const input = {};
668
- const result = (0, misc_1.flattenMap)(input);
669
- expect(result).toEqual([]);
670
- });
671
- // Tests that the function returns an array with null value if the input is an array with null value
672
- it('should return an array with null value when the input is an array with null value', () => {
673
- const input = [null];
674
- const result = (0, misc_1.flattenMap)(input);
675
- expect(result).toEqual([null]);
676
- });
677
- // Tests that the function returns an object with null value if the input is an object with null value
678
- it('should return an object with null value when the input is an object with null value', () => {
679
- const input = { a: null };
680
- const result = (0, misc_1.flattenMap)(input);
681
- expect(result).toEqual([null]);
682
- });
683
- // Tests that the function returns an array with undefined value if the input is an array with undefined value
684
- it('should return an array with undefined value when the input is an array with undefined value', () => {
685
- const input = [undefined];
686
- const result = (0, misc_1.flattenMap)(input);
687
- expect(result).toEqual([undefined]);
688
- });
689
- // Tests that the function returns an object with undefined value if the input is an object with undefined value
690
- it('should return a collection with undefined value when the input is an object with undefined value', () => {
691
- const input = { a: undefined };
692
- const result = (0, misc_1.flattenMap)(input);
693
- expect(result).toEqual([undefined]);
694
- });
695
- // Tests that the function returns an array with NaN value if the input is an array with NaN value
696
- it('should return an array with NaN value when the input is an array with NaN value', () => {
697
- const input = [NaN];
698
- const result = (0, misc_1.flattenMap)(input);
699
- expect(result).toEqual([NaN]);
700
- });
701
- // Tests that the function returns an object with NaN value if the input is an object with NaN value
702
- it('should return a collection with NaN value when the input is an object with NaN value', () => {
703
- const input = { a: NaN };
704
- const result = (0, misc_1.flattenMap)(input);
705
- expect(result).toEqual([NaN]);
706
- });
707
- // Tests that the function returns an array with empty string value if the input is an array with empty string value
708
- it('should return an array with empty string value when the input is an array with empty string value', () => {
709
- const input = [''];
710
- const result = (0, misc_1.flattenMap)(input);
711
- expect(result).toEqual(['']);
712
- });
713
- // Tests that the function returns a flattened array with values of different types if the input is an array with values of different types
714
- it('should return a flattened array with values of different types when the input is an array with values of different types', () => {
715
- const input = [1, 'two', true, { name: 'John' }];
716
- const result = (0, misc_1.flattenMap)(input);
717
- expect(result).toEqual([1, 'two', true, { name: 'John' }]);
718
- });
719
- // Tests that the function returns a flattened collection with values of different types if the input is an object with values of different types
720
- it('should return a flattened collection with values of different types when the input is an object with values of different types', () => {
721
- const input = { name: 'John', age: 25, isStudent: true, hobbies: ['reading', 'painting'] };
722
- const result = (0, misc_1.flattenMap)(input);
723
- expect(result).toEqual(['John', 25, true, 'reading', 'painting']);
724
- });
725
- // Tests that the function returns a flattened array with nested arrays and objects if the input is an array with nested arrays and objects
726
- it('should return a flattened array with nested arrays and objects when the input is an array with nested arrays and objects', () => {
727
- const input = [1, [2, [3, 4]], { name: 'John', age: 25 }];
728
- const result = (0, misc_1.flattenMap)(input);
729
- expect(result).toEqual([1, 2, [3, 4], { name: 'John', age: 25 }]);
730
- });
731
- // Tests that the function returns a flattened array with values of different types if the input is an array with values of different types
732
- it('should return a flattened array with values of different types when the input is an array with values of different types', () => {
733
- const input = [1, 'two', true, { name: 'John' }];
734
- const result = (0, misc_1.flattenMap)(input);
735
- expect(result).toEqual([1, 'two', true, { name: 'John' }]);
736
- });
737
- // Tests that the function returns a flattened collection with values of different types if the input is an object with values of different types
738
- it('should return a flattened collection with values of different types when the input is an object with values of different types', () => {
739
- const input = { name: 'John', age: 25, isStudent: true, hobbies: ['reading', 'painting'] };
740
- const result = (0, misc_1.flattenMap)(input);
741
- expect(result).toEqual(['John', 25, true, 'reading', 'painting']);
742
- });
743
- // Tests that the function returns a flattened array with nested arrays and objects if the input is an array with nested arrays and objects
744
- it('should return a flattened array with nested arrays and objects when the input is an array with nested arrays and objects', () => {
745
- const input = [1, [2, [3, 4]], { name: 'John', age: 25 }];
746
- const result = (0, misc_1.flattenMap)(input);
747
- expect(result).toEqual([1, 2, [3, 4], { name: 'John', age: 25 }]);
748
- });
749
- });
750
- describe('base64Convertor', () => {
751
- // Tests that the function correctly handles an empty string input and returns an empty base64 string
752
- it('should return an empty base64 string when the input is an empty string', () => {
753
- const input = '';
754
- const expectedOutput = '';
755
- const result = (0, misc_1.base64Convertor)(input);
756
- expect(result).toEqual(expectedOutput);
757
- });
758
- // Tests that the function correctly handles a string input with non-ASCII characters and converts it to base64 format
759
- it('should convert a string with non-ASCII characters to base64 format', () => {
760
- const input = 'こんにちは';
761
- const expectedOutput = '44GT44KT44Gr44Gh44Gv';
762
- const result = (0, misc_1.base64Convertor)(input);
763
- expect(result).toEqual(expectedOutput);
764
- });
765
- // Tests that the function correctly handles a string input with special characters and converts it to base64 format
766
- it('should convert a string with special characters to base64 format', () => {
767
- const input = '!@#$%^&*()';
768
- const expectedOutput = 'IUAjJCVeJiooKQ==';
769
- const result = (0, misc_1.base64Convertor)(input);
770
- expect(result).toEqual(expectedOutput);
771
- });
772
- // Tests that the function correctly handles a string input with whitespace characters and converts it to base64 format
773
- it('should convert a string with whitespace characters to base64 format', () => {
774
- const input = ' Hello World ';
775
- const expectedOutput = 'ICAgSGVsbG8gV29ybGQgICA=';
776
- const result = (0, misc_1.base64Convertor)(input);
777
- expect(result).toEqual(expectedOutput);
778
- });
779
- // Tests that the function correctly handles a string input with line breaks and converts it to base64 format
780
- it('should convert a string with line breaks to base64 format', () => {
781
- const input = 'Hello\nWorld';
782
- const expectedOutput = 'SGVsbG8KV29ybGQ=';
783
- const result = (0, misc_1.base64Convertor)(input);
784
- expect(result).toEqual(expectedOutput);
785
- });
786
- });
787
- describe('isValidUrl', () => {
788
- // Tests that a valid URL string returns a URL object
789
- it('should return a URL object when given a valid URL string', () => {
790
- const url = 'https://www.example.com';
791
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
792
- });
793
- // Tests that a valid URL object returns the same URL object
794
- it('should return the same URL object when given a valid URL object', () => {
795
- const url = new URL('https://www.example.com');
796
- expect((0, misc_1.isValidUrl)(url)?.toJSON()).toBe(url.toJSON());
797
- });
798
- // Tests that a URL with query parameters returns a URL object
799
- it('should return a URL object when given a URL with query parameters', () => {
800
- const url = 'https://www.example.com?param1=value1&param2=value2';
801
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
802
- });
803
- // Tests that a URL with a hash returns a URL object
804
- it('should return a URL object when given a URL with a hash', () => {
805
- const url = 'https://www.example.com#section1';
806
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
807
- });
808
- // Tests that a URL with a port returns a URL object
809
- it('should return a URL object when given a URL with a port', () => {
810
- const url = 'https://www.example.com:8080';
811
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
812
- });
813
- // Tests that a URL with a username and password returns a URL object
814
- it('should return a URL object when given a URL with a username and password', () => {
815
- const url = 'https://username:password@example.com';
816
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
817
- });
818
- // Tests that an empty string returns null
819
- it('should return null when given an empty string', () => {
820
- const url = '';
821
- expect((0, misc_1.isValidUrl)(url)).toBeNull();
822
- });
823
- // The test objective is to verify that the function 'isValidUrl' returns null when given an invalid URL string.
824
- it('should return null when given an invalid URL string', () => {
825
- const url = 'invalid-url';
826
- expect((0, misc_1.isValidUrl)(url)).toBeNull();
827
- });
828
- // Tests that an URL with a different protocol returns valid object
829
- it('should return URL object when given a URL with a different protocol', () => {
830
- const url = 'ftp://www.example.com';
831
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
832
- });
833
- // Tests that an invalid URL with an invalid port returns null
834
- it('should return null when given a URL with an invalid port', () => {
835
- const url = 'https://www.example.com:abc';
836
- expect((0, misc_1.isValidUrl)(url)).toBeNull();
837
- });
838
- // Tests that a URL with invalid username and password returns object
839
- it('should return object when given a URL with username and password', () => {
840
- const url = 'https://username:password@example.com';
841
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
842
- });
843
- // Tests that a URL with a subdomain returns URL object
844
- it('should return null when given a URL with an invalid subdomain', () => {
845
- const url = 'https://invalid.example.com';
846
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
847
- });
848
- // Tests that a valid URL string with a path returns a URL object
849
- it('should return a URL object when given a valid URL string with a path', () => {
850
- const url = 'https://www.example.com/path';
851
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
852
- });
853
- // Tests that a valid URL string with a subdomain returns a URL object
854
- it('should return a URL object when given a valid URL string with a subdomain', () => {
855
- const url = 'https://subdomain.example.com';
856
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
857
- });
858
- // Tests that a valid URL string returns a URL object
859
- it('should return a URL object when given a valid URL string', () => {
860
- const url = 'https://www.example.com';
861
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
862
- });
863
- // Tests that a valid URL string returns a URL object
864
- it('should return a URL object when given a valid URL string', () => {
865
- const url = 'https://www.example.com';
866
- expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
867
- });
868
- });
869
- describe('stripTrailingSlash', () => {
870
- // Tests that the function returns the same string if it does not end with '/'
871
- it("should return the same string when it does not end with '/'", () => {
872
- const input = 'example';
873
- const result = (0, misc_1.stripTrailingSlash)(input);
874
- expect(result).toBe(input);
875
- });
876
- // Tests that the function removes the trailing '/' if the string ends with it
877
- it("should remove the trailing '/' if the string ends with it", () => {
878
- const input = 'example/';
879
- const result = (0, misc_1.stripTrailingSlash)(input);
880
- expect(result).toBe('example');
881
- });
882
- // Tests that the function removes only one trailing '/' if the string ends with multiple
883
- it("should remove only one trailing '/' if the string ends with multiple", () => {
884
- const input = 'example//';
885
- const result = (0, misc_1.stripTrailingSlash)(input);
886
- expect(result).toBe('example/');
887
- });
888
- // Tests that the function returns an empty string if the input is an empty string
889
- it('should return an empty string if the input is an empty string', () => {
890
- const input = '';
891
- const result = (0, misc_1.stripTrailingSlash)(input);
892
- expect(result).toBe('');
893
- });
894
- // Tests that the function returns empty string if it contains only '/'
895
- it("should return empty string when it contains only '/'", () => {
896
- const input = '';
897
- const result = (0, misc_1.stripTrailingSlash)(input);
898
- expect(result).toBe(input);
899
- });
900
- // Tests that the function returns the same string if it does not end with '/'
901
- it("should return the same string when it does not end with '/'", () => {
902
- const input = 'example';
903
- const result = (0, misc_1.stripTrailingSlash)(input);
904
- expect(result).toBe(input);
905
- });
906
- // Tests that the function removes the trailing slash from a string if it exists
907
- it('should remove the trailing slash when it exists', () => {
908
- const input = 'example/';
909
- const result = (0, misc_1.stripTrailingSlash)(input);
910
- expect(result).toBe('example');
911
- });
912
- // Tests that the function removes the trailing slash from a string if it exists
913
- it('should remove the trailing slash when it exists', () => {
914
- const input = 'example/';
915
- const result = (0, misc_1.stripTrailingSlash)(input);
916
- expect(result).toBe('example');
917
- });
918
- // Tests that the function removes trailing slashes from a string
919
- it('should remove trailing slashes when they exist', () => {
920
- const input = 'example/';
921
- const result = (0, misc_1.stripTrailingSlash)(input);
922
- expect(result).toBe('example');
923
- });
924
- // Tests that the function removes the trailing slash from a string if it exists
925
- it('should remove the trailing slash when it exists', () => {
926
- const input = 'example/';
927
- const result = (0, misc_1.stripTrailingSlash)(input);
928
- expect(result).toBe('example');
929
- });
930
- // Tests that the function removes the trailing slash from a string if it ends with '/'
931
- it("should remove the trailing slash when the string ends with '/'", () => {
932
- const input = 'example/';
933
- const result = (0, misc_1.stripTrailingSlash)(input);
934
- expect(result).toBe('example');
935
- });
936
- });
937
- describe('isPrimitive', () => {
938
- // Tests that isPrimitive returns true for a primitive string
939
- it('should return true when the argument is a primitive string', () => {
940
- const result = (0, misc_1.isPrimitive)('hello');
941
- expect(result).toBe(true);
942
- });
943
- // Tests that isPrimitive returns true for a primitive number
944
- it('should return true when the argument is a primitive number', () => {
945
- const result = (0, misc_1.isPrimitive)(123);
946
- expect(result).toBe(true);
947
- });
948
- // Tests that isPrimitive returns true for a primitive boolean
949
- it('should return true when the argument is a primitive boolean', () => {
950
- const result = (0, misc_1.isPrimitive)(true);
951
- expect(result).toBe(true);
952
- });
953
- // Tests that isPrimitive returns true for null
954
- it('should return true when the argument is null', () => {
955
- const result = (0, misc_1.isPrimitive)(null);
956
- expect(result).toBe(true);
957
- });
958
- // Tests that isPrimitive returns true for undefined
959
- it('should return true when the argument is undefined', () => {
960
- const result = (0, misc_1.isPrimitive)(undefined);
961
- expect(result).toBe(true);
962
- });
963
- // Tests that isPrimitive returns false for an instance of a non-primitive wrapper class (Date)
964
- it('should return false when the argument is an instance of a non-primitive wrapper class (Date)', () => {
965
- const result = (0, misc_1.isPrimitive)(new Date());
966
- expect(result).toBe(false);
967
- });
968
- // Tests that isPrimitive returns false for an instance of a custom class
969
- it('should return false when the argument is an instance of a custom class', () => {
970
- class CustomClass {
971
- }
972
- const arg = new CustomClass();
973
- const result = (0, misc_1.isPrimitive)(arg);
974
- expect(result).toBe(false);
975
- });
976
- // Tests that isPrimitive returns false for a function with properties
977
- it('should return false when the argument is a function with properties', () => {
978
- const func = () => { };
979
- func.property = 'value';
980
- const result = (0, misc_1.isPrimitive)(func);
981
- expect(result).toBe(false);
982
- });
983
- // Tests that isPrimitive returns true for a symbol
984
- it('should return true when the argument is a symbol', () => {
985
- const result = (0, misc_1.isPrimitive)(Symbol('test'));
986
- expect(result).toBe(true);
987
- });
988
- });
989
- describe('getType', () => {
990
- // Tests that getType returns the correct type for string input
991
- it('should return string when the input is a string', () => {
992
- const input = 'hello';
993
- const result = (0, misc_1.getType)(input);
994
- expect(result).toBe('string');
995
- });
996
- // Tests that getType returns the correct type for number input
997
- it('should return number when the input is a number', () => {
998
- const input = 42;
999
- const result = (0, misc_1.getType)(input);
1000
- expect(result).toBe('number');
1001
- });
1002
- // Tests that getType returns the correct type for boolean input
1003
- it('should return boolean when the input is a boolean value', () => {
1004
- expect((0, misc_1.getType)(true)).toBe('boolean');
1005
- expect((0, misc_1.getType)(false)).toBe('boolean');
1006
- });
1007
- // Tests that getType returns 'NULL' when the input is null
1008
- it("should return 'NULL' when the input is null", () => {
1009
- const input = null;
1010
- const result = (0, misc_1.getType)(input);
1011
- expect(result).toBe('NULL');
1012
- });
1013
- // Tests that getType returns 'object' when the input is an empty object
1014
- it('should return object when the input is an empty object', () => {
1015
- const input = {};
1016
- const result = (0, misc_1.getType)(input);
1017
- expect(result).toBe('object');
1018
- });
1019
- // Tests that getType returns the correct type for function input
1020
- it('should return function when the input is a function', () => {
1021
- const input = () => { };
1022
- const result = (0, misc_1.getType)(input);
1023
- expect(result).toBe('function');
1024
- });
1025
- // Tests that getType returns the correct type for bigint input
1026
- it("should return 'bigint' when the input is a bigint", () => {
1027
- const input = BigInt(10);
1028
- const result = (0, misc_1.getType)(input);
1029
- expect(result).toBe('bigint');
1030
- });
1031
- // Tests that getType returns 'symbol' when the input is a symbol
1032
- it("should return 'symbol' when the input is a symbol", () => {
1033
- const input = Symbol('test');
1034
- const result = (0, misc_1.getType)(input);
1035
- expect(result).toBe('symbol');
1036
- });
1037
- // Tests that getType returns 'undefined' when the input is undefined
1038
- it("should return 'NULL' when the input is undefined", () => {
1039
- const input = undefined;
1040
- const result = (0, misc_1.getType)(input);
1041
- expect(result).toBe('NULL');
1042
- });
1043
- // Tests that getType returns the correct type for arrow function input
1044
- it('should return function when the input is an arrow function', () => {
1045
- const input = () => { };
1046
- const result = (0, misc_1.getType)(input);
1047
- expect(result).toBe('function');
1048
- });
1049
- // Tests that getType returns 'object' when the input is an object with properties
1050
- it('should return object when the input is an object with properties', () => {
1051
- const input = { name: 'John', age: 30 };
1052
- const result = (0, misc_1.getType)(input);
1053
- expect(result).toBe('object');
1054
- });
1055
- // Tests that getType object the correct type for class input
1056
- it('should return object when the input is a class', () => {
1057
- class MyClass {
1058
- }
1059
- const input = new MyClass();
1060
- const result = (0, misc_1.getType)(input);
1061
- expect(result).toBe('object');
1062
- });
1063
- // Tests that getType returns 'function' when the input is a generator function
1064
- it('should return function when the input is a generator function', () => {
1065
- // eslint-disable-next-line @typescript-eslint/no-empty-function
1066
- const input = function* () { };
1067
- const result = (0, misc_1.getType)(input);
1068
- expect(result).toBe('function');
1069
- });
1070
- // Tests that getType returns 'function' when the input is an async function
1071
- it('should return function when the input is an async function', () => {
1072
- const input = async () => { };
1073
- const result = (0, misc_1.getType)(input);
1074
- expect(result).toBe('function');
1075
- });
1076
- });
1077
- describe('isObject', () => {
1078
- // Tests that the function returns true for an object
1079
- it('should return true when value is an object', () => {
1080
- const value = {};
1081
- expect((0, misc_1.isObject)(value)).toBe(true);
1082
- });
1083
- // Tests that the function returns true for a function
1084
- it('should return true when value is a function', () => {
1085
- const value = () => { };
1086
- expect((0, misc_1.isObject)(value)).toBe(true);
1087
- });
1088
- // Tests that the function returns false for null
1089
- it('should return false when value is null', () => {
1090
- const value = null;
1091
- expect((0, misc_1.isObject)(value)).toBe(false);
1092
- });
1093
- // Tests that the function returns false for undefined
1094
- it('should return false when value is undefined', () => {
1095
- const value = undefined;
1096
- expect((0, misc_1.isObject)(value)).toBe(false);
1097
- });
1098
- // Tests that the function returns false for an array
1099
- it('should return false when value is an array', () => {
1100
- const value = [];
1101
- expect((0, misc_1.isObject)(value)).toBe(false);
1102
- });
1103
- // Tests that the function returns false for a string
1104
- it('should return false when value is a string', () => {
1105
- const value = 'test';
1106
- expect((0, misc_1.isObject)(value)).toBe(false);
1107
- });
1108
- // Tests that the function returns false for a number
1109
- it('should return false when value is a number', () => {
1110
- const value = 123;
1111
- expect((0, misc_1.isObject)(value)).toBe(false);
1112
- });
1113
- // Tests that the function returns false for a boolean
1114
- it('should return false when value is a boolean', () => {
1115
- const value = true;
1116
- expect((0, misc_1.isObject)(value)).toBe(false);
1117
- });
1118
- // Tests that the function returns false for a symbol
1119
- it('should return false when value is a symbol', () => {
1120
- const value = Symbol();
1121
- expect((0, misc_1.isObject)(value)).toBe(false);
1122
- });
1123
- // Tests that the function returns false when the value is NaN
1124
- it('should return false when value is NaN', () => {
1125
- const value = NaN;
1126
- expect((0, misc_1.isObject)(value)).toBe(false);
1127
- });
1128
- });
1129
- describe('isEmpty', () => {
1130
- // Tests that isEmpty returns true for an empty string
1131
- it('should return true when input is an empty string', () => {
1132
- const input = '';
1133
- const result = (0, misc_1.isEmpty)(input);
1134
- expect(result).toBe(true);
1135
- });
1136
- // Tests that isEmpty returns true for an empty array
1137
- it('should return true when input is an empty array', () => {
1138
- const input = [];
1139
- const result = (0, misc_1.isEmpty)(input);
1140
- expect(result).toBe(true);
1141
- });
1142
- // Tests that isEmpty returns false for an empty object
1143
- it('should return false when input is an empty object', () => {
1144
- const input = {};
1145
- const result = (0, misc_1.isEmpty)(input);
1146
- expect(result).toBe(false);
1147
- });
1148
- // Tests that isEmpty returns false for a non-empty string
1149
- it('should return false when input is a non-empty string', () => {
1150
- const input = 'hello';
1151
- const result = (0, misc_1.isEmpty)(input);
1152
- expect(result).toBe(false);
1153
- });
1154
- // Tests that isEmpty returns false for a non-empty array
1155
- it('should return false when input is a non-empty array', () => {
1156
- const input = [1, 2, 3];
1157
- const result = (0, misc_1.isEmpty)(input);
1158
- expect(result).toBe(false);
1159
- });
1160
- // Tests that isEmpty returns false for a non-empty object
1161
- it('should return false when input is a non-empty object', () => {
1162
- const input = { key: 'value' };
1163
- const result = (0, misc_1.isEmpty)(input);
1164
- expect(result).toBe(false);
1165
- });
1166
- // Tests that isEmpty returns true for null input
1167
- it('should return true when input is null', () => {
1168
- const input = null;
1169
- const result = (0, misc_1.isEmpty)(input);
1170
- expect(result).toBe(true);
1171
- });
1172
- // The test objective is to verify that the function 'isEmpty' returns true when the input is undefined.
1173
- it('should return true when input is undefined', () => {
1174
- const input = undefined;
1175
- const result = (0, misc_1.isEmpty)(input);
1176
- expect(result).toBe(true);
1177
- });
1178
- // Tests that isEmpty returns false for NaN input
1179
- it('should return false when input is NaN', () => {
1180
- const input = NaN;
1181
- const result = (0, misc_1.isEmpty)(input);
1182
- expect(result).toBe(false);
1183
- });
1184
- // Test that the function 'isEmpty' returns true when the input is a whitespace string
1185
- it('should return true when input is a whitespace string', () => {
1186
- const input = ' ';
1187
- const result = (0, misc_1.isEmpty)(input);
1188
- expect(result).toBe(true);
1189
- });
1190
- });
1191
- describe('isEmptyObject', () => {
1192
- // Tests that isEmptyObject returns true for an empty object {}
1193
- it('should return true for an empty object', () => {
1194
- const obj = {};
1195
- expect((0, misc_1.isEmptyObject)(obj)).toBe(true);
1196
- });
1197
- // Tests that isEmptyObject returns false for a non-empty object {a: '1'}
1198
- it('should return false for a non-empty object', () => {
1199
- const obj = { a: '1' };
1200
- expect((0, misc_1.isEmptyObject)(obj)).toBe(false);
1201
- });
1202
- // Tests that isEmptyObject returns true for an empty array []
1203
- it('should return true for an empty array', () => {
1204
- const arr = [];
1205
- expect((0, misc_1.isEmptyObject)(arr)).toBe(true);
1206
- });
1207
- // Tests that isEmptyObject returns false for a non-empty array [1, 2, 3]
1208
- it('should return false for a non-empty array', () => {
1209
- const arr = [1, 2, 3];
1210
- expect((0, misc_1.isEmptyObject)(arr)).toBe(false);
1211
- });
1212
- // Tests that isEmptyObject returns true for an empty string ''
1213
- it('should return true for an empty string', () => {
1214
- const obj = '';
1215
- expect((0, misc_1.isEmptyObject)(obj)).toBe(true);
1216
- });
1217
- // Tests that isEmptyObject returns false for a non-empty string 'hello'
1218
- it('should return false for a non-empty string', () => {
1219
- const obj = 'hello';
1220
- expect((0, misc_1.isEmptyObject)(obj)).toBe(false);
1221
- });
1222
- // Tests that isEmptyObject returns true for number
1223
- it('should return true for number', () => {
1224
- const obj = 2;
1225
- expect((0, misc_1.isEmptyObject)(obj)).toBe(true);
1226
- });
1227
- });
1228
- describe('isDefinedNotNullNotEmpty', () => {
1229
- // Tests that the function returns true when a non-empty string is passed as an argument
1230
- it('should return true when a non-empty string is passed as an argument', () => {
1231
- const result = (0, misc_1.isDefinedNotNullNotEmpty)('test');
1232
- expect(result).toBe(true);
1233
- });
1234
- // Tests that the function returns true when a non-empty object is passed as an argument
1235
- it('should return true when a non-empty object is passed as an argument', () => {
1236
- const result = (0, misc_1.isDefinedNotNullNotEmpty)({ key: 'value' });
1237
- expect(result).toBe(true);
1238
- });
1239
- // Tests that the function returns true when a non-empty array is passed as an argument
1240
- it('should return true when a non-empty array is passed as an argument', () => {
1241
- const result = (0, misc_1.isDefinedNotNullNotEmpty)([1, 2, 3]);
1242
- expect(result).toBe(true);
1243
- });
1244
- // Tests that the function returns true when a non-zero number is passed as an argument
1245
- it('should return true when a non-zero number is passed as an argument', () => {
1246
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(123);
1247
- expect(result).toBe(true);
1248
- });
1249
- // Tests that the function returns true when a boolean value is passed as an argument
1250
- it('should return true when a boolean value is passed as an argument', () => {
1251
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(true);
1252
- expect(result).toBe(true);
1253
- });
1254
- // Tests that the function returns false when an empty string is passed as an argument
1255
- it('should return false when an empty string is passed as an argument', () => {
1256
- const result = (0, misc_1.isDefinedNotNullNotEmpty)('');
1257
- expect(result).toBe(false);
1258
- });
1259
- // Tests that the function returns true when false is passed as an argument
1260
- it('should return true when false is passed as an argument', () => {
1261
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(false);
1262
- expect(result).toBe(true);
1263
- });
1264
- // Tests that the function returns true when 0 is passed as an argument
1265
- it('should return true when 0 is passed as an argument', () => {
1266
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(0);
1267
- expect(result).toBe(true);
1268
- });
1269
- // Tests that the function returns false when NaN is passed as an argument
1270
- it('should return false when NaN is passed as an argument', () => {
1271
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(NaN);
1272
- expect(result).toBe(false);
1273
- });
1274
- // Tests that the function returns false when undefined is passed as an argument
1275
- it('should return false when undefined is passed as an argument', () => {
1276
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(undefined);
1277
- expect(result).toBe(false);
1278
- });
1279
- // Tests that the function returns false when null is passed as an argument
1280
- it('should return false when null is passed as an argument', () => {
1281
- const result = (0, misc_1.isDefinedNotNullNotEmpty)(null);
1282
- expect(result).toBe(false);
1283
- });
1284
- // Tests that the function returns false when an empty array is passed as an argument
1285
- it('should return false when an empty array is passed as an argument', () => {
1286
- const result = (0, misc_1.isDefinedNotNullNotEmpty)([]);
1287
- expect(result).toBe(false);
1288
- });
1289
- // Tests that the function returns false when an empty object is passed as an argument
1290
- it('should return false when an empty object is passed as an argument', () => {
1291
- const result = (0, misc_1.isDefinedNotNullNotEmpty)({});
1292
- expect(result).toBe(false);
1293
- });
1294
- });
1295
- describe('removeUndefinedNullEmptyExclBoolInt', () => {
1296
- // Tests that the function returns the same object if it does not contain undefined, null, empty, boolean, or integer values
1297
- it('should return the same object when it does not contain undefined, null, empty, boolean, or integer values', () => {
1298
- const obj = { a: 1, b: 'test', c: { d: 'nested' } };
1299
- expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(obj)).toEqual(obj);
1300
- });
1301
- // Tests that the function removes undefined, null, empty, boolean, or integer values from the object and returns the cleaned object
1302
- it('should remove undefined, null, empty, boolean, or integer values from the object and return the cleaned object', () => {
1303
- const obj = { a: 1, b: undefined, c: null, d: '', e: {}, f: true, g: 0 };
1304
- const expected = { a: 1, f: true, g: 0 };
1305
- expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(obj)).toEqual(expected);
1306
- });
1307
- // Tests that the function returns undefined if the input is undefined
1308
- it('should return undefined when the input is undefined', () => {
1309
- expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(undefined)).toBeUndefined();
1310
- });
1311
- // Tests that the function returns null if the input is null
1312
- it('should return null when the input is null', () => {
1313
- expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(null)).toBeNull();
1314
- });
1315
- // Tests that the function returns an empty object if the input is an empty object
1316
- it('should return an empty object when the input is an empty object', () => {
1317
- expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)({})).toEqual({});
1318
- });
1319
- // Tests that the function returns an empty object if the input contains only undefined, null, empty, boolean, or integer values
1320
- it('should return a valid object when the input contains only undefined, null, empty, boolean or integer values', () => {
1321
- const obj = { a: undefined, b: null, c: '', d: {}, e: true, f: 0 };
1322
- expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(obj)).toEqual({ e: true, f: 0 });
1323
- });
1324
- });
1325
- describe('getHashFromArray', () => {
1326
- // Tests that the function returns an empty object when given an empty array
1327
- it('should return an empty object when given an empty array', () => {
1328
- const arrays = [];
1329
- const result = (0, misc_1.getHashFromArray)(arrays);
1330
- expect(result).toEqual({});
1331
- });
1332
- // Tests that the function returns a hashMap with correct key-value pairs when given an array of objects with 'from' and 'to' properties
1333
- it("should return a hashMap with correct key-value pairs when given an array of objects with 'from' and 'to' properties", () => {
1334
- const arrays = [
1335
- { from: 'A', to: '1' },
1336
- { from: 'B', to: '2' },
1337
- { from: 'C', to: '3' },
1338
- ];
1339
- const result = (0, misc_1.getHashFromArray)(arrays);
1340
- expect(result).toEqual({ a: '1', b: '2', c: '3' });
1341
- });
1342
- // Tests that the function returns an empty object when given an array of objects with empty 'from' property
1343
- it("should return an empty object when given an array of objects with empty 'from' property", () => {
1344
- const arrays = [
1345
- { from: '', to: '1' },
1346
- { from: '', to: '2' },
1347
- { from: '', to: '3' },
1348
- ];
1349
- const result = (0, misc_1.getHashFromArray)(arrays);
1350
- expect(result).toEqual({});
1351
- });
1352
- // Tests that the function returns a hashMap with only the first occurrence of a 'from' property when given an array with duplicate 'from' properties
1353
- it("should return a hashMap with only the first occurrence of a 'from' property when given an array with duplicate 'from' properties", () => {
1354
- const arrays = [
1355
- { from: 'A', to: '1' },
1356
- { from: 'B', to: '2' },
1357
- { from: 'A', to: '3' },
1358
- ];
1359
- const result = (0, misc_1.getHashFromArray)(arrays);
1360
- expect(result).toEqual({ a: '3', b: '2' });
1361
- });
1362
- // Tests that the function returns a hashMap with only the last occurrence of a 'from' property when given an array with duplicate 'from' properties and different 'to' values
1363
- it("should return a hashMap with only the last occurrence of a 'from' property when given an array with duplicate 'from' properties and different 'to' values", () => {
1364
- const arrays = [
1365
- { from: 'A', to: '1' },
1366
- { from: 'B', to: '2' },
1367
- { from: 'A', to: '3' },
1368
- ];
1369
- const result = (0, misc_1.getHashFromArray)(arrays);
1370
- expect(result).toEqual({ a: '3', b: '2' });
1371
- });
1372
- // Tests that the function returns a hashMap with correct key-value pairs when given an array of objects with non-string 'from' and 'to' properties
1373
- it("should return a hashMap with correct key-value pairs when given an array of objects with non-string 'from' and 'to' properties", () => {
1374
- const arrays = [
1375
- { from: 1, to: true },
1376
- { from: null, to: undefined },
1377
- { from: [1, 2, 3], to: { a: 'A', b: 'B' } },
1378
- ];
1379
- const result = (0, misc_1.getHashFromArray)(arrays);
1380
- expect(result).toEqual({ '1': true, null: undefined, '1,2,3': { a: 'A', b: 'B' } });
1381
- });
1382
- // Tests that the function converts the 'from' property to lowercase in the hashMap when the isLowerCase parameter is true
1383
- it('should convert "from" property to lowercase in hashMap when isLowerCase is true', () => {
1384
- const arrays = [
1385
- { from: 'VALUE1', to: 'Value1' },
1386
- { from: 'VALUE2', to: 'Value2' },
1387
- { from: 'VALUE3', to: 'Value3' },
1388
- ];
1389
- const expected = {
1390
- value1: 'Value1',
1391
- value2: 'Value2',
1392
- value3: 'Value3',
1393
- };
1394
- const result = (0, misc_1.getHashFromArray)(arrays, 'from', 'to', true);
1395
- expect(result).toEqual(expected);
1396
- });
1397
- });
1398
- describe('getHashFromArrayWithDuplicate', () => {
1399
- // Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys
1400
- it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys", () => {
1401
- const arrays = [
1402
- { from: 'prop1', to: 'val1' },
1403
- { from: 'prop1', to: 'val2' },
1404
- { from: 'prop2', to: 'val2' },
1405
- ];
1406
- const expectedHashMap = {
1407
- prop1: new Set(['val1', 'val2']),
1408
- prop2: new Set(['val2']),
1409
- };
1410
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1411
- expect(result).toEqual(expectedHashMap);
1412
- });
1413
- // Tests that the function correctly generates a hashMap from an array of objects with only one object
1414
- it('should correctly generate a hashMap from an array of objects with only one object', () => {
1415
- const arrays = [{ from: 'prop1', to: 'val1' }];
1416
- const expectedHashMap = { prop1: new Set(['val1']) };
1417
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1418
- expect(result).toEqual(expectedHashMap);
1419
- });
1420
- // Tests that the function correctly generates a hashMap from an array of objects with unique 'from' keys
1421
- it("should correctly generate a hashMap from an array of objects with unique 'from' keys", () => {
1422
- const arrays = [
1423
- { from: 'prop1', to: 'val1' },
1424
- { from: 'prop2', to: 'val2' },
1425
- { from: 'prop3', to: 'val3' },
1426
- ];
1427
- const expectedHashMap = {
1428
- prop1: new Set(['val1']),
1429
- prop2: new Set(['val2']),
1430
- prop3: new Set(['val3']),
1431
- };
1432
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1433
- expect(result).toEqual(expectedHashMap);
1434
- });
1435
- // Tests that the function correctly generates a hashMap from an array of objects with unique 'to' keys
1436
- it("should correctly generate a hashMap from an array of objects with unique 'to' keys", () => {
1437
- const arrays = [
1438
- { from: 'prop1', to: 'val1' },
1439
- { from: 'prop2', to: 'val2' },
1440
- { from: 'prop3', to: 'val3' },
1441
- ];
1442
- const expectedHashMap = {
1443
- prop1: new Set(['val1']),
1444
- prop2: new Set(['val2']),
1445
- prop3: new Set(['val3']),
1446
- };
1447
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1448
- expect(result).toEqual(expectedHashMap);
1449
- });
1450
- // Tests that the function returns an empty hashMap when given an empty array
1451
- it('should return an empty hashMap when given an empty array', () => {
1452
- const arrays = [];
1453
- const expectedHashMap = {};
1454
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1455
- expect(result).toEqual(expectedHashMap);
1456
- });
1457
- // Tests that the function correctly handles an array of objects with empty 'from' keys
1458
- it("should correctly handle an array of objects with empty 'from' keys", () => {
1459
- const arrays = [
1460
- { from: '', to: 'val1' },
1461
- { from: '', to: 'val2' },
1462
- { from: '', to: 'val3' },
1463
- ];
1464
- const expectedHashMap = {};
1465
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1466
- expect(result).toEqual(expectedHashMap);
1467
- });
1468
- // Tests that the function correctly handles an array of objects with empty 'to' keys
1469
- it("should return an empty hashMap when the 'to' key is empty in all objects", () => {
1470
- const arrays = [
1471
- { from: 'prop1', to: '' },
1472
- { from: 'prop2', to: '' },
1473
- { from: 'prop3', to: '' },
1474
- ];
1475
- const expectedHashMap = { prop1: new Set(['']), prop2: new Set(['']), prop3: new Set(['']) };
1476
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1477
- expect(result).toEqual(expectedHashMap);
1478
- });
1479
- // Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to false
1480
- it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to false", () => {
1481
- const arrays = [
1482
- { from: 'prop1', to: 'val1' },
1483
- { from: 'prop1', to: 'val2' },
1484
- { from: 'prop2', to: 'val2' },
1485
- ];
1486
- const expectedHashMap = {
1487
- prop1: new Set(['val1', 'val2']),
1488
- prop2: new Set(['val2']),
1489
- };
1490
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays, 'from', 'to', false);
1491
- expect(result).toEqual(expectedHashMap);
1492
- });
1493
- // Tests that the function correctly generates a hashMap from a valid array of objects with custom fromKey and toKey values
1494
- it('should correctly generate a hashMap from a valid array of objects with custom fromKey and toKey values', () => {
1495
- const arrays = [
1496
- { from: 'prop1', to: 'val1' },
1497
- { from: 'prop1', to: 'val2' },
1498
- { from: 'prop2', to: 'val2' },
1499
- ];
1500
- const expectedHashMap = {
1501
- prop1: new Set(['val1', 'val2']),
1502
- prop2: new Set(['val2']),
1503
- };
1504
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays, 'from', 'to');
1505
- expect(result).toEqual(expectedHashMap);
1506
- });
1507
- // Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to true
1508
- it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to true", () => {
1509
- const arrays = [
1510
- { from: 'prop1', to: 'val1' },
1511
- { from: 'prop1', to: 'val2' },
1512
- { from: 'prop2', to: 'val2' },
1513
- ];
1514
- const expectedHashMap = {
1515
- prop1: new Set(['val1', 'val2']),
1516
- prop2: new Set(['val2']),
1517
- };
1518
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays, 'from', 'to', true);
1519
- expect(result).toEqual(expectedHashMap);
1520
- });
1521
- // Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys
1522
- it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys", () => {
1523
- const arrays = [
1524
- { from: 'prop1', to: 'val1' },
1525
- { from: 'prop1', to: 'val2' },
1526
- { from: 'prop2', to: 'val2' },
1527
- ];
1528
- const expectedHashMap = {
1529
- prop1: new Set(['val1', 'val2']),
1530
- prop2: new Set(['val2']),
1531
- };
1532
- const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
1533
- expect(result).toEqual(expectedHashMap);
1534
- });
1535
- });
1536
- describe('getValueFromPropertiesOrTraits', () => {
1537
- // Tests that the function returns the value of the key from properties if it exists.
1538
- it('should return the value of the key from properties when it exists', () => {
1539
- const message = {
1540
- properties: {
1541
- key: 'value',
1542
- },
1543
- traits: {},
1544
- context: {
1545
- traits: {},
1546
- },
1547
- };
1548
- const key = 'key';
1549
- const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
1550
- expect(result).toBe('value');
1551
- });
1552
- // Tests that the function returns the value of the key from traits if it exists.
1553
- it('should return the value of the key from traits when it exists', () => {
1554
- const message = {
1555
- properties: {},
1556
- traits: {
1557
- key: 'value',
1558
- },
1559
- context: {
1560
- traits: {},
1561
- },
1562
- };
1563
- const key = 'key';
1564
- const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
1565
- expect(result).toBe('value');
1566
- });
1567
- // Tests that the function returns the value of the key from context.traits if it exists.
1568
- it('should return the value of the key from context.traits when it exists', () => {
1569
- const message = {
1570
- properties: {},
1571
- traits: {},
1572
- context: {
1573
- traits: {
1574
- key: 'value',
1575
- },
1576
- },
1577
- };
1578
- const key = 'key';
1579
- const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
1580
- expect(result).toBe('value');
1581
- });
1582
- // Tests that the function returns null if the message is null.
1583
- it('should return null when the message is null', () => {
1584
- const message = null;
1585
- const key = 'key';
1586
- const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
1587
- expect(result).toBeNull();
1588
- });
1589
- // Tests that the function returns null if the key is null.
1590
- it('should return null when the key is null', () => {
1591
- const message = {
1592
- properties: {},
1593
- traits: {},
1594
- context: {
1595
- traits: {},
1596
- },
1597
- };
1598
- const key = null;
1599
- const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
1600
- expect(result).toBeNull();
1601
- });
1602
- // Tests that the function returns null if the key does not exist in any of the keySets.
1603
- it('should return null when the key does not exist in any of the keySets', () => {
1604
- const message = {
1605
- properties: {},
1606
- traits: {},
1607
- context: {
1608
- traits: {},
1609
- },
1610
- };
1611
- const key = 'nonexistentKey';
1612
- const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
1613
- expect(result).toBeNull();
1614
- });
1615
- });
1616
- describe('flattenJson', () => {
1617
- // Tests that flattenJson function correctly flattens a simple JSON object with no nested objects or arrays.
1618
- it('should correctly flatten a simple JSON object', () => {
1619
- const data = { name: 'John', age: 30, city: 'New York' };
1620
- const expectedResult = { name: 'John', age: 30, city: 'New York' };
1621
- const result = (0, misc_1.flattenJson)(data);
1622
- expect(result).toEqual(expectedResult);
1623
- });
1624
- // Tests that flattenJson function correctly flattens a JSON object with nested objects and arrays.
1625
- it('should correctly flatten a JSON object with nested objects and arrays', () => {
1626
- const data = {
1627
- name: 'John',
1628
- age: 30,
1629
- address: {
1630
- street: '123 Main St',
1631
- city: 'New York',
1632
- country: 'USA',
1633
- },
1634
- hobbies: ['reading', 'painting'],
1635
- };
1636
- const expectedResult = {
1637
- name: 'John',
1638
- age: 30,
1639
- 'address.street': '123 Main St',
1640
- 'address.city': 'New York',
1641
- 'address.country': 'USA',
1642
- 'hobbies[0]': 'reading',
1643
- 'hobbies[1]': 'painting',
1644
- };
1645
- const result = (0, misc_1.flattenJson)(data);
1646
- expect(result).toEqual(expectedResult);
1647
- });
1648
- // Tests that flattenJson function correctly flattens a JSON object with null and undefined values.
1649
- it('should correctly flatten a JSON object with null and undefined values', () => {
1650
- const data = { name: null, age: undefined, city: 'New York' };
1651
- const expectedResult = { name: null, age: undefined, city: 'New York' };
1652
- const result = (0, misc_1.flattenJson)(data);
1653
- expect(result).toEqual(expectedResult);
1654
- });
1655
- // Tests that flattenJson function correctly flattens a JSON object with empty arrays and objects.
1656
- it('should correctly flatten a JSON object with empty arrays and objects', () => {
1657
- const data = { name: [], age: {}, city: 'New York' };
1658
- const expectedResult = { name: [], age: {}, city: 'New York' };
1659
- const result = (0, misc_1.flattenJson)(data);
1660
- expect(result).toEqual(expectedResult);
1661
- });
1662
- // // Need to fix this test
1663
- // // Tests that flattenJson function handles circular references in a JSON object correctly.
1664
- // it('should handle circular references in a JSON object correctly', () => {
1665
- // const data = { name: 'John', age: 30 };
1666
- // data['self'] = data;
1667
- // const expectedResult = { name: 'John', age: 30, self: '[Circular]' };
1668
- // const result = flattenJson(data);
1669
- // expect(result).toEqual(expectedResult);
1670
- // });
1671
- // Tests that flattenJson function correctly flattens a JSON object with keys containing special characters.
1672
- it('should correctly flatten a JSON object with keys containing special characters', () => {
1673
- const data = { 'name.first': 'John', 'name.last': 'Doe', 'age@': 30 };
1674
- const expectedResult = { 'name.first': 'John', 'name.last': 'Doe', 'age@': 30 };
1675
- const result = (0, misc_1.flattenJson)(data);
1676
- expect(result).toEqual(expectedResult);
1677
- });
1678
- // Test that the flattenJson function correctly flattens a JSON object with non-string keys.
1679
- it('should correctly flatten a JSON object with non-string keys', () => {
1680
- const data = { 1: 'one', 2: 'two', 3: 'three' };
1681
- const expectedResult = { '1': 'one', '2': 'two', '3': 'three' };
1682
- const result = (0, misc_1.flattenJson)(data);
1683
- expect(result).toEqual(expectedResult);
1684
- });
1685
- // Tests that flattenJson function correctly flattens a JSON object with keys containing the separator character.
1686
- it('should correctly flatten a JSON object with keys containing the separator character', () => {
1687
- const data = { 'name.first': 'John', 'name.last': 'Doe', age: 30, city: 'New York' };
1688
- const expectedResult = {
1689
- 'name.first': 'John',
1690
- 'name.last': 'Doe',
1691
- age: 30,
1692
- city: 'New York',
1693
- };
1694
- const result = (0, misc_1.flattenJson)(data);
1695
- expect(result).toEqual(expectedResult);
1696
- });
1697
- // The test objective is to verify that the flattenJson function correctly flattens a JSON object with keys that are reserved words.
1698
- it('should correctly flatten a JSON object with reserved word keys', () => {
1699
- const data = { class: 'Math', function: 'add', return: 'result' };
1700
- const expectedResult = { class: 'Math', function: 'add', return: 'result' };
1701
- const result = (0, misc_1.flattenJson)(data);
1702
- expect(result).toEqual(expectedResult);
1703
- });
1704
- // The test objective is to verify that the 'flattenJson' function correctly flattens a JSON object with deeply nested objects and arrays.
1705
- it('should correctly flatten a JSON object with deeply nested objects and arrays', () => {
1706
- const data = {
1707
- name: 'John',
1708
- age: 30,
1709
- address: {
1710
- street: '123 Main St',
1711
- city: 'New York',
1712
- state: 'NY',
1713
- zip: '10001',
1714
- },
1715
- hobbies: ['reading', 'painting', 'cooking'],
1716
- friends: [
1717
- {
1718
- name: 'Jane',
1719
- age: 28,
1720
- address: {
1721
- street: '456 Elm St',
1722
- city: 'Los Angeles',
1723
- state: 'CA',
1724
- zip: '90001',
1725
- },
1726
- hobbies: ['hiking', 'photography'],
1727
- },
1728
- {
1729
- name: 'Mike',
1730
- age: 32,
1731
- address: {
1732
- street: '789 Oak St',
1733
- city: 'Chicago',
1734
- state: 'IL',
1735
- zip: '60007',
1736
- },
1737
- hobbies: ['running', 'gaming'],
1738
- },
1739
- ],
1740
- };
1741
- const expectedResult = {
1742
- name: 'John',
1743
- age: 30,
1744
- 'address.street': '123 Main St',
1745
- 'address.city': 'New York',
1746
- 'address.state': 'NY',
1747
- 'address.zip': '10001',
1748
- 'hobbies[0]': 'reading',
1749
- 'hobbies[1]': 'painting',
1750
- 'hobbies[2]': 'cooking',
1751
- 'friends[0].name': 'Jane',
1752
- 'friends[0].age': 28,
1753
- 'friends[0].address.street': '456 Elm St',
1754
- 'friends[0].address.city': 'Los Angeles',
1755
- 'friends[0].address.state': 'CA',
1756
- 'friends[0].address.zip': '90001',
1757
- 'friends[0].hobbies[0]': 'hiking',
1758
- 'friends[0].hobbies[1]': 'photography',
1759
- 'friends[1].name': 'Mike',
1760
- 'friends[1].age': 32,
1761
- 'friends[1].address.street': '789 Oak St',
1762
- 'friends[1].address.city': 'Chicago',
1763
- 'friends[1].address.state': 'IL',
1764
- 'friends[1].address.zip': '60007',
1765
- 'friends[1].hobbies[0]': 'running',
1766
- 'friends[1].hobbies[1]': 'gaming',
1767
- };
1768
- const result = (0, misc_1.flattenJson)(data);
1769
- expect(result).toEqual(expectedResult);
1770
- });
1771
- // The test objective is to verify that the 'flattenJson' function correctly flattens a JSON object with non-ASCII characters in keys and values.
1772
- it('should correctly flatten a JSON object with non-ASCII characters in keys and values', () => {
1773
- const data = {
1774
- name: 'John',
1775
- age: 30,
1776
- city: 'New York',
1777
- address: { street: '123 Main St', city: 'San Francisco' },
1778
- };
1779
- const expectedResult = {
1780
- name: 'John',
1781
- age: 30,
1782
- city: 'New York',
1783
- 'address.street': '123 Main St',
1784
- 'address.city': 'San Francisco',
1785
- };
1786
- const result = (0, misc_1.flattenJson)(data);
1787
- expect(result).toEqual(expectedResult);
1788
- });
1789
- // The test objective is to verify that the flattenJson function correctly flattens a JSON object with deeply nested arrays and objects, including null and undefined values.
1790
- it('should correctly flatten a JSON object with deeply nested arrays and objects with null and undefined values', () => {
1791
- const data = {
1792
- name: 'John',
1793
- age: 30,
1794
- city: 'New York',
1795
- address: {
1796
- street: '123 Main St',
1797
- zip: 12345,
1798
- country: 'USA',
1799
- coordinates: {
1800
- latitude: 40.7128,
1801
- longitude: -74.006,
1802
- },
1803
- },
1804
- hobbies: ['reading', 'painting', 'swimming'],
1805
- friends: [
1806
- { name: 'Jane', age: 28 },
1807
- { name: 'Mike', age: 32 },
1808
- { name: 'Sarah', age: 27 },
1809
- ],
1810
- pet: null,
1811
- favoriteColor: undefined,
1812
- };
1813
- const expectedResult = {
1814
- name: 'John',
1815
- age: 30,
1816
- city: 'New York',
1817
- 'address.street': '123 Main St',
1818
- 'address.zip': 12345,
1819
- 'address.country': 'USA',
1820
- 'address.coordinates.latitude': 40.7128,
1821
- 'address.coordinates.longitude': -74.006,
1822
- 'hobbies[0]': 'reading',
1823
- 'hobbies[1]': 'painting',
1824
- 'hobbies[2]': 'swimming',
1825
- 'friends[0].name': 'Jane',
1826
- 'friends[0].age': 28,
1827
- 'friends[1].name': 'Mike',
1828
- 'friends[1].age': 32,
1829
- 'friends[2].name': 'Sarah',
1830
- 'friends[2].age': 27,
1831
- pet: null,
1832
- favoriteColor: undefined,
1833
- };
1834
- const result = (0, misc_1.flattenJson)(data);
1835
- expect(result).toEqual(expectedResult);
1836
- });
1837
- // Tests that flattenJson function correctly flattens a JSON object with arrays containing objects with different nesting levels.
1838
- it('should correctly flatten a JSON object with arrays containing objects with different nesting levels', () => {
1839
- const data = {
1840
- name: 'John',
1841
- age: 30,
1842
- city: 'New York',
1843
- hobbies: [
1844
- { name: 'Reading', type: 'Indoor' },
1845
- { name: 'Running', type: 'Outdoor' },
1846
- { name: 'Cooking', type: 'Indoor' },
1847
- ],
1848
- friends: [
1849
- { name: 'Alice', age: 28 },
1850
- { name: 'Bob', age: 32 },
1851
- { name: 'Charlie', age: 27 },
1852
- ],
1853
- };
1854
- const expectedResult = {
1855
- name: 'John',
1856
- age: 30,
1857
- city: 'New York',
1858
- 'hobbies[0].name': 'Reading',
1859
- 'hobbies[0].type': 'Indoor',
1860
- 'hobbies[1].name': 'Running',
1861
- 'hobbies[1].type': 'Outdoor',
1862
- 'hobbies[2].name': 'Cooking',
1863
- 'hobbies[2].type': 'Indoor',
1864
- 'friends[0].name': 'Alice',
1865
- 'friends[0].age': 28,
1866
- 'friends[1].name': 'Bob',
1867
- 'friends[1].age': 32,
1868
- 'friends[2].name': 'Charlie',
1869
- 'friends[2].age': 27,
1870
- };
1871
- const result = (0, misc_1.flattenJson)(data);
1872
- expect(result).toEqual(expectedResult);
1873
- });
1874
- });
1875
- describe('generateRandomString', () => {
1876
- const testCases = [
1877
- {
1878
- name: 'should generate a random string of the specified length',
1879
- length: 8,
1880
- expectedLength: 8,
1881
- },
1882
- {
1883
- name: 'should generate a random string of the default length',
1884
- expectedLength: 10,
1885
- },
1886
- ];
1887
- (0, tests_1.filter)(testCases).forEach((testCase) => {
1888
- it(testCase.name, () => {
1889
- const result = (0, misc_1.generateRandomString)(testCase.length);
1890
- expect(result.length).toBe(testCase.expectedLength);
1891
- });
1892
- });
1893
- });
1894
- describe('getOffsetInSec', () => {
1895
- // Tests that the function returns the offset value in seconds for a valid timezone string
1896
- it('should return the offset value in seconds for a valid timezone string', () => {
1897
- const offset = (0, misc_1.getOffsetInSec)('Asia/Kolkata');
1898
- expect(offset).toBe(19800);
1899
- });
1900
- // Tests that the function returns 0 for the timezone string 'UTC'
1901
- it('should return 0 for the timezone string "UTC"', () => {
1902
- const offset = (0, misc_1.getOffsetInSec)('UTC');
1903
- expect(offset).toBe(0);
1904
- });
1905
- // Tests that the function returns 0 for the timezone string 'Etc/UTC'
1906
- it('should return 0 for the timezone string "Etc/UTC"', () => {
1907
- const offset = (0, misc_1.getOffsetInSec)('Etc/UTC');
1908
- expect(offset).toBe(0);
1909
- });
1910
- // Tests that the function returns undefined for an invalid timezone string
1911
- it('should return undefined for an invalid timezone string', () => {
1912
- const offset = (0, misc_1.getOffsetInSec)('Invalid/Timezone');
1913
- expect(offset).toBeUndefined();
1914
- });
1915
- // Tests that the function returns the undefined offset value for the timezone string '+05:30' invalid timezone string
1916
- it('should return the undefined offset value for the timezone string "+05:30"', () => {
1917
- const offset = (0, misc_1.getOffsetInSec)('+05:30');
1918
- expect(offset).toBe(undefined);
1919
- });
1920
- // Tests that the function returns the correct offset value for the timezone string 'America/New_York'
1921
- it('should return the correct offset value for the timezone string "America/New_York"', () => {
1922
- const offset = (0, misc_1.getOffsetInSec)('Asia/Calcutta');
1923
- expect(offset).toBe(19800);
1924
- });
1925
- });
1926
- describe('formatTimeStamp', () => {
1927
- // Tests that the function returns the timestamp in milliseconds when no format is provided.
1928
- it('should return the timestamp in milliseconds when no format is provided', () => {
1929
- const dateStr = '2022-01-01T00:00:00.000Z';
1930
- const result = (0, misc_1.formatTimeStamp)(dateStr);
1931
- expect(result).toBe(1640995200000);
1932
- });
1933
- // Tests that the function returns the timestamp formatted according to the moment format when format is provided.
1934
- it('should return the timestamp formatted according to the moment format when format is provided', () => {
1935
- const dateStr = '2022-01-01T00:00:00.000Z';
1936
- const format = 'YYYY-MM-DD';
1937
- const result = (0, misc_1.formatTimeStamp)(dateStr, format);
1938
- expect(result).toBe('2022-01-01');
1939
- });
1940
- // Tests that the function throws an error when an invalid date string is provided.
1941
- it('should throw an error when an invalid date string is provided', () => {
1942
- const dateStr = 'invalid-date';
1943
- expect((0, misc_1.formatTimeStamp)(dateStr)).toBeNaN();
1944
- });
1945
- // Tests that the function returns NaN when an invalid date string is provided and no format is provided.
1946
- it('should return NaN when an invalid date string is provided and no format is provided', () => {
1947
- const dateStr = 'invalid-date';
1948
- const result = (0, misc_1.formatTimeStamp)(dateStr);
1949
- expect(result).toBeNaN();
1950
- });
1951
- // Tests that the function returns NaN when an empty string is provided as the date string and no format is provided.
1952
- it('should return NaN when an empty string is provided as the date string and no format is provided', () => {
1953
- const dateStr = '';
1954
- const result = (0, misc_1.formatTimeStamp)(dateStr);
1955
- expect(result).toBeNaN();
1956
- });
1957
- // Tests that the function returns NaN when an invalid format is provided.
1958
- it('should return NaN when an invalid format is provided', () => {
1959
- const dateStr = '2022-01-01T00:00:00.000Z';
1960
- const format = 'invalidFormat';
1961
- const result = (0, misc_1.formatTimeStamp)(dateStr, format);
1962
- expect(result).toEqual('invam1/1/2022i6For0amt');
1963
- });
1964
- // Tests that the function returns the timestamp in milliseconds when a valid timestamp string is provided instead of a date string.
1965
- it('should return the timestamp in milliseconds when a valid timestamp string is provided instead of a date string', () => {
1966
- const dateStr = '2022-01-01T00:00:00.000Z';
1967
- const result = (0, misc_1.formatTimeStamp)(dateStr);
1968
- expect(result).toBe(1640995200000);
1969
- });
1970
- });
1971
- describe('hashToSha256', () => {
1972
- // Tests that hashToSha256 returns the SHA256 hash of a string input
1973
- it('should return the SHA256 hash of a string input', () => {
1974
- const input = 'test string';
1975
- const expectedOutput = 'd5579c46dfcc7f18207013e65b44e4cb4e2c2298f4ac457ba8f82743f31e930b';
1976
- const output = (0, misc_1.hashToSha256)(input);
1977
- expect(output).toBe(expectedOutput);
1978
- });
1979
- // Tests that hashToSha256 returns the SHA256 hash of a Buffer input
1980
- it('should return the SHA256 hash of a Buffer input', () => {
1981
- const input = Buffer.from('test buffer');
1982
- const expectedOutput = '525ef5f7baf56528b48770922e98e800310d3685681d34ee592902aa252458b3';
1983
- const output = (0, misc_1.hashToSha256)(input);
1984
- expect(output).toBe(expectedOutput);
1985
- });
1986
- // Tests that hashToSha256 returns the SHA256 hash of an empty number array input
1987
- it('should return the SHA256 hash of an empty number array input', () => {
1988
- const input = [];
1989
- const expectedOutput = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
1990
- const output = (0, misc_1.hashToSha256)(input);
1991
- expect(output).toBe(expectedOutput);
1992
- });
1993
- // Tests that hashToSha256 returns the SHA256 hash of an empty Buffer input
1994
- it('should return the SHA256 hash of an empty Buffer input', () => {
1995
- const input = Buffer.from([]);
1996
- const expectedOutput = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
1997
- const output = (0, misc_1.hashToSha256)(input);
1998
- expect(output).toBe(expectedOutput);
1999
- });
2000
- // Tests that hashToSha256 returns the SHA256 hash of an empty string input
2001
- it('should return the SHA256 hash of an empty string input', () => {
2002
- const input = '';
2003
- const expectedOutput = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
2004
- const output = (0, misc_1.hashToSha256)(input);
2005
- expect(output).toBe(expectedOutput);
2006
- });
2007
- // Tests that hashToSha256 returns the SHA256 hash of a number array input
2008
- it('should return the SHA256 hash of a number array input', () => {
2009
- const input = [1, 2, 3, 4, 5];
2010
- const expectedOutput = '74f81fe167d99b4cb41d6d0ccda82278caee9f3e2f25d5e5a3936ff3dcec60d0';
2011
- const output = (0, misc_1.hashToSha256)(input);
2012
- expect(output).toBe(expectedOutput);
2013
- });
2014
- // Tests that hashToSha256 returns the SHA256 hash of a non-ASCII string input
2015
- it('should return the SHA256 hash of a non-ASCII string input', () => {
2016
- const input = '你好世界';
2017
- const expectedOutput = '508d69dc21bf5d2f804014b1688953a12d5dfde71be6cd954177980d5d1741bb';
2018
- const output = (0, misc_1.hashToSha256)(input);
2019
- expect(output).toBe(expectedOutput);
2020
- });
2021
- });
2022
- describe('generateUUID', () => {
2023
- // Tests that generateUUID function returns a UUID string
2024
- it('should return a UUID string', () => {
2025
- const uuid = (0, misc_1.generateUUID)();
2026
- expect(typeof uuid).toBe('string');
2027
- });
2028
- // Tests that generateUUID function generates a unique UUID each time it is called
2029
- it('should generate a unique UUID each time it is called', () => {
2030
- const uuid1 = (0, misc_1.generateUUID)();
2031
- const uuid2 = (0, misc_1.generateUUID)();
2032
- expect(uuid1).not.toBe(uuid2);
2033
- });
2034
- // Tests that generateUUID function returns a UUID string with length 36
2035
- it('should return a UUID string with length 36', () => {
2036
- const uuid = (0, misc_1.generateUUID)();
2037
- expect(uuid.length).toBe(36);
2038
- });
2039
- // Tests that generateUUID function returns a UUID string with 4 dashes
2040
- it('should return a UUID string with 4 dashes', () => {
2041
- const uuid = (0, misc_1.generateUUID)();
2042
- const dashCount = (uuid.match(/-/g) || []).length;
2043
- expect(dashCount).toBe(4);
2044
- });
2045
- });
2046
- describe('toString', () => {
2047
- it('should return the same string when input is a string', () => {
2048
- const input = 'test string';
2049
- const result = (0, misc_1.convertToString)(input);
2050
- expect(result).toBe(input);
2051
- });
2052
- it('should return "null" when input is null', () => {
2053
- const input = null;
2054
- const result = (0, misc_1.convertToString)(input);
2055
- expect(result).toBe('null');
2056
- });
2057
- it('should return JSON string when input is a custom object', () => {
2058
- const input = { key: 'value', anotherKey: 123 };
2059
- const result = (0, misc_1.convertToString)(input);
2060
- expect(result).toBe(JSON.stringify(input));
2061
- });
2062
- it('should throw an error when input has circular references', () => {
2063
- const circularObj = {};
2064
- circularObj.self = circularObj;
2065
- expect(() => (0, misc_1.convertToString)(circularObj)).toThrow(TypeError);
2066
- });
2067
- it('should convert boolean true to JSON string', () => {
2068
- const input = true;
2069
- const result = (0, misc_1.convertToString)(input);
2070
- expect(result).toBe('true');
2071
- });
2072
- it('should convert array to JSON string when input is an array', () => {
2073
- const input = [1, 2, 3];
2074
- const result = (0, misc_1.convertToString)(input);
2075
- expect(result).toBe(JSON.stringify(input));
2076
- });
2077
- it('should convert a number to a JSON string', () => {
2078
- const input = 123;
2079
- const result = (0, misc_1.convertToString)(input);
2080
- expect(result).toBe('123');
2081
- });
2082
- it('should correctly handle strings with special characters', () => {
2083
- const input = 'special!@#$%^&*()_+{}:"<>?';
2084
- const result = (0, misc_1.convertToString)(input);
2085
- expect(result).toBe(input);
2086
- });
2087
- it('should correctly convert large data structures to string', () => {
2088
- const largeObject = {
2089
- key1: 'value1',
2090
- key2: Array(1000).fill('value2'),
2091
- key3: { nestedKey: 'nestedValue' },
2092
- };
2093
- const result = (0, misc_1.convertToString)(largeObject);
2094
- expect(result).toBe('{"key1":"value1","key2":["value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2"],"key3":{"nestedKey":"nestedValue"}}');
2095
- });
2096
- });
2097
- describe('uuidv5', () => {
2098
- it('should generate the same UUID for the same input', () => {
2099
- const input = 'test-value';
2100
- const uuid1 = (0, misc_1.uuidv5)(input);
2101
- const uuid2 = (0, misc_1.uuidv5)(input);
2102
- expect(uuid1).toBe(uuid2);
2103
- });
2104
- it('should generate different UUIDs for different inputs', () => {
2105
- const uuid1 = (0, misc_1.uuidv5)('first-value');
2106
- const uuid2 = (0, misc_1.uuidv5)('second-value');
2107
- expect(uuid1).not.toBe(uuid2);
2108
- });
2109
- it('should return a valid UUID v5', () => {
2110
- expect((0, misc_1.uuidv5)('valid-test')).toBe('49843169-ee91-53d4-82ae-02dd676c92ae');
2111
- });
2112
- it('should handle empty string inputs', () => {
2113
- expect((0, misc_1.uuidv5)('')).toBe('1c7fcf13-74af-5595-8ee9-d72be6c1ac42');
2114
- });
2115
- });
2116
- describe('flattenQueryParams', () => {
2117
- const testCases = [
2118
- {
2119
- name: 'flatten array values to first elements',
2120
- input: {
2121
- key1: ['value1'],
2122
- key2: ['value2'],
2123
- key3: [123],
2124
- },
2125
- expected: {
2126
- key1: 'value1',
2127
- key2: 'value2',
2128
- key3: 123,
2129
- },
2130
- },
2131
- {
2132
- name: 'handle null input',
2133
- input: null,
2134
- expected: {},
2135
- },
2136
- {
2137
- name: 'handle undefined input',
2138
- input: undefined,
2139
- expected: {},
2140
- },
2141
- {
2142
- name: 'handle empty object',
2143
- input: {},
2144
- expected: {},
2145
- },
2146
- {
2147
- name: 'ignore null/undefined array elements',
2148
- input: {
2149
- key1: [undefined],
2150
- key2: [null],
2151
- key3: [undefined, 'value'],
2152
- key4: [null, 'value'],
2153
- },
2154
- expected: {
2155
- key3: [undefined, 'value'],
2156
- key4: [null, 'value'],
2157
- },
2158
- },
2159
- {
2160
- name: 'handle mixed type values in arrays',
2161
- input: {
2162
- number: [42],
2163
- string: ['test'],
2164
- boolean: [true],
2165
- object: [{ nested: 'value' }],
2166
- date: [new Date('2024-01-01')],
2167
- },
2168
- expected: {
2169
- number: 42,
2170
- string: 'test',
2171
- boolean: true,
2172
- object: { nested: 'value' },
2173
- date: new Date('2024-01-01'),
2174
- },
2175
- },
2176
- {
2177
- name: 'handle empty arrays',
2178
- input: {
2179
- key1: [],
2180
- key2: ['value'],
2181
- key3: [],
2182
- },
2183
- expected: {
2184
- key2: 'value',
2185
- },
2186
- },
2187
- {
2188
- name: 'keep non-array values unchanged',
2189
- input: {
2190
- string: 'direct string',
2191
- number: 42,
2192
- boolean: true,
2193
- object: { test: 'value' },
2194
- array: ['first', 'second'],
2195
- },
2196
- expected: {
2197
- string: 'direct string',
2198
- number: 42,
2199
- boolean: true,
2200
- object: { test: 'value' },
2201
- array: ['first', 'second'],
2202
- },
2203
- },
2204
- {
2205
- name: 'handle mixed array and non-array values',
2206
- input: {
2207
- arrayValue: ['first'],
2208
- emptyArray: [],
2209
- directValue: 'string',
2210
- nullValue: null,
2211
- undefinedValue: undefined,
2212
- },
2213
- expected: {
2214
- arrayValue: 'first',
2215
- directValue: 'string',
2216
- },
2217
- },
2218
- {
2219
- name: 'handle nested arrays',
2220
- input: {
2221
- nested: [
2222
- [1, 2],
2223
- [3, 4],
2224
- ],
2225
- mixed: [['a', 'b'], 'c'],
2226
- },
2227
- expected: {
2228
- nested: [
2229
- [1, 2],
2230
- [3, 4],
2231
- ],
2232
- mixed: [['a', 'b'], 'c'],
2233
- },
2234
- },
2235
- {
2236
- name: 'handle special values in arrays',
2237
- input: {
2238
- nan: [NaN],
2239
- infinity: [Infinity],
2240
- negInfinity: [-Infinity],
2241
- zero: [0],
2242
- negZero: [-0],
2243
- },
2244
- expected: {
2245
- nan: NaN,
2246
- infinity: Infinity,
2247
- negInfinity: -Infinity,
2248
- zero: 0,
2249
- negZero: -0,
2250
- },
2251
- },
2252
- ];
2253
- testCases.forEach(({ name, input, expected }) => {
2254
- it(`should ${name}`, () => {
2255
- expect((0, misc_1.flattenQueryParams)(input)).toEqual(expected);
2256
- });
2257
- });
2258
- });
2259
- });
2260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL21pc2MudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQWtDZ0I7QUFDaEIsbUNBQStDO0FBRS9DLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLHFGQUFxRjtRQUNyRixFQUFFLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxFQUFFO1lBQzFFLE1BQU0sQ0FBQyxJQUFBLGdCQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxzRkFBc0Y7UUFDdEYsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxNQUFNLENBQUMsSUFBQSxnQkFBUyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgscUZBQXFGO1FBQ3JGLEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7WUFDMUUsTUFBTSxDQUFDLElBQUEsZ0JBQVMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILDhFQUE4RTtRQUM5RSxFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1lBQ25FLE1BQU0sQ0FBQyxJQUFBLGdCQUFTLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCwrRUFBK0U7UUFDL0UsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLENBQUMsSUFBQSxnQkFBUyxFQUFDLElBQUksQ0FB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RUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFxQixFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxxR0FBcUc7UUFDckcsRUFBRSxDQUFDLG9GQUFvRixFQUFFLEdBQUcsRUFBRTtZQUM1RixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFxQixFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxvR0FBb0c7UUFDcEcsRUFBRSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtZQUMzRixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFFBQVEs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QUcsRUFBRTtZQUN4SSxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNGLE1BQU0sTUFBTSxHQUFHLElBQUEsaUJBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCwySUFBMkk7UUFDM0ksRUFBRSxDQUFDLDBIQUEwSCxFQUFFLEdBQUcsRUFBRTtZQUNsSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGlCQUFVLEVBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCwySUFBMkk7UUFDM0ksRUFBRSxDQUFDLDBIQUEwSCxFQUFFLEdBQUcsRUFBRTtZQUNsSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDakQsTUFBTSxNQUFNLEdBQUcs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QUNaO2FBQ0Y7U0FDRixDQUFDO1FBRUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQzlDLEVBQUUsQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLElBQUEseUJBQWtCLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBiYXNlNjRDb252ZXJ0b3IsXG4gIGZsYXR0ZW5NYXAsXG4gIGdldFR5cGUsXG4gIGlzQmxhbmssXG4gIGlzRGVmaW5lZCxcbiAgaXNEZWZpbmVkQW5kTm90TnVsbCxcbiAgaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5LFxuICBpc05vdEVtcHR5LFxuICBpc05vdE51bGwsXG4gIGlzUHJpbWl0aXZlLFxuICBpc1ZhbGlkVXJsLFxuICByZW1vdmVOdWxsVmFsdWVzLFxuICByZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMsXG4gIHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFZhbHVlcyxcbiAgc3RyaXBUcmFpbGluZ1NsYXNoLFxuICBpc09iamVjdCxcbiAgaXNFbXB0eSxcbiAgaXNFbXB0eU9iamVjdCxcbiAgaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5LFxuICByZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludCxcbiAgZ2V0SGFzaEZyb21BcnJheSxcbiAgZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUsXG4gIGZsYXR0ZW5Kc29uLFxuICBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMsXG4gIGdldE9mZnNldEluU2VjLFxuICBmb3JtYXRUaW1lU3RhbXAsXG4gIGhhc2hUb1NoYTI1NixcbiAgZ2VuZXJhdGVVVUlELFxuICBjb252ZXJ0VG9TdHJpbmcsXG4gIHV1aWR2NSxcbiAgZ2VuZXJhdGVSYW5kb21TdHJpbmcsXG4gIGZsYXR0ZW5RdWVyeVBhcmFtcyxcbn0gZnJvbSAnLi9taXNjJztcbmltcG9ydCB7IEJhc2VUZXN0Q2FzZSwgZmlsdGVyIH0gZnJvbSAnLi90ZXN0cyc7XG5cbmRlc2NyaWJlKCdtaXNjJywgKCkgPT4ge1xuICBkZXNjcmliZSgnaXNEZWZpbmVkJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgZGVmaW5lZCB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBkZWZpbmVkIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoNSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIG5vbi1udWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG5vbi1udWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoJ2hlbGxvJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKCcnKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbnVtYmVyIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG51bWJlciBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKDEwKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgYm9vbGVhbiBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBib29sZWFuIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQodHJ1ZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gYW4gdW5kZWZpbmVkIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gYW4gdW5kZWZpbmVkIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQodW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBudWxsIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBudWxsIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQobnVsbCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKHt9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKFtdKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIE5hTiBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gTmFOIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoTmFOKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZCgoKSA9PiB7fSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIHN5bWJvbCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBzeW1ib2wgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZChTeW1ib2woKSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUbyB2ZXJpZnkgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgTWFwIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgTWFwIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKG1hcCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgb2JqZWN0aXZlIG9mIHRoaXMgdGVzdCBpcyB0byB2ZXJpZnkgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgU2V0IG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IFNldCBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2V0T2JqID0gbmV3IFNldCgpO1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZChzZXRPYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG9iamVjdGl2ZSBvZiB0aGlzIHRlc3QgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IFdlYWtNYXAgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgV2Vha01hcCBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgZW1wdHlXZWFrTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoZW1wdHlXZWFrTWFwKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzTm90RW1wdHknLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgdHJ1ZSBmb3Igbm9uLWVtcHR5IGFycmF5c1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgaW5wdXQgaXMgYSBub24tZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KFsxLCAyLCAzXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIGVtcHR5IGFycmF5c1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eShbXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIHRydWUgZm9yIG5vbi1lbXB0eSBvYmplY3RzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KHsga2V5OiAndmFsdWUnIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBlbXB0eSBvYmplY3RzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eSh7fSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIHRydWUgZm9yIG5vbi1lbXB0eSBzdHJpbmdzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KCdoZWxsbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBlbXB0eSBzdHJpbmdzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eSgnJyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBub24temVybyBudW1iZXJzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYSBub24temVybyBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KDQyKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIHplcm9cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpbnB1dCBpcyB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eSgwKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpbnB1dCBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eShudWxsKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIHVuZGVmaW5lZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTm90RW1wdHkodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIE5hTlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGlucHV0IGlzIE5hTicsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTm90RW1wdHkoTmFOKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIGZhbHNlIGJvb2xlYW5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpbnB1dCBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTm90RW1wdHkoZmFsc2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90RW1wdHkgcmV0dXJucyBmYWxzZSBmb3IgdHJ1ZSBib29sZWFuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYSB0cnVlIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc05vdE51bGwnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gYSBub24tbnVsbCB2YWx1ZSBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tbnVsbCB2YWx1ZSBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKCd0ZXN0JykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhIHRydXRoeSB2YWx1ZSBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSB0cnV0aHkgdmFsdWUgaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbCh0cnVlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwoJycpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gYSBudW1iZXIgaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgbnVtYmVyIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwoMTIzKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGEgYm9vbGVhbiB2YWx1ZSBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwodHJ1ZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIGZhbHNlIHdoZW4gbnVsbCBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG51bGwgaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChudWxsKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIGZhbHNlIHdoZW4gdW5kZWZpbmVkIGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdW5kZWZpbmVkIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwodW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IG9iamVjdCBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKHt9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKFtdKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbCgoKSA9PiB7fSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBOYU4gaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIE5hTiBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKE5hTikpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhIHN5bWJvbCBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBzeW1ib2wgaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChTeW1ib2woKSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhIGZ1bmN0aW9uIGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIGZ1bmN0aW9uIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwoKCkgPT4ge30pKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gTmFOIGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBOYU4gaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChOYU4pKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gYSBzeW1ib2wgaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgc3ltYm9sIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbCgpO1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChzeW1ib2wpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNEZWZpbmVkQW5kTm90TnVsbCcsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZEFuZE5vdE51bGwoJ3Rlc3QnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIHN0cmluZyB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBzdHJpbmcgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCgndGVzdCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbnVtYmVyIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG51bWJlciB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWRBbmROb3ROdWxsKDEyMyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIGJvb2xlYW4gdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhbiBvYmplY3QgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIG9iamVjdCB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWRBbmROb3ROdWxsKHsga2V5OiAndmFsdWUnIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGFycmF5IHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBhcnJheSB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWRBbmROb3ROdWxsKFsxLCAyLCAzXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBlbXB0eSBzdHJpbmcgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCgnJyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgYXJyYXkgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IGFycmF5IHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZEFuZE5vdE51bGwoW10pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IG9iamVjdCB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgb2JqZWN0IHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZEFuZE5vdE51bGwoe30pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gbnVsbCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG51bGwgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbChudWxsKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gTmFOIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBOYU4gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbChOYU4pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eScsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBwYXNzZWQgYSBub24tZW1wdHkgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHBhc3NlZCBhIG5vbi1lbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KCdoZWxsbycpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGEgbm9uLWVtcHR5IG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBwYXNzZWQgYSBub24tZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSh7IG5hbWU6ICdKb2huJywgYWdlOiAyNSB9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhIG5vbi1lbXB0eSBhcnJheVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBwYXNzZWQgYSBub24tZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KFsxLCAyLCAzXSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gcGFzc2VkIGEgYm9vbGVhbiB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIGEgYm9vbGVhbiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkodHJ1ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIHBhc3NlZCBhIG51bWJlciB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIGEgbnVtYmVyIHZhbHVlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSg0MikpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIHBhc3NlZCBhbiBlbXB0eSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHBhc3NlZCBhbiBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KCcnKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gcGFzc2VkIGFuIGVtcHR5IG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkoe30pKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBwYXNzZWQgYW4gZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHBhc3NlZCBhbiBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkoW10pKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBwYXNzZWQgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIG51bGwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KG51bGwpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBwYXNzZWQgdW5kZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBwYXNzZWQgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSh1bmRlZmluZWQpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhIHN0cmluZyB3aXRoIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHBhc3NlZCBhIHN0cmluZyB3aXRoIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSgnICAgJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggb25seSBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIG9ubHkgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSh7IHByb3AxOiBudWxsLCBwcm9wMjogdW5kZWZpbmVkIH0pKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNCbGFuaycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyB0cnVlIGZvciBhbiBlbXB0eSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQmxhbmsoJycpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgdHJ1ZSBmb3IgYW4gZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsdWUgaXMgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayhbXSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYW4gZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKHt9KSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuaygnaGVsbG8nKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbHVlIGlzIGEgbm9uLWVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQmxhbmsoWzEsIDIsIDNdKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayh7IGtleTogJ3ZhbHVlJyB9KSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyB0cnVlIGZvciBhIG51bGwgdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKG51bGwpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgdHJ1ZSBmb3IgYW4gdW5kZWZpbmVkIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKHVuZGVmaW5lZCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBib29sZWFuIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayh0cnVlKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNCbGFuayhmYWxzZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgZmFsc2UgZm9yIGEgbnVtYmVyIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIG51bWJlcicsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKDEyMykpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQmxhbmsoMCkpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQmxhbmsoLTEpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNCbGFuayByZXR1cm5zIGZhbHNlIGZvciBhIHdoaXRlc3BhY2Ugc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIHdoaXRlc3BhY2Ugc3RyaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQmxhbmsoJyAgICcpKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChpc0JsYW5rKCdcXHQnKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNCbGFuaygnXFxuJykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgZmFsc2UgZm9yIE5hTiB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB2YWx1ZSBpcyBOYU4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayhOYU4pKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZVVuZGVmaW5lZFZhbHVlcycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCBpZiBpdCBpcyBub3QgYW4gb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHdoZW4gdGhlIGlucHV0IGlzIG5vdCBhbiBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IDEyMztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyBpZiBhbGwgdmFsdWVzIGFyZSBkZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGFsbCB2YWx1ZXMgYXJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogMSwgYjogJ2hlbGxvJywgYzogdHJ1ZSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlVW5kZWZpbmVkVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzIGlmIHNvbWUgdmFsdWVzIGFyZSBkZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgdmFsdWVzIGFyZSBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IDEsIGI6IHVuZGVmaW5lZCwgYzogdHJ1ZSB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IDEsIGM6IHRydWUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBpZiB0aGUgaW5wdXQgaXMgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgaW5wdXQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGlucHV0IGlzIHVuZGVmaW5lZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIHRoZSBpbnB1dCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSB1bmRlZmluZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzIHdoZW4gc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxLCBjOiB1bmRlZmluZWQgfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBudWxsXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IDEsIGM6IG51bGwgfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSwgYzogbnVsbCB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgZW1wdHkgc3RyaW5ncycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IDEsIGM6ICcnIH0sIGQ6IDIgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0geyBhOiB7IGI6IDEsIGM6ICcnIH0sIGQ6IDIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyBpZiBzb21lIG5lc3RlZCB2YWx1ZXMgYXJlIGZhbHNlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxLCBjOiBmYWxzZSB9LCBkOiAyIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogeyBiOiAxLCBjOiBmYWxzZSB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSB6ZXJvXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgemVybycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IDEsIGM6IDAgfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSwgYzogMCB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBOYU5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzIHdoZW4gc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBOYU4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxLCBjOiBOYU4gfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSwgYzogTmFOIH0sIGQ6IDIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZU51bGxWYWx1ZXMnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gZW1wdHkgb2JqZWN0IGFzIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHdoZW4gaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7fTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gb2JqZWN0IHdpdGggbm8gbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBpbnB1dCBoYXMgbm8gbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogMSwgYjogJ2hlbGxvJywgYzogWzEsIDIsIDNdIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogMSwgYjogJ2hlbGxvJywgYzogWzEsIDIsIDNdIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgbnVsbCBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBpbnB1dCBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBudWxsO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBudWxsO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlTnVsbFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBoYW5kbGVzIHVuZGVmaW5lZCBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIGlucHV0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYSBzdHJpbmcgYXMgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2hlbiBpbnB1dCBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2hlbGxvJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ2hlbGxvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZU51bGxWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhIG51bWJlciBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG51bWJlciB3aGVuIGlucHV0IGlzIGEgbnVtYmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAxMjM7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IDEyMztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZU51bGxWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBhcnJheSBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIGFycmF5IHdoZW4gaW5wdXQgaXMgYW4gYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAyLCAzXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0geyAnMCc6IDEsICcxJzogMiwgJzInOiAzIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gb2JqZWN0IHdpdGggb25seSBudWxsIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIGlucHV0IGhhcyBvbmx5IG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IG51bGwsIGI6IG51bGwsIGM6IG51bGwgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gb2JqZWN0IHdpdGggbmVzdGVkIG51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgbmVzdGVkIG51bGwgdmFsdWVzIGZyb20gdGhlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IG51bGwgfSwgYzogeyBkOiB7IGU6IG51bGwgfSB9IH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYToge30sIGM6IHsgZDoge30gfSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlTnVsbFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBvYmplY3Qgd2l0aCBuZXN0ZWQgbm9uLW51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHdoZW4gaW5wdXQgaGFzIG5lc3RlZCBub24tbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxIH0sIGM6IHsgZDogeyBlOiAnaGVsbG8nIH0gfSB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSB9LCBjOiB7IGQ6IHsgZTogJ2hlbGxvJyB9IH0gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZU51bGxWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBvYmplY3Qgd2l0aCBtaXhlZCBuZXN0ZWQgbnVsbCBhbmQgbm9uLW51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgbmVzdGVkIG51bGwgdmFsdWVzIGFuZCBrZWVwIG5vbi1udWxsIHZhbHVlcyBpbiB0aGUgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IHsgYjogbnVsbCwgYzogMSB9LCBkOiB7IGU6IG51bGwsIGY6ICdoZWxsbycgfSB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYzogMSB9LCBkOiB7IGY6ICdoZWxsbycgfSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlTnVsbFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlcyBhbmQgZmFsc3kgbm9uLW51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgbnVsbCB2YWx1ZXMgYW5kIGtlZXAgZmFsc3kgbm9uLW51bGwgdmFsdWVzIGluIHRoZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogbnVsbCwgYjogZmFsc2UsIGM6IDAsIGQ6ICcnIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYjogZmFsc2UsIGM6IDAsIGQ6ICcnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlVW5kZWZpbmVkQW5kTnVsbFZhbHVlcycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCB3aGVuIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggZGVmaW5lZCBhbmQgbm90IG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiAndGVzdCcsIGM6IHRydWUgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsVmFsdWVzKG9iaikpLnRvRXF1YWwob2JqKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9iamVjdCB3aXRob3V0IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIGRlZmluZWQgYW5kIG51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIG9iamVjdCB3aXRob3V0IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIGRlZmluZWQgYW5kIG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiBudWxsLCBjOiAndGVzdCcsIGQ6IG51bGwgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0geyBhOiAxLCBjOiAndGVzdCcgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsVmFsdWVzKG9iaikpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiBwYXNzZWQgYW4gZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHdoZW4gcGFzc2VkIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbCh7fSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgYW5kIG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHVuZGVmaW5lZCBhbmQgbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIGFuZCBudWxsIHZhbHVlcyB3aGVuIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgYW5kIG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiB1bmRlZmluZWQsIGM6ICd0ZXN0JywgZDogbnVsbCB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IDEsIGM6ICd0ZXN0JyB9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIHdoZW4gcGFzc2VkIGEgbm9uLW9iamVjdCB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIHdoZW4gcGFzc2VkIGEgbm9uLW9iamVjdCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gMTIzO1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXModmFsdWUpKS50b0VxdWFsKHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0IHdpdGggbmVzdGVkIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlcyB3aGVuIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBuZXN0ZWQgcHJvcGVydGllcyBjb250YWluaW5nIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB3aXRoIG5lc3RlZCBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXMgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggbmVzdGVkIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6IDEsIGI6IHsgYzogJ3Rlc3QnLCBkOiB0cnVlIH0sIGU6ICd0ZXN0JyB9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbChvYmopO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgZGVmaW5lZCBhbmQgbm90IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgZGVmaW5lZCBhbmQgbm90IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6IDEsIGI6ICd0ZXN0JywgYzogdHJ1ZSB9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbChvYmopO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2JqZWN0IHdpdGhvdXQgbnVsbCB2YWx1ZXMgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBjb250YWluaW5nIGRlZmluZWQgYW5kIG51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIG9iamVjdCB3aXRob3V0IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBudWxsIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHsgYTogMSwgYjogbnVsbCwgYzogJ3Rlc3QnLCBkOiBudWxsIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogMSwgYzogJ3Rlc3QnIH07XG4gICAgICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkQW5kTnVsbFZhbHVlcyhvYmopKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcycsICgpID0+IHtcbiAgICAvLyBUT0RPOiBORUVEIFRPIEZJWCBUSElTIFRFU1RTXG4gICAgLy8gLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBvYmplY3Qgd2hlbiBhbGwgdmFsdWVzIGFyZSBkZWZpbmVkLCBub3QgbnVsbCwgYW5kIG5vdCBlbXB0eVxuICAgIC8vIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB3aGVuIGFsbCB2YWx1ZXMgYXJlIGRlZmluZWQsIG5vdCBudWxsLCBhbmQgbm90IGVtcHR5JywgKCkgPT4ge1xuICAgIC8vICAgY29uc3Qgb2JqID0ge1xuICAgIC8vICAgICBwcm9wMTogJ3ZhbHVlMScsXG4gICAgLy8gICAgIHByb3AyOiAxMjMsXG4gICAgLy8gICAgIHByb3AzOiBbMSwgMiwgM10sXG4gICAgLy8gICAgIHByb3A0OiB7IG5lc3RlZFByb3A6ICduZXN0ZWRWYWx1ZScgfSxcbiAgICAvLyAgIH07XG4gICAgLy8gICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkQW5kTnVsbEFuZEVtcHR5VmFsdWVzKG9iaikpLnRvRXF1YWwob2JqKTtcbiAgICAvLyB9KTtcblxuICAgIC8vIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0IHdoZW4gYWxsIHZhbHVlcyBhcmUgZGVmaW5lZCBhbmQgbm90IG51bGxcbiAgICAvLyBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBhbGwgdmFsdWVzIGFyZSBkZWZpbmVkIGFuZCBub3QgbnVsbCcsICgpID0+IHtcbiAgICAvLyAgIGNvbnN0IG9iaiA9IHtcbiAgICAvLyAgICAgcHJvcDE6ICd2YWx1ZTEnLFxuICAgIC8vICAgICBwcm9wMjogMTIzLFxuICAgIC8vICAgICBwcm9wMzogWzEsIDIsIDNdLFxuICAgIC8vICAgICBwcm9wNDogeyBuZXN0ZWRQcm9wOiAnbmVzdGVkVmFsdWUnIH0sXG4gICAgLy8gICB9O1xuICAgIC8vICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcyhvYmopKS50b0VxdWFsKG9iaik7XG4gICAgLy8gfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IG9iamVjdCB3aGVuIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkQW5kTnVsbEFuZEVtcHR5VmFsdWVzKG9iaikpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxsIHdoZW4gdGhlIGlucHV0IGlzIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gdGhlIGlucHV0IGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBudWxsO1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcyhvYmopKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgaW5wdXQgaXMgdW5kZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHVuZGVmaW5lZDtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMob2JqKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgb2JqZWN0IGhhcyBvbmx5IGVtcHR5IHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIHRoZSBpbnB1dCBvYmplY3QgaGFzIG9ubHkgZW1wdHkgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBwcm9wMTogJycsXG4gICAgICAgIHByb3AyOiAnICAgICcsXG4gICAgICAgIHByb3AzOiBbXSxcbiAgICAgICAgcHJvcDQ6IHt9LFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMob2JqKSkudG9FcXVhbCh7IHByb3AyOiAnICAgICcgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IG9iamVjdCBhbmQgZG9lcyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIG5ldyBvYmplY3QgYW5kIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgcHJvcDE6ICd2YWx1ZTEnLFxuICAgICAgICBwcm9wMjogbnVsbCxcbiAgICAgICAgcHJvcDM6ICcnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcyhvYmopO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7IHByb3AxOiAndmFsdWUxJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKG9iaik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmbGF0dGVuTWFwJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IGlmIGl0IGlzIG5vdCBhbiBhcnJheSBvciBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgaW5wdXQgd2hlbiBpdCBpcyBub3QgYW4gYXJyYXkgb3Igb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSA1O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbk1hcChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5XG4gICAgLy8gT25seSAxIGxldmVsIG9mIGZsYXR0ZW5pbmcgaXMgcGVyZm9ybWVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbGF0dGVuZWQgYXJyYXkgd2hlbiB0aGUgaW5wdXQgaXMgYW4gYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCBbMiwgM10sIFs0LCBbNSwgNl1dXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbMSwgMiwgMywgNCwgWzUsIDZdXSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhdHRlbmVkIGFycmF5IGlmIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBhcnJheSB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGZsYXR0ZW5lZCBhcnJheSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBhcnJheSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogWzEsIDJdLCBiOiBbMywgNF0gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbMSwgMiwgMywgNF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gW107XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uIHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIG51bGwgdmFsdWUgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggbnVsbCB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGFycmF5IHdpdGggbnVsbCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIG51bGwgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFtudWxsXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbbnVsbF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlIGlmIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGggbnVsbCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IG51bGwgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbbnVsbF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIHVuZGVmaW5lZCB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCB1bmRlZmluZWQgdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRoIHVuZGVmaW5lZCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIHVuZGVmaW5lZCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gW3VuZGVmaW5lZF07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW3VuZGVmaW5lZF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgdmFsdWUgaWYgdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHVuZGVmaW5lZCB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29sbGVjdGlvbiB3aXRoIHVuZGVmaW5lZCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogdW5kZWZpbmVkIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW3VuZGVmaW5lZF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIE5hTiB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCBOYU4gdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRoIE5hTiB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIE5hTiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gW05hTl07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW05hTl0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBOYU4gdmFsdWUgaWYgdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIE5hTiB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29sbGVjdGlvbiB3aXRoIE5hTiB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBOYU4gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogTmFOIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW05hTl0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZyB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCBlbXB0eSBzdHJpbmcgdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZyB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gWycnXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbJyddKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzIGlmIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGZsYXR0ZW5lZCBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgd2hlbiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBbMSwgJ3R3bycsIHRydWUsIHsgbmFtZTogJ0pvaG4nIH1dO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbk1hcChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKFsxLCAndHdvJywgdHJ1ZSwgeyBuYW1lOiAnSm9obicgfV0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZsYXR0ZW5lZCBjb2xsZWN0aW9uIHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcyBpZiB0aGUgaW5wdXQgaXMgYW4gb2JqZWN0IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxhdHRlbmVkIGNvbGxlY3Rpb24gd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzIHdoZW4gdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDI1LCBpc1N0dWRlbnQ6IHRydWUsIGhvYmJpZXM6IFsncmVhZGluZycsICdwYWludGluZyddIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWydKb2huJywgMjUsIHRydWUsICdyZWFkaW5nJywgJ3BhaW50aW5nJ10pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZsYXR0ZW5lZCBhcnJheSB3aXRoIG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHMgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxhdHRlbmVkIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0cyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCBbMiwgWzMsIDRdXSwgeyBuYW1lOiAnSm9obicsIGFnZTogMjUgfV07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWzEsIDIsIFszLCA0XSwgeyBuYW1lOiAnSm9obicsIGFnZTogMjUgfV0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZsYXR0ZW5lZCBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxhdHRlbmVkIGFycmF5IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAndHdvJywgdHJ1ZSwgeyBuYW1lOiAnSm9obicgfV07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWzEsICd0d28nLCB0cnVlLCB7IG5hbWU6ICdKb2huJyB9XSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhdHRlbmVkIGNvbGxlY3Rpb24gd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzIGlmIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbGF0dGVuZWQgY29sbGVjdGlvbiB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgd2hlbiB0aGUgaW5wdXQgaXMgYW4gb2JqZWN0IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBuYW1lOiAnSm9obicsIGFnZTogMjUsIGlzU3R1ZGVudDogdHJ1ZSwgaG9iYmllczogWydyZWFkaW5nJywgJ3BhaW50aW5nJ10gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbJ0pvaG4nLCAyNSwgdHJ1ZSwgJ3JlYWRpbmcnLCAncGFpbnRpbmcnXSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhdHRlbmVkIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0cyBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbGF0dGVuZWQgYXJyYXkgd2l0aCBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzIHdoZW4gdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gWzEsIFsyLCBbMywgNF1dLCB7IG5hbWU6ICdKb2huJywgYWdlOiAyNSB9XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbMSwgMiwgWzMsIDRdLCB7IG5hbWU6ICdKb2huJywgYWdlOiAyNSB9XSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdiYXNlNjRDb252ZXJ0b3InLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gZW1wdHkgc3RyaW5nIGlucHV0IGFuZCByZXR1cm5zIGFuIGVtcHR5IGJhc2U2NCBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBiYXNlNjQgc3RyaW5nIHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJyc7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICcnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZTY0Q29udmVydG9yKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYSBzdHJpbmcgaW5wdXQgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBhbmQgY29udmVydHMgaXQgdG8gYmFzZTY0IGZvcm1hdFxuICAgIGl0KCdzaG91bGQgY29udmVydCBhIHN0cmluZyB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHRvIGJhc2U2NCBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICfjgZPjgpPjgavjgaHjga8nO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnNDRHVDQ0S1Q0NEdyNDRHaDQ0R3YnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZTY0Q29udmVydG9yKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYSBzdHJpbmcgaW5wdXQgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGNvbnZlcnRzIGl0IHRvIGJhc2U2NCBmb3JtYXRcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgYSBzdHJpbmcgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gYmFzZTY0IGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJyFAIyQlXiYqKCknO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnSVVBakpDVmVKaW9vS1E9PSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBiYXNlNjRDb252ZXJ0b3IoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhIHN0cmluZyBpbnB1dCB3aXRoIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhbmQgY29udmVydHMgaXQgdG8gYmFzZTY0IGZvcm1hdFxuICAgIGl0KCdzaG91bGQgY29udmVydCBhIHN0cmluZyB3aXRoIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiYXNlNjQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnICAgSGVsbG8gV29ybGQgICAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnSUNBZ1NHVnNiRzhnVjI5eWJHUWdJQ0E9JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2U2NENvbnZlcnRvcihpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBoYW5kbGVzIGEgc3RyaW5nIGlucHV0IHdpdGggbGluZSBicmVha3MgYW5kIGNvbnZlcnRzIGl0IHRvIGJhc2U2NCBmb3JtYXRcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgYSBzdHJpbmcgd2l0aCBsaW5lIGJyZWFrcyB0byBiYXNlNjQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnSGVsbG9cXG5Xb3JsZCc7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICdTR1ZzYkc4S1YyOXliR1E9JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2U2NENvbnZlcnRvcihpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRVcmwnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgcmV0dXJucyBhIFVSTCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20nO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZUluc3RhbmNlT2YoVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYSB2YWxpZCBVUkwgb2JqZWN0IHJldHVybnMgdGhlIHNhbWUgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCdodHRwczovL3d3dy5leGFtcGxlLmNvbScpO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKT8udG9KU09OKCkpLnRvQmUodXJsLnRvSlNPTigpKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYSBVUkwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzIHJldHVybnMgYSBVUkwgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tP3BhcmFtMT12YWx1ZTEmcGFyYW0yPXZhbHVlMic7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGEgaGFzaCByZXR1cm5zIGEgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVVJMIG9iamVjdCB3aGVuIGdpdmVuIGEgVVJMIHdpdGggYSBoYXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tI3NlY3Rpb24xJztcbiAgICAgIGV4cGVjdChpc1ZhbGlkVXJsKHVybCkpLnRvQmVJbnN0YW5jZU9mKFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGEgVVJMIHdpdGggYSBwb3J0IHJldHVybnMgYSBVUkwgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBhIHBvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb206ODA4MCc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHJldHVybnMgYSBVUkwgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL3VzZXJuYW1lOnBhc3N3b3JkQGV4YW1wbGUuY29tJztcbiAgICAgIGV4cGVjdChpc1ZhbGlkVXJsKHVybCkpLnRvQmVJbnN0YW5jZU9mKFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGFuIGVtcHR5IHN0cmluZyByZXR1cm5zIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gZ2l2ZW4gYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJyc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHRlc3Qgb2JqZWN0aXZlIGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiAnaXNWYWxpZFVybCcgcmV0dXJucyBudWxsIHdoZW4gZ2l2ZW4gYW4gaW52YWxpZCBVUkwgc3RyaW5nLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBnaXZlbiBhbiBpbnZhbGlkIFVSTCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaW52YWxpZC11cmwnO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYW4gVVJMIHdpdGggYSBkaWZmZXJlbnQgcHJvdG9jb2wgcmV0dXJucyB2YWxpZCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBhIGRpZmZlcmVudCBwcm90b2NvbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdmdHA6Ly93d3cuZXhhbXBsZS5jb20nO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZUluc3RhbmNlT2YoVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYW4gaW52YWxpZCBVUkwgd2l0aCBhbiBpbnZhbGlkIHBvcnQgcmV0dXJucyBudWxsXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIGdpdmVuIGEgVVJMIHdpdGggYW4gaW52YWxpZCBwb3J0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tOmFiYyc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGludmFsaWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHJldHVybnMgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCB1c2VybmFtZSBhbmQgcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly91c2VybmFtZTpwYXNzd29yZEBleGFtcGxlLmNvbSc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGEgc3ViZG9tYWluIHJldHVybnMgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBnaXZlbiBhIFVSTCB3aXRoIGFuIGludmFsaWQgc3ViZG9tYWluJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vaW52YWxpZC5leGFtcGxlLmNvbSc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgd2l0aCBhIHBhdGggcmV0dXJucyBhIFVSTCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBzdHJpbmcgd2l0aCBhIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGF0aCc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgd2l0aCBhIHN1YmRvbWFpbiByZXR1cm5zIGEgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVVJMIG9iamVjdCB3aGVuIGdpdmVuIGEgdmFsaWQgVVJMIHN0cmluZyB3aXRoIGEgc3ViZG9tYWluJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vc3ViZG9tYWluLmV4YW1wbGUuY29tJztcbiAgICAgIGV4cGVjdChpc1ZhbGlkVXJsKHVybCkpLnRvQmVJbnN0YW5jZU9mKFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGEgdmFsaWQgVVJMIHN0cmluZyByZXR1cm5zIGEgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVVJMIG9iamVjdCB3aGVuIGdpdmVuIGEgdmFsaWQgVVJMIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL3d3dy5leGFtcGxlLmNvbSc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgcmV0dXJucyBhIFVSTCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20nO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZUluc3RhbmNlT2YoVVJMKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmlwVHJhaWxpbmdTbGFzaCcsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHN0cmluZyBpZiBpdCBkb2VzIG5vdCBlbmQgd2l0aCAnLydcbiAgICBpdChcInNob3VsZCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nIHdoZW4gaXQgZG9lcyBub3QgZW5kIHdpdGggJy8nXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2V4YW1wbGUnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgdHJhaWxpbmcgJy8nIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGl0XG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIHRoZSB0cmFpbGluZyAnLycgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggaXRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgb25seSBvbmUgdHJhaWxpbmcgJy8nIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIG11bHRpcGxlXG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIG9ubHkgb25lIHRyYWlsaW5nICcvJyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBtdWx0aXBsZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICdleGFtcGxlLy8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUvJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICcnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJycpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgaXQgY29udGFpbnMgb25seSAnLydcbiAgICBpdChcInNob3VsZCByZXR1cm4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgY29udGFpbnMgb25seSAnLydcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwVHJhaWxpbmdTbGFzaChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgc3RyaW5nIGlmIGl0IGRvZXMgbm90IGVuZCB3aXRoICcvJ1xuICAgIGl0KFwic2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2hlbiBpdCBkb2VzIG5vdCBlbmQgd2l0aCAnLydcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdHJpcFRyYWlsaW5nU2xhc2goaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBmcm9tIGEgc3RyaW5nIGlmIGl0IGV4aXN0c1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRoZSB0cmFpbGluZyBzbGFzaCB3aGVuIGl0IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2V4YW1wbGUvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwVHJhaWxpbmdTbGFzaChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdleGFtcGxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBmcm9tIGEgc3RyaW5nIGlmIGl0IGV4aXN0c1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRoZSB0cmFpbGluZyBzbGFzaCB3aGVuIGl0IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2V4YW1wbGUvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwVHJhaWxpbmdTbGFzaChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdleGFtcGxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZW1vdmVzIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBhIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgd2hlbiB0aGV5IGV4aXN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIGZyb20gYSBzdHJpbmcgaWYgaXQgZXhpc3RzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgdGhlIHRyYWlsaW5nIHNsYXNoIHdoZW4gaXQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIGZyb20gYSBzdHJpbmcgaWYgaXQgZW5kcyB3aXRoICcvJ1xuICAgIGl0KFwic2hvdWxkIHJlbW92ZSB0aGUgdHJhaWxpbmcgc2xhc2ggd2hlbiB0aGUgc3RyaW5nIGVuZHMgd2l0aCAnLydcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzUHJpbWl0aXZlJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgaXNQcmltaXRpdmUgcmV0dXJucyB0cnVlIGZvciBhIHByaW1pdGl2ZSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKCdoZWxsbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNQcmltaXRpdmUgcmV0dXJucyB0cnVlIGZvciBhIHByaW1pdGl2ZSBudW1iZXJcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlIG51bWJlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKDEyMyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIHRydWUgZm9yIGEgcHJpbWl0aXZlIGJvb2xlYW5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc1ByaW1pdGl2ZSh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzUHJpbWl0aXZlIHJldHVybnMgdHJ1ZSBmb3IgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgYXJndW1lbnQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKG51bGwpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNQcmltaXRpdmUgcmV0dXJucyB0cnVlIGZvciB1bmRlZmluZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIGZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIG5vbi1wcmltaXRpdmUgd3JhcHBlciBjbGFzcyAoRGF0ZSlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBhIG5vbi1wcmltaXRpdmUgd3JhcHBlciBjbGFzcyAoRGF0ZSknLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc1ByaW1pdGl2ZShuZXcgRGF0ZSgpKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIGZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIGN1c3RvbSBjbGFzc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGEgY3VzdG9tIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY2xhc3MgQ3VzdG9tQ2xhc3Mge31cbiAgICAgIGNvbnN0IGFyZyA9IG5ldyBDdXN0b21DbGFzcygpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNQcmltaXRpdmUoYXJnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIGZhbHNlIGZvciBhIGZ1bmN0aW9uIHdpdGggcHJvcGVydGllc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gd2l0aCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnVuYyA9ICgpID0+IHt9O1xuICAgICAgZnVuYy5wcm9wZXJ0eSA9ICd2YWx1ZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc1ByaW1pdGl2ZShmdW5jKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIHRydWUgZm9yIGEgc3ltYm9sXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHN5bWJvbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKFN5bWJvbCgndGVzdCcpKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRUeXBlJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHN0cmluZyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0cmluZyB3aGVuIHRoZSBpbnB1dCBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2hlbGxvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnc3RyaW5nJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdldFR5cGUgcmV0dXJucyB0aGUgY29ycmVjdCB0eXBlIGZvciBudW1iZXIgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudW1iZXIgd2hlbiB0aGUgaW5wdXQgaXMgYSBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IDQyO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VHlwZShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdudW1iZXInKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zIHRoZSBjb3JyZWN0IHR5cGUgZm9yIGJvb2xlYW4gaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBib29sZWFuIHdoZW4gdGhlIGlucHV0IGlzIGEgYm9vbGVhbiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRUeXBlKHRydWUpKS50b0JlKCdib29sZWFuJyk7XG4gICAgICBleHBlY3QoZ2V0VHlwZShmYWxzZSkpLnRvQmUoJ2Jvb2xlYW4nKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zICdOVUxMJyB3aGVuIHRoZSBpbnB1dCBpcyBudWxsXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuICdOVUxMJyB3aGVuIHRoZSBpbnB1dCBpcyBudWxsXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnTlVMTCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgJ29iamVjdCcgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0IHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgdGhlIGNvcnJlY3QgdHlwZSBmb3IgZnVuY3Rpb24gaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmdW5jdGlvbiB3aGVuIHRoZSBpbnB1dCBpcyBhIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAoKSA9PiB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zIHRoZSBjb3JyZWN0IHR5cGUgZm9yIGJpZ2ludCBpbnB1dFxuICAgIGl0KFwic2hvdWxkIHJldHVybiAnYmlnaW50JyB3aGVuIHRoZSBpbnB1dCBpcyBhIGJpZ2ludFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IEJpZ0ludCgxMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2JpZ2ludCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgJ3N5bWJvbCcgd2hlbiB0aGUgaW5wdXQgaXMgYSBzeW1ib2xcbiAgICBpdChcInNob3VsZCByZXR1cm4gJ3N5bWJvbCcgd2hlbiB0aGUgaW5wdXQgaXMgYSBzeW1ib2xcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBTeW1ib2woJ3Rlc3QnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnc3ltYm9sJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdldFR5cGUgcmV0dXJucyAndW5kZWZpbmVkJyB3aGVuIHRoZSBpbnB1dCBpcyB1bmRlZmluZWRcbiAgICBpdChcInNob3VsZCByZXR1cm4gJ05VTEwnIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnTlVMTCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYXJyb3cgZnVuY3Rpb24gaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmdW5jdGlvbiB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJvdyBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gKCkgPT4ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdldFR5cGUgcmV0dXJucyAnb2JqZWN0JyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0IHdoZW4gdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIG9iamVjdCB0aGUgY29ycmVjdCB0eXBlIGZvciBjbGFzcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG9iamVjdCB3aGVuIHRoZSBpbnB1dCBpcyBhIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY2xhc3MgTXlDbGFzcyB7fVxuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgTXlDbGFzcygpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VHlwZShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdvYmplY3QnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zICdmdW5jdGlvbicgd2hlbiB0aGUgaW5wdXQgaXMgYSBnZW5lcmF0b3IgZnVuY3Rpb25cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmdW5jdGlvbiB3aGVuIHRoZSBpbnB1dCBpcyBhIGdlbmVyYXRvciBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgIGNvbnN0IGlucHV0ID0gZnVuY3Rpb24qICgpIHt9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VHlwZShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgJ2Z1bmN0aW9uJyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhc3luYyBmdW5jdGlvblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZ1bmN0aW9uIHdoZW4gdGhlIGlucHV0IGlzIGFuIGFzeW5jIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBhc3luYyAoKSA9PiB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzT2JqZWN0JywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW4gb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0ge307XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhIGZ1bmN0aW9uXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIGEgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICgpID0+IHt9O1xuICAgICAgZXhwZWN0KGlzT2JqZWN0KHZhbHVlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG51bGw7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIHVuZGVmaW5lZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdmFsdWUgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGFuIGFycmF5XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gW107XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGEgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gJ3Rlc3QnO1xuICAgICAgZXhwZWN0KGlzT2JqZWN0KHZhbHVlKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZvciBhIG51bWJlclxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdmFsdWUgaXMgYSBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IDEyMztcbiAgICAgIGV4cGVjdChpc09iamVjdCh2YWx1ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgYSBib29sZWFuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRydWU7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGEgc3ltYm9sXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIHN5bWJvbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gU3ltYm9sKCk7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgdmFsdWUgaXMgTmFOXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBOYU4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IE5hTjtcbiAgICAgIGV4cGVjdChpc09iamVjdCh2YWx1ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNFbXB0eScsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHkgcmV0dXJucyB0cnVlIGZvciBhbiBlbXB0eSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eSByZXR1cm5zIHRydWUgZm9yIGFuIGVtcHR5IGFycmF5XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGlucHV0IGlzIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBbXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGlucHV0IGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0VtcHR5KGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gaW5wdXQgaXMgYSBub24tZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnaGVsbG8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNFbXB0eShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBhIG5vbi1lbXB0eSBhcnJheVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gaW5wdXQgaXMgYSBub24tZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAyLCAzXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHkgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBpbnB1dCBpcyBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsga2V5OiAndmFsdWUnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0VtcHR5KGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5IHJldHVybnMgdHJ1ZSBmb3IgbnVsbCBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBpbnB1dCBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBudWxsO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNFbXB0eShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHRlc3Qgb2JqZWN0aXZlIGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiAnaXNFbXB0eScgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0VtcHR5KGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHkgcmV0dXJucyBmYWxzZSBmb3IgTmFOIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBpbnB1dCBpcyBOYU4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IE5hTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0IHRoYXQgdGhlIGZ1bmN0aW9uICdpc0VtcHR5JyByZXR1cm5zIHRydWUgd2hlbiB0aGUgaW5wdXQgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBpbnB1dCBpcyBhIHdoaXRlc3BhY2Ugc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnICAgJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzRW1wdHlPYmplY3QnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgdHJ1ZSBmb3IgYW4gZW1wdHkgb2JqZWN0IHt9XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IG9iamVjdCB7YTogJzEnfVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6ICcxJyB9O1xuICAgICAgZXhwZWN0KGlzRW1wdHlPYmplY3Qob2JqKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHlPYmplY3QgcmV0dXJucyB0cnVlIGZvciBhbiBlbXB0eSBhcnJheSBbXVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChhcnIpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IGFycmF5IFsxLCAyLCAzXVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBhIG5vbi1lbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGFyciA9IFsxLCAyLCAzXTtcbiAgICAgIGV4cGVjdChpc0VtcHR5T2JqZWN0KGFycikpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgdHJ1ZSBmb3IgYW4gZW1wdHkgc3RyaW5nICcnXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0gJyc7XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IHN0cmluZyAnaGVsbG8nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGEgbm9uLWVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9ICdoZWxsbyc7XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eU9iamVjdCByZXR1cm5zIHRydWUgZm9yIG51bWJlclxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIG51bWJlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IDI7XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5JywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbm9uLWVtcHR5IHN0cmluZyBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSgndGVzdCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbm9uLWVtcHR5IG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tZW1wdHkgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSh7IGtleTogJ3ZhbHVlJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIG5vbi1lbXB0eSBhcnJheSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tZW1wdHkgYXJyYXkgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KFsxLCAyLCAzXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYSBub24temVybyBudW1iZXIgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgbm9uLXplcm8gbnVtYmVyIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSgxMjMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgYm9vbGVhbiB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSgnJyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGZhbHNlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBmYWxzZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWROb3ROdWxsTm90RW1wdHkoZmFsc2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIDAgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIDAgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KDApO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBOYU4gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBOYU4gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KE5hTik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBudWxsIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gbnVsbCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWROb3ROdWxsTm90RW1wdHkobnVsbCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eShbXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KHt9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlVW5kZWZpbmVkTnVsbEVtcHR5RXhjbEJvb2xJbnQnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBvYmplY3QgaWYgaXQgZG9lcyBub3QgY29udGFpbiB1bmRlZmluZWQsIG51bGwsIGVtcHR5LCBib29sZWFuLCBvciBpbnRlZ2VyIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB3aGVuIGl0IGRvZXMgbm90IGNvbnRhaW4gdW5kZWZpbmVkLCBudWxsLCBlbXB0eSwgYm9vbGVhbiwgb3IgaW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6IDEsIGI6ICd0ZXN0JywgYzogeyBkOiAnbmVzdGVkJyB9IH07XG4gICAgICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkTnVsbEVtcHR5RXhjbEJvb2xJbnQob2JqKSkudG9FcXVhbChvYmopO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB1bmRlZmluZWQsIG51bGwsIGVtcHR5LCBib29sZWFuLCBvciBpbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBvYmplY3QgYW5kIHJldHVybnMgdGhlIGNsZWFuZWQgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSwgYm9vbGVhbiwgb3IgaW50ZWdlciB2YWx1ZXMgZnJvbSB0aGUgb2JqZWN0IGFuZCByZXR1cm4gdGhlIGNsZWFuZWQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiB1bmRlZmluZWQsIGM6IG51bGwsIGQ6ICcnLCBlOiB7fSwgZjogdHJ1ZSwgZzogMCB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IDEsIGY6IHRydWUsIGc6IDAgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludChvYmopKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBpbnB1dCBpcyB1bmRlZmluZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2hlbiB0aGUgaW5wdXQgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZE51bGxFbXB0eUV4Y2xCb29sSW50KHVuZGVmaW5lZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBpZiB0aGUgaW5wdXQgaXMgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgaW5wdXQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludChudWxsKSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZE51bGxFbXB0eUV4Y2xCb29sSW50KHt9KSkudG9FcXVhbCh7fSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgaW5wdXQgY29udGFpbnMgb25seSB1bmRlZmluZWQsIG51bGwsIGVtcHR5LCBib29sZWFuLCBvciBpbnRlZ2VyIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgdmFsaWQgb2JqZWN0IHdoZW4gdGhlIGlucHV0IGNvbnRhaW5zIG9ubHkgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSwgYm9vbGVhbiBvciBpbnRlZ2VyIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHsgYTogdW5kZWZpbmVkLCBiOiBudWxsLCBjOiAnJywgZDoge30sIGU6IHRydWUsIGY6IDAgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludChvYmopKS50b0VxdWFsKHsgZTogdHJ1ZSwgZjogMCB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEhhc2hGcm9tQXJyYXknLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiBnaXZlbiBhbiBlbXB0eSBhcnJheVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIGdpdmVuIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW107XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRIYXNoRnJvbUFycmF5KGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBoYXNoTWFwIHdpdGggY29ycmVjdCBrZXktdmFsdWUgcGFpcnMgd2hlbiBnaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggJ2Zyb20nIGFuZCAndG8nIHByb3BlcnRpZXNcbiAgICBpdChcInNob3VsZCByZXR1cm4gYSBoYXNoTWFwIHdpdGggY29ycmVjdCBrZXktdmFsdWUgcGFpcnMgd2hlbiBnaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggJ2Zyb20nIGFuZCAndG8nIHByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206ICdBJywgdG86ICcxJyB9LFxuICAgICAgICB7IGZyb206ICdCJywgdG86ICcyJyB9LFxuICAgICAgICB7IGZyb206ICdDJywgdG86ICczJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoeyBhOiAnMScsIGI6ICcyJywgYzogJzMnIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiBnaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggZW1wdHkgJ2Zyb20nIHByb3BlcnR5XG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIGdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBlbXB0eSAnZnJvbScgcHJvcGVydHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206ICcnLCB0bzogJzEnIH0sXG4gICAgICAgIHsgZnJvbTogJycsIHRvOiAnMicgfSxcbiAgICAgICAgeyBmcm9tOiAnJywgdG86ICczJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhc2hNYXAgd2l0aCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgJ2Zyb20nIHByb3BlcnR5IHdoZW4gZ2l2ZW4gYW4gYXJyYXkgd2l0aCBkdXBsaWNhdGUgJ2Zyb20nIHByb3BlcnRpZXNcbiAgICBpdChcInNob3VsZCByZXR1cm4gYSBoYXNoTWFwIHdpdGggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhICdmcm9tJyBwcm9wZXJ0eSB3aGVuIGdpdmVuIGFuIGFycmF5IHdpdGggZHVwbGljYXRlICdmcm9tJyBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAnQScsIHRvOiAnMScgfSxcbiAgICAgICAgeyBmcm9tOiAnQicsIHRvOiAnMicgfSxcbiAgICAgICAgeyBmcm9tOiAnQScsIHRvOiAnMycgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRIYXNoRnJvbUFycmF5KGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgYTogJzMnLCBiOiAnMicgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFzaE1hcCB3aXRoIG9ubHkgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhICdmcm9tJyBwcm9wZXJ0eSB3aGVuIGdpdmVuIGFuIGFycmF5IHdpdGggZHVwbGljYXRlICdmcm9tJyBwcm9wZXJ0aWVzIGFuZCBkaWZmZXJlbnQgJ3RvJyB2YWx1ZXNcbiAgICBpdChcInNob3VsZCByZXR1cm4gYSBoYXNoTWFwIHdpdGggb25seSB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgJ2Zyb20nIHByb3BlcnR5IHdoZW4gZ2l2ZW4gYW4gYXJyYXkgd2l0aCBkdXBsaWNhdGUgJ2Zyb20nIHByb3BlcnRpZXMgYW5kIGRpZmZlcmVudCAndG8nIHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ0EnLCB0bzogJzEnIH0sXG4gICAgICAgIHsgZnJvbTogJ0InLCB0bzogJzInIH0sXG4gICAgICAgIHsgZnJvbTogJ0EnLCB0bzogJzMnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheShhcnJheXMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7IGE6ICczJywgYjogJzInIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhc2hNYXAgd2l0aCBjb3JyZWN0IGtleS12YWx1ZSBwYWlycyB3aGVuIGdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBub24tc3RyaW5nICdmcm9tJyBhbmQgJ3RvJyBwcm9wZXJ0aWVzXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIGEgaGFzaE1hcCB3aXRoIGNvcnJlY3Qga2V5LXZhbHVlIHBhaXJzIHdoZW4gZ2l2ZW4gYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5vbi1zdHJpbmcgJ2Zyb20nIGFuZCAndG8nIHByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206IDEsIHRvOiB0cnVlIH0sXG4gICAgICAgIHsgZnJvbTogbnVsbCwgdG86IHVuZGVmaW5lZCB9LFxuICAgICAgICB7IGZyb206IFsxLCAyLCAzXSwgdG86IHsgYTogJ0EnLCBiOiAnQicgfSB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoeyAnMSc6IHRydWUsIG51bGw6IHVuZGVmaW5lZCwgJzEsMiwzJzogeyBhOiAnQScsIGI6ICdCJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29udmVydHMgdGhlICdmcm9tJyBwcm9wZXJ0eSB0byBsb3dlcmNhc2UgaW4gdGhlIGhhc2hNYXAgd2hlbiB0aGUgaXNMb3dlckNhc2UgcGFyYW1ldGVyIGlzIHRydWVcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgXCJmcm9tXCIgcHJvcGVydHkgdG8gbG93ZXJjYXNlIGluIGhhc2hNYXAgd2hlbiBpc0xvd2VyQ2FzZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206ICdWQUxVRTEnLCB0bzogJ1ZhbHVlMScgfSxcbiAgICAgICAgeyBmcm9tOiAnVkFMVUUyJywgdG86ICdWYWx1ZTInIH0sXG4gICAgICAgIHsgZnJvbTogJ1ZBTFVFMycsIHRvOiAnVmFsdWUzJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgICB2YWx1ZTE6ICdWYWx1ZTEnLFxuICAgICAgICB2YWx1ZTI6ICdWYWx1ZTInLFxuICAgICAgICB2YWx1ZTM6ICdWYWx1ZTMnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzLCAnZnJvbScsICd0bycsIHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRIYXNoRnJvbUFycmF5V2l0aER1cGxpY2F0ZScsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzXG4gICAgaXQoXCJzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMScsICd2YWwyJ10pLFxuICAgICAgICBwcm9wMjogbmV3IFNldChbJ3ZhbDInXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoTWFwIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG9ubHkgb25lIG9iamVjdFxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBvbmx5IG9uZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH1dO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0geyBwcm9wMTogbmV3IFNldChbJ3ZhbDEnXSkgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB1bmlxdWUgJ2Zyb20nIGtleXNcbiAgICBpdChcInNob3VsZCBjb3JyZWN0bHkgZ2VuZXJhdGUgYSBoYXNoTWFwIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHVuaXF1ZSAnZnJvbScga2V5c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwxJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDMnLCB0bzogJ3ZhbDMnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge1xuICAgICAgICBwcm9wMTogbmV3IFNldChbJ3ZhbDEnXSksXG4gICAgICAgIHByb3AyOiBuZXcgU2V0KFsndmFsMiddKSxcbiAgICAgICAgcHJvcDM6IG5ldyBTZXQoWyd2YWwzJ10pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB1bmlxdWUgJ3RvJyBrZXlzXG4gICAgaXQoXCJzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB1bmlxdWUgJ3RvJyBrZXlzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AyJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMycsIHRvOiAndmFsMycgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMSddKSxcbiAgICAgICAgcHJvcDI6IG5ldyBTZXQoWyd2YWwyJ10pLFxuICAgICAgICBwcm9wMzogbmV3IFNldChbJ3ZhbDMnXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgaGFzaE1hcCB3aGVuIGdpdmVuIGFuIGVtcHR5IGFycmF5XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgaGFzaE1hcCB3aGVuIGdpdmVuIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW107XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggZW1wdHkgJ2Zyb20nIGtleXNcbiAgICBpdChcInNob3VsZCBjb3JyZWN0bHkgaGFuZGxlIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBlbXB0eSAnZnJvbScga2V5c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJycsIHRvOiAndmFsMScgfSxcbiAgICAgICAgeyBmcm9tOiAnJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICcnLCB0bzogJ3ZhbDMnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRIYXNoRnJvbUFycmF5V2l0aER1cGxpY2F0ZShhcnJheXMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZEhhc2hNYXApO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGVtcHR5ICd0bycga2V5c1xuICAgIGl0KFwic2hvdWxkIHJldHVybiBhbiBlbXB0eSBoYXNoTWFwIHdoZW4gdGhlICd0bycga2V5IGlzIGVtcHR5IGluIGFsbCBvYmplY3RzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJycgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDInLCB0bzogJycgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDMnLCB0bzogJycgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7IHByb3AxOiBuZXcgU2V0KFsnJ10pLCBwcm9wMjogbmV3IFNldChbJyddKSwgcHJvcDM6IG5ldyBTZXQoWycnXSkgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzIHdoZW4gaXNMb3dlckNhc2UgaXMgc2V0IHRvIGZhbHNlXG4gICAgaXQoXCJzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzIHdoZW4gaXNMb3dlckNhc2UgaXMgc2V0IHRvIGZhbHNlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMScsICd2YWwyJ10pLFxuICAgICAgICBwcm9wMjogbmV3IFNldChbJ3ZhbDInXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzLCAnZnJvbScsICd0bycsIGZhbHNlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoTWFwIGZyb20gYSB2YWxpZCBhcnJheSBvZiBvYmplY3RzIHdpdGggY3VzdG9tIGZyb21LZXkgYW5kIHRvS2V5IHZhbHVlc1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGN1c3RvbSBmcm9tS2V5IGFuZCB0b0tleSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwxJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMScsIHRvOiAndmFsMicgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDInLCB0bzogJ3ZhbDInIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge1xuICAgICAgICBwcm9wMTogbmV3IFNldChbJ3ZhbDEnLCAndmFsMiddKSxcbiAgICAgICAgcHJvcDI6IG5ldyBTZXQoWyd2YWwyJ10pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cywgJ2Zyb20nLCAndG8nKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoTWFwIGZyb20gYSB2YWxpZCBhcnJheSBvZiBvYmplY3RzIHdpdGggJ2Zyb20nIGFuZCAndG8nIGtleXMgd2hlbiBpc0xvd2VyQ2FzZSBpcyBzZXQgdG8gdHJ1ZVxuICAgIGl0KFwic2hvdWxkIGNvcnJlY3RseSBnZW5lcmF0ZSBhIGhhc2hNYXAgZnJvbSBhIHZhbGlkIGFycmF5IG9mIG9iamVjdHMgd2l0aCAnZnJvbScgYW5kICd0bycga2V5cyB3aGVuIGlzTG93ZXJDYXNlIGlzIHNldCB0byB0cnVlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMScsICd2YWwyJ10pLFxuICAgICAgICBwcm9wMjogbmV3IFNldChbJ3ZhbDInXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzLCAnZnJvbScsICd0bycsIHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZEhhc2hNYXApO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGdlbmVyYXRlcyBhIGhhc2hNYXAgZnJvbSBhIHZhbGlkIGFycmF5IG9mIG9iamVjdHMgd2l0aCAnZnJvbScgYW5kICd0bycga2V5c1xuICAgIGl0KFwic2hvdWxkIGNvcnJlY3RseSBnZW5lcmF0ZSBhIGhhc2hNYXAgZnJvbSBhIHZhbGlkIGFycmF5IG9mIG9iamVjdHMgd2l0aCAnZnJvbScgYW5kICd0bycga2V5c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwxJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMScsIHRvOiAndmFsMicgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDInLCB0bzogJ3ZhbDInIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge1xuICAgICAgICBwcm9wMTogbmV3IFNldChbJ3ZhbDEnLCAndmFsMiddKSxcbiAgICAgICAgcHJvcDI6IG5ldyBTZXQoWyd2YWwyJ10pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGtleSBmcm9tIHByb3BlcnRpZXMgaWYgaXQgZXhpc3RzLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGZyb20gcHJvcGVydGllcyB3aGVuIGl0IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB0cmFpdHM6IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleSA9ICdrZXknO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VmFsdWVGcm9tUHJvcGVydGllc09yVHJhaXRzKHsgbWVzc2FnZSwga2V5IH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsdWUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBrZXkgZnJvbSB0cmFpdHMgaWYgaXQgZXhpc3RzLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGZyb20gdHJhaXRzIHdoZW4gaXQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHRyYWl0czoge1xuICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5ID0gJ2tleSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMoeyBtZXNzYWdlLCBrZXkgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWx1ZScpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGtleSBmcm9tIGNvbnRleHQudHJhaXRzIGlmIGl0IGV4aXN0cy5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGtleSBmcm9tIGNvbnRleHQudHJhaXRzIHdoZW4gaXQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB0cmFpdHM6IHtcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleSA9ICdrZXknO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VmFsdWVGcm9tUHJvcGVydGllc09yVHJhaXRzKHsgbWVzc2FnZSwga2V5IH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsdWUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBpZiB0aGUgbWVzc2FnZSBpcyBudWxsLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgbWVzc2FnZSBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IG51bGw7XG4gICAgICBjb25zdCBrZXkgPSAna2V5JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFZhbHVlRnJvbVByb3BlcnRpZXNPclRyYWl0cyh7IG1lc3NhZ2UsIGtleSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwgaWYgdGhlIGtleSBpcyBudWxsLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUga2V5IGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgdHJhaXRzOiB7fSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFZhbHVlRnJvbVByb3BlcnRpZXNPclRyYWl0cyh7IG1lc3NhZ2UsIGtleSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgb2YgdGhlIGtleVNldHMuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gYW55IG9mIHRoZSBrZXlTZXRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB0cmFpdHM6IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleSA9ICdub25leGlzdGVudEtleSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMoeyBtZXNzYWdlLCBrZXkgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmxhdHRlbkpzb24nLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBzaW1wbGUgSlNPTiBvYmplY3Qgd2l0aCBubyBuZXN0ZWQgb2JqZWN0cyBvciBhcnJheXMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIHNpbXBsZSBKU09OIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCwgY2l0eTogJ05ldyBZb3JrJyB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCwgY2l0eTogJ05ldyBZb3JrJyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbkpzb24oZGF0YSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZmxhdHRlbkpzb24gZnVuY3Rpb24gY29ycmVjdGx5IGZsYXR0ZW5zIGEgSlNPTiBvYmplY3Qgd2l0aCBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIG5lc3RlZCBvYmplY3RzIGFuZCBhcnJheXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgICBzdHJlZXQ6ICcxMjMgTWFpbiBTdCcsXG4gICAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgICBjb3VudHJ5OiAnVVNBJyxcbiAgICAgICAgfSxcbiAgICAgICAgaG9iYmllczogWydyZWFkaW5nJywgJ3BhaW50aW5nJ10sXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgJ2FkZHJlc3Muc3RyZWV0JzogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgJ2FkZHJlc3MuY2l0eSc6ICdOZXcgWW9yaycsXG4gICAgICAgICdhZGRyZXNzLmNvdW50cnknOiAnVVNBJyxcbiAgICAgICAgJ2hvYmJpZXNbMF0nOiAncmVhZGluZycsXG4gICAgICAgICdob2JiaWVzWzFdJzogJ3BhaW50aW5nJyxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIG51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIEpTT04gb2JqZWN0IHdpdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IG5hbWU6IG51bGwsIGFnZTogdW5kZWZpbmVkLCBjaXR5OiAnTmV3IFlvcmsnIH07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHsgbmFtZTogbnVsbCwgYWdlOiB1bmRlZmluZWQsIGNpdHk6ICdOZXcgWW9yaycgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGggZW1wdHkgYXJyYXlzIGFuZCBvYmplY3RzLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIGVtcHR5IGFycmF5cyBhbmQgb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IG5hbWU6IFtdLCBhZ2U6IHt9LCBjaXR5OiAnTmV3IFlvcmsnIH07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHsgbmFtZTogW10sIGFnZToge30sIGNpdHk6ICdOZXcgWW9yaycgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyAvLyBOZWVkIHRvIGZpeCB0aGlzIHRlc3RcbiAgICAvLyAvLyBUZXN0cyB0aGF0IGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGhhbmRsZXMgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiBhIEpTT04gb2JqZWN0IGNvcnJlY3RseS5cbiAgICAvLyBpdCgnc2hvdWxkIGhhbmRsZSBjaXJjdWxhciByZWZlcmVuY2VzIGluIGEgSlNPTiBvYmplY3QgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZGF0YSA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH07XG4gICAgLy8gICBkYXRhWydzZWxmJ10gPSBkYXRhO1xuICAgIC8vICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCwgc2VsZjogJ1tDaXJjdWxhcl0nIH07XG4gICAgLy8gICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAvLyAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIC8vIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIGtleXMgY29udGFpbmluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIEpTT04gb2JqZWN0IHdpdGgga2V5cyBjb250YWluaW5nIHNwZWNpYWwgY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7ICduYW1lLmZpcnN0JzogJ0pvaG4nLCAnbmFtZS5sYXN0JzogJ0RvZScsICdhZ2VAJzogMzAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0geyAnbmFtZS5maXJzdCc6ICdKb2huJywgJ25hbWUubGFzdCc6ICdEb2UnLCAnYWdlQCc6IDMwIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdCB0aGF0IHRoZSBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIG5vbi1zdHJpbmcga2V5cy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCBub24tc3RyaW5nIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0geyAxOiAnb25lJywgMjogJ3R3bycsIDM6ICd0aHJlZScgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0geyAnMSc6ICdvbmUnLCAnMic6ICd0d28nLCAnMyc6ICd0aHJlZScgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGgga2V5cyBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIGtleXMgY29udGFpbmluZyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7ICduYW1lLmZpcnN0JzogJ0pvaG4nLCAnbmFtZS5sYXN0JzogJ0RvZScsIGFnZTogMzAsIGNpdHk6ICdOZXcgWW9yaycgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICAnbmFtZS5maXJzdCc6ICdKb2huJyxcbiAgICAgICAgJ25hbWUubGFzdCc6ICdEb2UnLFxuICAgICAgICBhZ2U6IDMwLFxuICAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGVzdCBvYmplY3RpdmUgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGgga2V5cyB0aGF0IGFyZSByZXNlcnZlZCB3b3Jkcy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCByZXNlcnZlZCB3b3JkIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0geyBjbGFzczogJ01hdGgnLCBmdW5jdGlvbjogJ2FkZCcsIHJldHVybjogJ3Jlc3VsdCcgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0geyBjbGFzczogJ01hdGgnLCBmdW5jdGlvbjogJ2FkZCcsIHJldHVybjogJ3Jlc3VsdCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGVzdCBvYmplY3RpdmUgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlICdmbGF0dGVuSnNvbicgZnVuY3Rpb24gY29ycmVjdGx5IGZsYXR0ZW5zIGEgSlNPTiBvYmplY3Qgd2l0aCBkZWVwbHkgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCBkZWVwbHkgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgIHN0cmVldDogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICAgICAgICAgIHN0YXRlOiAnTlknLFxuICAgICAgICAgIHppcDogJzEwMDAxJyxcbiAgICAgICAgfSxcbiAgICAgICAgaG9iYmllczogWydyZWFkaW5nJywgJ3BhaW50aW5nJywgJ2Nvb2tpbmcnXSxcbiAgICAgICAgZnJpZW5kczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdKYW5lJyxcbiAgICAgICAgICAgIGFnZTogMjgsXG4gICAgICAgICAgICBhZGRyZXNzOiB7XG4gICAgICAgICAgICAgIHN0cmVldDogJzQ1NiBFbG0gU3QnLFxuICAgICAgICAgICAgICBjaXR5OiAnTG9zIEFuZ2VsZXMnLFxuICAgICAgICAgICAgICBzdGF0ZTogJ0NBJyxcbiAgICAgICAgICAgICAgemlwOiAnOTAwMDEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvYmJpZXM6IFsnaGlraW5nJywgJ3Bob3RvZ3JhcGh5J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnTWlrZScsXG4gICAgICAgICAgICBhZ2U6IDMyLFxuICAgICAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgICAgICBzdHJlZXQ6ICc3ODkgT2FrIFN0JyxcbiAgICAgICAgICAgICAgY2l0eTogJ0NoaWNhZ28nLFxuICAgICAgICAgICAgICBzdGF0ZTogJ0lMJyxcbiAgICAgICAgICAgICAgemlwOiAnNjAwMDcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvYmJpZXM6IFsncnVubmluZycsICdnYW1pbmcnXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgICdhZGRyZXNzLnN0cmVldCc6ICcxMjMgTWFpbiBTdCcsXG4gICAgICAgICdhZGRyZXNzLmNpdHknOiAnTmV3IFlvcmsnLFxuICAgICAgICAnYWRkcmVzcy5zdGF0ZSc6ICdOWScsXG4gICAgICAgICdhZGRyZXNzLnppcCc6ICcxMDAwMScsXG4gICAgICAgICdob2JiaWVzWzBdJzogJ3JlYWRpbmcnLFxuICAgICAgICAnaG9iYmllc1sxXSc6ICdwYWludGluZycsXG4gICAgICAgICdob2JiaWVzWzJdJzogJ2Nvb2tpbmcnLFxuICAgICAgICAnZnJpZW5kc1swXS5uYW1lJzogJ0phbmUnLFxuICAgICAgICAnZnJpZW5kc1swXS5hZ2UnOiAyOCxcbiAgICAgICAgJ2ZyaWVuZHNbMF0uYWRkcmVzcy5zdHJlZXQnOiAnNDU2IEVsbSBTdCcsXG4gICAgICAgICdmcmllbmRzWzBdLmFkZHJlc3MuY2l0eSc6ICdMb3MgQW5nZWxlcycsXG4gICAgICAgICdmcmllbmRzWzBdLmFkZHJlc3Muc3RhdGUnOiAnQ0EnLFxuICAgICAgICAnZnJpZW5kc1swXS5hZGRyZXNzLnppcCc6ICc5MDAwMScsXG4gICAgICAgICdmcmllbmRzWzBdLmhvYmJpZXNbMF0nOiAnaGlraW5nJyxcbiAgICAgICAgJ2ZyaWVuZHNbMF0uaG9iYmllc1sxXSc6ICdwaG90b2dyYXBoeScsXG4gICAgICAgICdmcmllbmRzWzFdLm5hbWUnOiAnTWlrZScsXG4gICAgICAgICdmcmllbmRzWzFdLmFnZSc6IDMyLFxuICAgICAgICAnZnJpZW5kc1sxXS5hZGRyZXNzLnN0cmVldCc6ICc3ODkgT2FrIFN0JyxcbiAgICAgICAgJ2ZyaWVuZHNbMV0uYWRkcmVzcy5jaXR5JzogJ0NoaWNhZ28nLFxuICAgICAgICAnZnJpZW5kc1sxXS5hZGRyZXNzLnN0YXRlJzogJ0lMJyxcbiAgICAgICAgJ2ZyaWVuZHNbMV0uYWRkcmVzcy56aXAnOiAnNjAwMDcnLFxuICAgICAgICAnZnJpZW5kc1sxXS5ob2JiaWVzWzBdJzogJ3J1bm5pbmcnLFxuICAgICAgICAnZnJpZW5kc1sxXS5ob2JiaWVzWzFdJzogJ2dhbWluZycsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbkpzb24oZGF0YSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSB0ZXN0IG9iamVjdGl2ZSBpcyB0byB2ZXJpZnkgdGhhdCB0aGUgJ2ZsYXR0ZW5Kc29uJyBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGtleXMgYW5kIHZhbHVlcy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBrZXlzIGFuZCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gICAgICAgIGFkZHJlc3M6IHsgc3RyZWV0OiAnMTIzIE1haW4gU3QnLCBjaXR5OiAnU2FuIEZyYW5jaXNjbycgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ0pvaG4nLFxuICAgICAgICBhZ2U6IDMwLFxuICAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICAgICAgICAnYWRkcmVzcy5zdHJlZXQnOiAnMTIzIE1haW4gU3QnLFxuICAgICAgICAnYWRkcmVzcy5jaXR5JzogJ1NhbiBGcmFuY2lzY28nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGVzdCBvYmplY3RpdmUgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGggZGVlcGx5IG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHMsIGluY2x1ZGluZyBudWxsIGFuZCB1bmRlZmluZWQgdmFsdWVzLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIGRlZXBseSBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzIHdpdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgIHN0cmVldDogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgICB6aXA6IDEyMzQ1LFxuICAgICAgICAgIGNvdW50cnk6ICdVU0EnLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB7XG4gICAgICAgICAgICBsYXRpdHVkZTogNDAuNzEyOCxcbiAgICAgICAgICAgIGxvbmdpdHVkZTogLTc0LjAwNixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBob2JiaWVzOiBbJ3JlYWRpbmcnLCAncGFpbnRpbmcnLCAnc3dpbW1pbmcnXSxcbiAgICAgICAgZnJpZW5kczogW1xuICAgICAgICAgIHsgbmFtZTogJ0phbmUnLCBhZ2U6IDI4IH0sXG4gICAgICAgICAgeyBuYW1lOiAnTWlrZScsIGFnZTogMzIgfSxcbiAgICAgICAgICB7IG5hbWU6ICdTYXJhaCcsIGFnZTogMjcgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGV0OiBudWxsLFxuICAgICAgICBmYXZvcml0ZUNvbG9yOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgJ2FkZHJlc3Muc3RyZWV0JzogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgJ2FkZHJlc3MuemlwJzogMTIzNDUsXG4gICAgICAgICdhZGRyZXNzLmNvdW50cnknOiAnVVNBJyxcbiAgICAgICAgJ2FkZHJlc3MuY29vcmRpbmF0ZXMubGF0aXR1ZGUnOiA0MC43MTI4LFxuICAgICAgICAnYWRkcmVzcy5jb29yZGluYXRlcy5sb25naXR1ZGUnOiAtNzQuMDA2LFxuICAgICAgICAnaG9iYmllc1swXSc6ICdyZWFkaW5nJyxcbiAgICAgICAgJ2hvYmJpZXNbMV0nOiAncGFpbnRpbmcnLFxuICAgICAgICAnaG9iYmllc1syXSc6ICdzd2ltbWluZycsXG4gICAgICAgICdmcmllbmRzWzBdLm5hbWUnOiAnSmFuZScsXG4gICAgICAgICdmcmllbmRzWzBdLmFnZSc6IDI4LFxuICAgICAgICAnZnJpZW5kc1sxXS5uYW1lJzogJ01pa2UnLFxuICAgICAgICAnZnJpZW5kc1sxXS5hZ2UnOiAzMixcbiAgICAgICAgJ2ZyaWVuZHNbMl0ubmFtZSc6ICdTYXJhaCcsXG4gICAgICAgICdmcmllbmRzWzJdLmFnZSc6IDI3LFxuICAgICAgICBwZXQ6IG51bGwsXG4gICAgICAgIGZhdm9yaXRlQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIGFycmF5cyBjb250YWluaW5nIG9iamVjdHMgd2l0aCBkaWZmZXJlbnQgbmVzdGluZyBsZXZlbHMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIEpTT04gb2JqZWN0IHdpdGggYXJyYXlzIGNvbnRhaW5pbmcgb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBuZXN0aW5nIGxldmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgaG9iYmllczogW1xuICAgICAgICAgIHsgbmFtZTogJ1JlYWRpbmcnLCB0eXBlOiAnSW5kb29yJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ1J1bm5pbmcnLCB0eXBlOiAnT3V0ZG9vcicgfSxcbiAgICAgICAgICB7IG5hbWU6ICdDb29raW5nJywgdHlwZTogJ0luZG9vcicgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZnJpZW5kczogW1xuICAgICAgICAgIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAyOCB9LFxuICAgICAgICAgIHsgbmFtZTogJ0JvYicsIGFnZTogMzIgfSxcbiAgICAgICAgICB7IG5hbWU6ICdDaGFybGllJywgYWdlOiAyNyB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gICAgICAgICdob2JiaWVzWzBdLm5hbWUnOiAnUmVhZGluZycsXG4gICAgICAgICdob2JiaWVzWzBdLnR5cGUnOiAnSW5kb29yJyxcbiAgICAgICAgJ2hvYmJpZXNbMV0ubmFtZSc6ICdSdW5uaW5nJyxcbiAgICAgICAgJ2hvYmJpZXNbMV0udHlwZSc6ICdPdXRkb29yJyxcbiAgICAgICAgJ2hvYmJpZXNbMl0ubmFtZSc6ICdDb29raW5nJyxcbiAgICAgICAgJ2hvYmJpZXNbMl0udHlwZSc6ICdJbmRvb3InLFxuICAgICAgICAnZnJpZW5kc1swXS5uYW1lJzogJ0FsaWNlJyxcbiAgICAgICAgJ2ZyaWVuZHNbMF0uYWdlJzogMjgsXG4gICAgICAgICdmcmllbmRzWzFdLm5hbWUnOiAnQm9iJyxcbiAgICAgICAgJ2ZyaWVuZHNbMV0uYWdlJzogMzIsXG4gICAgICAgICdmcmllbmRzWzJdLm5hbWUnOiAnQ2hhcmxpZScsXG4gICAgICAgICdmcmllbmRzWzJdLmFnZSc6IDI3LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZVJhbmRvbVN0cmluZycsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q2FzZXM6IEJhc2VUZXN0Q2FzZVtdID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIGdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCcsXG4gICAgICAgIGxlbmd0aDogOCxcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGg6IDgsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIGdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyBvZiB0aGUgZGVmYXVsdCBsZW5ndGgnLFxuICAgICAgICBleHBlY3RlZExlbmd0aDogMTAsXG4gICAgICB9LFxuICAgIF07XG4gICAgZmlsdGVyKHRlc3RDYXNlcykuZm9yRWFjaCgodGVzdENhc2UpID0+IHtcbiAgICAgIGl0KHRlc3RDYXNlLm5hbWUsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2VuZXJhdGVSYW5kb21TdHJpbmcodGVzdENhc2UubGVuZ3RoKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLnRvQmUodGVzdENhc2UuZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRPZmZzZXRJblNlYycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgYSB2YWxpZCB0aW1lem9uZSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgb2Zmc2V0IHZhbHVlIGluIHNlY29uZHMgZm9yIGEgdmFsaWQgdGltZXpvbmUgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0T2Zmc2V0SW5TZWMoJ0FzaWEvS29sa2F0YScpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZSgxOTgwMCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgZm9yIHRoZSB0aW1lem9uZSBzdHJpbmcgJ1VUQydcbiAgICBpdCgnc2hvdWxkIHJldHVybiAwIGZvciB0aGUgdGltZXpvbmUgc3RyaW5nIFwiVVRDXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnVVRDJyk7XG4gICAgICBleHBlY3Qob2Zmc2V0KS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIGZvciB0aGUgdGltZXpvbmUgc3RyaW5nICdFdGMvVVRDJ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIDAgZm9yIHRoZSB0aW1lem9uZSBzdHJpbmcgXCJFdGMvVVRDXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnRXRjL1VUQycpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZSgwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkIGZvciBhbiBpbnZhbGlkIHRpbWV6b25lIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgYW4gaW52YWxpZCB0aW1lem9uZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnSW52YWxpZC9UaW1lem9uZScpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5kZWZpbmVkIG9mZnNldCB2YWx1ZSBmb3IgdGhlIHRpbWV6b25lIHN0cmluZyAnKzA1OjMwJyBpbnZhbGlkIHRpbWV6b25lIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB1bmRlZmluZWQgb2Zmc2V0IHZhbHVlIGZvciB0aGUgdGltZXpvbmUgc3RyaW5nIFwiKzA1OjMwXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnKzA1OjMwJyk7XG4gICAgICBleHBlY3Qob2Zmc2V0KS50b0JlKHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb3JyZWN0IG9mZnNldCB2YWx1ZSBmb3IgdGhlIHRpbWV6b25lIHN0cmluZyAnQW1lcmljYS9OZXdfWW9yaydcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBvZmZzZXQgdmFsdWUgZm9yIHRoZSB0aW1lem9uZSBzdHJpbmcgXCJBbWVyaWNhL05ld19Zb3JrXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnQXNpYS9DYWxjdXR0YScpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZSgxOTgwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmb3JtYXRUaW1lU3RhbXAnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyB3aGVuIG5vIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyB3aGVuIG5vIGZvcm1hdCBpcyBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGVTdHIgPSAnMjAyMi0wMS0wMVQwMDowMDowMC4wMDBaJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdFRpbWVTdGFtcChkYXRlU3RyKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoMTY0MDk5NTIwMDAwMCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lc3RhbXAgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgbW9tZW50IGZvcm1hdCB3aGVuIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdGltZXN0YW1wIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIG1vbWVudCBmb3JtYXQgd2hlbiBmb3JtYXQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJzIwMjItMDEtMDFUMDA6MDA6MDAuMDAwWic7XG4gICAgICBjb25zdCBmb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJzIwMjItMDEtMDEnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHRocm93cyBhbiBlcnJvciB3aGVuIGFuIGludmFsaWQgZGF0ZSBzdHJpbmcgaXMgcHJvdmlkZWQuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIGFuIGludmFsaWQgZGF0ZSBzdHJpbmcgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJ2ludmFsaWQtZGF0ZSc7XG4gICAgICBleHBlY3QoZm9ybWF0VGltZVN0YW1wKGRhdGVTdHIpKS50b0JlTmFOKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIE5hTiB3aGVuIGFuIGludmFsaWQgZGF0ZSBzdHJpbmcgaXMgcHJvdmlkZWQgYW5kIG5vIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBOYU4gd2hlbiBhbiBpbnZhbGlkIGRhdGUgc3RyaW5nIGlzIHByb3ZpZGVkIGFuZCBubyBmb3JtYXQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJ2ludmFsaWQtZGF0ZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0cik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTmFOKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIE5hTiB3aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBwcm92aWRlZCBhcyB0aGUgZGF0ZSBzdHJpbmcgYW5kIG5vIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBOYU4gd2hlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcHJvdmlkZWQgYXMgdGhlIGRhdGUgc3RyaW5nIGFuZCBubyBmb3JtYXQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJyc7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0cik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTmFOKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIE5hTiB3aGVuIGFuIGludmFsaWQgZm9ybWF0IGlzIHByb3ZpZGVkLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIE5hTiB3aGVuIGFuIGludmFsaWQgZm9ybWF0IGlzIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZVN0ciA9ICcyMDIyLTAxLTAxVDAwOjAwOjAwLjAwMFonO1xuICAgICAgY29uc3QgZm9ybWF0ID0gJ2ludmFsaWRGb3JtYXQnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZm9ybWF0VGltZVN0YW1wKGRhdGVTdHIsIGZvcm1hdCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKCdpbnZhbTEvMS8yMDIyaTZGb3IwYW10Jyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzIHdoZW4gYSB2YWxpZCB0aW1lc3RhbXAgc3RyaW5nIGlzIHByb3ZpZGVkIGluc3RlYWQgb2YgYSBkYXRlIHN0cmluZy5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyB3aGVuIGEgdmFsaWQgdGltZXN0YW1wIHN0cmluZyBpcyBwcm92aWRlZCBpbnN0ZWFkIG9mIGEgZGF0ZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJzIwMjItMDEtMDFUMDA6MDA6MDAuMDAwWic7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0cik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDE2NDA5OTUyMDAwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFzaFRvU2hhMjU2JywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgaGFzaFRvU2hhMjU2IHJldHVybnMgdGhlIFNIQTI1NiBoYXNoIG9mIGEgc3RyaW5nIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIFNIQTI1NiBoYXNoIG9mIGEgc3RyaW5nIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAndGVzdCBzdHJpbmcnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnZDU1NzljNDZkZmNjN2YxODIwNzAxM2U2NWI0NGU0Y2I0ZTJjMjI5OGY0YWM0NTdiYThmODI3NDNmMzFlOTMwYic7XG4gICAgICBjb25zdCBvdXRwdXQgPSBoYXNoVG9TaGEyNTYoaW5wdXQpO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZShleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGhhc2hUb1NoYTI1NiByZXR1cm5zIHRoZSBTSEEyNTYgaGFzaCBvZiBhIEJ1ZmZlciBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBTSEEyNTYgaGFzaCBvZiBhIEJ1ZmZlciBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oJ3Rlc3QgYnVmZmVyJyk7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICc1MjVlZjVmN2JhZjU2NTI4YjQ4NzcwOTIyZTk4ZTgwMDMxMGQzNjg1NjgxZDM0ZWU1OTI5MDJhYTI1MjQ1OGIzJztcbiAgICAgIGNvbnN0IG91dHB1dCA9IGhhc2hUb1NoYTI1NihpbnB1dCk7XG4gICAgICBleHBlY3Qob3V0cHV0KS50b0JlKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaGFzaFRvU2hhMjU2IHJldHVybnMgdGhlIFNIQTI1NiBoYXNoIG9mIGFuIGVtcHR5IG51bWJlciBhcnJheSBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBTSEEyNTYgaGFzaCBvZiBhbiBlbXB0eSBudW1iZXIgYXJyYXkgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dDogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gJ2UzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUnO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gaGFzaFRvU2hhMjU2KGlucHV0KTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBoYXNoVG9TaGEyNTYgcmV0dXJucyB0aGUgU0hBMjU2IGhhc2ggb2YgYW4gZW1wdHkgQnVmZmVyIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIFNIQTI1NiBoYXNoIG9mIGFuIGVtcHR5IEJ1ZmZlciBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oW10pO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NSc7XG4gICAgICBjb25zdCBvdXRwdXQgPSBoYXNoVG9TaGEyNTYoaW5wdXQpO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZShleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGhhc2hUb1NoYTI1NiByZXR1cm5zIHRoZSBTSEEyNTYgaGFzaCBvZiBhbiBlbXB0eSBzdHJpbmcgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgU0hBMjU2IGhhc2ggb2YgYW4gZW1wdHkgc3RyaW5nIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gJ2UzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUnO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gaGFzaFRvU2hhMjU2KGlucHV0KTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBoYXNoVG9TaGEyNTYgcmV0dXJucyB0aGUgU0hBMjU2IGhhc2ggb2YgYSBudW1iZXIgYXJyYXkgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgU0hBMjU2IGhhc2ggb2YgYSBudW1iZXIgYXJyYXkgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gJzc0ZjgxZmUxNjdkOTliNGNiNDFkNmQwY2NkYTgyMjc4Y2FlZTlmM2UyZjI1ZDVlNWEzOTM2ZmYzZGNlYzYwZDAnO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gaGFzaFRvU2hhMjU2KGlucHV0KTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBoYXNoVG9TaGEyNTYgcmV0dXJucyB0aGUgU0hBMjU2IGhhc2ggb2YgYSBub24tQVNDSUkgc3RyaW5nIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIFNIQTI1NiBoYXNoIG9mIGEgbm9uLUFTQ0lJIHN0cmluZyBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ+S9oOWlveS4lueVjCc7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICc1MDhkNjlkYzIxYmY1ZDJmODA0MDE0YjE2ODg5NTNhMTJkNWRmZGU3MWJlNmNkOTU0MTc3OTgwZDVkMTc0MWJiJztcbiAgICAgIGNvbnN0IG91dHB1dCA9IGhhc2hUb1NoYTI1NihpbnB1dCk7XG4gICAgICBleHBlY3Qob3V0cHV0KS50b0JlKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlVVVJRCcsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IGdlbmVyYXRlVVVJRCBmdW5jdGlvbiByZXR1cm5zIGEgVVVJRCBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVVSUQgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgZXhwZWN0KHR5cGVvZiB1dWlkKS50b0JlKCdzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2VuZXJhdGVVVUlEIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIHVuaXF1ZSBVVUlEIGVhY2ggdGltZSBpdCBpcyBjYWxsZWRcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgdW5pcXVlIFVVSUQgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQxID0gZ2VuZXJhdGVVVUlEKCk7XG4gICAgICBjb25zdCB1dWlkMiA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgZXhwZWN0KHV1aWQxKS5ub3QudG9CZSh1dWlkMik7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdlbmVyYXRlVVVJRCBmdW5jdGlvbiByZXR1cm5zIGEgVVVJRCBzdHJpbmcgd2l0aCBsZW5ndGggMzZcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVVSUQgc3RyaW5nIHdpdGggbGVuZ3RoIDM2JywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgZXhwZWN0KHV1aWQubGVuZ3RoKS50b0JlKDM2KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2VuZXJhdGVVVUlEIGZ1bmN0aW9uIHJldHVybnMgYSBVVUlEIHN0cmluZyB3aXRoIDQgZGFzaGVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVVUlEIHN0cmluZyB3aXRoIDQgZGFzaGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgY29uc3QgZGFzaENvdW50ID0gKHV1aWQubWF0Y2goLy0vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGV4cGVjdChkYXNoQ291bnQpLnRvQmUoNCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b1N0cmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2hlbiBpbnB1dCBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ3Rlc3Qgc3RyaW5nJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1N0cmluZyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIFwibnVsbFwiIHdoZW4gaW5wdXQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1N0cmluZyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdudWxsJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gSlNPTiBzdHJpbmcgd2hlbiBpbnB1dCBpcyBhIGN1c3RvbSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsga2V5OiAndmFsdWUnLCBhbm90aGVyS2V5OiAxMjMgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1N0cmluZyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKEpTT04uc3RyaW5naWZ5KGlucHV0KSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIGlucHV0IGhhcyBjaXJjdWxhciByZWZlcmVuY2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2lyY3VsYXJPYmo6IGFueSA9IHt9O1xuICAgICAgY2lyY3VsYXJPYmouc2VsZiA9IGNpcmN1bGFyT2JqO1xuICAgICAgZXhwZWN0KCgpID0+IGNvbnZlcnRUb1N0cmluZyhjaXJjdWxhck9iaikpLnRvVGhyb3coVHlwZUVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBib29sZWFuIHRydWUgdG8gSlNPTiBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHRydWU7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9TdHJpbmcoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndHJ1ZScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBhcnJheSB0byBKU09OIHN0cmluZyB3aGVuIGlucHV0IGlzIGFuIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBbMSwgMiwgM107XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9TdHJpbmcoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShKU09OLnN0cmluZ2lmeShpbnB1dCkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBhIG51bWJlciB0byBhIEpTT04gc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAxMjM7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9TdHJpbmcoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnMTIzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIHN0cmluZ3Mgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICdzcGVjaWFsIUAjJCVeJiooKV8re306XCI8Pj8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRvU3RyaW5nKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoaW5wdXQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGxhcmdlT2JqZWN0ID0ge1xuICAgICAgICBrZXkxOiAndmFsdWUxJyxcbiAgICAgICAga2V5MjogQXJyYXkoMTAwMCkuZmlsbCgndmFsdWUyJyksXG4gICAgICAgIGtleTM6IHsgbmVzdGVkS2V5OiAnbmVzdGVkVmFsdWUnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRvU3RyaW5nKGxhcmdlT2JqZWN0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXG4gICAgICAgICd7XCJrZXkxXCI6XCJ2YWx1ZTFcIixcImtleTJcIjpbXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIl0sXCJrZXkzXCI6e1wibmVzdGVkS2V5XCI6XCJuZXN0ZWRWYWx1ZVwifX0nLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3V1aWR2NScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIFVVSUQgZm9yIHRoZSBzYW1lIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAndGVzdC12YWx1ZSc7XG4gICAgICBjb25zdCB1dWlkMSA9IHV1aWR2NShpbnB1dCk7XG4gICAgICBjb25zdCB1dWlkMiA9IHV1aWR2NShpbnB1dCk7XG5cbiAgICAgIGV4cGVjdCh1dWlkMSkudG9CZSh1dWlkMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGRpZmZlcmVudCBVVUlEcyBmb3IgZGlmZmVyZW50IGlucHV0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQxID0gdXVpZHY1KCdmaXJzdC12YWx1ZScpO1xuICAgICAgY29uc3QgdXVpZDIgPSB1dWlkdjUoJ3NlY29uZC12YWx1ZScpO1xuICAgICAgZXhwZWN0KHV1aWQxKS5ub3QudG9CZSh1dWlkMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIFVVSUQgdjUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodXVpZHY1KCd2YWxpZC10ZXN0JykpLnRvQmUoJzQ5ODQzMTY5LWVlOTEtNTNkNC04MmFlLTAyZGQ2NzZjOTJhZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgc3RyaW5nIGlucHV0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1dWlkdjUoJycpKS50b0JlKCcxYzdmY2YxMy03NGFmLTU1OTUtOGVlOS1kNzJiZTZjMWFjNDInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZsYXR0ZW5RdWVyeVBhcmFtcycsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q2FzZXM6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsYXR0ZW4gYXJyYXkgdmFsdWVzIHRvIGZpcnN0IGVsZW1lbnRzJyxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBrZXkxOiBbJ3ZhbHVlMSddLFxuICAgICAgICAgIGtleTI6IFsndmFsdWUyJ10sXG4gICAgICAgICAga2V5MzogWzEyM10sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAga2V5MTogJ3ZhbHVlMScsXG4gICAgICAgICAga2V5MjogJ3ZhbHVlMicsXG4gICAgICAgICAga2V5MzogMTIzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBudWxsIGlucHV0JyxcbiAgICAgICAgaW5wdXQ6IG51bGwsXG4gICAgICAgIGV4cGVjdGVkOiB7fSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdoYW5kbGUgdW5kZWZpbmVkIGlucHV0JyxcbiAgICAgICAgaW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZXhwZWN0ZWQ6IHt9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBlbXB0eSBvYmplY3QnLFxuICAgICAgICBpbnB1dDoge30sXG4gICAgICAgIGV4cGVjdGVkOiB7fSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpZ25vcmUgbnVsbC91bmRlZmluZWQgYXJyYXkgZWxlbWVudHMnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGtleTE6IFt1bmRlZmluZWRdLFxuICAgICAgICAgIGtleTI6IFtudWxsXSxcbiAgICAgICAgICBrZXkzOiBbdW5kZWZpbmVkLCAndmFsdWUnXSxcbiAgICAgICAgICBrZXk0OiBbbnVsbCwgJ3ZhbHVlJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAga2V5MzogW3VuZGVmaW5lZCwgJ3ZhbHVlJ10sXG4gICAgICAgICAga2V5NDogW251bGwsICd2YWx1ZSddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBtaXhlZCB0eXBlIHZhbHVlcyBpbiBhcnJheXMnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIG51bWJlcjogWzQyXSxcbiAgICAgICAgICBzdHJpbmc6IFsndGVzdCddLFxuICAgICAgICAgIGJvb2xlYW46IFt0cnVlXSxcbiAgICAgICAgICBvYmplY3Q6IFt7IG5lc3RlZDogJ3ZhbHVlJyB9XSxcbiAgICAgICAgICBkYXRlOiBbbmV3IERhdGUoJzIwMjQtMDEtMDEnKV0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAgbnVtYmVyOiA0MixcbiAgICAgICAgICBzdHJpbmc6ICd0ZXN0JyxcbiAgICAgICAgICBib29sZWFuOiB0cnVlLFxuICAgICAgICAgIG9iamVjdDogeyBuZXN0ZWQ6ICd2YWx1ZScgfSxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMScpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBlbXB0eSBhcnJheXMnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGtleTE6IFtdLFxuICAgICAgICAgIGtleTI6IFsndmFsdWUnXSxcbiAgICAgICAgICBrZXkzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWQ6IHtcbiAgICAgICAgICBrZXkyOiAndmFsdWUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2tlZXAgbm9uLWFycmF5IHZhbHVlcyB1bmNoYW5nZWQnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIHN0cmluZzogJ2RpcmVjdCBzdHJpbmcnLFxuICAgICAgICAgIG51bWJlcjogNDIsXG4gICAgICAgICAgYm9vbGVhbjogdHJ1ZSxcbiAgICAgICAgICBvYmplY3Q6IHsgdGVzdDogJ3ZhbHVlJyB9LFxuICAgICAgICAgIGFycmF5OiBbJ2ZpcnN0JywgJ3NlY29uZCddLFxuICAgICAgICB9LFxuICAgICAgICBleHBlY3RlZDoge1xuICAgICAgICAgIHN0cmluZzogJ2RpcmVjdCBzdHJpbmcnLFxuICAgICAgICAgIG51bWJlcjogNDIsXG4gICAgICAgICAgYm9vbGVhbjogdHJ1ZSxcbiAgICAgICAgICBvYmplY3Q6IHsgdGVzdDogJ3ZhbHVlJyB9LFxuICAgICAgICAgIGFycmF5OiBbJ2ZpcnN0JywgJ3NlY29uZCddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBtaXhlZCBhcnJheSBhbmQgbm9uLWFycmF5IHZhbHVlcycsXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgYXJyYXlWYWx1ZTogWydmaXJzdCddLFxuICAgICAgICAgIGVtcHR5QXJyYXk6IFtdLFxuICAgICAgICAgIGRpcmVjdFZhbHVlOiAnc3RyaW5nJyxcbiAgICAgICAgICBudWxsVmFsdWU6IG51bGwsXG4gICAgICAgICAgdW5kZWZpbmVkVmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWQ6IHtcbiAgICAgICAgICBhcnJheVZhbHVlOiAnZmlyc3QnLFxuICAgICAgICAgIGRpcmVjdFZhbHVlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdoYW5kbGUgbmVzdGVkIGFycmF5cycsXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgbmVzdGVkOiBbXG4gICAgICAgICAgICBbMSwgMl0sXG4gICAgICAgICAgICBbMywgNF0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaXhlZDogW1snYScsICdiJ10sICdjJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAgbmVzdGVkOiBbXG4gICAgICAgICAgICBbMSwgMl0sXG4gICAgICAgICAgICBbMywgNF0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaXhlZDogW1snYScsICdiJ10sICdjJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaGFuZGxlIHNwZWNpYWwgdmFsdWVzIGluIGFycmF5cycsXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgbmFuOiBbTmFOXSxcbiAgICAgICAgICBpbmZpbml0eTogW0luZmluaXR5XSxcbiAgICAgICAgICBuZWdJbmZpbml0eTogWy1JbmZpbml0eV0sXG4gICAgICAgICAgemVybzogWzBdLFxuICAgICAgICAgIG5lZ1plcm86IFstMF0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAgbmFuOiBOYU4sXG4gICAgICAgICAgaW5maW5pdHk6IEluZmluaXR5LFxuICAgICAgICAgIG5lZ0luZmluaXR5OiAtSW5maW5pdHksXG4gICAgICAgICAgemVybzogMCxcbiAgICAgICAgICBuZWdaZXJvOiAtMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7IG5hbWUsIGlucHV0LCBleHBlY3RlZCB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkICR7bmFtZX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChmbGF0dGVuUXVlcnlQYXJhbXMoaW5wdXQpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19