@growsober/sdk 1.0.5 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/e2e.test.d.ts +30 -0
- package/dist/__tests__/e2e.test.js +959 -63
- package/dist/api/mutations/badges.d.ts +116 -0
- package/dist/api/mutations/badges.js +177 -0
- package/dist/api/mutations/brands.d.ts +251 -0
- package/dist/api/mutations/brands.js +242 -0
- package/dist/api/mutations/creators.d.ts +131 -0
- package/dist/api/mutations/creators.js +129 -0
- package/dist/api/mutations/event-chat.d.ts +2 -2
- package/dist/api/mutations/event-chat.js +9 -9
- package/dist/api/mutations/index.d.ts +4 -0
- package/dist/api/mutations/index.js +5 -1
- package/dist/api/mutations/jack.d.ts +29 -0
- package/dist/api/mutations/jack.js +41 -1
- package/dist/api/mutations/products.d.ts +175 -0
- package/dist/api/mutations/products.js +226 -0
- package/dist/api/mutations/support.d.ts +20 -1
- package/dist/api/mutations/support.js +36 -1
- package/dist/api/queries/badges.d.ts +221 -0
- package/dist/api/queries/badges.js +290 -0
- package/dist/api/queries/bookings.d.ts +1 -1
- package/dist/api/queries/brands.d.ts +248 -0
- package/dist/api/queries/brands.js +226 -0
- package/dist/api/queries/businesses.d.ts +61 -1
- package/dist/api/queries/businesses.js +27 -1
- package/dist/api/queries/creators.d.ts +332 -0
- package/dist/api/queries/creators.js +249 -0
- package/dist/api/queries/event-chat.d.ts +1 -1
- package/dist/api/queries/event-chat.js +4 -4
- package/dist/api/queries/events.d.ts +45 -0
- package/dist/api/queries/index.d.ts +5 -0
- package/dist/api/queries/index.js +6 -1
- package/dist/api/queries/jack.d.ts +80 -0
- package/dist/api/queries/jack.js +98 -1
- package/dist/api/queries/library.d.ts +8 -0
- package/dist/api/queries/products.d.ts +185 -0
- package/dist/api/queries/products.js +203 -0
- package/dist/api/queries/support.d.ts +46 -1
- package/dist/api/queries/support.js +48 -1
- package/dist/api/queries/venues.d.ts +304 -0
- package/dist/api/queries/venues.js +211 -0
- package/dist/api/types.d.ts +245 -0
- package/dist/api/types.js +6 -1
- package/dist/api/utils/eventGrouping.d.ts +104 -0
- package/dist/api/utils/eventGrouping.js +155 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/package.json +5 -2
- package/src/__tests__/e2e.test.ts +996 -64
- package/src/api/mutations/badges.ts +228 -0
- package/src/api/mutations/brands.ts +376 -0
- package/src/api/mutations/creators.ts +171 -0
- package/src/api/mutations/event-chat.ts +8 -8
- package/src/api/mutations/index.ts +4 -0
- package/src/api/mutations/jack.ts +50 -1
- package/src/api/mutations/products.ts +336 -0
- package/src/api/mutations/support.ts +44 -0
- package/src/api/queries/badges.ts +385 -0
- package/src/api/queries/brands.ts +281 -0
- package/src/api/queries/businesses.ts +30 -1
- package/src/api/queries/creators.ts +308 -0
- package/src/api/queries/event-chat.ts +3 -3
- package/src/api/queries/index.ts +5 -0
- package/src/api/queries/jack.ts +139 -1
- package/src/api/queries/products.ts +312 -0
- package/src/api/queries/support.ts +54 -0
- package/src/api/queries/venues.ts +271 -0
- package/src/api/types.ts +317 -1
- package/src/api/utils/eventGrouping.ts +181 -0
- package/src/index.ts +6 -0
|
@@ -4,13 +4,43 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Tests all SDK endpoints against the real API.
|
|
6
6
|
* Run with: npx ts-node src/__tests__/e2e.test.ts
|
|
7
|
+
*
|
|
8
|
+
* Covers:
|
|
9
|
+
* - Authentication
|
|
10
|
+
* - Users
|
|
11
|
+
* - Events (with venue, creator, brand sponsor)
|
|
12
|
+
* - Bookings
|
|
13
|
+
* - Event Chat (new roles: ATTENDEE, CREATOR, VENUE_REP, BRAND_REP)
|
|
14
|
+
* - Hubs
|
|
15
|
+
* - Venues (new - replaces businesses)
|
|
16
|
+
* - Creators (new)
|
|
17
|
+
* - Brands (new)
|
|
18
|
+
* - Unified Rewards (venue + brand rewards)
|
|
19
|
+
* - Library (content workflow)
|
|
20
|
+
* - Support (check-ins, wins, Jack AI)
|
|
21
|
+
* - Creator Products (sessions/packages with booking flow)
|
|
22
|
+
* - Badges & Rewards
|
|
23
|
+
* - Badge Awarding (business logic tests for automatic badge awarding)
|
|
24
|
+
* - CHECK_IN_STREAK badge on check-in
|
|
25
|
+
* - WINS_LOGGED badge on logging wins
|
|
26
|
+
* - MOOD_LOGS_COUNT badge on mood logging
|
|
27
|
+
* - REFLECTIONS_COUNT badge on submitting reflections
|
|
28
|
+
* - EVENTS_HOSTED badge on publishing events
|
|
29
|
+
* - EVENTS_ATTENDED badge progress tracking
|
|
30
|
+
* - Reward Flow (full redemption lifecycle)
|
|
31
|
+
* - Creating rewards for badges (venue/brand)
|
|
32
|
+
* - User earns badge -> reward becomes available
|
|
33
|
+
* - Redeem reward (get redemption details)
|
|
34
|
+
* - Cannot redeem without badge
|
|
35
|
+
* - Cannot redeem twice (per user limit)
|
|
36
|
+
* - Reward verification endpoint
|
|
7
37
|
*/
|
|
8
38
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
39
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
40
|
};
|
|
11
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
42
|
const axios_1 = __importDefault(require("axios"));
|
|
13
|
-
const BASE_URL = 'http://localhost:3001/api/v1';
|
|
43
|
+
const BASE_URL = process.env.API_URL || 'http://localhost:3001/api/v1';
|
|
14
44
|
const TEST_EMAIL = `e2e-${Date.now()}@growsober.com`;
|
|
15
45
|
const TEST_PASSWORD = 'SecurePass123!';
|
|
16
46
|
// Colors for output
|
|
@@ -21,6 +51,7 @@ const c = {
|
|
|
21
51
|
yellow: '\x1b[33m',
|
|
22
52
|
cyan: '\x1b[36m',
|
|
23
53
|
dim: '\x1b[2m',
|
|
54
|
+
bold: '\x1b[1m',
|
|
24
55
|
};
|
|
25
56
|
// State shared across tests
|
|
26
57
|
const state = {
|
|
@@ -31,6 +62,7 @@ const state = {
|
|
|
31
62
|
// Stats
|
|
32
63
|
let passed = 0;
|
|
33
64
|
let failed = 0;
|
|
65
|
+
let skipped = 0;
|
|
34
66
|
// Create axios client
|
|
35
67
|
function api(token) {
|
|
36
68
|
return axios_1.default.create({
|
|
@@ -55,30 +87,39 @@ async function test(name, fn) {
|
|
|
55
87
|
return false;
|
|
56
88
|
}
|
|
57
89
|
}
|
|
58
|
-
//
|
|
90
|
+
// Skip test with reason
|
|
91
|
+
function skip(name, reason) {
|
|
92
|
+
console.log(`${c.yellow}SKIP${c.reset} ${name} ${c.dim}(${reason})${c.reset}`);
|
|
93
|
+
skipped++;
|
|
94
|
+
}
|
|
95
|
+
// Unwrap API response (handles both wrapped and unwrapped)
|
|
59
96
|
function unwrap(res) {
|
|
60
|
-
return res.data.data;
|
|
97
|
+
return res.data?.data !== undefined ? res.data.data : res.data;
|
|
98
|
+
}
|
|
99
|
+
// Section header
|
|
100
|
+
function section(name) {
|
|
101
|
+
console.log(`\n${c.cyan}--- ${name} ---${c.reset}\n`);
|
|
61
102
|
}
|
|
62
103
|
// ============================================================================
|
|
63
104
|
// TESTS
|
|
64
105
|
// ============================================================================
|
|
65
106
|
async function runTests() {
|
|
66
|
-
console.log(`\n${c.cyan}${'='.repeat(
|
|
67
|
-
console.log(`${c.cyan} GrowSober API E2E Tests${c.reset}`);
|
|
68
|
-
console.log(`${c.cyan}${'='.repeat(
|
|
107
|
+
console.log(`\n${c.cyan}${'='.repeat(70)}${c.reset}`);
|
|
108
|
+
console.log(`${c.cyan} GrowSober API E2E Tests - Full Coverage${c.reset}`);
|
|
109
|
+
console.log(`${c.cyan}${'='.repeat(70)}${c.reset}`);
|
|
69
110
|
console.log(`${c.dim}Base URL: ${BASE_URL}${c.reset}`);
|
|
70
111
|
console.log(`${c.dim}Test Email: ${TEST_EMAIL}${c.reset}\n`);
|
|
71
112
|
// Health check
|
|
72
113
|
const health = await api().get('/health');
|
|
73
114
|
if (health.status !== 200) {
|
|
74
|
-
console.log(`${c.red}API is not reachable${c.reset}`);
|
|
115
|
+
console.log(`${c.red}API is not reachable at ${BASE_URL}${c.reset}`);
|
|
75
116
|
process.exit(1);
|
|
76
117
|
}
|
|
77
118
|
console.log(`${c.green}API is healthy${c.reset}\n`);
|
|
78
119
|
// =========================================================================
|
|
79
120
|
// AUTH
|
|
80
121
|
// =========================================================================
|
|
81
|
-
|
|
122
|
+
section('AUTHENTICATION');
|
|
82
123
|
await test('Register new user', async () => {
|
|
83
124
|
const res = await api().post('/auth/register', {
|
|
84
125
|
email: TEST_EMAIL,
|
|
@@ -126,10 +167,23 @@ async function runTests() {
|
|
|
126
167
|
if (res.status !== 401)
|
|
127
168
|
throw new Error(`Expected 401, got ${res.status}`);
|
|
128
169
|
});
|
|
170
|
+
// Register second user for ownership tests
|
|
171
|
+
await test('Register second user for ownership tests', async () => {
|
|
172
|
+
const res = await api().post('/auth/register', {
|
|
173
|
+
email: `e2e-second-${Date.now()}@growsober.com`,
|
|
174
|
+
password: TEST_PASSWORD,
|
|
175
|
+
name: 'E2E Second User',
|
|
176
|
+
});
|
|
177
|
+
if (res.status !== 201)
|
|
178
|
+
throw new Error(`Status ${res.status}`);
|
|
179
|
+
const data = unwrap(res);
|
|
180
|
+
state.secondUserToken = data.accessToken;
|
|
181
|
+
state.secondUserId = data.user.id;
|
|
182
|
+
});
|
|
129
183
|
// =========================================================================
|
|
130
184
|
// USERS
|
|
131
185
|
// =========================================================================
|
|
132
|
-
|
|
186
|
+
section('USERS');
|
|
133
187
|
await test('Get current user profile', async () => {
|
|
134
188
|
const res = await api(state.accessToken).get('/users/me');
|
|
135
189
|
if (res.status !== 200)
|
|
@@ -154,9 +208,411 @@ async function runTests() {
|
|
|
154
208
|
throw new Error(`Status ${res.status}`);
|
|
155
209
|
});
|
|
156
210
|
// =========================================================================
|
|
157
|
-
//
|
|
211
|
+
// VENUES (New - replaces Businesses)
|
|
212
|
+
// =========================================================================
|
|
213
|
+
section('VENUES');
|
|
214
|
+
await test('List venues', async () => {
|
|
215
|
+
const res = await api().get('/venues');
|
|
216
|
+
if (res.status !== 200)
|
|
217
|
+
throw new Error(`Status ${res.status}`);
|
|
218
|
+
const data = unwrap(res);
|
|
219
|
+
// Get first venue if exists for further tests
|
|
220
|
+
if (data?.venues?.length > 0) {
|
|
221
|
+
state.venueId = data.venues[0].id;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
await test('Get featured venues', async () => {
|
|
225
|
+
const res = await api().get('/venues/featured');
|
|
226
|
+
if (res.status !== 200)
|
|
227
|
+
throw new Error(`Status ${res.status}`);
|
|
228
|
+
});
|
|
229
|
+
await test('Get nearby venues', async () => {
|
|
230
|
+
const res = await api().get('/venues/nearby', {
|
|
231
|
+
params: { lat: 51.5074, long: -0.1278, radius: 10 },
|
|
232
|
+
});
|
|
233
|
+
if (res.status !== 200)
|
|
234
|
+
throw new Error(`Status ${res.status}`);
|
|
235
|
+
});
|
|
236
|
+
if (state.venueId) {
|
|
237
|
+
await test('Get venue by ID', async () => {
|
|
238
|
+
const res = await api().get(`/venues/${state.venueId}`);
|
|
239
|
+
if (res.status !== 200)
|
|
240
|
+
throw new Error(`Status ${res.status}`);
|
|
241
|
+
});
|
|
242
|
+
await test('Get venue owners', async () => {
|
|
243
|
+
const res = await api(state.accessToken).get(`/venues/${state.venueId}/owners`);
|
|
244
|
+
if (res.status !== 200)
|
|
245
|
+
throw new Error(`Status ${res.status}`);
|
|
246
|
+
});
|
|
247
|
+
await test('Get venue events', async () => {
|
|
248
|
+
const res = await api().get(`/venues/${state.venueId}/events`);
|
|
249
|
+
if (res.status !== 200)
|
|
250
|
+
throw new Error(`Status ${res.status}`);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
skip('Get venue by ID', 'No venues in database');
|
|
255
|
+
skip('Get venue owners', 'No venues in database');
|
|
256
|
+
skip('Get venue events', 'No venues in database');
|
|
257
|
+
}
|
|
258
|
+
// =========================================================================
|
|
259
|
+
// CREATORS (New)
|
|
260
|
+
// =========================================================================
|
|
261
|
+
section('CREATORS');
|
|
262
|
+
await test('List creators', async () => {
|
|
263
|
+
const res = await api().get('/creators');
|
|
264
|
+
if (res.status !== 200)
|
|
265
|
+
throw new Error(`Status ${res.status}`);
|
|
266
|
+
});
|
|
267
|
+
await test('Create creator profile', async () => {
|
|
268
|
+
const res = await api(state.accessToken).post('/creators', {
|
|
269
|
+
slug: `e2e-creator-${Date.now()}`,
|
|
270
|
+
displayName: 'E2E Test Creator',
|
|
271
|
+
bio: 'A test creator for E2E tests',
|
|
272
|
+
canFacilitate: true,
|
|
273
|
+
canCreateContent: true,
|
|
274
|
+
isInfluencer: false,
|
|
275
|
+
specialties: ['meditation', 'sobriety-coaching'],
|
|
276
|
+
certifications: ['Test Cert 1'],
|
|
277
|
+
});
|
|
278
|
+
if (res.status !== 201)
|
|
279
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
280
|
+
const data = unwrap(res);
|
|
281
|
+
state.creatorId = data.id;
|
|
282
|
+
});
|
|
283
|
+
if (state.creatorId) {
|
|
284
|
+
await test('Get creator by ID', async () => {
|
|
285
|
+
const res = await api().get(`/creators/${state.creatorId}`);
|
|
286
|
+
if (res.status !== 200)
|
|
287
|
+
throw new Error(`Status ${res.status}`);
|
|
288
|
+
});
|
|
289
|
+
await test('Get my creator profile', async () => {
|
|
290
|
+
const res = await api(state.accessToken).get('/creators/me');
|
|
291
|
+
// Returns 200 with null or creator data
|
|
292
|
+
if (res.status !== 200)
|
|
293
|
+
throw new Error(`Status ${res.status}`);
|
|
294
|
+
});
|
|
295
|
+
await test('Get creator by user ID', async () => {
|
|
296
|
+
const res = await api(state.accessToken).get(`/creators/user/${state.userId}`);
|
|
297
|
+
if (res.status !== 200)
|
|
298
|
+
throw new Error(`Status ${res.status}`);
|
|
299
|
+
});
|
|
300
|
+
await test('Update creator profile', async () => {
|
|
301
|
+
const res = await api(state.accessToken).patch(`/creators/${state.creatorId}`, {
|
|
302
|
+
bio: 'Updated bio for E2E testing',
|
|
303
|
+
sessionRate: 50,
|
|
304
|
+
});
|
|
305
|
+
if (res.status !== 200)
|
|
306
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
307
|
+
});
|
|
308
|
+
await test('Add creator availability', async () => {
|
|
309
|
+
const res = await api(state.accessToken).post(`/creators/${state.creatorId}/availability`, {
|
|
310
|
+
dayOfWeek: 1, // Monday
|
|
311
|
+
startTime: '09:00',
|
|
312
|
+
endTime: '17:00',
|
|
313
|
+
timezone: 'Europe/London',
|
|
314
|
+
isRecurring: true,
|
|
315
|
+
});
|
|
316
|
+
if (res.status !== 201)
|
|
317
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
318
|
+
const data = unwrap(res);
|
|
319
|
+
state.availabilityId = data.id;
|
|
320
|
+
});
|
|
321
|
+
await test('Get creator availability', async () => {
|
|
322
|
+
const res = await api().get(`/creators/${state.creatorId}/availability`);
|
|
323
|
+
if (res.status !== 200)
|
|
324
|
+
throw new Error(`Status ${res.status}`);
|
|
325
|
+
});
|
|
326
|
+
await test('Get creator content (published)', async () => {
|
|
327
|
+
const res = await api().get(`/creators/${state.creatorId}/content`);
|
|
328
|
+
if (res.status !== 200)
|
|
329
|
+
throw new Error(`Status ${res.status}`);
|
|
330
|
+
});
|
|
331
|
+
await test('Get creator events', async () => {
|
|
332
|
+
const res = await api().get(`/creators/${state.creatorId}/events`);
|
|
333
|
+
if (res.status !== 200)
|
|
334
|
+
throw new Error(`Status ${res.status}`);
|
|
335
|
+
});
|
|
336
|
+
// Test ownership - second user cannot update
|
|
337
|
+
await test('Second user cannot update another creator profile (403)', async () => {
|
|
338
|
+
const res = await api(state.secondUserToken).patch(`/creators/${state.creatorId}`, {
|
|
339
|
+
bio: 'Hacked bio',
|
|
340
|
+
});
|
|
341
|
+
if (res.status !== 403)
|
|
342
|
+
throw new Error(`Expected 403, got ${res.status}`);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
// =========================================================================
|
|
346
|
+
// CREATOR PRODUCTS (Sessions/Packages)
|
|
158
347
|
// =========================================================================
|
|
159
|
-
|
|
348
|
+
section('CREATOR PRODUCTS');
|
|
349
|
+
if (state.creatorId) {
|
|
350
|
+
await test('Create creator product (1-on-1 session)', async () => {
|
|
351
|
+
const res = await api(state.accessToken).post(`/creators/${state.creatorId}/products`, {
|
|
352
|
+
title: 'E2E Test 1-on-1 Session',
|
|
353
|
+
description: 'A test coaching session for E2E testing',
|
|
354
|
+
type: 'SESSION_1ON1',
|
|
355
|
+
price: 5000, // £50 in pence
|
|
356
|
+
currency: 'GBP',
|
|
357
|
+
durationMinutes: 60,
|
|
358
|
+
maxParticipants: 1,
|
|
359
|
+
deliveryMethod: 'VIDEO_CALL',
|
|
360
|
+
});
|
|
361
|
+
if (res.status !== 201)
|
|
362
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
363
|
+
const data = unwrap(res);
|
|
364
|
+
state.productId = data.id;
|
|
365
|
+
});
|
|
366
|
+
await test('Create second product (workshop)', async () => {
|
|
367
|
+
const res = await api(state.accessToken).post(`/creators/${state.creatorId}/products`, {
|
|
368
|
+
title: 'E2E Test Workshop',
|
|
369
|
+
description: 'A group workshop for E2E testing',
|
|
370
|
+
type: 'WORKSHOP',
|
|
371
|
+
price: 2500, // £25 in pence
|
|
372
|
+
currency: 'GBP',
|
|
373
|
+
durationMinutes: 90,
|
|
374
|
+
maxParticipants: 10,
|
|
375
|
+
deliveryMethod: 'VIDEO_CALL',
|
|
376
|
+
});
|
|
377
|
+
if (res.status !== 201)
|
|
378
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
379
|
+
});
|
|
380
|
+
await test('Get creator products', async () => {
|
|
381
|
+
const res = await api(state.accessToken).get(`/creators/${state.creatorId}/products`);
|
|
382
|
+
if (res.status !== 200)
|
|
383
|
+
throw new Error(`Status ${res.status}`);
|
|
384
|
+
const data = unwrap(res);
|
|
385
|
+
const products = data.products || data;
|
|
386
|
+
if (!Array.isArray(products) || products.length < 2) {
|
|
387
|
+
throw new Error('Expected at least 2 products for creator');
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
if (state.productId) {
|
|
391
|
+
await test('Get product by ID (public)', async () => {
|
|
392
|
+
const res = await api().get(`/products/${state.productId}`);
|
|
393
|
+
if (res.status !== 200)
|
|
394
|
+
throw new Error(`Status ${res.status}`);
|
|
395
|
+
const data = unwrap(res);
|
|
396
|
+
if (!data.title || !data.price)
|
|
397
|
+
throw new Error('Missing expected product fields');
|
|
398
|
+
});
|
|
399
|
+
await test('Update product', async () => {
|
|
400
|
+
const res = await api(state.accessToken).put(`/creators/${state.creatorId}/products/${state.productId}`, {
|
|
401
|
+
price: 6000, // Update to £60
|
|
402
|
+
description: 'Updated description for E2E testing',
|
|
403
|
+
});
|
|
404
|
+
if (res.status !== 200)
|
|
405
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
406
|
+
const data = unwrap(res);
|
|
407
|
+
if (data.price !== 6000)
|
|
408
|
+
throw new Error('Price not updated correctly');
|
|
409
|
+
});
|
|
410
|
+
// Second user books the product
|
|
411
|
+
await test('Book product (as second user)', async () => {
|
|
412
|
+
const scheduledAt = new Date();
|
|
413
|
+
scheduledAt.setDate(scheduledAt.getDate() + 14); // 2 weeks from now
|
|
414
|
+
scheduledAt.setHours(10, 0, 0, 0);
|
|
415
|
+
const res = await api(state.secondUserToken).post(`/products/${state.productId}/book`, {
|
|
416
|
+
scheduledAt: scheduledAt.toISOString(),
|
|
417
|
+
timezone: 'Europe/London',
|
|
418
|
+
clientNotes: 'E2E test booking',
|
|
419
|
+
});
|
|
420
|
+
if (res.status !== 201)
|
|
421
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
422
|
+
const data = unwrap(res);
|
|
423
|
+
state.productBookingId = data.id;
|
|
424
|
+
});
|
|
425
|
+
if (state.productBookingId) {
|
|
426
|
+
await test('Get product booking details', async () => {
|
|
427
|
+
const res = await api(state.secondUserToken).get(`/users/me/product-bookings/${state.productBookingId}`);
|
|
428
|
+
if (res.status !== 200)
|
|
429
|
+
throw new Error(`Status ${res.status}`);
|
|
430
|
+
const data = unwrap(res);
|
|
431
|
+
if (!data.scheduledAt || !data.status)
|
|
432
|
+
throw new Error('Missing booking fields');
|
|
433
|
+
});
|
|
434
|
+
await test('Get user product bookings', async () => {
|
|
435
|
+
const res = await api(state.secondUserToken).get('/users/me/product-bookings');
|
|
436
|
+
if (res.status !== 200)
|
|
437
|
+
throw new Error(`Status ${res.status}`);
|
|
438
|
+
const data = unwrap(res);
|
|
439
|
+
const bookings = Array.isArray(data) ? data : (data.data || []);
|
|
440
|
+
if (!Array.isArray(bookings) || bookings.length === 0) {
|
|
441
|
+
throw new Error('Expected at least one product booking');
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
await test('Get creator bookings (as creator)', async () => {
|
|
445
|
+
const res = await api(state.accessToken).get(`/creators/${state.creatorId}/products/bookings`);
|
|
446
|
+
if (res.status !== 200)
|
|
447
|
+
throw new Error(`Status ${res.status}`);
|
|
448
|
+
const data = unwrap(res);
|
|
449
|
+
const bookings = Array.isArray(data) ? data : (data.data || []);
|
|
450
|
+
if (!Array.isArray(bookings) || bookings.length === 0) {
|
|
451
|
+
throw new Error('Expected at least one booking for creator products');
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
await test('Update product booking', async () => {
|
|
455
|
+
const newScheduledAt = new Date();
|
|
456
|
+
newScheduledAt.setDate(newScheduledAt.getDate() + 21); // 3 weeks from now
|
|
457
|
+
newScheduledAt.setHours(14, 0, 0, 0);
|
|
458
|
+
const res = await api(state.secondUserToken).put(`/users/me/product-bookings/${state.productBookingId}`, {
|
|
459
|
+
scheduledAt: newScheduledAt.toISOString(),
|
|
460
|
+
clientNotes: 'Rescheduled - E2E test',
|
|
461
|
+
});
|
|
462
|
+
if (res.status !== 200)
|
|
463
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
464
|
+
});
|
|
465
|
+
await test('Cancel product booking', async () => {
|
|
466
|
+
const res = await api(state.secondUserToken).delete(`/users/me/product-bookings/${state.productBookingId}`, {
|
|
467
|
+
data: { reason: 'E2E test cleanup' },
|
|
468
|
+
});
|
|
469
|
+
if (res.status !== 200 && res.status !== 204)
|
|
470
|
+
throw new Error(`Status ${res.status}`);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
// Second user cannot delete creator's product
|
|
474
|
+
await test('Second user cannot delete product (403)', async () => {
|
|
475
|
+
const res = await api(state.secondUserToken).delete(`/creators/${state.creatorId}/products/${state.productId}`);
|
|
476
|
+
if (res.status !== 403)
|
|
477
|
+
throw new Error(`Expected 403, got ${res.status}`);
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
skip('Create creator product', 'No creator ID available');
|
|
483
|
+
skip('Create second product', 'No creator ID available');
|
|
484
|
+
skip('Get creator products', 'No creator ID available');
|
|
485
|
+
skip('Get product by ID', 'No product ID available');
|
|
486
|
+
skip('Update product', 'No product ID available');
|
|
487
|
+
skip('Book product', 'No product ID available');
|
|
488
|
+
skip('Get product booking details', 'No booking ID available');
|
|
489
|
+
skip('Get user product bookings', 'No booking ID available');
|
|
490
|
+
skip('Get creator bookings', 'No booking ID available');
|
|
491
|
+
skip('Update product booking', 'No booking ID available');
|
|
492
|
+
skip('Cancel product booking', 'No booking ID available');
|
|
493
|
+
skip('Second user cannot delete product', 'No product ID available');
|
|
494
|
+
}
|
|
495
|
+
// Test public products listing
|
|
496
|
+
await test('List all public products', async () => {
|
|
497
|
+
const res = await api().get('/products');
|
|
498
|
+
if (res.status !== 200)
|
|
499
|
+
throw new Error(`Status ${res.status}`);
|
|
500
|
+
const data = unwrap(res);
|
|
501
|
+
// May have products array or paginated response
|
|
502
|
+
const products = data.products || data;
|
|
503
|
+
if (!Array.isArray(products))
|
|
504
|
+
throw new Error('Expected products array');
|
|
505
|
+
});
|
|
506
|
+
// =========================================================================
|
|
507
|
+
// BRANDS (New)
|
|
508
|
+
// =========================================================================
|
|
509
|
+
section('BRANDS');
|
|
510
|
+
await test('List brands', async () => {
|
|
511
|
+
const res = await api().get('/brands');
|
|
512
|
+
if (res.status !== 200)
|
|
513
|
+
throw new Error(`Status ${res.status}`);
|
|
514
|
+
});
|
|
515
|
+
await test('Get featured brands', async () => {
|
|
516
|
+
const res = await api().get('/brands/featured');
|
|
517
|
+
if (res.status !== 200)
|
|
518
|
+
throw new Error(`Status ${res.status}`);
|
|
519
|
+
});
|
|
520
|
+
await test('Create brand', async () => {
|
|
521
|
+
const res = await api(state.accessToken).post('/brands', {
|
|
522
|
+
slug: `e2e-brand-${Date.now()}`,
|
|
523
|
+
name: 'E2E Test Brand',
|
|
524
|
+
description: 'A test brand for E2E testing',
|
|
525
|
+
website: 'https://example.com',
|
|
526
|
+
email: 'brand@example.com',
|
|
527
|
+
});
|
|
528
|
+
if (res.status !== 201)
|
|
529
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
530
|
+
const data = unwrap(res);
|
|
531
|
+
state.brandId = data.id;
|
|
532
|
+
});
|
|
533
|
+
if (state.brandId) {
|
|
534
|
+
await test('Get brand by ID', async () => {
|
|
535
|
+
const res = await api().get(`/brands/${state.brandId}`);
|
|
536
|
+
if (res.status !== 200)
|
|
537
|
+
throw new Error(`Status ${res.status}`);
|
|
538
|
+
});
|
|
539
|
+
await test('Update brand', async () => {
|
|
540
|
+
const res = await api(state.accessToken).patch(`/brands/${state.brandId}`, {
|
|
541
|
+
description: 'Updated brand description',
|
|
542
|
+
});
|
|
543
|
+
if (res.status !== 200)
|
|
544
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
545
|
+
});
|
|
546
|
+
await test('Get brand owners', async () => {
|
|
547
|
+
const res = await api(state.accessToken).get(`/brands/${state.brandId}/owners`);
|
|
548
|
+
if (res.status !== 200)
|
|
549
|
+
throw new Error(`Status ${res.status}`);
|
|
550
|
+
});
|
|
551
|
+
// Add second user as brand manager
|
|
552
|
+
await test('Add brand owner (manager role)', async () => {
|
|
553
|
+
const res = await api(state.accessToken).post(`/brands/${state.brandId}/owners`, {
|
|
554
|
+
userId: state.secondUserId,
|
|
555
|
+
role: 'MANAGER',
|
|
556
|
+
});
|
|
557
|
+
if (res.status !== 201)
|
|
558
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
559
|
+
});
|
|
560
|
+
// Manager can update brand
|
|
561
|
+
await test('Manager can update brand', async () => {
|
|
562
|
+
const res = await api(state.secondUserToken).patch(`/brands/${state.brandId}`, {
|
|
563
|
+
description: 'Updated by manager',
|
|
564
|
+
});
|
|
565
|
+
if (res.status !== 200)
|
|
566
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
567
|
+
});
|
|
568
|
+
await test('Get brand creators (partnerships)', async () => {
|
|
569
|
+
const res = await api(state.accessToken).get(`/brands/${state.brandId}/creators`);
|
|
570
|
+
if (res.status !== 200)
|
|
571
|
+
throw new Error(`Status ${res.status}`);
|
|
572
|
+
});
|
|
573
|
+
// Add creator partnership if creator exists
|
|
574
|
+
if (state.creatorId) {
|
|
575
|
+
await test('Add creator partnership to brand', async () => {
|
|
576
|
+
const res = await api(state.accessToken).post(`/brands/${state.brandId}/creators`, {
|
|
577
|
+
creatorId: state.creatorId,
|
|
578
|
+
commissionRate: 0.15,
|
|
579
|
+
isActive: true,
|
|
580
|
+
});
|
|
581
|
+
if (res.status !== 201)
|
|
582
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
583
|
+
});
|
|
584
|
+
await test('Update creator partnership', async () => {
|
|
585
|
+
const res = await api(state.accessToken).patch(`/brands/${state.brandId}/creators/${state.creatorId}`, {
|
|
586
|
+
commissionRate: 0.20,
|
|
587
|
+
});
|
|
588
|
+
if (res.status !== 200)
|
|
589
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
await test('Get brand sponsored events', async () => {
|
|
593
|
+
const res = await api().get(`/brands/${state.brandId}/events`);
|
|
594
|
+
if (res.status !== 200)
|
|
595
|
+
throw new Error(`Status ${res.status}`);
|
|
596
|
+
});
|
|
597
|
+
// Remove the manager
|
|
598
|
+
await test('Remove brand owner', async () => {
|
|
599
|
+
const res = await api(state.accessToken).delete(`/brands/${state.brandId}/owners/${state.secondUserId}`);
|
|
600
|
+
if (res.status !== 200 && res.status !== 204)
|
|
601
|
+
throw new Error(`Status ${res.status}`);
|
|
602
|
+
});
|
|
603
|
+
// Second user should now be forbidden
|
|
604
|
+
await test('Removed owner cannot access brand (403)', async () => {
|
|
605
|
+
const res = await api(state.secondUserToken).patch(`/brands/${state.brandId}`, {
|
|
606
|
+
description: 'Should fail',
|
|
607
|
+
});
|
|
608
|
+
if (res.status !== 403)
|
|
609
|
+
throw new Error(`Expected 403, got ${res.status}`);
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
// =========================================================================
|
|
613
|
+
// EVENTS (with new fields: venueId, creatorId, sponsorBrandId, gatheringType)
|
|
614
|
+
// =========================================================================
|
|
615
|
+
section('EVENTS');
|
|
160
616
|
await test('List events', async () => {
|
|
161
617
|
const res = await api().get('/events');
|
|
162
618
|
if (res.status !== 200)
|
|
@@ -167,15 +623,24 @@ async function runTests() {
|
|
|
167
623
|
if (res.status !== 200)
|
|
168
624
|
throw new Error(`Status ${res.status}`);
|
|
169
625
|
});
|
|
170
|
-
await test('Create event', async () => {
|
|
171
|
-
const
|
|
626
|
+
await test('Create event with creator and brand sponsor', async () => {
|
|
627
|
+
const eventData = {
|
|
172
628
|
title: 'E2E Test Event',
|
|
173
629
|
description: 'A test event created by E2E tests',
|
|
174
|
-
startDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
630
|
+
startDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
175
631
|
totalSpots: 20,
|
|
176
632
|
locationName: 'Test Location',
|
|
177
633
|
locationAddress: '123 Test Street',
|
|
178
|
-
|
|
634
|
+
gatheringType: 'FACILITATOR_LED',
|
|
635
|
+
};
|
|
636
|
+
// Add creator and brand if available
|
|
637
|
+
if (state.creatorId)
|
|
638
|
+
eventData.creatorId = state.creatorId;
|
|
639
|
+
if (state.brandId)
|
|
640
|
+
eventData.sponsorBrandId = state.brandId;
|
|
641
|
+
if (state.venueId)
|
|
642
|
+
eventData.venueId = state.venueId;
|
|
643
|
+
const res = await api(state.accessToken).post('/events', eventData);
|
|
179
644
|
if (res.status !== 201)
|
|
180
645
|
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
181
646
|
const data = unwrap(res);
|
|
@@ -186,10 +651,21 @@ async function runTests() {
|
|
|
186
651
|
const res = await api().get(`/events/${state.eventId}`);
|
|
187
652
|
if (res.status !== 200)
|
|
188
653
|
throw new Error(`Status ${res.status}`);
|
|
654
|
+
const data = unwrap(res);
|
|
655
|
+
// Verify new fields are present
|
|
656
|
+
if (!('gatheringType' in data))
|
|
657
|
+
throw new Error('Missing gatheringType field');
|
|
658
|
+
if (!('venueId' in data))
|
|
659
|
+
throw new Error('Missing venueId field');
|
|
660
|
+
if (!('creatorId' in data))
|
|
661
|
+
throw new Error('Missing creatorId field');
|
|
662
|
+
if (!('sponsorBrandId' in data))
|
|
663
|
+
throw new Error('Missing sponsorBrandId field');
|
|
189
664
|
});
|
|
190
665
|
await test('Update event', async () => {
|
|
191
666
|
const res = await api(state.accessToken).put(`/events/${state.eventId}`, {
|
|
192
667
|
title: 'E2E Test Event (Updated)',
|
|
668
|
+
description: 'Updated description for E2E testing',
|
|
193
669
|
});
|
|
194
670
|
if (res.status !== 200)
|
|
195
671
|
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
@@ -208,13 +684,12 @@ async function runTests() {
|
|
|
208
684
|
// =========================================================================
|
|
209
685
|
// BOOKINGS
|
|
210
686
|
// =========================================================================
|
|
211
|
-
|
|
687
|
+
section('BOOKINGS');
|
|
212
688
|
if (state.eventId) {
|
|
213
689
|
await test('RSVP to event', async () => {
|
|
214
690
|
const res = await api(state.accessToken).post(`/events/${state.eventId}/book`);
|
|
215
|
-
// 201 for new booking, 409 if already exists
|
|
216
691
|
if (res.status !== 201 && res.status !== 409)
|
|
217
|
-
throw new Error(`Status ${res.status}
|
|
692
|
+
throw new Error(`Status ${res.status}`);
|
|
218
693
|
if (res.status === 201) {
|
|
219
694
|
const data = unwrap(res);
|
|
220
695
|
state.bookingId = data.id;
|
|
@@ -227,9 +702,9 @@ async function runTests() {
|
|
|
227
702
|
});
|
|
228
703
|
}
|
|
229
704
|
// =========================================================================
|
|
230
|
-
// EVENT CHAT
|
|
705
|
+
// EVENT CHAT (New roles: ATTENDEE, CREATOR, VENUE_REP, BRAND_REP)
|
|
231
706
|
// =========================================================================
|
|
232
|
-
|
|
707
|
+
section('EVENT CHAT');
|
|
233
708
|
if (state.eventId) {
|
|
234
709
|
await test('Get or create event chat', async () => {
|
|
235
710
|
const res = await api(state.accessToken).get(`/events/${state.eventId}/chat`);
|
|
@@ -240,26 +715,34 @@ async function runTests() {
|
|
|
240
715
|
});
|
|
241
716
|
await test('Join event chat', async () => {
|
|
242
717
|
const res = await api(state.accessToken).post(`/events/${state.eventId}/chat/join`);
|
|
243
|
-
// 200 for join, 403 if no booking (but we just booked)
|
|
244
718
|
if (res.status !== 200)
|
|
245
|
-
throw new Error(`Status ${res.status}
|
|
719
|
+
throw new Error(`Status ${res.status}`);
|
|
246
720
|
});
|
|
247
721
|
await test('Send chat message', async () => {
|
|
248
722
|
const res = await api(state.accessToken).post(`/events/${state.eventId}/chat/messages`, {
|
|
249
723
|
content: 'Hello from E2E test!',
|
|
250
724
|
});
|
|
251
725
|
if (res.status !== 201)
|
|
252
|
-
throw new Error(`Status ${res.status}
|
|
726
|
+
throw new Error(`Status ${res.status}`);
|
|
253
727
|
});
|
|
254
728
|
await test('Get chat messages', async () => {
|
|
255
729
|
const res = await api(state.accessToken).get(`/events/${state.eventId}/chat/messages`);
|
|
256
730
|
if (res.status !== 200)
|
|
257
|
-
throw new Error(`Status ${res.status}
|
|
731
|
+
throw new Error(`Status ${res.status}`);
|
|
258
732
|
});
|
|
259
|
-
await test('Get chat members', async () => {
|
|
733
|
+
await test('Get chat members (check for new roles)', async () => {
|
|
260
734
|
const res = await api(state.accessToken).get(`/events/${state.eventId}/chat/members`);
|
|
261
735
|
if (res.status !== 200)
|
|
262
736
|
throw new Error(`Status ${res.status}`);
|
|
737
|
+
const data = unwrap(res);
|
|
738
|
+
// Verify members have role field
|
|
739
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
740
|
+
const validRoles = ['ATTENDEE', 'CREATOR', 'VENUE_REP', 'BRAND_REP', 'MODERATOR', 'ADMIN'];
|
|
741
|
+
const member = data[0];
|
|
742
|
+
if (!validRoles.includes(member.role)) {
|
|
743
|
+
throw new Error(`Invalid role: ${member.role}`);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
263
746
|
});
|
|
264
747
|
await test('Mark chat as read', async () => {
|
|
265
748
|
const res = await api(state.accessToken).post(`/events/${state.eventId}/chat/read`);
|
|
@@ -268,15 +751,74 @@ async function runTests() {
|
|
|
268
751
|
});
|
|
269
752
|
}
|
|
270
753
|
// =========================================================================
|
|
754
|
+
// BADGES & UNIFIED REWARDS
|
|
755
|
+
// =========================================================================
|
|
756
|
+
section('BADGES & UNIFIED REWARDS');
|
|
757
|
+
await test('Get all badges', async () => {
|
|
758
|
+
const res = await api(state.accessToken).get('/badges');
|
|
759
|
+
if (res.status !== 200)
|
|
760
|
+
throw new Error(`Status ${res.status}`);
|
|
761
|
+
const data = unwrap(res);
|
|
762
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
763
|
+
state.badgeId = data[0].id;
|
|
764
|
+
}
|
|
765
|
+
});
|
|
766
|
+
await test('Get my badges', async () => {
|
|
767
|
+
const res = await api(state.accessToken).get('/badges/users/me/badges');
|
|
768
|
+
if (res.status !== 200)
|
|
769
|
+
throw new Error(`Status ${res.status}`);
|
|
770
|
+
});
|
|
771
|
+
await test('Get next badges (with progress)', async () => {
|
|
772
|
+
const res = await api(state.accessToken).get('/badges/next');
|
|
773
|
+
if (res.status !== 200)
|
|
774
|
+
throw new Error(`Status ${res.status}`);
|
|
775
|
+
});
|
|
776
|
+
await test('Get available rewards', async () => {
|
|
777
|
+
const res = await api(state.accessToken).get('/rewards/available');
|
|
778
|
+
if (res.status !== 200)
|
|
779
|
+
throw new Error(`Status ${res.status}`);
|
|
780
|
+
});
|
|
781
|
+
await test('Get rewards wallet', async () => {
|
|
782
|
+
const res = await api(state.accessToken).get('/rewards/wallet');
|
|
783
|
+
if (res.status !== 200)
|
|
784
|
+
throw new Error(`Status ${res.status}`);
|
|
785
|
+
const data = unwrap(res);
|
|
786
|
+
// Verify wallet structure - badges may be empty array for new users
|
|
787
|
+
if (data.badges === undefined)
|
|
788
|
+
throw new Error('Missing badges in wallet');
|
|
789
|
+
if (data.stats === undefined)
|
|
790
|
+
throw new Error('Missing stats in wallet');
|
|
791
|
+
});
|
|
792
|
+
if (state.badgeId) {
|
|
793
|
+
await test('Get rewards for badge', async () => {
|
|
794
|
+
const res = await api(state.accessToken).get(`/rewards/badge/${state.badgeId}`);
|
|
795
|
+
if (res.status !== 200)
|
|
796
|
+
throw new Error(`Status ${res.status}`);
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
if (state.venueId) {
|
|
800
|
+
await test('Get rewards for venue', async () => {
|
|
801
|
+
const res = await api(state.accessToken).get(`/rewards/venue/${state.venueId}`);
|
|
802
|
+
if (res.status !== 200)
|
|
803
|
+
throw new Error(`Status ${res.status}`);
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
if (state.brandId) {
|
|
807
|
+
await test('Get rewards for brand', async () => {
|
|
808
|
+
const res = await api(state.accessToken).get(`/rewards/brand/${state.brandId}`);
|
|
809
|
+
if (res.status !== 200)
|
|
810
|
+
throw new Error(`Status ${res.status}`);
|
|
811
|
+
});
|
|
812
|
+
}
|
|
813
|
+
// =========================================================================
|
|
271
814
|
// HUBS
|
|
272
815
|
// =========================================================================
|
|
273
|
-
|
|
816
|
+
section('HUBS');
|
|
274
817
|
await test('List hubs', async () => {
|
|
275
818
|
const res = await api().get('/hubs');
|
|
276
819
|
if (res.status !== 200)
|
|
277
820
|
throw new Error(`Status ${res.status}`);
|
|
278
|
-
|
|
279
|
-
const data = res.data.data;
|
|
821
|
+
const data = unwrap(res);
|
|
280
822
|
if (Array.isArray(data) && data.length > 0) {
|
|
281
823
|
state.hubId = data[0].id;
|
|
282
824
|
}
|
|
@@ -289,9 +831,8 @@ async function runTests() {
|
|
|
289
831
|
});
|
|
290
832
|
await test('Join hub', async () => {
|
|
291
833
|
const res = await api(state.accessToken).post(`/hubs/${state.hubId}/join`);
|
|
292
|
-
// 200/201 for join, 409 if already member
|
|
293
834
|
if (res.status !== 200 && res.status !== 201 && res.status !== 409) {
|
|
294
|
-
throw new Error(`Status ${res.status}
|
|
835
|
+
throw new Error(`Status ${res.status}`);
|
|
295
836
|
}
|
|
296
837
|
});
|
|
297
838
|
await test('Get hub members', async () => {
|
|
@@ -301,15 +842,34 @@ async function runTests() {
|
|
|
301
842
|
});
|
|
302
843
|
}
|
|
303
844
|
// =========================================================================
|
|
845
|
+
// LIBRARY (Content workflow)
|
|
846
|
+
// =========================================================================
|
|
847
|
+
section('LIBRARY');
|
|
848
|
+
await test('Get library content', async () => {
|
|
849
|
+
const res = await api(state.accessToken).get('/library');
|
|
850
|
+
if (res.status !== 200)
|
|
851
|
+
throw new Error(`Status ${res.status}`);
|
|
852
|
+
});
|
|
853
|
+
await test('Get featured content', async () => {
|
|
854
|
+
const res = await api(state.accessToken).get('/library/featured');
|
|
855
|
+
if (res.status !== 200)
|
|
856
|
+
throw new Error(`Status ${res.status}`);
|
|
857
|
+
});
|
|
858
|
+
// Content workflow tests (if creator exists)
|
|
859
|
+
if (state.creatorId) {
|
|
860
|
+
// Note: /library/creator/:id endpoint not implemented yet
|
|
861
|
+
// skip('Get content by creator', 'Endpoint not implemented');
|
|
862
|
+
}
|
|
863
|
+
// =========================================================================
|
|
304
864
|
// JACK AI (Support Conversations)
|
|
305
865
|
// =========================================================================
|
|
306
|
-
|
|
866
|
+
section('JACK AI');
|
|
307
867
|
await test('Start Jack conversation', async () => {
|
|
308
868
|
const res = await api(state.accessToken).post('/support/jack/conversations/new', {
|
|
309
869
|
message: 'Hello Jack!',
|
|
310
870
|
});
|
|
311
871
|
if (res.status !== 201 && res.status !== 200)
|
|
312
|
-
throw new Error(`Status ${res.status}
|
|
872
|
+
throw new Error(`Status ${res.status}`);
|
|
313
873
|
const data = unwrap(res);
|
|
314
874
|
state.conversationId = data.conversation?.id || data.id;
|
|
315
875
|
});
|
|
@@ -333,18 +893,17 @@ async function runTests() {
|
|
|
333
893
|
// =========================================================================
|
|
334
894
|
// SUPPORT (Check-ins, Wins)
|
|
335
895
|
// =========================================================================
|
|
336
|
-
|
|
896
|
+
section('SUPPORT');
|
|
337
897
|
await test('Create daily check-in', async () => {
|
|
338
898
|
const res = await api(state.accessToken).post('/support/check-ins', {
|
|
339
899
|
date: new Date().toISOString().split('T')[0],
|
|
340
|
-
mood: 4,
|
|
341
|
-
energy: 4,
|
|
900
|
+
mood: 4,
|
|
901
|
+
energy: 4,
|
|
342
902
|
stayedSober: true,
|
|
343
903
|
notes: 'E2E test check-in',
|
|
344
904
|
});
|
|
345
|
-
// 201 for new, 409 if exists
|
|
346
905
|
if (res.status !== 201 && res.status !== 409)
|
|
347
|
-
throw new Error(`Status ${res.status}
|
|
906
|
+
throw new Error(`Status ${res.status}`);
|
|
348
907
|
});
|
|
349
908
|
await test('Get check-ins', async () => {
|
|
350
909
|
const res = await api(state.accessToken).get('/support/check-ins');
|
|
@@ -365,10 +924,10 @@ async function runTests() {
|
|
|
365
924
|
const res = await api(state.accessToken).post('/support/wins', {
|
|
366
925
|
title: 'Completed E2E tests',
|
|
367
926
|
description: 'Successfully ran all API tests',
|
|
368
|
-
category: 'PERSONAL',
|
|
927
|
+
category: 'PERSONAL',
|
|
369
928
|
});
|
|
370
929
|
if (res.status !== 201)
|
|
371
|
-
throw new Error(`Status ${res.status}
|
|
930
|
+
throw new Error(`Status ${res.status}`);
|
|
372
931
|
});
|
|
373
932
|
await test('Get wins', async () => {
|
|
374
933
|
const res = await api(state.accessToken).get('/support/wins');
|
|
@@ -383,7 +942,7 @@ async function runTests() {
|
|
|
383
942
|
// =========================================================================
|
|
384
943
|
// NOTIFICATIONS
|
|
385
944
|
// =========================================================================
|
|
386
|
-
|
|
945
|
+
section('NOTIFICATIONS');
|
|
387
946
|
await test('Get notifications', async () => {
|
|
388
947
|
const res = await api(state.accessToken).get('/notifications');
|
|
389
948
|
if (res.status !== 200)
|
|
@@ -397,7 +956,7 @@ async function runTests() {
|
|
|
397
956
|
// =========================================================================
|
|
398
957
|
// SUBSCRIPTIONS
|
|
399
958
|
// =========================================================================
|
|
400
|
-
|
|
959
|
+
section('SUBSCRIPTIONS');
|
|
401
960
|
await test('Get subscription plans', async () => {
|
|
402
961
|
const res = await api(state.accessToken).get('/subscriptions/plans');
|
|
403
962
|
if (res.status !== 200)
|
|
@@ -405,42 +964,366 @@ async function runTests() {
|
|
|
405
964
|
});
|
|
406
965
|
await test('Get my subscription', async () => {
|
|
407
966
|
const res = await api(state.accessToken).get('/subscriptions/me');
|
|
408
|
-
// 200 if subscribed, 404 if not
|
|
409
967
|
if (res.status !== 200 && res.status !== 404)
|
|
410
968
|
throw new Error(`Status ${res.status}`);
|
|
411
969
|
});
|
|
412
970
|
// =========================================================================
|
|
413
|
-
//
|
|
971
|
+
// MAP
|
|
414
972
|
// =========================================================================
|
|
415
|
-
|
|
416
|
-
await test('Get
|
|
417
|
-
const res = await api(state.accessToken).get('/
|
|
973
|
+
section('MAP');
|
|
974
|
+
await test('Get map hubs', async () => {
|
|
975
|
+
const res = await api(state.accessToken).get('/map/hubs');
|
|
418
976
|
if (res.status !== 200)
|
|
419
977
|
throw new Error(`Status ${res.status}`);
|
|
420
978
|
});
|
|
421
|
-
await test('Get
|
|
422
|
-
const res = await api(state.accessToken).get('/
|
|
979
|
+
await test('Get map events', async () => {
|
|
980
|
+
const res = await api(state.accessToken).get('/map/events');
|
|
423
981
|
if (res.status !== 200)
|
|
424
982
|
throw new Error(`Status ${res.status}`);
|
|
425
983
|
});
|
|
426
984
|
// =========================================================================
|
|
427
|
-
//
|
|
985
|
+
// BADGE AWARDING (Business Logic Tests)
|
|
428
986
|
// =========================================================================
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
987
|
+
section('BADGE AWARDING');
|
|
988
|
+
// Test badge progress tracking after actions
|
|
989
|
+
// Note: These tests verify the badge awarding integration works correctly.
|
|
990
|
+
// Actual badge earning depends on thresholds in seed data.
|
|
991
|
+
// Get initial badge state
|
|
992
|
+
let initialBadgeCount = 0;
|
|
993
|
+
let initialBadges = [];
|
|
994
|
+
await test('Get initial user badges before badge tests', async () => {
|
|
995
|
+
const res = await api(state.accessToken).get('/badges/users/me/badges');
|
|
432
996
|
if (res.status !== 200)
|
|
433
997
|
throw new Error(`Status ${res.status}`);
|
|
998
|
+
const data = unwrap(res);
|
|
999
|
+
initialBadgeCount = Array.isArray(data) ? data.length : 0;
|
|
1000
|
+
initialBadges = Array.isArray(data) ? data.map((b) => b.badgeId) : [];
|
|
434
1001
|
});
|
|
435
|
-
|
|
436
|
-
|
|
1002
|
+
// Check-in Streak Badge Tests
|
|
1003
|
+
await test('Check-in updates streak and triggers badge check', async () => {
|
|
1004
|
+
// Create a check-in for a previous day (to test streak logic)
|
|
1005
|
+
const yesterday = new Date();
|
|
1006
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
1007
|
+
const yesterdayStr = yesterday.toISOString().split('T')[0];
|
|
1008
|
+
const res = await api(state.accessToken).post('/support/check-ins', {
|
|
1009
|
+
date: yesterdayStr,
|
|
1010
|
+
mood: 4,
|
|
1011
|
+
energy: 3,
|
|
1012
|
+
stayedSober: true,
|
|
1013
|
+
notes: 'Badge test check-in',
|
|
1014
|
+
});
|
|
1015
|
+
// Accept 201 (created) or 409 (already exists - re-running test)
|
|
1016
|
+
if (res.status !== 201 && res.status !== 409)
|
|
1017
|
+
throw new Error(`Status ${res.status}`);
|
|
1018
|
+
});
|
|
1019
|
+
await test('Verify streak is tracked after check-in', async () => {
|
|
1020
|
+
const res = await api(state.accessToken).get('/support/check-ins/streak');
|
|
437
1021
|
if (res.status !== 200)
|
|
438
1022
|
throw new Error(`Status ${res.status}`);
|
|
1023
|
+
const data = unwrap(res);
|
|
1024
|
+
// Should have at least 1 check-in now (from earlier test)
|
|
1025
|
+
if (data.totalCheckIns === undefined)
|
|
1026
|
+
throw new Error('Missing totalCheckIns in streak data');
|
|
1027
|
+
});
|
|
1028
|
+
// Wins Badge Tests
|
|
1029
|
+
await test('Log win updates count and triggers badge check', async () => {
|
|
1030
|
+
const res = await api(state.accessToken).post('/support/wins', {
|
|
1031
|
+
title: 'Badge awarding test win',
|
|
1032
|
+
description: 'Testing that logging wins triggers badge check',
|
|
1033
|
+
category: 'PERSONAL', // Valid WinCategory enum value
|
|
1034
|
+
});
|
|
1035
|
+
if (res.status !== 201)
|
|
1036
|
+
throw new Error(`Status ${res.status}`);
|
|
1037
|
+
});
|
|
1038
|
+
await test('Verify wins count is tracked', async () => {
|
|
1039
|
+
const res = await api(state.accessToken).get('/support/wins/count');
|
|
1040
|
+
if (res.status !== 200)
|
|
1041
|
+
throw new Error(`Status ${res.status}`);
|
|
1042
|
+
const data = unwrap(res);
|
|
1043
|
+
// Should have totalWins or count
|
|
1044
|
+
if (data.totalWins === undefined && typeof data !== 'number' && data.count === undefined) {
|
|
1045
|
+
throw new Error('Expected wins count in response');
|
|
1046
|
+
}
|
|
1047
|
+
});
|
|
1048
|
+
// Mood Log Badge Tests
|
|
1049
|
+
await test('Log mood updates count and triggers badge check', async () => {
|
|
1050
|
+
const res = await api(state.accessToken).post('/support/mood-logs', {
|
|
1051
|
+
mood: 4, // Required field (1-5)
|
|
1052
|
+
energy: 3, // Optional (1-5)
|
|
1053
|
+
tags: ['hopeful'], // Optional array of strings
|
|
1054
|
+
note: 'Badge test mood log', // Optional note
|
|
1055
|
+
});
|
|
1056
|
+
if (res.status !== 201)
|
|
1057
|
+
throw new Error(`Status ${res.status}`);
|
|
1058
|
+
});
|
|
1059
|
+
await test('Verify mood logs are tracked', async () => {
|
|
1060
|
+
const res = await api(state.accessToken).get('/support/mood-logs');
|
|
1061
|
+
if (res.status !== 200)
|
|
1062
|
+
throw new Error(`Status ${res.status}`);
|
|
1063
|
+
const data = unwrap(res);
|
|
1064
|
+
// Handle both array and { data: array } formats
|
|
1065
|
+
const logs = Array.isArray(data) ? data : (data.data || data.moodLogs || []);
|
|
1066
|
+
// Should have at least 1 mood log
|
|
1067
|
+
if (!Array.isArray(logs) || logs.length === 0) {
|
|
1068
|
+
throw new Error('Expected at least one mood log');
|
|
1069
|
+
}
|
|
1070
|
+
});
|
|
1071
|
+
// Reflection Badge Tests
|
|
1072
|
+
await test('Submit reflection updates count and triggers badge check', async () => {
|
|
1073
|
+
// Calculate weekStart - needs to be a Monday in YYYY-MM-DD format
|
|
1074
|
+
const now = new Date();
|
|
1075
|
+
const dayOfWeek = now.getDay();
|
|
1076
|
+
const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
|
1077
|
+
const monday = new Date(now);
|
|
1078
|
+
monday.setDate(now.getDate() - daysToMonday);
|
|
1079
|
+
const weekStart = monday.toISOString().split('T')[0];
|
|
1080
|
+
const res = await api(state.accessToken).post('/support/reflections', {
|
|
1081
|
+
weekStart, // Required field
|
|
1082
|
+
overallRating: 4,
|
|
1083
|
+
biggestWin: 'Badge test reflection - testing the badge integration',
|
|
1084
|
+
challenges: 'Testing automated badge checks',
|
|
1085
|
+
goals: ['Continue improving the platform'],
|
|
1086
|
+
notes: 'E2E test reflection',
|
|
1087
|
+
});
|
|
1088
|
+
// Accept 201 (created) or 409 (already exists for this week)
|
|
1089
|
+
if (res.status !== 201 && res.status !== 409)
|
|
1090
|
+
throw new Error(`Status ${res.status}`);
|
|
1091
|
+
});
|
|
1092
|
+
await test('Verify reflections are tracked', async () => {
|
|
1093
|
+
const res = await api(state.accessToken).get('/support/reflections');
|
|
1094
|
+
if (res.status !== 200)
|
|
1095
|
+
throw new Error(`Status ${res.status}`);
|
|
1096
|
+
});
|
|
1097
|
+
// Events Hosted Badge Tests (awarded on publish)
|
|
1098
|
+
await test('Publishing event awards EVENTS_HOSTED badge to hosts', async () => {
|
|
1099
|
+
// The event was already published in EVENTS section
|
|
1100
|
+
// Verify the badge check was triggered by checking next badges
|
|
1101
|
+
const res = await api(state.accessToken).get('/badges/next');
|
|
1102
|
+
if (res.status !== 200)
|
|
1103
|
+
throw new Error(`Status ${res.status}`);
|
|
1104
|
+
const data = unwrap(res);
|
|
1105
|
+
// Should return badge progress data
|
|
1106
|
+
if (!Array.isArray(data))
|
|
1107
|
+
throw new Error('Expected array of next badges');
|
|
1108
|
+
});
|
|
1109
|
+
// Events Attended Badge Tests
|
|
1110
|
+
// Note: EVENTS_ATTENDED badge is awarded when booking is checked-in
|
|
1111
|
+
// This requires a host to check-in the booking, which we can't do in E2E easily
|
|
1112
|
+
// So we just verify the badge progress tracking works
|
|
1113
|
+
await test('Badge progress shows EVENTS_ATTENDED tracking', async () => {
|
|
1114
|
+
const res = await api(state.accessToken).get('/badges/next');
|
|
1115
|
+
if (res.status !== 200)
|
|
1116
|
+
throw new Error(`Status ${res.status}`);
|
|
1117
|
+
const data = unwrap(res);
|
|
1118
|
+
// Look for events attended badge in progress
|
|
1119
|
+
const eventsAttendedBadge = data.find((b) => b.badge?.type === 'EVENTS_ATTENDED' || b.badge?.slug?.includes('event'));
|
|
1120
|
+
// May or may not exist depending on seed data, but API should work
|
|
1121
|
+
});
|
|
1122
|
+
// Verify badge state after all actions
|
|
1123
|
+
await test('Verify badges after all badge-triggering actions', async () => {
|
|
1124
|
+
const res = await api(state.accessToken).get('/badges/users/me/badges');
|
|
1125
|
+
if (res.status !== 200)
|
|
1126
|
+
throw new Error(`Status ${res.status}`);
|
|
1127
|
+
const data = unwrap(res);
|
|
1128
|
+
const currentBadgeCount = Array.isArray(data) ? data.length : 0;
|
|
1129
|
+
// Depending on thresholds, user may have earned new badges
|
|
1130
|
+
// At minimum, the API should return successfully
|
|
1131
|
+
});
|
|
1132
|
+
// =========================================================================
|
|
1133
|
+
// REWARD FLOW
|
|
1134
|
+
// =========================================================================
|
|
1135
|
+
section('REWARD FLOW');
|
|
1136
|
+
// Store reward-related state
|
|
1137
|
+
let testBadgeIdForReward;
|
|
1138
|
+
let testRewardId;
|
|
1139
|
+
let redemptionId;
|
|
1140
|
+
// Get a badge to use for reward tests
|
|
1141
|
+
await test('Get available badges for reward test', async () => {
|
|
1142
|
+
const res = await api(state.accessToken).get('/badges');
|
|
1143
|
+
if (res.status !== 200)
|
|
1144
|
+
throw new Error(`Status ${res.status}`);
|
|
1145
|
+
const data = unwrap(res);
|
|
1146
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
1147
|
+
testBadgeIdForReward = data[0].id;
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1150
|
+
// Create a brand reward for testing (user owns brand from earlier tests)
|
|
1151
|
+
// Note: We use brand since we created one in the BRANDS section
|
|
1152
|
+
if (state.brandId) {
|
|
1153
|
+
await test('Create brand reward for badge', async () => {
|
|
1154
|
+
if (!testBadgeIdForReward) {
|
|
1155
|
+
throw new Error('No badge available to create reward for');
|
|
1156
|
+
}
|
|
1157
|
+
const res = await api(state.accessToken).post(`/brands/${state.brandId}/rewards`, {
|
|
1158
|
+
badgeId: testBadgeIdForReward,
|
|
1159
|
+
title: 'E2E Brand Test Reward',
|
|
1160
|
+
description: 'A test brand reward for E2E testing',
|
|
1161
|
+
redeemType: 'ONLINE',
|
|
1162
|
+
code: 'E2E-TEST-CODE',
|
|
1163
|
+
perUserLimit: 1,
|
|
1164
|
+
});
|
|
1165
|
+
if (res.status !== 201)
|
|
1166
|
+
throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
|
|
1167
|
+
const data = unwrap(res);
|
|
1168
|
+
testRewardId = data.id;
|
|
1169
|
+
});
|
|
1170
|
+
}
|
|
1171
|
+
else {
|
|
1172
|
+
skip('Create brand reward for badge', 'No brand available (brand not created)');
|
|
1173
|
+
}
|
|
1174
|
+
// Test reward availability
|
|
1175
|
+
await test('Get available rewards for user', async () => {
|
|
1176
|
+
const res = await api(state.accessToken).get('/rewards/available');
|
|
1177
|
+
if (res.status !== 200)
|
|
1178
|
+
throw new Error(`Status ${res.status}`);
|
|
1179
|
+
const data = unwrap(res);
|
|
1180
|
+
// API returns { data: rewards[] }
|
|
1181
|
+
const rewards = data.data || data;
|
|
1182
|
+
if (!Array.isArray(rewards))
|
|
1183
|
+
throw new Error('Expected array of available rewards');
|
|
1184
|
+
});
|
|
1185
|
+
// Test user cannot redeem without earning the badge
|
|
1186
|
+
await test('Cannot redeem reward without earning required badge (400)', async () => {
|
|
1187
|
+
if (!testRewardId || !testBadgeIdForReward) {
|
|
1188
|
+
console.log(` ${c.dim}(Skipped: No test reward created)${c.reset}`);
|
|
1189
|
+
return;
|
|
1190
|
+
}
|
|
1191
|
+
// First check if user has the badge
|
|
1192
|
+
const badgeRes = await api(state.accessToken).get('/badges/users/me/badges');
|
|
1193
|
+
const badges = unwrap(badgeRes);
|
|
1194
|
+
const hasBadge = Array.isArray(badges) && badges.some((b) => b.badgeId === testBadgeIdForReward);
|
|
1195
|
+
if (!hasBadge) {
|
|
1196
|
+
// User doesn't have badge, should get 400 when trying to redeem
|
|
1197
|
+
const res = await api(state.accessToken).post(`/rewards/${testRewardId}/redeem`);
|
|
1198
|
+
if (res.status !== 400) {
|
|
1199
|
+
throw new Error(`Expected 400 (need badge first), got ${res.status}`);
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
else {
|
|
1203
|
+
// User has the badge, test passes (we'll test redemption below)
|
|
1204
|
+
console.log(` ${c.dim}(User already has required badge - will test redemption)${c.reset}`);
|
|
1205
|
+
}
|
|
1206
|
+
});
|
|
1207
|
+
// Test redemption flow - check if user can redeem
|
|
1208
|
+
await test('Check badge ownership and test redemption flow', async () => {
|
|
1209
|
+
if (!testRewardId || !testBadgeIdForReward) {
|
|
1210
|
+
console.log(` ${c.dim}(Skipped: No test reward created)${c.reset}`);
|
|
1211
|
+
return;
|
|
1212
|
+
}
|
|
1213
|
+
// Check if user has earned the badge
|
|
1214
|
+
const badgeRes = await api(state.accessToken).get('/badges/users/me/badges');
|
|
1215
|
+
if (badgeRes.status !== 200)
|
|
1216
|
+
throw new Error(`Status ${badgeRes.status}`);
|
|
1217
|
+
const badges = unwrap(badgeRes);
|
|
1218
|
+
const userHasBadge = Array.isArray(badges) && badges.some((b) => b.badgeId === testBadgeIdForReward);
|
|
1219
|
+
if (userHasBadge) {
|
|
1220
|
+
// User has badge, test the full redemption flow
|
|
1221
|
+
const redeemRes = await api(state.accessToken).post(`/rewards/${testRewardId}/redeem`);
|
|
1222
|
+
if (redeemRes.status !== 201) {
|
|
1223
|
+
throw new Error(`Redeem failed: ${redeemRes.status}: ${JSON.stringify(redeemRes.data)}`);
|
|
1224
|
+
}
|
|
1225
|
+
const redeemData = unwrap(redeemRes);
|
|
1226
|
+
redemptionId = redeemData.id;
|
|
1227
|
+
console.log(` ${c.dim}(Redemption successful: ${redemptionId})${c.reset}`);
|
|
1228
|
+
}
|
|
1229
|
+
else {
|
|
1230
|
+
console.log(` ${c.dim}(User has not earned required badge - redemption test skipped)${c.reset}`);
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
await test('Cannot redeem same reward twice (400)', async () => {
|
|
1234
|
+
if (!testRewardId || !redemptionId) {
|
|
1235
|
+
console.log(` ${c.dim}(Skipped: No prior redemption to test)${c.reset}`);
|
|
1236
|
+
return;
|
|
1237
|
+
}
|
|
1238
|
+
const res = await api(state.accessToken).post(`/rewards/${testRewardId}/redeem`);
|
|
1239
|
+
if (res.status !== 400) {
|
|
1240
|
+
throw new Error(`Expected 400 (already redeemed), got ${res.status}`);
|
|
1241
|
+
}
|
|
1242
|
+
});
|
|
1243
|
+
await test('Get redeemed rewards', async () => {
|
|
1244
|
+
const res = await api(state.accessToken).get('/rewards/redeemed');
|
|
1245
|
+
if (res.status !== 200)
|
|
1246
|
+
throw new Error(`Status ${res.status}`);
|
|
1247
|
+
const data = unwrap(res);
|
|
1248
|
+
// API returns { data: redemptions[] }
|
|
1249
|
+
const redemptions = data.data || data;
|
|
1250
|
+
if (!Array.isArray(redemptions))
|
|
1251
|
+
throw new Error('Expected array of redeemed rewards');
|
|
1252
|
+
// If we redeemed, should have at least one
|
|
1253
|
+
if (redemptionId && redemptions.length === 0) {
|
|
1254
|
+
throw new Error('Expected at least one redeemed reward');
|
|
1255
|
+
}
|
|
1256
|
+
});
|
|
1257
|
+
await test('Rewards wallet shows correct stats', async () => {
|
|
1258
|
+
const res = await api(state.accessToken).get('/rewards/wallet');
|
|
1259
|
+
if (res.status !== 200)
|
|
1260
|
+
throw new Error(`Status ${res.status}`);
|
|
1261
|
+
const data = unwrap(res);
|
|
1262
|
+
if (data.stats === undefined)
|
|
1263
|
+
throw new Error('Missing stats in wallet');
|
|
1264
|
+
// After redemption, should have at least 1 redeemed
|
|
1265
|
+
if (redemptionId && data.stats.totalRedeemedRewards < 1) {
|
|
1266
|
+
throw new Error('Expected at least 1 redeemed reward in wallet stats');
|
|
1267
|
+
}
|
|
1268
|
+
});
|
|
1269
|
+
// Test getting rewards by badge
|
|
1270
|
+
await test('Get rewards for specific badge', async () => {
|
|
1271
|
+
if (!testBadgeIdForReward) {
|
|
1272
|
+
console.log(` ${c.dim}(Skipped: No badge ID available)${c.reset}`);
|
|
1273
|
+
return;
|
|
1274
|
+
}
|
|
1275
|
+
const res = await api(state.accessToken).get(`/rewards/badge/${testBadgeIdForReward}`);
|
|
1276
|
+
if (res.status !== 200)
|
|
1277
|
+
throw new Error(`Status ${res.status}`);
|
|
1278
|
+
const data = unwrap(res);
|
|
1279
|
+
// API returns { data: rewards[] }
|
|
1280
|
+
const rewards = data.data || data;
|
|
1281
|
+
if (!Array.isArray(rewards))
|
|
1282
|
+
throw new Error('Expected array of rewards');
|
|
1283
|
+
});
|
|
1284
|
+
// Verify reward redemption verification endpoint
|
|
1285
|
+
await test('Verify redemption endpoint works', async () => {
|
|
1286
|
+
// This would normally be called by venue/brand staff
|
|
1287
|
+
// We'll test with an invalid token to ensure endpoint exists
|
|
1288
|
+
const res = await api(state.accessToken).post('/rewards/verify', {
|
|
1289
|
+
qrToken: 'invalid-test-token',
|
|
1290
|
+
});
|
|
1291
|
+
// POST defaults to 201, but either 200 or 201 is acceptable
|
|
1292
|
+
if (res.status !== 200 && res.status !== 201)
|
|
1293
|
+
throw new Error(`Status ${res.status}`);
|
|
1294
|
+
const data = unwrap(res);
|
|
1295
|
+
// API returns { data: { valid: boolean } }
|
|
1296
|
+
const result = data.data || data;
|
|
1297
|
+
if (result.valid !== false) {
|
|
1298
|
+
throw new Error('Expected valid: false for invalid token');
|
|
1299
|
+
}
|
|
439
1300
|
});
|
|
440
1301
|
// =========================================================================
|
|
441
1302
|
// CLEANUP
|
|
442
1303
|
// =========================================================================
|
|
443
|
-
|
|
1304
|
+
section('CLEANUP');
|
|
1305
|
+
// Cleanup creator products
|
|
1306
|
+
if (state.productId && state.creatorId) {
|
|
1307
|
+
await test('Delete creator product', async () => {
|
|
1308
|
+
const res = await api(state.accessToken).delete(`/creators/${state.creatorId}/products/${state.productId}`);
|
|
1309
|
+
if (res.status !== 200 && res.status !== 204)
|
|
1310
|
+
throw new Error(`Status ${res.status}`);
|
|
1311
|
+
});
|
|
1312
|
+
}
|
|
1313
|
+
if (state.availabilityId && state.creatorId) {
|
|
1314
|
+
await test('Remove creator availability', async () => {
|
|
1315
|
+
const res = await api(state.accessToken).delete(`/creators/${state.creatorId}/availability/${state.availabilityId}`);
|
|
1316
|
+
if (res.status !== 200 && res.status !== 204)
|
|
1317
|
+
throw new Error(`Status ${res.status}`);
|
|
1318
|
+
});
|
|
1319
|
+
}
|
|
1320
|
+
if (state.creatorId && state.brandId) {
|
|
1321
|
+
await test('Remove creator from brand partnership', async () => {
|
|
1322
|
+
const res = await api(state.accessToken).delete(`/brands/${state.brandId}/creators/${state.creatorId}`);
|
|
1323
|
+
if (res.status !== 200 && res.status !== 204)
|
|
1324
|
+
throw new Error(`Status ${res.status}`);
|
|
1325
|
+
});
|
|
1326
|
+
}
|
|
444
1327
|
if (state.bookingId) {
|
|
445
1328
|
await test('Cancel booking', async () => {
|
|
446
1329
|
const res = await api(state.accessToken).delete(`/bookings/${state.bookingId}`);
|
|
@@ -458,15 +1341,28 @@ async function runTests() {
|
|
|
458
1341
|
// =========================================================================
|
|
459
1342
|
// SUMMARY
|
|
460
1343
|
// =========================================================================
|
|
461
|
-
console.log(`\n${c.cyan}${'='.repeat(
|
|
1344
|
+
console.log(`\n${c.cyan}${'='.repeat(70)}${c.reset}`);
|
|
462
1345
|
console.log(`${c.cyan} TEST SUMMARY${c.reset}`);
|
|
463
|
-
console.log(`${c.cyan}${'='.repeat(
|
|
464
|
-
console.log(`${c.green}Passed:
|
|
465
|
-
console.log(`${c.red}Failed:
|
|
466
|
-
console.log(
|
|
467
|
-
console.log(`${c.
|
|
1346
|
+
console.log(`${c.cyan}${'='.repeat(70)}${c.reset}`);
|
|
1347
|
+
console.log(`${c.green}Passed: ${passed}${c.reset}`);
|
|
1348
|
+
console.log(`${c.red}Failed: ${failed}${c.reset}`);
|
|
1349
|
+
console.log(`${c.yellow}Skipped: ${skipped}${c.reset}`);
|
|
1350
|
+
console.log(`${c.bold}Total: ${passed + failed + skipped}${c.reset}`);
|
|
1351
|
+
console.log(`${c.cyan}${'='.repeat(70)}${c.reset}\n`);
|
|
1352
|
+
// IDs for debugging
|
|
1353
|
+
console.log(`${c.dim}Test IDs:${c.reset}`);
|
|
1354
|
+
console.log(`${c.dim} User: ${state.userId}${c.reset}`);
|
|
1355
|
+
console.log(`${c.dim} Creator: ${state.creatorId || 'N/A'}${c.reset}`);
|
|
1356
|
+
console.log(`${c.dim} Product: ${state.productId || 'N/A'}${c.reset}`);
|
|
1357
|
+
console.log(`${c.dim} Brand: ${state.brandId || 'N/A'}${c.reset}`);
|
|
1358
|
+
console.log(`${c.dim} Event: ${state.eventId || 'N/A'}${c.reset}`);
|
|
1359
|
+
console.log(`${c.dim} Venue: ${state.venueId || 'N/A'}${c.reset}`);
|
|
1360
|
+
console.log('');
|
|
468
1361
|
process.exit(failed > 0 ? 1 : 0);
|
|
469
1362
|
}
|
|
470
1363
|
// Run tests
|
|
471
|
-
runTests().catch(
|
|
472
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2UyZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7QUFFSCxrREFBNkM7QUFFN0MsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUM7QUFDaEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDO0FBQ3JELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBRXZDLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsR0FBRztJQUNSLEtBQUssRUFBRSxTQUFTO0lBQ2hCLEtBQUssRUFBRSxVQUFVO0lBQ2pCLEdBQUcsRUFBRSxVQUFVO0lBQ2YsTUFBTSxFQUFFLFVBQVU7SUFDbEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsR0FBRyxFQUFFLFNBQVM7Q0FDZixDQUFDO0FBRUYsNEJBQTRCO0FBQzVCLE1BQU0sS0FBSyxHQVNQO0lBQ0YsV0FBVyxFQUFFLEVBQUU7SUFDZixZQUFZLEVBQUUsRUFBRTtJQUNoQixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRixRQUFRO0FBQ1IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWYsc0JBQXNCO0FBQ3RCLFNBQVMsR0FBRyxDQUFDLEtBQWM7SUFDekIsT0FBTyxlQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMxRCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtLQUMzQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsY0FBYztBQUNkLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBWSxF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QztBQUNuQyxDQUFDO0FBRUQsWUFBWTtBQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3dTb2JlciBBUEkgRTJFIFRlc3RzXG4gKlxuICogVGVzdHMgYWxsIFNESyBlbmRwb2ludHMgYWdhaW5zdCB0aGUgcmVhbCBBUEkuXG4gKiBSdW4gd2l0aDogbnB4IHRzLW5vZGUgc3JjL19fdGVzdHNfXy9lMmUudGVzdC50c1xuICovXG5cbmltcG9ydCBheGlvcywgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5jb25zdCBCQVNFX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjMwMDEvYXBpL3YxJztcbmNvbnN0IFRFU1RfRU1BSUwgPSBgZTJlLSR7RGF0ZS5ub3coKX1AZ3Jvd3NvYmVyLmNvbWA7XG5jb25zdCBURVNUX1BBU1NXT1JEID0gJ1NlY3VyZVBhc3MxMjMhJztcblxuLy8gQ29sb3JzIGZvciBvdXRwdXRcbmNvbnN0IGMgPSB7XG4gIHJlc2V0OiAnXFx4MWJbMG0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHJlZDogJ1xceDFiWzMxbScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGN5YW46ICdcXHgxYlszNm0nLFxuICBkaW06ICdcXHgxYlsybScsXG59O1xuXG4vLyBTdGF0ZSBzaGFyZWQgYWNyb3NzIHRlc3RzXG5jb25zdCBzdGF0ZToge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGV2ZW50SWQ/OiBzdHJpbmc7XG4gIGh1YklkPzogc3RyaW5nO1xuICBib29raW5nSWQ/OiBzdHJpbmc7XG4gIGNoYXRJZD86IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG59ID0ge1xuICBhY2Nlc3NUb2tlbjogJycsXG4gIHJlZnJlc2hUb2tlbjogJycsXG4gIHVzZXJJZDogJycsXG59O1xuXG4vLyBTdGF0c1xubGV0IHBhc3NlZCA9IDA7XG5sZXQgZmFpbGVkID0gMDtcblxuLy8gQ3JlYXRlIGF4aW9zIGNsaWVudFxuZnVuY3Rpb24gYXBpKHRva2VuPzogc3RyaW5nKTogQXhpb3NJbnN0YW5jZSB7XG4gIHJldHVybiBheGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IEJBU0VfVVJMLFxuICAgIGhlYWRlcnM6IHRva2VuID8geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9IDoge30sXG4gICAgdmFsaWRhdGVTdGF0dXM6ICgpID0+IHRydWUsXG4gIH0pO1xufVxuXG4vLyBUZXN0IHJ1bm5lclxuYXN5bmMgZnVuY3Rpb24gdGVzdChuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmbigpO1xuICAgIGNvbnNvbGUubG9nKGAke2MuZ3JlZW59UEFTUyR7Yy5yZXNldH0gJHtuYW1lfSAke2MuZGltfSgke0RhdGUubm93KCkgLSBzdGFydH1tcykke2MucmVzZXR9YCk7XG4gICAgcGFzc2VkKys7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKGAke2MucmVkfUZBSUwke2MucmVzZXR9ICR7bmFtZX0gJHtjLmRpbX0oJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMpJHtjLnJlc2V0fWApO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Yy55ZWxsb3d9JHtlLm1lc3NhZ2V9JHtjLnJlc2V0fWApO1xuICAgIGZhaWxlZCsrO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBVbndyYXAgQVBJIHJlc3BvbnNlXG5mdW5jdGlvbiB1bndyYXA8VD4ocmVzOiB7IGRhdGE6IHsgZGF0YTogVCB9IH0pOiBUIHtcbiAgcmV0dXJuIHJlcy5kYXRhLmRhdGE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRFU1RTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKCkge1xuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59JHsnPScucmVwZWF0KDYwKX0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0gIEdyb3dTb2JlciBBUEkgRTJFIFRlc3RzJHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59JHsnPScucmVwZWF0KDYwKX0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfUJhc2UgVVJMOiAke0JBU0VfVVJMfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5kaW19VGVzdCBFbWFpbDogJHtURVNUX0VNQUlMfSR7Yy5yZXNldH1cXG5gKTtcblxuICAvLyBIZWFsdGggY2hlY2tcbiAgY29uc3QgaGVhbHRoID0gYXdhaXQgYXBpKCkuZ2V0KCcvaGVhbHRoJyk7XG4gIGlmIChoZWFsdGguc3RhdHVzICE9PSAyMDApIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjLnJlZH1BUEkgaXMgbm90IHJlYWNoYWJsZSR7Yy5yZXNldH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1BUEkgaXMgaGVhbHRoeSR7Yy5yZXNldH1cXG5gKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEhcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEFVVEhFTlRJQ0FUSU9OIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBhd2FpdCB0ZXN0KCdSZWdpc3RlciBuZXcgdXNlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWdpc3RlcicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgICBuYW1lOiAnRTJFIFRlc3QgVXNlcicsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICAgIHN0YXRlLnVzZXJJZCA9IGRhdGEudXNlci5pZDtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnTG9naW4gd2l0aCBlbWFpbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9sb2dpbicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmFjY2Vzc1Rva2VuID0gZGF0YS5hY2Nlc3NUb2tlbjtcbiAgICBzdGF0ZS5yZWZyZXNoVG9rZW4gPSBkYXRhLnJlZnJlc2hUb2tlbjtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnUmVmcmVzaCB0b2tlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWZyZXNoJywge1xuICAgICAgcmVmcmVzaFRva2VuOiBzdGF0ZS5yZWZyZXNoVG9rZW4sXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY3VycmVudCB1c2VyIChhdXRoL21lKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2F1dGgvbWUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0ludmFsaWQgbG9naW4gcmV0dXJucyA0MDEnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkucG9zdCgnL2F1dGgvbG9naW4nLCB7XG4gICAgICBlbWFpbDogVEVTVF9FTUFJTCxcbiAgICAgIHBhc3N3b3JkOiAnV3JvbmdQYXNzd29yZCcsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA0MDEsIGdvdCAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVNFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIFVTRVJTIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy91c2Vycy9tZScpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnVXBkYXRlIHByb2ZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wdXQoJy91c2Vycy9tZScsIHtcbiAgICAgIG5hbWU6ICdVcGRhdGVkIEUyRSBVc2VyJyxcbiAgICAgIGJpbzogJ0UyRSB0ZXN0IGJpbycsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB1c2VyIGJ5IElEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvdXNlcnMvJHtzdGF0ZS51c2VySWR9YCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdXNlciBwdWJsaWMgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL3VzZXJzLyR7c3RhdGUudXNlcklkfS9wdWJsaWNgKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRVZFTlRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufS0tLSBFVkVOVFMgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ0xpc3QgZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2V2ZW50cycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHVwY29taW5nIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoJy9ldmVudHMvdXBjb21pbmcnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0NyZWF0ZSBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9ldmVudHMnLCB7XG4gICAgICB0aXRsZTogJ0UyRSBUZXN0IEV2ZW50JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSB0ZXN0IGV2ZW50IGNyZWF0ZWQgYnkgRTJFIHRlc3RzJyxcbiAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwKS50b0lTT1N0cmluZygpLCAvLyA3IGRheXMgZnJvbSBub3dcbiAgICAgIHRvdGFsU3BvdHM6IDIwLFxuICAgICAgbG9jYXRpb25OYW1lOiAnVGVzdCBMb2NhdGlvbicsXG4gICAgICBsb2NhdGlvbkFkZHJlc3M6ICcxMjMgVGVzdCBTdHJlZXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmV2ZW50SWQgPSBkYXRhLmlkO1xuICB9KTtcblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBldmVudCBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgZXZlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnB1dChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9YCwge1xuICAgICAgICB0aXRsZTogJ0UyRSBUZXN0IEV2ZW50IChVcGRhdGVkKScsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnUHVibGlzaCBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L3B1Ymxpc2hgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBteSBldmVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2V2ZW50cy9teS1ldmVudHMnKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQk9PS0lOR1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEJPT0tJTkdTIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ1JTVlAgdG8gZXZlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9ib29rYCk7XG4gICAgICAvLyAyMDEgZm9yIG5ldyBib29raW5nLCA0MDkgaWYgYWxyZWFkeSBleGlzdHNcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgIHN0YXRlLmJvb2tpbmdJZCA9IGRhdGEuaWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgbXkgYm9va2luZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2Jvb2tpbmdzL21lJyk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVWRU5UIENIQVRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEVWRU5UIENIQVQgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGlmIChzdGF0ZS5ldmVudElkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IG9yIGNyZWF0ZSBldmVudCBjaGF0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9jaGF0YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgc3RhdGUuY2hhdElkID0gZGF0YS5pZDtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0pvaW4gZXZlbnQgY2hhdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvam9pbmApO1xuICAgICAgLy8gMjAwIGZvciBqb2luLCA0MDMgaWYgbm8gYm9va2luZyAoYnV0IHdlIGp1c3QgYm9va2VkKVxuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdTZW5kIGNoYXQgbWVzc2FnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvbWVzc2FnZXNgLCB7XG4gICAgICAgIGNvbnRlbnQ6ICdIZWxsbyBmcm9tIEUyRSB0ZXN0IScsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNoYXQgbWVzc2FnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvbWVzc2FnZXNgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNoYXQgbWVtYmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdC9tZW1iZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdNYXJrIGNoYXQgYXMgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvcmVhZGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIVUJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufS0tLSBIVUJTIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBhd2FpdCB0ZXN0KCdMaXN0IGh1YnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvaHVicycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAvLyBHZXQgZmlyc3QgaHViIGlmIGV4aXN0c1xuICAgIGNvbnN0IGRhdGEgPSByZXMuZGF0YS5kYXRhO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuaHViSWQgPSBkYXRhWzBdLmlkO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHN0YXRlLmh1YklkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IGh1YiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2h1YnMvJHtzdGF0ZS5odWJJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0pvaW4gaHViJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvaHVicy8ke3N0YXRlLmh1YklkfS9qb2luYCk7XG4gICAgICAvLyAyMDAvMjAxIGZvciBqb2luLCA0MDkgaWYgYWxyZWFkeSBtZW1iZXJcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjAxICYmIHJlcy5zdGF0dXMgIT09IDQwOSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBodWIgbWVtYmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvaHVicy8ke3N0YXRlLmh1YklkfS9tZW1iZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEpBQ0sgQUkgKFN1cHBvcnQgQ29udmVyc2F0aW9ucylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEpBQ0sgQUkgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ1N0YXJ0IEphY2sgY29udmVyc2F0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvamFjay9jb252ZXJzYXRpb25zL25ldycsIHtcbiAgICAgIG1lc3NhZ2U6ICdIZWxsbyBKYWNrIScsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSAmJiByZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gZGF0YS5jb252ZXJzYXRpb24/LmlkIHx8IGRhdGEuaWQ7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L2phY2svY29udmVyc2F0aW9ucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IEphY2sgY2hhdCBoaXN0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9qYWNrL2hpc3RvcnknKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5jb252ZXJzYXRpb25JZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvc3VwcG9ydC9qYWNrL2NvbnZlcnNhdGlvbnMvJHtzdGF0ZS5jb252ZXJzYXRpb25JZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VQUE9SVCAoQ2hlY2staW5zLCBXaW5zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gU1VQUE9SVCAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgYXdhaXQgdGVzdCgnQ3JlYXRlIGRhaWx5IGNoZWNrLWluJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvY2hlY2staW5zJywge1xuICAgICAgZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0sXG4gICAgICBtb29kOiA0LCAvLyBWYWxpZCByYW5nZSAxLTVcbiAgICAgIGVuZXJneTogNCwgLy8gVmFsaWQgcmFuZ2UgMS01XG4gICAgICBzdGF5ZWRTb2JlcjogdHJ1ZSxcbiAgICAgIG5vdGVzOiAnRTJFIHRlc3QgY2hlY2staW4nLFxuICAgIH0pO1xuICAgIC8vIDIwMSBmb3IgbmV3LCA0MDkgaWYgZXhpc3RzXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSAmJiByZXMuc3RhdHVzICE9PSA0MDkpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY2hlY2staW5zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9jaGVjay1pbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB0b2RheSBjaGVjay1pbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvY2hlY2staW5zL3RvZGF5Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCAmJiByZXMuc3RhdHVzICE9PSA0MDQpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IGNoZWNrLWluIHN0cmVhaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvY2hlY2staW5zL3N0cmVhaycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnTG9nIGEgd2luJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvd2lucycsIHtcbiAgICAgIHRpdGxlOiAnQ29tcGxldGVkIEUyRSB0ZXN0cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1N1Y2Nlc3NmdWxseSByYW4gYWxsIEFQSSB0ZXN0cycsXG4gICAgICBjYXRlZ29yeTogJ1BFUlNPTkFMJywgLy8gVmFsaWQ6IFNPQlJJRVRZLCBIRUFMVEgsIFJFTEFUSU9OU0hJUCwgQ0FSRUVSLCBQRVJTT05BTCwgRklOQU5DSUFMLCBPVEhFUlxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgd2lucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvd2lucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHdpbnMgY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L3dpbnMvY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk9USUZJQ0FUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gTk9USUZJQ0FUSU9OUyAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5vdGlmaWNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9ub3RpZmljYXRpb25zJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdW5yZWFkIGNvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvbm90aWZpY2F0aW9ucy91bnJlYWQtY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VCU0NSSVBUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gU1VCU0NSSVBUSU9OUyAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHN1YnNjcmlwdGlvbiBwbGFucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1YnNjcmlwdGlvbnMvcGxhbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBteSBzdWJzY3JpcHRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdWJzY3JpcHRpb25zL21lJyk7XG4gICAgLy8gMjAwIGlmIHN1YnNjcmliZWQsIDQwNCBpZiBub3RcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDQwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJQlJBUllcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIExJQlJBUlkgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBsaWJyYXJ5IGNvbnRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9saWJyYXJ5Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgY29udGVudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2xpYnJhcnkvZmVhdHVyZWQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUFQXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufS0tLSBNQVAgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBtYXAgaHVicycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9odWJzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgbWFwIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9ldmVudHMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0xFQU5VUFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gQ0xFQU5VUCAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgaWYgKHN0YXRlLmJvb2tpbmdJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBib29raW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5kZWxldGUoYC9ib29raW5ncy8ke3N0YXRlLmJvb2tpbmdJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDQgJiYgcmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NhbmNlbGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVU1NQVJZXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufSR7Jz0nLnJlcGVhdCg2MCl9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59ICBURVNUIFNVTU1BUlkke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0keyc9Jy5yZXBlYXQoNjApfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1QYXNzZWQ6ICR7cGFzc2VkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5yZWR9RmFpbGVkOiAke2ZhaWxlZH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGBUb3RhbDogICR7cGFzc2VkICsgZmFpbGVkfWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59JHsnPScucmVwZWF0KDYwKX0ke2MucmVzZXR9XFxuYCk7XG5cbiAgcHJvY2Vzcy5leGl0KGZhaWxlZCA+IDAgPyAxIDogMCk7XG59XG5cbi8vIFJ1biB0ZXN0c1xucnVuVGVzdHMoKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiJdfQ==
|
|
1364
|
+
runTests().catch((e) => {
|
|
1365
|
+
console.error(`${c.red}Unexpected error:${c.reset}`, e);
|
|
1366
|
+
process.exit(1);
|
|
1367
|
+
});
|
|
1368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2UyZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7Ozs7O0FBRUgsa0RBQTZDO0FBRTdDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLDhCQUE4QixDQUFDO0FBQ3ZFLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQztBQUNyRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUV2QyxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLEdBQUc7SUFDUixLQUFLLEVBQUUsU0FBUztJQUNoQixLQUFLLEVBQUUsVUFBVTtJQUNqQixHQUFHLEVBQUUsVUFBVTtJQUNmLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLEdBQUcsRUFBRSxTQUFTO0lBQ2QsSUFBSSxFQUFFLFNBQVM7Q0FDaEIsQ0FBQztBQUVGLDRCQUE0QjtBQUM1QixNQUFNLEtBQUssR0F1QlA7SUFDRixXQUFXLEVBQUUsRUFBRTtJQUNmLFlBQVksRUFBRSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxFQUFFO0NBQ1gsQ0FBQztBQUVGLFFBQVE7QUFDUixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEIsc0JBQXNCO0FBQ3RCLFNBQVMsR0FBRyxDQUFDLEtBQWM7SUFDekIsT0FBTyxlQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFD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QyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLFlBQVksT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxZQUFZLE1BQU0sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFFdEQsb0JBQW9CO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVoQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFlBQVk7QUFDWixRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHcm93U29iZXIgQVBJIEUyRSBUZXN0c1xuICpcbiAqIFRlc3RzIGFsbCBTREsgZW5kcG9pbnRzIGFnYWluc3QgdGhlIHJlYWwgQVBJLlxuICogUnVuIHdpdGg6IG5weCB0cy1ub2RlIHNyYy9fX3Rlc3RzX18vZTJlLnRlc3QudHNcbiAqXG4gKiBDb3ZlcnM6XG4gKiAtIEF1dGhlbnRpY2F0aW9uXG4gKiAtIFVzZXJzXG4gKiAtIEV2ZW50cyAod2l0aCB2ZW51ZSwgY3JlYXRvciwgYnJhbmQgc3BvbnNvcilcbiAqIC0gQm9va2luZ3NcbiAqIC0gRXZlbnQgQ2hhdCAobmV3IHJvbGVzOiBBVFRFTkRFRSwgQ1JFQVRPUiwgVkVOVUVfUkVQLCBCUkFORF9SRVApXG4gKiAtIEh1YnNcbiAqIC0gVmVudWVzIChuZXcgLSByZXBsYWNlcyBidXNpbmVzc2VzKVxuICogLSBDcmVhdG9ycyAobmV3KVxuICogLSBCcmFuZHMgKG5ldylcbiAqIC0gVW5pZmllZCBSZXdhcmRzICh2ZW51ZSArIGJyYW5kIHJld2FyZHMpXG4gKiAtIExpYnJhcnkgKGNvbnRlbnQgd29ya2Zsb3cpXG4gKiAtIFN1cHBvcnQgKGNoZWNrLWlucywgd2lucywgSmFjayBBSSlcbiAqIC0gQ3JlYXRvciBQcm9kdWN0cyAoc2Vzc2lvbnMvcGFja2FnZXMgd2l0aCBib29raW5nIGZsb3cpXG4gKiAtIEJhZGdlcyAmIFJld2FyZHNcbiAqIC0gQmFkZ2UgQXdhcmRpbmcgKGJ1c2luZXNzIGxvZ2ljIHRlc3RzIGZvciBhdXRvbWF0aWMgYmFkZ2UgYXdhcmRpbmcpXG4gKiAgIC0gQ0hFQ0tfSU5fU1RSRUFLIGJhZGdlIG9uIGNoZWNrLWluXG4gKiAgIC0gV0lOU19MT0dHRUQgYmFkZ2Ugb24gbG9nZ2luZyB3aW5zXG4gKiAgIC0gTU9PRF9MT0dTX0NPVU5UIGJhZGdlIG9uIG1vb2QgbG9nZ2luZ1xuICogICAtIFJFRkxFQ1RJT05TX0NPVU5UIGJhZGdlIG9uIHN1Ym1pdHRpbmcgcmVmbGVjdGlvbnNcbiAqICAgLSBFVkVOVFNfSE9TVEVEIGJhZGdlIG9uIHB1Ymxpc2hpbmcgZXZlbnRzXG4gKiAgIC0gRVZFTlRTX0FUVEVOREVEIGJhZGdlIHByb2dyZXNzIHRyYWNraW5nXG4gKiAtIFJld2FyZCBGbG93IChmdWxsIHJlZGVtcHRpb24gbGlmZWN5Y2xlKVxuICogICAtIENyZWF0aW5nIHJld2FyZHMgZm9yIGJhZGdlcyAodmVudWUvYnJhbmQpXG4gKiAgIC0gVXNlciBlYXJucyBiYWRnZSAtPiByZXdhcmQgYmVjb21lcyBhdmFpbGFibGVcbiAqICAgLSBSZWRlZW0gcmV3YXJkIChnZXQgcmVkZW1wdGlvbiBkZXRhaWxzKVxuICogICAtIENhbm5vdCByZWRlZW0gd2l0aG91dCBiYWRnZVxuICogICAtIENhbm5vdCByZWRlZW0gdHdpY2UgKHBlciB1c2VyIGxpbWl0KVxuICogICAtIFJld2FyZCB2ZXJpZmljYXRpb24gZW5kcG9pbnRcbiAqL1xuXG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NJbnN0YW5jZSB9IGZyb20gJ2F4aW9zJztcblxuY29uc3QgQkFTRV9VUkwgPSBwcm9jZXNzLmVudi5BUElfVVJMIHx8ICdodHRwOi8vbG9jYWxob3N0OjMwMDEvYXBpL3YxJztcbmNvbnN0IFRFU1RfRU1BSUwgPSBgZTJlLSR7RGF0ZS5ub3coKX1AZ3Jvd3NvYmVyLmNvbWA7XG5jb25zdCBURVNUX1BBU1NXT1JEID0gJ1NlY3VyZVBhc3MxMjMhJztcblxuLy8gQ29sb3JzIGZvciBvdXRwdXRcbmNvbnN0IGMgPSB7XG4gIHJlc2V0OiAnXFx4MWJbMG0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHJlZDogJ1xceDFiWzMxbScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGN5YW46ICdcXHgxYlszNm0nLFxuICBkaW06ICdcXHgxYlsybScsXG4gIGJvbGQ6ICdcXHgxYlsxbScsXG59O1xuXG4vLyBTdGF0ZSBzaGFyZWQgYWNyb3NzIHRlc3RzXG5jb25zdCBzdGF0ZToge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGV2ZW50SWQ/OiBzdHJpbmc7XG4gIGh1YklkPzogc3RyaW5nO1xuICBib29raW5nSWQ/OiBzdHJpbmc7XG4gIGNoYXRJZD86IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG4gIC8vIE5ldyBzdGF0ZSBmb3IgcmVzdHJ1Y3R1cmVkIG1vZGVsc1xuICB2ZW51ZUlkPzogc3RyaW5nO1xuICBjcmVhdG9ySWQ/OiBzdHJpbmc7XG4gIGJyYW5kSWQ/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eUlkPzogc3RyaW5nO1xuICByZXdhcmRJZD86IHN0cmluZztcbiAgYmFkZ2VJZD86IHN0cmluZztcbiAgY29udGVudElkPzogc3RyaW5nO1xuICAvLyBDcmVhdG9yIHByb2R1Y3RzXG4gIHByb2R1Y3RJZD86IHN0cmluZztcbiAgcHJvZHVjdEJvb2tpbmdJZD86IHN0cmluZztcbiAgLy8gU2Vjb25kIHVzZXIgZm9yIG93bmVyc2hpcCB0ZXN0c1xuICBzZWNvbmRVc2VyVG9rZW4/OiBzdHJpbmc7XG4gIHNlY29uZFVzZXJJZD86IHN0cmluZztcbn0gPSB7XG4gIGFjY2Vzc1Rva2VuOiAnJyxcbiAgcmVmcmVzaFRva2VuOiAnJyxcbiAgdXNlcklkOiAnJyxcbn07XG5cbi8vIFN0YXRzXG5sZXQgcGFzc2VkID0gMDtcbmxldCBmYWlsZWQgPSAwO1xubGV0IHNraXBwZWQgPSAwO1xuXG4vLyBDcmVhdGUgYXhpb3MgY2xpZW50XG5mdW5jdGlvbiBhcGkodG9rZW4/OiBzdHJpbmcpOiBBeGlvc0luc3RhbmNlIHtcbiAgcmV0dXJuIGF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogQkFTRV9VUkwsXG4gICAgaGVhZGVyczogdG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0gOiB7fSxcbiAgICB2YWxpZGF0ZVN0YXR1czogKCkgPT4gdHJ1ZSxcbiAgfSk7XG59XG5cbi8vIFRlc3QgcnVubmVyXG5hc3luYyBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGF3YWl0IGZuKCk7XG4gICAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1QQVNTJHtjLnJlc2V0fSAke25hbWV9ICR7Yy5kaW19KCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zKSR7Yy5yZXNldH1gKTtcbiAgICBwYXNzZWQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgY29uc29sZS5sb2coYCR7Yy5yZWR9RkFJTCR7Yy5yZXNldH0gJHtuYW1lfSAke2MuZGltfSgke0RhdGUubm93KCkgLSBzdGFydH1tcykke2MucmVzZXR9YCk7XG4gICAgY29uc29sZS5sb2coYCAgJHtjLnllbGxvd30ke2UubWVzc2FnZX0ke2MucmVzZXR9YCk7XG4gICAgZmFpbGVkKys7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIFNraXAgdGVzdCB3aXRoIHJlYXNvblxuZnVuY3Rpb24gc2tpcChuYW1lOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKGAke2MueWVsbG93fVNLSVAke2MucmVzZXR9ICR7bmFtZX0gJHtjLmRpbX0oJHtyZWFzb259KSR7Yy5yZXNldH1gKTtcbiAgc2tpcHBlZCsrO1xufVxuXG4vLyBVbndyYXAgQVBJIHJlc3BvbnNlIChoYW5kbGVzIGJvdGggd3JhcHBlZCBhbmQgdW53cmFwcGVkKVxuZnVuY3Rpb24gdW53cmFwPFQ+KHJlczogeyBkYXRhOiBhbnkgfSk6IFQge1xuICByZXR1cm4gcmVzLmRhdGE/LmRhdGEgIT09IHVuZGVmaW5lZCA/IHJlcy5kYXRhLmRhdGEgOiByZXMuZGF0YTtcbn1cblxuLy8gU2VjdGlvbiBoZWFkZXJcbmZ1bmN0aW9uIHNlY3Rpb24obmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gJHtuYW1lfSAtLS0ke2MucmVzZXR9XFxuYCk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRFU1RTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKCkge1xuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59JHsnPScucmVwZWF0KDcwKX0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0gIEdyb3dTb2JlciBBUEkgRTJFIFRlc3RzIC0gRnVsbCBDb3ZlcmFnZSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5jeWFufSR7Jz0nLnJlcGVhdCg3MCl9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmRpbX1CYXNlIFVSTDogJHtCQVNFX1VSTH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfVRlc3QgRW1haWw6ICR7VEVTVF9FTUFJTH0ke2MucmVzZXR9XFxuYCk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrXG4gIGNvbnN0IGhlYWx0aCA9IGF3YWl0IGFwaSgpLmdldCgnL2hlYWx0aCcpO1xuICBpZiAoaGVhbHRoLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgY29uc29sZS5sb2coYCR7Yy5yZWR9QVBJIGlzIG5vdCByZWFjaGFibGUgYXQgJHtCQVNFX1VSTH0ke2MucmVzZXR9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGNvbnNvbGUubG9nKGAke2MuZ3JlZW59QVBJIGlzIGhlYWx0aHkke2MucmVzZXR9XFxuYCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRIXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQVVUSEVOVElDQVRJT04nKTtcblxuICBhd2FpdCB0ZXN0KCdSZWdpc3RlciBuZXcgdXNlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWdpc3RlcicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgICBuYW1lOiAnRTJFIFRlc3QgVXNlcicsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICAgIHN0YXRlLnVzZXJJZCA9IGRhdGEudXNlci5pZDtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnTG9naW4gd2l0aCBlbWFpbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9sb2dpbicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmFjY2Vzc1Rva2VuID0gZGF0YS5hY2Nlc3NUb2tlbjtcbiAgICBzdGF0ZS5yZWZyZXNoVG9rZW4gPSBkYXRhLnJlZnJlc2hUb2tlbjtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnUmVmcmVzaCB0b2tlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWZyZXNoJywge1xuICAgICAgcmVmcmVzaFRva2VuOiBzdGF0ZS5yZWZyZXNoVG9rZW4sXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY3VycmVudCB1c2VyIChhdXRoL21lKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2F1dGgvbWUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0ludmFsaWQgbG9naW4gcmV0dXJucyA0MDEnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkucG9zdCgnL2F1dGgvbG9naW4nLCB7XG4gICAgICBlbWFpbDogVEVTVF9FTUFJTCxcbiAgICAgIHBhc3N3b3JkOiAnV3JvbmdQYXNzd29yZCcsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA0MDEsIGdvdCAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vIFJlZ2lzdGVyIHNlY29uZCB1c2VyIGZvciBvd25lcnNoaXAgdGVzdHNcbiAgYXdhaXQgdGVzdCgnUmVnaXN0ZXIgc2Vjb25kIHVzZXIgZm9yIG93bmVyc2hpcCB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWdpc3RlcicsIHtcbiAgICAgIGVtYWlsOiBgZTJlLXNlY29uZC0ke0RhdGUubm93KCl9QGdyb3dzb2Jlci5jb21gLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgICBuYW1lOiAnRTJFIFNlY29uZCBVc2VyJyxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuc2Vjb25kVXNlclRva2VuID0gZGF0YS5hY2Nlc3NUb2tlbjtcbiAgICBzdGF0ZS5zZWNvbmRVc2VySWQgPSBkYXRhLnVzZXIuaWQ7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVNFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdVU0VSUycpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBjdXJyZW50IHVzZXIgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3VzZXJzL21lJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdVcGRhdGUgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnB1dCgnL3VzZXJzL21lJywge1xuICAgICAgbmFtZTogJ1VwZGF0ZWQgRTJFIFVzZXInLFxuICAgICAgYmlvOiAnRTJFIHRlc3QgYmlvJyxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHVzZXIgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC91c2Vycy8ke3N0YXRlLnVzZXJJZH1gKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB1c2VyIHB1YmxpYyBwcm9maWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvdXNlcnMvJHtzdGF0ZS51c2VySWR9L3B1YmxpY2ApO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWRU5VRVMgKE5ldyAtIHJlcGxhY2VzIEJ1c2luZXNzZXMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignVkVOVUVTJyk7XG5cbiAgYXdhaXQgdGVzdCgnTGlzdCB2ZW51ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvdmVudWVzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIC8vIEdldCBmaXJzdCB2ZW51ZSBpZiBleGlzdHMgZm9yIGZ1cnRoZXIgdGVzdHNcbiAgICBpZiAoZGF0YT8udmVudWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZS52ZW51ZUlkID0gZGF0YS52ZW51ZXNbMF0uaWQ7XG4gICAgfVxuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgdmVudWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL3ZlbnVlcy9mZWF0dXJlZCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5lYXJieSB2ZW51ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvdmVudWVzL25lYXJieScsIHtcbiAgICAgIHBhcmFtczogeyBsYXQ6IDUxLjUwNzQsIGxvbmc6IC0wLjEyNzgsIHJhZGl1czogMTAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS52ZW51ZUlkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHZlbnVlIGJ5IElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KGAvdmVudWVzLyR7c3RhdGUudmVudWVJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCB2ZW51ZSBvd25lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL3ZlbnVlcy8ke3N0YXRlLnZlbnVlSWR9L293bmVyc2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IHZlbnVlIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL3ZlbnVlcy8ke3N0YXRlLnZlbnVlSWR9L2V2ZW50c2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNraXAoJ0dldCB2ZW51ZSBieSBJRCcsICdObyB2ZW51ZXMgaW4gZGF0YWJhc2UnKTtcbiAgICBza2lwKCdHZXQgdmVudWUgb3duZXJzJywgJ05vIHZlbnVlcyBpbiBkYXRhYmFzZScpO1xuICAgIHNraXAoJ0dldCB2ZW51ZSBldmVudHMnLCAnTm8gdmVudWVzIGluIGRhdGFiYXNlJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENSRUFUT1JTIChOZXcpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQ1JFQVRPUlMnKTtcblxuICBhd2FpdCB0ZXN0KCdMaXN0IGNyZWF0b3JzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2NyZWF0b3JzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdDcmVhdGUgY3JlYXRvciBwcm9maWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL2NyZWF0b3JzJywge1xuICAgICAgc2x1ZzogYGUyZS1jcmVhdG9yLSR7RGF0ZS5ub3coKX1gLFxuICAgICAgZGlzcGxheU5hbWU6ICdFMkUgVGVzdCBDcmVhdG9yJyxcbiAgICAgIGJpbzogJ0EgdGVzdCBjcmVhdG9yIGZvciBFMkUgdGVzdHMnLFxuICAgICAgY2FuRmFjaWxpdGF0ZTogdHJ1ZSxcbiAgICAgIGNhbkNyZWF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICBpc0luZmx1ZW5jZXI6IGZhbHNlLFxuICAgICAgc3BlY2lhbHRpZXM6IFsnbWVkaXRhdGlvbicsICdzb2JyaWV0eS1jb2FjaGluZyddLFxuICAgICAgY2VydGlmaWNhdGlvbnM6IFsnVGVzdCBDZXJ0IDEnXSxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBzdGF0ZS5jcmVhdG9ySWQgPSBkYXRhLmlkO1xuICB9KTtcblxuICBpZiAoc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBteSBjcmVhdG9yIHByb2ZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2NyZWF0b3JzL21lJyk7XG4gICAgICAvLyBSZXR1cm5zIDIwMCB3aXRoIG51bGwgb3IgY3JlYXRvciBkYXRhXG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgY3JlYXRvciBieSB1c2VyIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9jcmVhdG9ycy91c2VyLyR7c3RhdGUudXNlcklkfWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnVXBkYXRlIGNyZWF0b3IgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucGF0Y2goYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH1gLCB7XG4gICAgICAgIGJpbzogJ1VwZGF0ZWQgYmlvIGZvciBFMkUgdGVzdGluZycsXG4gICAgICAgIHNlc3Npb25SYXRlOiA1MCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdBZGQgY3JlYXRvciBhdmFpbGFiaWxpdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vYXZhaWxhYmlsaXR5YCwge1xuICAgICAgICBkYXlPZldlZWs6IDEsIC8vIE1vbmRheVxuICAgICAgICBzdGFydFRpbWU6ICcwOTowMCcsXG4gICAgICAgIGVuZFRpbWU6ICcxNzowMCcsXG4gICAgICAgIHRpbWV6b25lOiAnRXVyb3BlL0xvbmRvbicsXG4gICAgICAgIGlzUmVjdXJyaW5nOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgc3RhdGUuYXZhaWxhYmlsaXR5SWQgPSBkYXRhLmlkO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgYXZhaWxhYmlsaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KGAvY3JlYXRvcnMvJHtzdGF0ZS5jcmVhdG9ySWR9L2F2YWlsYWJpbGl0eWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgY29udGVudCAocHVibGlzaGVkKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9jb250ZW50YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgY3JlYXRvciBldmVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vZXZlbnRzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0IG93bmVyc2hpcCAtIHNlY29uZCB1c2VyIGNhbm5vdCB1cGRhdGVcbiAgICBhd2FpdCB0ZXN0KCdTZWNvbmQgdXNlciBjYW5ub3QgdXBkYXRlIGFub3RoZXIgY3JlYXRvciBwcm9maWxlICg0MDMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLnNlY29uZFVzZXJUb2tlbikucGF0Y2goYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH1gLCB7XG4gICAgICAgIGJpbzogJ0hhY2tlZCBiaW8nLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gNDAzKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDQwMywgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ1JFQVRPUiBQUk9EVUNUUyAoU2Vzc2lvbnMvUGFja2FnZXMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQ1JFQVRPUiBQUk9EVUNUUycpO1xuXG4gIGlmIChzdGF0ZS5jcmVhdG9ySWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdDcmVhdGUgY3JlYXRvciBwcm9kdWN0ICgxLW9uLTEgc2Vzc2lvbiknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vcHJvZHVjdHNgLCB7XG4gICAgICAgIHRpdGxlOiAnRTJFIFRlc3QgMS1vbi0xIFNlc3Npb24nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0EgdGVzdCBjb2FjaGluZyBzZXNzaW9uIGZvciBFMkUgdGVzdGluZycsXG4gICAgICAgIHR5cGU6ICdTRVNTSU9OXzFPTjEnLFxuICAgICAgICBwcmljZTogNTAwMCwgLy8gwqM1MCBpbiBwZW5jZVxuICAgICAgICBjdXJyZW5jeTogJ0dCUCcsXG4gICAgICAgIGR1cmF0aW9uTWludXRlczogNjAsXG4gICAgICAgIG1heFBhcnRpY2lwYW50czogMSxcbiAgICAgICAgZGVsaXZlcnlNZXRob2Q6ICdWSURFT19DQUxMJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgIHN0YXRlLnByb2R1Y3RJZCA9IGRhdGEuaWQ7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdDcmVhdGUgc2Vjb25kIHByb2R1Y3QgKHdvcmtzaG9wKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9wcm9kdWN0c2AsIHtcbiAgICAgICAgdGl0bGU6ICdFMkUgVGVzdCBXb3Jrc2hvcCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQSBncm91cCB3b3Jrc2hvcCBmb3IgRTJFIHRlc3RpbmcnLFxuICAgICAgICB0eXBlOiAnV09SS1NIT1AnLFxuICAgICAgICBwcmljZTogMjUwMCwgLy8gwqMyNSBpbiBwZW5jZVxuICAgICAgICBjdXJyZW5jeTogJ0dCUCcsXG4gICAgICAgIGR1cmF0aW9uTWludXRlczogOTAsXG4gICAgICAgIG1heFBhcnRpY2lwYW50czogMTAsXG4gICAgICAgIGRlbGl2ZXJ5TWV0aG9kOiAnVklERU9fQ0FMTCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgcHJvZHVjdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9wcm9kdWN0c2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICBjb25zdCBwcm9kdWN0cyA9IGRhdGEucHJvZHVjdHMgfHwgZGF0YTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9kdWN0cykgfHwgcHJvZHVjdHMubGVuZ3RoIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IDIgcHJvZHVjdHMgZm9yIGNyZWF0b3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChzdGF0ZS5wcm9kdWN0SWQpIHtcbiAgICAgIGF3YWl0IHRlc3QoJ0dldCBwcm9kdWN0IGJ5IElEIChwdWJsaWMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9wcm9kdWN0cy8ke3N0YXRlLnByb2R1Y3RJZH1gKTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgICAgaWYgKCFkYXRhLnRpdGxlIHx8ICFkYXRhLnByaWNlKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZXhwZWN0ZWQgcHJvZHVjdCBmaWVsZHMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgcHJvZHVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wdXQoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vcHJvZHVjdHMvJHtzdGF0ZS5wcm9kdWN0SWR9YCwge1xuICAgICAgICAgIHByaWNlOiA2MDAwLCAvLyBVcGRhdGUgdG8gwqM2MFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXBkYXRlZCBkZXNjcmlwdGlvbiBmb3IgRTJFIHRlc3RpbmcnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgICBpZiAoZGF0YS5wcmljZSAhPT0gNjAwMCkgdGhyb3cgbmV3IEVycm9yKCdQcmljZSBub3QgdXBkYXRlZCBjb3JyZWN0bHknKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZWNvbmQgdXNlciBib29rcyB0aGUgcHJvZHVjdFxuICAgICAgYXdhaXQgdGVzdCgnQm9vayBwcm9kdWN0IChhcyBzZWNvbmQgdXNlciknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgc2NoZWR1bGVkQXQuc2V0RGF0ZShzY2hlZHVsZWRBdC5nZXREYXRlKCkgKyAxNCk7IC8vIDIgd2Vla3MgZnJvbSBub3dcbiAgICAgICAgc2NoZWR1bGVkQXQuc2V0SG91cnMoMTAsIDAsIDAsIDApO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5zZWNvbmRVc2VyVG9rZW4pLnBvc3QoYC9wcm9kdWN0cy8ke3N0YXRlLnByb2R1Y3RJZH0vYm9va2AsIHtcbiAgICAgICAgICBzY2hlZHVsZWRBdDogc2NoZWR1bGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB0aW1lem9uZTogJ0V1cm9wZS9Mb25kb24nLFxuICAgICAgICAgIGNsaWVudE5vdGVzOiAnRTJFIHRlc3QgYm9va2luZycsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgIHN0YXRlLnByb2R1Y3RCb29raW5nSWQgPSBkYXRhLmlkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0ZS5wcm9kdWN0Qm9va2luZ0lkKSB7XG4gICAgICAgIGF3YWl0IHRlc3QoJ0dldCBwcm9kdWN0IGJvb2tpbmcgZGV0YWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuc2Vjb25kVXNlclRva2VuKS5nZXQoYC91c2Vycy9tZS9wcm9kdWN0LWJvb2tpbmdzLyR7c3RhdGUucHJvZHVjdEJvb2tpbmdJZH1gKTtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgICAgaWYgKCFkYXRhLnNjaGVkdWxlZEF0IHx8ICFkYXRhLnN0YXR1cykgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJvb2tpbmcgZmllbGRzJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRlc3QoJ0dldCB1c2VyIHByb2R1Y3QgYm9va2luZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLnNlY29uZFVzZXJUb2tlbikuZ2V0KCcvdXNlcnMvbWUvcHJvZHVjdC1ib29raW5ncycpO1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgICAgICBjb25zdCBib29raW5ncyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEuZGF0YSB8fCBbXSk7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJvb2tpbmdzKSB8fCBib29raW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHByb2R1Y3QgYm9va2luZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgYm9va2luZ3MgKGFzIGNyZWF0b3IpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvY3JlYXRvcnMvJHtzdGF0ZS5jcmVhdG9ySWR9L3Byb2R1Y3RzL2Jvb2tpbmdzYCk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgICAgIGNvbnN0IGJvb2tpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiAoZGF0YS5kYXRhIHx8IFtdKTtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYm9va2luZ3MpIHx8IGJvb2tpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYm9va2luZyBmb3IgY3JlYXRvciBwcm9kdWN0cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGVzdCgnVXBkYXRlIHByb2R1Y3QgYm9va2luZycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY2hlZHVsZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgbmV3U2NoZWR1bGVkQXQuc2V0RGF0ZShuZXdTY2hlZHVsZWRBdC5nZXREYXRlKCkgKyAyMSk7IC8vIDMgd2Vla3MgZnJvbSBub3dcbiAgICAgICAgICBuZXdTY2hlZHVsZWRBdC5zZXRIb3VycygxNCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuc2Vjb25kVXNlclRva2VuKS5wdXQoYC91c2Vycy9tZS9wcm9kdWN0LWJvb2tpbmdzLyR7c3RhdGUucHJvZHVjdEJvb2tpbmdJZH1gLCB7XG4gICAgICAgICAgICBzY2hlZHVsZWRBdDogbmV3U2NoZWR1bGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGNsaWVudE5vdGVzOiAnUmVzY2hlZHVsZWQgLSBFMkUgdGVzdCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBwcm9kdWN0IGJvb2tpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLnNlY29uZFVzZXJUb2tlbikuZGVsZXRlKGAvdXNlcnMvbWUvcHJvZHVjdC1ib29raW5ncy8ke3N0YXRlLnByb2R1Y3RCb29raW5nSWR9YCwge1xuICAgICAgICAgICAgZGF0YTogeyByZWFzb246ICdFMkUgdGVzdCBjbGVhbnVwJyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWNvbmQgdXNlciBjYW5ub3QgZGVsZXRlIGNyZWF0b3IncyBwcm9kdWN0XG4gICAgICBhd2FpdCB0ZXN0KCdTZWNvbmQgdXNlciBjYW5ub3QgZGVsZXRlIHByb2R1Y3QgKDQwMyknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5zZWNvbmRVc2VyVG9rZW4pLmRlbGV0ZShgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9wcm9kdWN0cy8ke3N0YXRlLnByb2R1Y3RJZH1gKTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMykgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA0MDMsIGdvdCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcCgnQ3JlYXRlIGNyZWF0b3IgcHJvZHVjdCcsICdObyBjcmVhdG9yIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0NyZWF0ZSBzZWNvbmQgcHJvZHVjdCcsICdObyBjcmVhdG9yIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0dldCBjcmVhdG9yIHByb2R1Y3RzJywgJ05vIGNyZWF0b3IgSUQgYXZhaWxhYmxlJyk7XG4gICAgc2tpcCgnR2V0IHByb2R1Y3QgYnkgSUQnLCAnTm8gcHJvZHVjdCBJRCBhdmFpbGFibGUnKTtcbiAgICBza2lwKCdVcGRhdGUgcHJvZHVjdCcsICdObyBwcm9kdWN0IElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0Jvb2sgcHJvZHVjdCcsICdObyBwcm9kdWN0IElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0dldCBwcm9kdWN0IGJvb2tpbmcgZGV0YWlscycsICdObyBib29raW5nIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0dldCB1c2VyIHByb2R1Y3QgYm9va2luZ3MnLCAnTm8gYm9va2luZyBJRCBhdmFpbGFibGUnKTtcbiAgICBza2lwKCdHZXQgY3JlYXRvciBib29raW5ncycsICdObyBib29raW5nIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ1VwZGF0ZSBwcm9kdWN0IGJvb2tpbmcnLCAnTm8gYm9va2luZyBJRCBhdmFpbGFibGUnKTtcbiAgICBza2lwKCdDYW5jZWwgcHJvZHVjdCBib29raW5nJywgJ05vIGJvb2tpbmcgSUQgYXZhaWxhYmxlJyk7XG4gICAgc2tpcCgnU2Vjb25kIHVzZXIgY2Fubm90IGRlbGV0ZSBwcm9kdWN0JywgJ05vIHByb2R1Y3QgSUQgYXZhaWxhYmxlJyk7XG4gIH1cblxuICAvLyBUZXN0IHB1YmxpYyBwcm9kdWN0cyBsaXN0aW5nXG4gIGF3YWl0IHRlc3QoJ0xpc3QgYWxsIHB1YmxpYyBwcm9kdWN0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoJy9wcm9kdWN0cycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBNYXkgaGF2ZSBwcm9kdWN0cyBhcnJheSBvciBwYWdpbmF0ZWQgcmVzcG9uc2VcbiAgICBjb25zdCBwcm9kdWN0cyA9IGRhdGEucHJvZHVjdHMgfHwgZGF0YTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvZHVjdHMpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHByb2R1Y3RzIGFycmF5Jyk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQlJBTkRTIChOZXcpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQlJBTkRTJyk7XG5cbiAgYXdhaXQgdGVzdCgnTGlzdCBicmFuZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvYnJhbmRzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgYnJhbmRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2JyYW5kcy9mZWF0dXJlZCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnQ3JlYXRlIGJyYW5kJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL2JyYW5kcycsIHtcbiAgICAgIHNsdWc6IGBlMmUtYnJhbmQtJHtEYXRlLm5vdygpfWAsXG4gICAgICBuYW1lOiAnRTJFIFRlc3QgQnJhbmQnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHRlc3QgYnJhbmQgZm9yIEUyRSB0ZXN0aW5nJyxcbiAgICAgIHdlYnNpdGU6ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGVtYWlsOiAnYnJhbmRAZXhhbXBsZS5jb20nLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmJyYW5kSWQgPSBkYXRhLmlkO1xuICB9KTtcblxuICBpZiAoc3RhdGUuYnJhbmRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBicmFuZCBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgYnJhbmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBhdGNoKGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH1gLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBkYXRlZCBicmFuZCBkZXNjcmlwdGlvbicsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGJyYW5kIG93bmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH0vb3duZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgc2Vjb25kIHVzZXIgYXMgYnJhbmQgbWFuYWdlclxuICAgIGF3YWl0IHRlc3QoJ0FkZCBicmFuZCBvd25lciAobWFuYWdlciByb2xlKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L293bmVyc2AsIHtcbiAgICAgICAgdXNlcklkOiBzdGF0ZS5zZWNvbmRVc2VySWQsXG4gICAgICAgIHJvbGU6ICdNQU5BR0VSJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBNYW5hZ2VyIGNhbiB1cGRhdGUgYnJhbmRcbiAgICBhd2FpdCB0ZXN0KCdNYW5hZ2VyIGNhbiB1cGRhdGUgYnJhbmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuc2Vjb25kVXNlclRva2VuKS5wYXRjaChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9YCwge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZWQgYnkgbWFuYWdlcicsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGJyYW5kIGNyZWF0b3JzIChwYXJ0bmVyc2hpcHMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9icmFuZHMvJHtzdGF0ZS5icmFuZElkfS9jcmVhdG9yc2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNyZWF0b3IgcGFydG5lcnNoaXAgaWYgY3JlYXRvciBleGlzdHNcbiAgICBpZiAoc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgICBhd2FpdCB0ZXN0KCdBZGQgY3JlYXRvciBwYXJ0bmVyc2hpcCB0byBicmFuZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH0vY3JlYXRvcnNgLCB7XG4gICAgICAgICAgY3JlYXRvcklkOiBzdGF0ZS5jcmVhdG9ySWQsXG4gICAgICAgICAgY29tbWlzc2lvblJhdGU6IDAuMTUsXG4gICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgY3JlYXRvciBwYXJ0bmVyc2hpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wYXRjaChcbiAgICAgICAgICBgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29tbWlzc2lvblJhdGU6IDAuMjAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRlc3QoJ0dldCBicmFuZCBzcG9uc29yZWQgZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH0vZXZlbnRzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIG1hbmFnZXJcbiAgICBhd2FpdCB0ZXN0KCdSZW1vdmUgYnJhbmQgb3duZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmRlbGV0ZShcbiAgICAgICAgYC9icmFuZHMvJHtzdGF0ZS5icmFuZElkfS9vd25lcnMvJHtzdGF0ZS5zZWNvbmRVc2VySWR9YFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBTZWNvbmQgdXNlciBzaG91bGQgbm93IGJlIGZvcmJpZGRlblxuICAgIGF3YWl0IHRlc3QoJ1JlbW92ZWQgb3duZXIgY2Fubm90IGFjY2VzcyBicmFuZCAoNDAzKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5zZWNvbmRVc2VyVG9rZW4pLnBhdGNoKGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH1gLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2hvdWxkIGZhaWwnLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gNDAzKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDQwMywgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRVZFTlRTICh3aXRoIG5ldyBmaWVsZHM6IHZlbnVlSWQsIGNyZWF0b3JJZCwgc3BvbnNvckJyYW5kSWQsIGdhdGhlcmluZ1R5cGUpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignRVZFTlRTJyk7XG5cbiAgYXdhaXQgdGVzdCgnTGlzdCBldmVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvZXZlbnRzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdXBjb21pbmcgZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2V2ZW50cy91cGNvbWluZycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnQ3JlYXRlIGV2ZW50IHdpdGggY3JlYXRvciBhbmQgYnJhbmQgc3BvbnNvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBldmVudERhdGE6IGFueSA9IHtcbiAgICAgIHRpdGxlOiAnRTJFIFRlc3QgRXZlbnQnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHRlc3QgZXZlbnQgY3JlYXRlZCBieSBFMkUgdGVzdHMnLFxuICAgICAgc3RhcnREYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICB0b3RhbFNwb3RzOiAyMCxcbiAgICAgIGxvY2F0aW9uTmFtZTogJ1Rlc3QgTG9jYXRpb24nLFxuICAgICAgbG9jYXRpb25BZGRyZXNzOiAnMTIzIFRlc3QgU3RyZWV0JyxcbiAgICAgIGdhdGhlcmluZ1R5cGU6ICdGQUNJTElUQVRPUl9MRUQnLFxuICAgIH07XG5cbiAgICAvLyBBZGQgY3JlYXRvciBhbmQgYnJhbmQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHN0YXRlLmNyZWF0b3JJZCkgZXZlbnREYXRhLmNyZWF0b3JJZCA9IHN0YXRlLmNyZWF0b3JJZDtcbiAgICBpZiAoc3RhdGUuYnJhbmRJZCkgZXZlbnREYXRhLnNwb25zb3JCcmFuZElkID0gc3RhdGUuYnJhbmRJZDtcbiAgICBpZiAoc3RhdGUudmVudWVJZCkgZXZlbnREYXRhLnZlbnVlSWQgPSBzdGF0ZS52ZW51ZUlkO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvZXZlbnRzJywgZXZlbnREYXRhKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBzdGF0ZS5ldmVudElkID0gZGF0YS5pZDtcbiAgfSk7XG5cbiAgaWYgKHN0YXRlLmV2ZW50SWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdHZXQgZXZlbnQgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAvLyBWZXJpZnkgbmV3IGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgaWYgKCEoJ2dhdGhlcmluZ1R5cGUnIGluIGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2F0aGVyaW5nVHlwZSBmaWVsZCcpO1xuICAgICAgaWYgKCEoJ3ZlbnVlSWQnIGluIGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdmVudWVJZCBmaWVsZCcpO1xuICAgICAgaWYgKCEoJ2NyZWF0b3JJZCcgaW4gZGF0YSkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBjcmVhdG9ySWQgZmllbGQnKTtcbiAgICAgIGlmICghKCdzcG9uc29yQnJhbmRJZCcgaW4gZGF0YSkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzcG9uc29yQnJhbmRJZCBmaWVsZCcpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnVXBkYXRlIGV2ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wdXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfWAsIHtcbiAgICAgICAgdGl0bGU6ICdFMkUgVGVzdCBFdmVudCAoVXBkYXRlZCknLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZWQgZGVzY3JpcHRpb24gZm9yIEUyRSB0ZXN0aW5nJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdQdWJsaXNoIGV2ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vcHVibGlzaGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IG15IGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvZXZlbnRzL215LWV2ZW50cycpO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCT09LSU5HU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0JPT0tJTkdTJyk7XG5cbiAgaWYgKHN0YXRlLmV2ZW50SWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdSU1ZQIHRvIGV2ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vYm9va2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSAmJiByZXMuc3RhdHVzICE9PSA0MDkpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgIHN0YXRlLmJvb2tpbmdJZCA9IGRhdGEuaWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgbXkgYm9va2luZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2Jvb2tpbmdzL21lJyk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVWRU5UIENIQVQgKE5ldyByb2xlczogQVRURU5ERUUsIENSRUFUT1IsIFZFTlVFX1JFUCwgQlJBTkRfUkVQKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0VWRU5UIENIQVQnKTtcblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBvciBjcmVhdGUgZXZlbnQgY2hhdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgIHN0YXRlLmNoYXRJZCA9IGRhdGEuaWQ7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdKb2luIGV2ZW50IGNoYXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9jaGF0L2pvaW5gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ1NlbmQgY2hhdCBtZXNzYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdC9tZXNzYWdlc2AsIHtcbiAgICAgICAgY29udGVudDogJ0hlbGxvIGZyb20gRTJFIHRlc3QhJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNoYXQgbWVzc2FnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvbWVzc2FnZXNgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBjaGF0IG1lbWJlcnMgKGNoZWNrIGZvciBuZXcgcm9sZXMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9jaGF0L21lbWJlcnNgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgLy8gVmVyaWZ5IG1lbWJlcnMgaGF2ZSByb2xlIGZpZWxkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsaWRSb2xlcyA9IFsnQVRURU5ERUUnLCAnQ1JFQVRPUicsICdWRU5VRV9SRVAnLCAnQlJBTkRfUkVQJywgJ01PREVSQVRPUicsICdBRE1JTiddO1xuICAgICAgICBjb25zdCBtZW1iZXIgPSBkYXRhWzBdO1xuICAgICAgICBpZiAoIXZhbGlkUm9sZXMuaW5jbHVkZXMobWVtYmVyLnJvbGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJvbGU6ICR7bWVtYmVyLnJvbGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ01hcmsgY2hhdCBhcyByZWFkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdC9yZWFkYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJBREdFUyAmIFVOSUZJRUQgUkVXQVJEU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0JBREdFUyAmIFVOSUZJRUQgUkVXQVJEUycpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBhbGwgYmFkZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuYmFkZ2VJZCA9IGRhdGFbMF0uaWQ7XG4gICAgfVxuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgbXkgYmFkZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzL3VzZXJzL21lL2JhZGdlcycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5leHQgYmFkZ2VzICh3aXRoIHByb2dyZXNzKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy9uZXh0Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgYXZhaWxhYmxlIHJld2FyZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9yZXdhcmRzL2F2YWlsYWJsZScpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgd2FsbGV0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvcmV3YXJkcy93YWxsZXQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gVmVyaWZ5IHdhbGxldCBzdHJ1Y3R1cmUgLSBiYWRnZXMgbWF5IGJlIGVtcHR5IGFycmF5IGZvciBuZXcgdXNlcnNcbiAgICBpZiAoZGF0YS5iYWRnZXMgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJhZGdlcyBpbiB3YWxsZXQnKTtcbiAgICBpZiAoZGF0YS5zdGF0cyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc3RhdHMgaW4gd2FsbGV0Jyk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5iYWRnZUlkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgZm9yIGJhZGdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL2JhZGdlLyR7c3RhdGUuYmFkZ2VJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS52ZW51ZUlkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgZm9yIHZlbnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL3ZlbnVlLyR7c3RhdGUudmVudWVJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5icmFuZElkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgZm9yIGJyYW5kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL2JyYW5kLyR7c3RhdGUuYnJhbmRJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSFVCU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0hVQlMnKTtcblxuICBhd2FpdCB0ZXN0KCdMaXN0IGh1YnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvaHVicycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlLmh1YklkID0gZGF0YVswXS5pZDtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5odWJJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBodWIgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9odWJzLyR7c3RhdGUuaHViSWR9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdKb2luIGh1YicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2h1YnMvJHtzdGF0ZS5odWJJZH0vam9pbmApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCAmJiByZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBodWIgbWVtYmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvaHVicy8ke3N0YXRlLmh1YklkfS9tZW1iZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJQlJBUlkgKENvbnRlbnQgd29ya2Zsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignTElCUkFSWScpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBsaWJyYXJ5IGNvbnRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9saWJyYXJ5Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgY29udGVudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2xpYnJhcnkvZmVhdHVyZWQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vIENvbnRlbnQgd29ya2Zsb3cgdGVzdHMgKGlmIGNyZWF0b3IgZXhpc3RzKVxuICBpZiAoc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgLy8gTm90ZTogL2xpYnJhcnkvY3JlYXRvci86aWQgZW5kcG9pbnQgbm90IGltcGxlbWVudGVkIHlldFxuICAgIC8vIHNraXAoJ0dldCBjb250ZW50IGJ5IGNyZWF0b3InLCAnRW5kcG9pbnQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEpBQ0sgQUkgKFN1cHBvcnQgQ29udmVyc2F0aW9ucylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdKQUNLIEFJJyk7XG5cbiAgYXdhaXQgdGVzdCgnU3RhcnQgSmFjayBjb252ZXJzYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC9qYWNrL2NvbnZlcnNhdGlvbnMvbmV3Jywge1xuICAgICAgbWVzc2FnZTogJ0hlbGxvIEphY2shJyxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxICYmIHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gZGF0YS5jb252ZXJzYXRpb24/LmlkIHx8IGRhdGEuaWQ7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L2phY2svY29udmVyc2F0aW9ucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IEphY2sgY2hhdCBoaXN0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9qYWNrL2hpc3RvcnknKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5jb252ZXJzYXRpb25JZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KFxuICAgICAgICBgL3N1cHBvcnQvamFjay9jb252ZXJzYXRpb25zLyR7c3RhdGUuY29udmVyc2F0aW9uSWR9YFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VQUE9SVCAoQ2hlY2staW5zLCBXaW5zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ1NVUFBPUlQnKTtcblxuICBhd2FpdCB0ZXN0KCdDcmVhdGUgZGFpbHkgY2hlY2staW4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC9jaGVjay1pbnMnLCB7XG4gICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSxcbiAgICAgIG1vb2Q6IDQsXG4gICAgICBlbmVyZ3k6IDQsXG4gICAgICBzdGF5ZWRTb2JlcjogdHJ1ZSxcbiAgICAgIG5vdGVzOiAnRTJFIHRlc3QgY2hlY2staW4nLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBjaGVjay1pbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L2NoZWNrLWlucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHRvZGF5IGNoZWNrLWluJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9jaGVjay1pbnMvdG9kYXknKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDQwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY2hlY2staW4gc3RyZWFrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9jaGVjay1pbnMvc3RyZWFrJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdMb2cgYSB3aW4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC93aW5zJywge1xuICAgICAgdGl0bGU6ICdDb21wbGV0ZWQgRTJFIHRlc3RzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU3VjY2Vzc2Z1bGx5IHJhbiBhbGwgQVBJIHRlc3RzJyxcbiAgICAgIGNhdGVnb3J5OiAnUEVSU09OQUwnLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHdpbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L3dpbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB3aW5zIGNvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC93aW5zL2NvdW50Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PVElGSUNBVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdOT1RJRklDQVRJT05TJyk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5vdGlmaWNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9ub3RpZmljYXRpb25zJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdW5yZWFkIGNvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvbm90aWZpY2F0aW9ucy91bnJlYWQtY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VCU0NSSVBUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ1NVQlNDUklQVElPTlMnKTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgc3Vic2NyaXB0aW9uIHBsYW5zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3Vic2NyaXB0aW9ucy9wbGFucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG15IHN1YnNjcmlwdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1YnNjcmlwdGlvbnMvbWUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDQwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1BUFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ01BUCcpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBtYXAgaHVicycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9odWJzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgbWFwIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9ldmVudHMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFER0UgQVdBUkRJTkcgKEJ1c2luZXNzIExvZ2ljIFRlc3RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0JBREdFIEFXQVJESU5HJyk7XG5cbiAgLy8gVGVzdCBiYWRnZSBwcm9ncmVzcyB0cmFja2luZyBhZnRlciBhY3Rpb25zXG4gIC8vIE5vdGU6IFRoZXNlIHRlc3RzIHZlcmlmeSB0aGUgYmFkZ2UgYXdhcmRpbmcgaW50ZWdyYXRpb24gd29ya3MgY29ycmVjdGx5LlxuICAvLyBBY3R1YWwgYmFkZ2UgZWFybmluZyBkZXBlbmRzIG9uIHRocmVzaG9sZHMgaW4gc2VlZCBkYXRhLlxuXG4gIC8vIEdldCBpbml0aWFsIGJhZGdlIHN0YXRlXG4gIGxldCBpbml0aWFsQmFkZ2VDb3VudCA9IDA7XG4gIGxldCBpbml0aWFsQmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBpbml0aWFsIHVzZXIgYmFkZ2VzIGJlZm9yZSBiYWRnZSB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy91c2Vycy9tZS9iYWRnZXMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgaW5pdGlhbEJhZGdlQ291bnQgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YS5sZW5ndGggOiAwO1xuICAgIGluaXRpYWxCYWRnZXMgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YS5tYXAoKGI6IGFueSkgPT4gYi5iYWRnZUlkKSA6IFtdO1xuICB9KTtcblxuICAvLyBDaGVjay1pbiBTdHJlYWsgQmFkZ2UgVGVzdHNcbiAgYXdhaXQgdGVzdCgnQ2hlY2staW4gdXBkYXRlcyBzdHJlYWsgYW5kIHRyaWdnZXJzIGJhZGdlIGNoZWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIENyZWF0ZSBhIGNoZWNrLWluIGZvciBhIHByZXZpb3VzIGRheSAodG8gdGVzdCBzdHJlYWsgbG9naWMpXG4gICAgY29uc3QgeWVzdGVyZGF5ID0gbmV3IERhdGUoKTtcbiAgICB5ZXN0ZXJkYXkuc2V0RGF0ZSh5ZXN0ZXJkYXkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgY29uc3QgeWVzdGVyZGF5U3RyID0geWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvY2hlY2staW5zJywge1xuICAgICAgZGF0ZTogeWVzdGVyZGF5U3RyLFxuICAgICAgbW9vZDogNCxcbiAgICAgIGVuZXJneTogMyxcbiAgICAgIHN0YXllZFNvYmVyOiB0cnVlLFxuICAgICAgbm90ZXM6ICdCYWRnZSB0ZXN0IGNoZWNrLWluJyxcbiAgICB9KTtcbiAgICAvLyBBY2NlcHQgMjAxIChjcmVhdGVkKSBvciA0MDkgKGFscmVhZHkgZXhpc3RzIC0gcmUtcnVubmluZyB0ZXN0KVxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1ZlcmlmeSBzdHJlYWsgaXMgdHJhY2tlZCBhZnRlciBjaGVjay1pbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvY2hlY2staW5zL3N0cmVhaycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBTaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGNoZWNrLWluIG5vdyAoZnJvbSBlYXJsaWVyIHRlc3QpXG4gICAgaWYgKGRhdGEudG90YWxDaGVja0lucyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG90YWxDaGVja0lucyBpbiBzdHJlYWsgZGF0YScpO1xuICB9KTtcblxuICAvLyBXaW5zIEJhZGdlIFRlc3RzXG4gIGF3YWl0IHRlc3QoJ0xvZyB3aW4gdXBkYXRlcyBjb3VudCBhbmQgdHJpZ2dlcnMgYmFkZ2UgY2hlY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC93aW5zJywge1xuICAgICAgdGl0bGU6ICdCYWRnZSBhd2FyZGluZyB0ZXN0IHdpbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1Rlc3RpbmcgdGhhdCBsb2dnaW5nIHdpbnMgdHJpZ2dlcnMgYmFkZ2UgY2hlY2snLFxuICAgICAgY2F0ZWdvcnk6ICdQRVJTT05BTCcsIC8vIFZhbGlkIFdpbkNhdGVnb3J5IGVudW0gdmFsdWVcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1ZlcmlmeSB3aW5zIGNvdW50IGlzIHRyYWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L3dpbnMvY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gU2hvdWxkIGhhdmUgdG90YWxXaW5zIG9yIGNvdW50XG4gICAgaWYgKGRhdGEudG90YWxXaW5zID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRhdGEgIT09ICdudW1iZXInICYmIGRhdGEuY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB3aW5zIGNvdW50IGluIHJlc3BvbnNlJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBNb29kIExvZyBCYWRnZSBUZXN0c1xuICBhd2FpdCB0ZXN0KCdMb2cgbW9vZCB1cGRhdGVzIGNvdW50IGFuZCB0cmlnZ2VycyBiYWRnZSBjaGVjaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9zdXBwb3J0L21vb2QtbG9ncycsIHtcbiAgICAgIG1vb2Q6IDQsIC8vIFJlcXVpcmVkIGZpZWxkICgxLTUpXG4gICAgICBlbmVyZ3k6IDMsIC8vIE9wdGlvbmFsICgxLTUpXG4gICAgICB0YWdzOiBbJ2hvcGVmdWwnXSwgLy8gT3B0aW9uYWwgYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgbm90ZTogJ0JhZGdlIHRlc3QgbW9vZCBsb2cnLCAvLyBPcHRpb25hbCBub3RlXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdWZXJpZnkgbW9vZCBsb2dzIGFyZSB0cmFja2VkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9tb29kLWxvZ3MnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgYW5kIHsgZGF0YTogYXJyYXkgfSBmb3JtYXRzXG4gICAgY29uc3QgbG9ncyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEuZGF0YSB8fCBkYXRhLm1vb2RMb2dzIHx8IFtdKTtcbiAgICAvLyBTaG91bGQgaGF2ZSBhdCBsZWFzdCAxIG1vb2QgbG9nXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxvZ3MpIHx8IGxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSBtb29kIGxvZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVmbGVjdGlvbiBCYWRnZSBUZXN0c1xuICBhd2FpdCB0ZXN0KCdTdWJtaXQgcmVmbGVjdGlvbiB1cGRhdGVzIGNvdW50IGFuZCB0cmlnZ2VycyBiYWRnZSBjaGVjaycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBDYWxjdWxhdGUgd2Vla1N0YXJ0IC0gbmVlZHMgdG8gYmUgYSBNb25kYXkgaW4gWVlZWS1NTS1ERCBmb3JtYXRcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IG5vdy5nZXREYXkoKTtcbiAgICBjb25zdCBkYXlzVG9Nb25kYXkgPSBkYXlPZldlZWsgPT09IDAgPyA2IDogZGF5T2ZXZWVrIC0gMTtcbiAgICBjb25zdCBtb25kYXkgPSBuZXcgRGF0ZShub3cpO1xuICAgIG1vbmRheS5zZXREYXRlKG5vdy5nZXREYXRlKCkgLSBkYXlzVG9Nb25kYXkpO1xuICAgIGNvbnN0IHdlZWtTdGFydCA9IG1vbmRheS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9zdXBwb3J0L3JlZmxlY3Rpb25zJywge1xuICAgICAgd2Vla1N0YXJ0LCAvLyBSZXF1aXJlZCBmaWVsZFxuICAgICAgb3ZlcmFsbFJhdGluZzogNCxcbiAgICAgIGJpZ2dlc3RXaW46ICdCYWRnZSB0ZXN0IHJlZmxlY3Rpb24gLSB0ZXN0aW5nIHRoZSBiYWRnZSBpbnRlZ3JhdGlvbicsXG4gICAgICBjaGFsbGVuZ2VzOiAnVGVzdGluZyBhdXRvbWF0ZWQgYmFkZ2UgY2hlY2tzJyxcbiAgICAgIGdvYWxzOiBbJ0NvbnRpbnVlIGltcHJvdmluZyB0aGUgcGxhdGZvcm0nXSxcbiAgICAgIG5vdGVzOiAnRTJFIHRlc3QgcmVmbGVjdGlvbicsXG4gICAgfSk7XG4gICAgLy8gQWNjZXB0IDIwMSAoY3JlYXRlZCkgb3IgNDA5IChhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB3ZWVrKVxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1ZlcmlmeSByZWZsZWN0aW9ucyBhcmUgdHJhY2tlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvcmVmbGVjdGlvbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vIEV2ZW50cyBIb3N0ZWQgQmFkZ2UgVGVzdHMgKGF3YXJkZWQgb24gcHVibGlzaClcbiAgYXdhaXQgdGVzdCgnUHVibGlzaGluZyBldmVudCBhd2FyZHMgRVZFTlRTX0hPU1RFRCBiYWRnZSB0byBob3N0cycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgZXZlbnQgd2FzIGFscmVhZHkgcHVibGlzaGVkIGluIEVWRU5UUyBzZWN0aW9uXG4gICAgLy8gVmVyaWZ5IHRoZSBiYWRnZSBjaGVjayB3YXMgdHJpZ2dlcmVkIGJ5IGNoZWNraW5nIG5leHQgYmFkZ2VzXG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9iYWRnZXMvbmV4dCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBTaG91bGQgcmV0dXJuIGJhZGdlIHByb2dyZXNzIGRhdGFcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXJyYXkgb2YgbmV4dCBiYWRnZXMnKTtcbiAgfSk7XG5cbiAgLy8gRXZlbnRzIEF0dGVuZGVkIEJhZGdlIFRlc3RzXG4gIC8vIE5vdGU6IEVWRU5UU19BVFRFTkRFRCBiYWRnZSBpcyBhd2FyZGVkIHdoZW4gYm9va2luZyBpcyBjaGVja2VkLWluXG4gIC8vIFRoaXMgcmVxdWlyZXMgYSBob3N0IHRvIGNoZWNrLWluIHRoZSBib29raW5nLCB3aGljaCB3ZSBjYW4ndCBkbyBpbiBFMkUgZWFzaWx5XG4gIC8vIFNvIHdlIGp1c3QgdmVyaWZ5IHRoZSBiYWRnZSBwcm9ncmVzcyB0cmFja2luZyB3b3Jrc1xuXG4gIGF3YWl0IHRlc3QoJ0JhZGdlIHByb2dyZXNzIHNob3dzIEVWRU5UU19BVFRFTkRFRCB0cmFja2luZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy9uZXh0Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIC8vIExvb2sgZm9yIGV2ZW50cyBhdHRlbmRlZCBiYWRnZSBpbiBwcm9ncmVzc1xuICAgIGNvbnN0IGV2ZW50c0F0dGVuZGVkQmFkZ2UgPSBkYXRhLmZpbmQoXG4gICAgICAoYjogYW55KSA9PiBiLmJhZGdlPy50eXBlID09PSAnRVZFTlRTX0FUVEVOREVEJyB8fCBiLmJhZGdlPy5zbHVnPy5pbmNsdWRlcygnZXZlbnQnKVxuICAgICk7XG4gICAgLy8gTWF5IG9yIG1heSBub3QgZXhpc3QgZGVwZW5kaW5nIG9uIHNlZWQgZGF0YSwgYnV0IEFQSSBzaG91bGQgd29ya1xuICB9KTtcblxuICAvLyBWZXJpZnkgYmFkZ2Ugc3RhdGUgYWZ0ZXIgYWxsIGFjdGlvbnNcbiAgYXdhaXQgdGVzdCgnVmVyaWZ5IGJhZGdlcyBhZnRlciBhbGwgYmFkZ2UtdHJpZ2dlcmluZyBhY3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzL3VzZXJzL21lL2JhZGdlcycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBjb25zdCBjdXJyZW50QmFkZ2VDb3VudCA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhLmxlbmd0aCA6IDA7XG4gICAgLy8gRGVwZW5kaW5nIG9uIHRocmVzaG9sZHMsIHVzZXIgbWF5IGhhdmUgZWFybmVkIG5ldyBiYWRnZXNcbiAgICAvLyBBdCBtaW5pbXVtLCB0aGUgQVBJIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bGx5XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkVXQVJEIEZMT1dcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdSRVdBUkQgRkxPVycpO1xuXG4gIC8vIFN0b3JlIHJld2FyZC1yZWxhdGVkIHN0YXRlXG4gIGxldCB0ZXN0QmFkZ2VJZEZvclJld2FyZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgdGVzdFJld2FyZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCByZWRlbXB0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBHZXQgYSBiYWRnZSB0byB1c2UgZm9yIHJld2FyZCB0ZXN0c1xuICBhd2FpdCB0ZXN0KCdHZXQgYXZhaWxhYmxlIGJhZGdlcyBmb3IgcmV3YXJkIHRlc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9iYWRnZXMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICB0ZXN0QmFkZ2VJZEZvclJld2FyZCA9IGRhdGFbMF0uaWQ7XG4gICAgfVxuICB9KTtcblxuICAvLyBDcmVhdGUgYSBicmFuZCByZXdhcmQgZm9yIHRlc3RpbmcgKHVzZXIgb3ducyBicmFuZCBmcm9tIGVhcmxpZXIgdGVzdHMpXG4gIC8vIE5vdGU6IFdlIHVzZSBicmFuZCBzaW5jZSB3ZSBjcmVhdGVkIG9uZSBpbiB0aGUgQlJBTkRTIHNlY3Rpb25cbiAgaWYgKHN0YXRlLmJyYW5kSWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdDcmVhdGUgYnJhbmQgcmV3YXJkIGZvciBiYWRnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghdGVzdEJhZGdlSWRGb3JSZXdhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYWRnZSBhdmFpbGFibGUgdG8gY3JlYXRlIHJld2FyZCBmb3InKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L3Jld2FyZHNgLCB7XG4gICAgICAgIGJhZGdlSWQ6IHRlc3RCYWRnZUlkRm9yUmV3YXJkLFxuICAgICAgICB0aXRsZTogJ0UyRSBCcmFuZCBUZXN0IFJld2FyZCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQSB0ZXN0IGJyYW5kIHJld2FyZCBmb3IgRTJFIHRlc3RpbmcnLFxuICAgICAgICByZWRlZW1UeXBlOiAnT05MSU5FJyxcbiAgICAgICAgY29kZTogJ0UyRS1URVNULUNPREUnLFxuICAgICAgICBwZXJVc2VyTGltaXQ6IDEsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICB0ZXN0UmV3YXJkSWQgPSBkYXRhLmlkO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNraXAoJ0NyZWF0ZSBicmFuZCByZXdhcmQgZm9yIGJhZGdlJywgJ05vIGJyYW5kIGF2YWlsYWJsZSAoYnJhbmQgbm90IGNyZWF0ZWQpJyk7XG4gIH1cblxuICAvLyBUZXN0IHJld2FyZCBhdmFpbGFiaWxpdHlcbiAgYXdhaXQgdGVzdCgnR2V0IGF2YWlsYWJsZSByZXdhcmRzIGZvciB1c2VyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvcmV3YXJkcy9hdmFpbGFibGUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gQVBJIHJldHVybnMgeyBkYXRhOiByZXdhcmRzW10gfVxuICAgIGNvbnN0IHJld2FyZHMgPSBkYXRhLmRhdGEgfHwgZGF0YTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmV3YXJkcykpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXJyYXkgb2YgYXZhaWxhYmxlIHJld2FyZHMnKTtcbiAgfSk7XG5cbiAgLy8gVGVzdCB1c2VyIGNhbm5vdCByZWRlZW0gd2l0aG91dCBlYXJuaW5nIHRoZSBiYWRnZVxuICBhd2FpdCB0ZXN0KCdDYW5ub3QgcmVkZWVtIHJld2FyZCB3aXRob3V0IGVhcm5pbmcgcmVxdWlyZWQgYmFkZ2UgKDQwMCknLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0ZXN0UmV3YXJkSWQgfHwgIXRlc3RCYWRnZUlkRm9yUmV3YXJkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2MuZGltfShTa2lwcGVkOiBObyB0ZXN0IHJld2FyZCBjcmVhdGVkKSR7Yy5yZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCBjaGVjayBpZiB1c2VyIGhhcyB0aGUgYmFkZ2VcbiAgICBjb25zdCBiYWRnZVJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzL3VzZXJzL21lL2JhZGdlcycpO1xuICAgIGNvbnN0IGJhZGdlcyA9IHVud3JhcDxhbnk+KGJhZGdlUmVzKTtcbiAgICBjb25zdCBoYXNCYWRnZSA9IEFycmF5LmlzQXJyYXkoYmFkZ2VzKSAmJiBiYWRnZXMuc29tZShcbiAgICAgIChiOiBhbnkpID0+IGIuYmFkZ2VJZCA9PT0gdGVzdEJhZGdlSWRGb3JSZXdhcmRcbiAgICApO1xuXG4gICAgaWYgKCFoYXNCYWRnZSkge1xuICAgICAgLy8gVXNlciBkb2Vzbid0IGhhdmUgYmFkZ2UsIHNob3VsZCBnZXQgNDAwIHdoZW4gdHJ5aW5nIHRvIHJlZGVlbVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvcmV3YXJkcy8ke3Rlc3RSZXdhcmRJZH0vcmVkZWVtYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gNDAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgNDAwIChuZWVkIGJhZGdlIGZpcnN0KSwgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlciBoYXMgdGhlIGJhZGdlLCB0ZXN0IHBhc3NlcyAod2UnbGwgdGVzdCByZWRlbXB0aW9uIGJlbG93KVxuICAgICAgY29uc29sZS5sb2coYCAgJHtjLmRpbX0oVXNlciBhbHJlYWR5IGhhcyByZXF1aXJlZCBiYWRnZSAtIHdpbGwgdGVzdCByZWRlbXB0aW9uKSR7Yy5yZXNldH1gKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRlc3QgcmVkZW1wdGlvbiBmbG93IC0gY2hlY2sgaWYgdXNlciBjYW4gcmVkZWVtXG4gIGF3YWl0IHRlc3QoJ0NoZWNrIGJhZGdlIG93bmVyc2hpcCBhbmQgdGVzdCByZWRlbXB0aW9uIGZsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0ZXN0UmV3YXJkSWQgfHwgIXRlc3RCYWRnZUlkRm9yUmV3YXJkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2MuZGltfShTa2lwcGVkOiBObyB0ZXN0IHJld2FyZCBjcmVhdGVkKSR7Yy5yZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBlYXJuZWQgdGhlIGJhZGdlXG4gICAgY29uc3QgYmFkZ2VSZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy91c2Vycy9tZS9iYWRnZXMnKTtcbiAgICBpZiAoYmFkZ2VSZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7YmFkZ2VSZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGJhZGdlcyA9IHVud3JhcDxhbnk+KGJhZGdlUmVzKTtcbiAgICBjb25zdCB1c2VySGFzQmFkZ2UgPSBBcnJheS5pc0FycmF5KGJhZGdlcykgJiYgYmFkZ2VzLnNvbWUoXG4gICAgICAoYjogYW55KSA9PiBiLmJhZGdlSWQgPT09IHRlc3RCYWRnZUlkRm9yUmV3YXJkXG4gICAgKTtcblxuICAgIGlmICh1c2VySGFzQmFkZ2UpIHtcbiAgICAgIC8vIFVzZXIgaGFzIGJhZGdlLCB0ZXN0IHRoZSBmdWxsIHJlZGVtcHRpb24gZmxvd1xuICAgICAgY29uc3QgcmVkZWVtUmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvcmV3YXJkcy8ke3Rlc3RSZXdhcmRJZH0vcmVkZWVtYCk7XG4gICAgICBpZiAocmVkZWVtUmVzLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVkZWVtIGZhaWxlZDogJHtyZWRlZW1SZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZWRlZW1SZXMuZGF0YSl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWRlZW1EYXRhID0gdW53cmFwPGFueT4ocmVkZWVtUmVzKTtcbiAgICAgIHJlZGVtcHRpb25JZCA9IHJlZGVlbURhdGEuaWQ7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2MuZGltfShSZWRlbXB0aW9uIHN1Y2Nlc3NmdWw6ICR7cmVkZW1wdGlvbklkfSkke2MucmVzZXR9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Yy5kaW19KFVzZXIgaGFzIG5vdCBlYXJuZWQgcmVxdWlyZWQgYmFkZ2UgLSByZWRlbXB0aW9uIHRlc3Qgc2tpcHBlZCkke2MucmVzZXR9YCk7XG4gICAgfVxuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdDYW5ub3QgcmVkZWVtIHNhbWUgcmV3YXJkIHR3aWNlICg0MDApJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghdGVzdFJld2FyZElkIHx8ICFyZWRlbXB0aW9uSWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Yy5kaW19KFNraXBwZWQ6IE5vIHByaW9yIHJlZGVtcHRpb24gdG8gdGVzdCkke2MucmVzZXR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL3Jld2FyZHMvJHt0ZXN0UmV3YXJkSWR9L3JlZGVlbWApO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSA0MDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgNDAwIChhbHJlYWR5IHJlZGVlbWVkKSwgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCByZWRlZW1lZCByZXdhcmRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvcmV3YXJkcy9yZWRlZW1lZCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBBUEkgcmV0dXJucyB7IGRhdGE6IHJlZGVtcHRpb25zW10gfVxuICAgIGNvbnN0IHJlZGVtcHRpb25zID0gZGF0YS5kYXRhIHx8IGRhdGE7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZGVtcHRpb25zKSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhcnJheSBvZiByZWRlZW1lZCByZXdhcmRzJyk7XG4gICAgLy8gSWYgd2UgcmVkZWVtZWQsIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZVxuICAgIGlmIChyZWRlbXB0aW9uSWQgJiYgcmVkZW1wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSByZWRlZW1lZCByZXdhcmQnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1Jld2FyZHMgd2FsbGV0IHNob3dzIGNvcnJlY3Qgc3RhdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9yZXdhcmRzL3dhbGxldCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBpZiAoZGF0YS5zdGF0cyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc3RhdHMgaW4gd2FsbGV0Jyk7XG4gICAgLy8gQWZ0ZXIgcmVkZW1wdGlvbiwgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSByZWRlZW1lZFxuICAgIGlmIChyZWRlbXB0aW9uSWQgJiYgZGF0YS5zdGF0cy50b3RhbFJlZGVlbWVkUmV3YXJkcyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXQgbGVhc3QgMSByZWRlZW1lZCByZXdhcmQgaW4gd2FsbGV0IHN0YXRzJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUZXN0IGdldHRpbmcgcmV3YXJkcyBieSBiYWRnZVxuICBhd2FpdCB0ZXN0KCdHZXQgcmV3YXJkcyBmb3Igc3BlY2lmaWMgYmFkZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0ZXN0QmFkZ2VJZEZvclJld2FyZCkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtjLmRpbX0oU2tpcHBlZDogTm8gYmFkZ2UgSUQgYXZhaWxhYmxlKSR7Yy5yZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL2JhZGdlLyR7dGVzdEJhZGdlSWRGb3JSZXdhcmR9YCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIC8vIEFQSSByZXR1cm5zIHsgZGF0YTogcmV3YXJkc1tdIH1cbiAgICBjb25zdCByZXdhcmRzID0gZGF0YS5kYXRhIHx8IGRhdGE7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJld2FyZHMpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGFycmF5IG9mIHJld2FyZHMnKTtcbiAgfSk7XG5cbiAgLy8gVmVyaWZ5IHJld2FyZCByZWRlbXB0aW9uIHZlcmlmaWNhdGlvbiBlbmRwb2ludFxuICBhd2FpdCB0ZXN0KCdWZXJpZnkgcmVkZW1wdGlvbiBlbmRwb2ludCB3b3JrcycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBieSB2ZW51ZS9icmFuZCBzdGFmZlxuICAgIC8vIFdlJ2xsIHRlc3Qgd2l0aCBhbiBpbnZhbGlkIHRva2VuIHRvIGVuc3VyZSBlbmRwb2ludCBleGlzdHNcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9yZXdhcmRzL3ZlcmlmeScsIHtcbiAgICAgIHFyVG9rZW46ICdpbnZhbGlkLXRlc3QtdG9rZW4nLFxuICAgIH0pO1xuICAgIC8vIFBPU1QgZGVmYXVsdHMgdG8gMjAxLCBidXQgZWl0aGVyIDIwMCBvciAyMDEgaXMgYWNjZXB0YWJsZVxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gQVBJIHJldHVybnMgeyBkYXRhOiB7IHZhbGlkOiBib29sZWFuIH0gfVxuICAgIGNvbnN0IHJlc3VsdCA9IGRhdGEuZGF0YSB8fCBkYXRhO1xuICAgIGlmIChyZXN1bHQudmFsaWQgIT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhbGlkOiBmYWxzZSBmb3IgaW52YWxpZCB0b2tlbicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDTEVBTlVQXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQ0xFQU5VUCcpO1xuXG4gIC8vIENsZWFudXAgY3JlYXRvciBwcm9kdWN0c1xuICBpZiAoc3RhdGUucHJvZHVjdElkICYmIHN0YXRlLmNyZWF0b3JJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0RlbGV0ZSBjcmVhdG9yIHByb2R1Y3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmRlbGV0ZShcbiAgICAgICAgYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vcHJvZHVjdHMvJHtzdGF0ZS5wcm9kdWN0SWR9YFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUuYXZhaWxhYmlsaXR5SWQgJiYgc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgYXdhaXQgdGVzdCgnUmVtb3ZlIGNyZWF0b3IgYXZhaWxhYmlsaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5kZWxldGUoXG4gICAgICAgIGAvY3JlYXRvcnMvJHtzdGF0ZS5jcmVhdG9ySWR9L2F2YWlsYWJpbGl0eS8ke3N0YXRlLmF2YWlsYWJpbGl0eUlkfWBcbiAgICAgICk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDIwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlLmNyZWF0b3JJZCAmJiBzdGF0ZS5icmFuZElkKSB7XG4gICAgYXdhaXQgdGVzdCgnUmVtb3ZlIGNyZWF0b3IgZnJvbSBicmFuZCBwYXJ0bmVyc2hpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZGVsZXRlKFxuICAgICAgICBgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfWBcbiAgICAgICk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDIwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlLmJvb2tpbmdJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBib29raW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5kZWxldGUoYC9ib29raW5ncy8ke3N0YXRlLmJvb2tpbmdJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDQgJiYgcmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NhbmNlbGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVU1NQVJZXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufSR7Jz0nLnJlcGVhdCg3MCl9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59ICBURVNUIFNVTU1BUlkke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0keyc9Jy5yZXBlYXQoNzApfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1QYXNzZWQ6ICAke3Bhc3NlZH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MucmVkfUZhaWxlZDogICR7ZmFpbGVkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy55ZWxsb3d9U2tpcHBlZDogJHtza2lwcGVkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5ib2xkfVRvdGFsOiAgICR7cGFzc2VkICsgZmFpbGVkICsgc2tpcHBlZH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0keyc9Jy5yZXBlYXQoNzApfSR7Yy5yZXNldH1cXG5gKTtcblxuICAvLyBJRHMgZm9yIGRlYnVnZ2luZ1xuICBjb25zb2xlLmxvZyhgJHtjLmRpbX1UZXN0IElEczoke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgVXNlcjogICAgICR7c3RhdGUudXNlcklkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5kaW19ICBDcmVhdG9yOiAgJHtzdGF0ZS5jcmVhdG9ySWQgfHwgJ04vQSd9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmRpbX0gIFByb2R1Y3Q6ICAke3N0YXRlLnByb2R1Y3RJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgQnJhbmQ6ICAgICR7c3RhdGUuYnJhbmRJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgRXZlbnQ6ICAgICR7c3RhdGUuZXZlbnRJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgVmVudWU6ICAgICR7c3RhdGUudmVudWVJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKCcnKTtcblxuICBwcm9jZXNzLmV4aXQoZmFpbGVkID4gMCA/IDEgOiAwKTtcbn1cblxuLy8gUnVuIHRlc3RzXG5ydW5UZXN0cygpLmNhdGNoKChlKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoYCR7Yy5yZWR9VW5leHBlY3RlZCBlcnJvcjoke2MucmVzZXR9YCwgZSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl19
|