@workflow/world-local 5.0.0-beta.23 → 5.0.0-beta.24
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/README.md +9 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -5
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -5
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +7 -8
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +164 -20
- package/dist/storage/helpers.d.ts +37 -0
- package/dist/storage/helpers.d.ts.map +1 -1
- package/dist/storage/helpers.js +73 -2
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +18 -6
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +79 -62
- package/package.json +4 -4
package/dist/streamer.js
CHANGED
|
@@ -49,14 +49,29 @@ function addChunkFilesByExtension(extMap, entries, sourceExtension, fileExtensio
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
52
|
+
* Resolve the per-stream chunk directory. Chunks are sharded one directory
|
|
53
|
+
* per stream (`streams/chunks/<streamName>/`) so that listing a stream's
|
|
54
|
+
* chunks costs O(chunks in that stream) rather than O(chunks in the whole
|
|
55
|
+
* world). A tail reader polling for new chunks would otherwise `readdir` the
|
|
56
|
+
* entire global chunks directory every 100ms — see vercel/workflow#2797.
|
|
55
57
|
*/
|
|
56
|
-
|
|
57
|
-
// Name
|
|
58
|
+
function chunkDirForStream(chunksBaseDir, name) {
|
|
59
|
+
// Name becomes a path segment below; validate it can't escape chunksBaseDir.
|
|
58
60
|
assertSafeEntityId('streamName', name);
|
|
59
|
-
|
|
61
|
+
return path.join(chunksBaseDir, name);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List chunk files for a stream, sorted chronologically (ULID order).
|
|
65
|
+
* Returns the sorted chunk keys (each key is the chunk ULID), a map of
|
|
66
|
+
* key → extension for resolving the full path, and the per-stream directory
|
|
67
|
+
* the files live in. Handles tagged and legacy (.json) formats.
|
|
68
|
+
*
|
|
69
|
+
* Files are stored per-stream (`<chunkDir>/<chunkId><tagSuffix>.bin`), so the
|
|
70
|
+
* key returned here is already the chunk id — no stream-name prefix to strip.
|
|
71
|
+
*/
|
|
72
|
+
async function listChunkFilesForStream(chunksBaseDir, name, tag) {
|
|
73
|
+
const dir = chunkDirForStream(chunksBaseDir, name);
|
|
74
|
+
const entries = await listChunkEntries(dir);
|
|
60
75
|
const extMap = new Map();
|
|
61
76
|
addChunkFilesByExtension(extMap, entries, '.json');
|
|
62
77
|
addChunkFilesByExtension(extMap, entries, '.bin', '.bin', tag ? (file) => !file.endsWith(`.${tag}`) : undefined);
|
|
@@ -64,10 +79,8 @@ async function listChunkFilesForStream(chunksDir, name, tag) {
|
|
|
64
79
|
const taggedExtension = `.${tag}.bin`;
|
|
65
80
|
addChunkFilesByExtension(extMap, entries, taggedExtension);
|
|
66
81
|
}
|
|
67
|
-
const files = [...extMap.keys()]
|
|
68
|
-
|
|
69
|
-
.sort();
|
|
70
|
-
return { files, extMap };
|
|
82
|
+
const files = [...extMap.keys()].sort();
|
|
83
|
+
return { files, extMap, dir };
|
|
71
84
|
}
|
|
72
85
|
export function createStreamer(basedir, tag) {
|
|
73
86
|
const tagSuffix = tag ? `.${tag}` : '';
|
|
@@ -122,7 +135,7 @@ export function createStreamer(basedir, tag) {
|
|
|
122
135
|
chunk: chunkBuffer,
|
|
123
136
|
eof: false,
|
|
124
137
|
});
|
|
125
|
-
const chunkPath = path.join(basedir, 'streams', 'chunks', `${
|
|
138
|
+
const chunkPath = path.join(chunkDirForStream(path.join(basedir, 'streams', 'chunks'), name), `${chunkId}${tagSuffix}.bin`);
|
|
126
139
|
await write(chunkPath, serialized);
|
|
127
140
|
// Emit real-time event with Uint8Array (create copy to prevent ArrayBuffer detachment)
|
|
128
141
|
const chunkData = Uint8Array.from(chunkBuffer);
|
|
@@ -151,7 +164,7 @@ export function createStreamer(basedir, tag) {
|
|
|
151
164
|
chunk: chunkBuffer,
|
|
152
165
|
eof: false,
|
|
153
166
|
});
|
|
154
|
-
const chunkPath = path.join(basedir, 'streams', 'chunks', `${
|
|
167
|
+
const chunkPath = path.join(chunkDirForStream(path.join(basedir, 'streams', 'chunks'), name), `${chunkId}${tagSuffix}.bin`);
|
|
155
168
|
await write(chunkPath, serialized);
|
|
156
169
|
// Return data needed for event emission
|
|
157
170
|
return {
|
|
@@ -177,7 +190,7 @@ export function createStreamer(basedir, tag) {
|
|
|
177
190
|
const runId = await _runId;
|
|
178
191
|
// Register this stream for the run (in case write wasn't called)
|
|
179
192
|
await registerStreamForRun(runId, name);
|
|
180
|
-
const chunkPath = path.join(basedir, 'streams', 'chunks', `${
|
|
193
|
+
const chunkPath = path.join(chunkDirForStream(path.join(basedir, 'streams', 'chunks'), name), `${chunkId}${tagSuffix}.bin`);
|
|
181
194
|
await write(chunkPath, serializeChunk({ chunk: Buffer.from([]), eof: true }));
|
|
182
195
|
streamEmitter.emit(`close:${name}`, { streamName: name });
|
|
183
196
|
},
|
|
@@ -188,8 +201,8 @@ export function createStreamer(basedir, tag) {
|
|
|
188
201
|
},
|
|
189
202
|
async getChunks(_runId, name, options) {
|
|
190
203
|
const limit = options?.limit ?? 100;
|
|
191
|
-
const
|
|
192
|
-
const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(
|
|
204
|
+
const chunksBaseDir = path.join(basedir, 'streams', 'chunks');
|
|
205
|
+
const { files: chunkFiles, extMap: fileExtMap, dir: chunksDir, } = await listChunkFilesForStream(chunksBaseDir, name, tag);
|
|
193
206
|
// Decode cursor
|
|
194
207
|
let startIndex = 0;
|
|
195
208
|
if (options?.cursor) {
|
|
@@ -255,8 +268,8 @@ export function createStreamer(basedir, tag) {
|
|
|
255
268
|
};
|
|
256
269
|
},
|
|
257
270
|
async getInfo(_runId, name) {
|
|
258
|
-
const
|
|
259
|
-
const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(
|
|
271
|
+
const chunksBaseDir = path.join(basedir, 'streams', 'chunks');
|
|
272
|
+
const { files: chunkFiles, extMap: fileExtMap, dir: chunksDir, } = await listChunkFilesForStream(chunksBaseDir, name, tag);
|
|
260
273
|
// Read only the EOF marker byte because metadata never needs payloads.
|
|
261
274
|
let streamDone = false;
|
|
262
275
|
let dataCount = 0;
|
|
@@ -271,9 +284,19 @@ export function createStreamer(basedir, tag) {
|
|
|
271
284
|
return { tailIndex: dataCount - 1, done: streamDone };
|
|
272
285
|
},
|
|
273
286
|
async get(_runId, name, startIndex = 0) {
|
|
274
|
-
const
|
|
275
|
-
|
|
287
|
+
const chunksBaseDir = path.join(basedir, 'streams', 'chunks');
|
|
288
|
+
// Tears down everything the reader holds open: both emitter listeners
|
|
289
|
+
// and the filesystem poll interval. Assigned once listeners are wired
|
|
290
|
+
// up in start(); called on cancel() and on terminal (EOF/close) paths.
|
|
291
|
+
// Kept robust (unconditional) so a cancel() while still reading from
|
|
292
|
+
// disk can't leak a listener/poll — a signal-bearing step opens one of
|
|
293
|
+
// these readers per invocation, so any leak accumulates fast.
|
|
294
|
+
let teardown = () => { };
|
|
276
295
|
let pollInterval = null;
|
|
296
|
+
// Set when the controller is closed/cancelled; guards against
|
|
297
|
+
// enqueue-after-close in the polling callback when teardown fires
|
|
298
|
+
// mid-iteration.
|
|
299
|
+
let streamClosed = false;
|
|
277
300
|
return new ReadableStream({
|
|
278
301
|
async start(controller) {
|
|
279
302
|
// Track chunks delivered via events to prevent duplicates and maintain order.
|
|
@@ -283,9 +306,6 @@ export function createStreamer(basedir, tag) {
|
|
|
283
306
|
let isReadingFromDisk = true;
|
|
284
307
|
// Buffer close event if it arrives during disk reading
|
|
285
308
|
let pendingClose = false;
|
|
286
|
-
// Set when the controller is closed; guards against enqueue-after-close
|
|
287
|
-
// in the polling callback when closeListener fires mid-iteration.
|
|
288
|
-
let streamClosed = false;
|
|
289
309
|
const chunkListener = (event) => {
|
|
290
310
|
// Skip empty chunks to maintain consistency with disk reading behavior
|
|
291
311
|
if (event.chunkData.byteLength === 0) {
|
|
@@ -318,12 +338,7 @@ export function createStreamer(basedir, tag) {
|
|
|
318
338
|
}
|
|
319
339
|
// Remove listeners before closing
|
|
320
340
|
streamClosed = true;
|
|
321
|
-
|
|
322
|
-
streamEmitter.off(`close:${name}`, closeListener);
|
|
323
|
-
if (pollInterval) {
|
|
324
|
-
clearInterval(pollInterval);
|
|
325
|
-
pollInterval = null;
|
|
326
|
-
}
|
|
341
|
+
teardown();
|
|
327
342
|
try {
|
|
328
343
|
controller.close();
|
|
329
344
|
}
|
|
@@ -331,12 +346,22 @@ export function createStreamer(basedir, tag) {
|
|
|
331
346
|
// Ignore if controller is already closed (e.g., from cancel() or EOF)
|
|
332
347
|
}
|
|
333
348
|
};
|
|
334
|
-
|
|
349
|
+
// Tear down listeners and the poll unconditionally. Unlike
|
|
350
|
+
// closeListener this never defers on isReadingFromDisk, so cancel()
|
|
351
|
+
// reliably releases the reader even mid-disk-read.
|
|
352
|
+
teardown = () => {
|
|
353
|
+
streamEmitter.off(`chunk:${name}`, chunkListener);
|
|
354
|
+
streamEmitter.off(`close:${name}`, closeListener);
|
|
355
|
+
if (pollInterval) {
|
|
356
|
+
clearInterval(pollInterval);
|
|
357
|
+
pollInterval = null;
|
|
358
|
+
}
|
|
359
|
+
};
|
|
335
360
|
// Set up listeners FIRST to avoid missing events
|
|
336
361
|
streamEmitter.on(`chunk:${name}`, chunkListener);
|
|
337
362
|
streamEmitter.on(`close:${name}`, closeListener);
|
|
338
363
|
// Now load existing chunks from disk.
|
|
339
|
-
const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(
|
|
364
|
+
const { files: chunkFiles, extMap: fileExtMap, dir: chunksDir, } = await listChunkFilesForStream(chunksBaseDir, name, tag);
|
|
340
365
|
// Resolve negative startIndex relative to the number of data chunks
|
|
341
366
|
// (excluding the trailing EOF marker chunk, if present).
|
|
342
367
|
let dataChunkCount = chunkFiles.length;
|
|
@@ -356,12 +381,9 @@ export function createStreamer(basedir, tag) {
|
|
|
356
381
|
let isComplete = false;
|
|
357
382
|
for (let i = resolvedStartIndex; i < chunkFiles.length; i++) {
|
|
358
383
|
const file = chunkFiles[i];
|
|
359
|
-
//
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
const chunkId = tag
|
|
363
|
-
? rawChunkId.replace(`.${tag}`, '')
|
|
364
|
-
: rawChunkId;
|
|
384
|
+
// Files are sharded per stream, so the key is already the chunk id
|
|
385
|
+
// (no stream-name prefix, tag suffix already stripped).
|
|
386
|
+
const chunkId = file;
|
|
365
387
|
// Skip if already delivered via event
|
|
366
388
|
if (deliveredChunkIds.has(chunkId)) {
|
|
367
389
|
continue;
|
|
@@ -388,7 +410,8 @@ export function createStreamer(basedir, tag) {
|
|
|
388
410
|
controller.enqueue(Uint8Array.from(buffered.chunkData));
|
|
389
411
|
}
|
|
390
412
|
if (isComplete) {
|
|
391
|
-
|
|
413
|
+
streamClosed = true;
|
|
414
|
+
teardown();
|
|
392
415
|
try {
|
|
393
416
|
controller.close();
|
|
394
417
|
}
|
|
@@ -399,8 +422,8 @@ export function createStreamer(basedir, tag) {
|
|
|
399
422
|
}
|
|
400
423
|
// Process any pending close event that arrived during disk reading
|
|
401
424
|
if (pendingClose) {
|
|
402
|
-
|
|
403
|
-
|
|
425
|
+
streamClosed = true;
|
|
426
|
+
teardown();
|
|
404
427
|
try {
|
|
405
428
|
controller.close();
|
|
406
429
|
}
|
|
@@ -411,12 +434,16 @@ export function createStreamer(basedir, tag) {
|
|
|
411
434
|
}
|
|
412
435
|
// Track pre-startIndex chunks so polling doesn't re-deliver them
|
|
413
436
|
for (let i = 0; i < resolvedStartIndex && i < chunkFiles.length; i++) {
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
437
|
+
// Files are sharded per stream: the key is already the chunk id.
|
|
438
|
+
deliveredChunkIds.add(chunkFiles[i]);
|
|
439
|
+
}
|
|
440
|
+
// If the reader was already cancelled/closed while we were reading
|
|
441
|
+
// from disk above (start() yields at every await), don't arm the
|
|
442
|
+
// poll — cancel()'s teardown ran before this point and would leave
|
|
443
|
+
// the freshly-created interval orphaned.
|
|
444
|
+
if (streamClosed) {
|
|
445
|
+
teardown();
|
|
446
|
+
return;
|
|
420
447
|
}
|
|
421
448
|
// Start filesystem polling for cross-process streaming support.
|
|
422
449
|
// The EventEmitter only works in-process; when the writer is in a
|
|
@@ -428,12 +455,10 @@ export function createStreamer(basedir, tag) {
|
|
|
428
455
|
return;
|
|
429
456
|
isPolling = true;
|
|
430
457
|
try {
|
|
431
|
-
const { files: currentFiles, extMap: currentExtMap } = await listChunkFilesForStream(
|
|
458
|
+
const { files: currentFiles, extMap: currentExtMap } = await listChunkFilesForStream(chunksBaseDir, name, tag);
|
|
432
459
|
for (const file of currentFiles) {
|
|
433
|
-
|
|
434
|
-
const chunkId =
|
|
435
|
-
? rawChunkId.replace(`.${tag}`, '')
|
|
436
|
-
: rawChunkId;
|
|
460
|
+
// Files are sharded per stream: the key is already the chunk id.
|
|
461
|
+
const chunkId = file;
|
|
437
462
|
if (deliveredChunkIds.has(chunkId))
|
|
438
463
|
continue;
|
|
439
464
|
deliveredChunkIds.add(chunkId);
|
|
@@ -441,12 +466,7 @@ export function createStreamer(basedir, tag) {
|
|
|
441
466
|
const chunk = deserializeChunk(await readBuffer(path.join(chunksDir, `${file}${ext}`)));
|
|
442
467
|
if (chunk?.eof === true) {
|
|
443
468
|
streamClosed = true;
|
|
444
|
-
|
|
445
|
-
clearInterval(pollInterval);
|
|
446
|
-
pollInterval = null;
|
|
447
|
-
}
|
|
448
|
-
streamEmitter.off(`chunk:${name}`, chunkListener);
|
|
449
|
-
streamEmitter.off(`close:${name}`, closeListener);
|
|
469
|
+
teardown();
|
|
450
470
|
try {
|
|
451
471
|
controller.close();
|
|
452
472
|
}
|
|
@@ -477,15 +497,12 @@ export function createStreamer(basedir, tag) {
|
|
|
477
497
|
}, 100);
|
|
478
498
|
},
|
|
479
499
|
cancel() {
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
clearInterval(pollInterval);
|
|
483
|
-
pollInterval = null;
|
|
484
|
-
}
|
|
500
|
+
streamClosed = true;
|
|
501
|
+
teardown();
|
|
485
502
|
},
|
|
486
503
|
});
|
|
487
504
|
},
|
|
488
505
|
},
|
|
489
506
|
};
|
|
490
507
|
}
|
|
491
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RyZWFtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLFNBQVMsQ0FBQztBQUVqQiwyRUFBMkU7QUFDM0Usa0RBQWtEO0FBQ2xELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTVELDZDQUE2QztBQUM3QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzdCLENBQUMsQ0FBQztBQWNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixTQUFTLFNBQVMsQ0FBQyxJQUF3QjtJQUN6QyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBWTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sTUFBTSxD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LENBQUM7b0NBQVMsQ0FBQztnQ0FDVCxTQUFTLEdBQUcsS0FBSyxDQUFDOzRCQUNwQixDQUFDO3dCQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDVixDQUFDO29CQUVELE1BQU07d0JBQ0osZUFBZSxFQUFFLENBQUM7d0JBQ2xCLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ2pCLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDNUIsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDdEIsQ0FBQztvQkFDSCxDQUFDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0Q2h1bmtzT3B0aW9ucyxcbiAgU3RyZWFtQ2h1bmtzUmVzcG9uc2UsXG4gIFN0cmVhbWVyLFxuICBTdHJlYW1JbmZvUmVzcG9uc2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgcmVhZEJ1ZmZlcixcbiAgcmVhZEZpcnN0Qnl0ZSxcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuXG4vLyBDcmVhdGUgYSBtb25vdG9uaWMgVUxJRCBmYWN0b3J5IHRoYXQgZW5zdXJlcyBVTElEcyBhcmUgYWx3YXlzIGluY3JlYXNpbmdcbi8vIGV2ZW4gd2hlbiBnZW5lcmF0ZWQgd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kXG5jb25zdCBtb25vdG9uaWNVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLy8gU2NoZW1hIGZvciB0aGUgcnVuLXRvLXN0cmVhbXMgbWFwcGluZyBmaWxlXG5jb25zdCBSdW5TdHJlYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJlYW1zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxufSk7XG5cbi8qKlxuICogQSBjaHVuayBjb25zaXN0cyBvZiBhIGJvb2xlYW4gYGVvZmAgaW5kaWNhdGluZyBpZiBpdCdzIHRoZSBsYXN0IGNodW5rLFxuICogYW5kIGEgYGNodW5rYCB3aGljaCBpcyBhIEJ1ZmZlciBvZiBkYXRhLlxuICogVGhlIHNlcmlhbGl6ZWQgZm9ybWF0IGlzOlxuICogLSAxIGJ5dGUgZm9yIGBlb2ZgICgwIG9yIDEpXG4gKiAtIGFuZCB0aGUgcmVzdCBpcyB0aGUgY2h1bmsgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaHVuayB7XG4gIGVvZjogYm9vbGVhbjtcbiAgY2h1bms6IEJ1ZmZlcjtcbn1cblxuY29uc3QgRU9GX01BUktFUiA9IDE7XG5cbmZ1bmN0aW9uIGlzRW9mQnl0ZShieXRlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJ5dGUgPT09IEVPRl9NQVJLRVI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDaHVuayhjaHVuazogQ2h1bmspIHtcbiAgY29uc3QgZW9mQnl0ZSA9IEJ1ZmZlci5mcm9tKFtjaHVuay5lb2YgPyBFT0ZfTUFSS0VSIDogMF0pO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbZW9mQnl0ZSwgY2h1bmsuY2h1bmtdKTtcbn1cblxuLyoqIENoZWNrIG9ubHkgdGhlIEVPRiBmbGFnIGJ5dGUgd2l0aG91dCBjb3B5aW5nIGNodW5rIHBheWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFb2ZDaHVuayhzZXJpYWxpemVkOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRW9mQnl0ZShzZXJpYWxpemVkWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ2h1bmsoc2VyaWFsaXplZDogQnVmZmVyKSB7XG4gIGNvbnN0IGVvZiA9IGlzRW9mQ2h1bmsoc2VyaWFsaXplZCk7XG4gIC8vIENyZWF0ZSBhIGNvcHkgaW5zdGVhZCBvZiBhIHZpZXcgdG8gcHJldmVudCBBcnJheUJ1ZmZlciBkZXRhY2htZW50XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZC5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7IGVvZiwgY2h1bmsgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdENodW5rRW50cmllcyhjaHVua3NEaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZGRpcihjaHVua3NEaXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihcbiAgZXh0TWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBlbnRyaWVzOiBzdHJpbmdbXSxcbiAgc291cmNlRXh0ZW5zaW9uOiBzdHJpbmcsXG4gIGZpbGVFeHRlbnNpb24gPSBzb3VyY2VFeHRlbnNpb24sXG4gIGluY2x1ZGU6IChmaWxlOiBzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5lbmRzV2l0aChzb3VyY2VFeHRlbnNpb24pKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWxlID0gZW50cnkuc2xpY2UoMCwgLXNvdXJjZUV4dGVuc2lvbi5sZW5ndGgpO1xuICAgIGlmIChpbmNsdWRlKGZpbGUpKSBleHRNYXAuc2V0KGZpbGUsIGZpbGVFeHRlbnNpb24pO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBjaHVuayBmaWxlcyBmb3IgYSBzdHJlYW0sIHNvcnRlZCBjaHJvbm9sb2dpY2FsbHkgKFVMSUQgb3JkZXIpLlxuICogUmV0dXJucyBib3RoIHRoZSBzb3J0ZWQgZmlsZSBuYW1lcyBhbmQgYSBtYXAgb2YgZmlsZSDihpIgZXh0ZW5zaW9uIGZvclxuICogcmVzb2x2aW5nIHRoZSBmdWxsIHBhdGguIEhhbmRsZXMgdGFnZ2VkIGFuZCBsZWdhY3kgKC5qc29uKSBmb3JtYXRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0Q2h1bmtGaWxlc0ZvclN0cmVhbShcbiAgY2h1bmtzRGlyOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPHsgZmlsZXM6IHN0cmluZ1tdOyBleHRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gfT4ge1xuICAvLyBOYW1lIGlzIHVzZWQgYXMgYSBmaWxlbmFtZSBwcmVmaXggYmVsb3c7IHZhbGlkYXRlIGl0IGNhbid0IGVzY2FwZSBjaHVua3NEaXIuXG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIG5hbWUpO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgbGlzdENodW5rRW50cmllcyhjaHVua3NEaXIpO1xuICBjb25zdCBleHRNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oZXh0TWFwLCBlbnRyaWVzLCAnLmpzb24nKTtcbiAgYWRkQ2h1bmtGaWxlc0J5RXh0ZW5zaW9uKFxuICAgIGV4dE1hcCxcbiAgICBlbnRyaWVzLFxuICAgICcuYmluJyxcbiAgICAnLmJpbicsXG4gICAgdGFnID8gKGZpbGUpID0+ICFmaWxlLmVuZHNXaXRoKGAuJHt0YWd9YCkgOiB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAodGFnKSB7XG4gICAgY29uc3QgdGFnZ2VkRXh0ZW5zaW9uID0gYC4ke3RhZ30uYmluYDtcbiAgICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oZXh0TWFwLCBlbnRyaWVzLCB0YWdnZWRFeHRlbnNpb24pO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBbLi4uZXh0TWFwLmtleXMoKV1cbiAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXJ0c1dpdGgoYCR7bmFtZX0tYCkpXG4gICAgLnNvcnQoKTtcblxuICByZXR1cm4geyBmaWxlcywgZXh0TWFwIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW1lcihiYXNlZGlyOiBzdHJpbmcsIHRhZz86IHN0cmluZyk6IFN0cmVhbWVyIHtcbiAgY29uc3QgdGFnU3VmZml4ID0gdGFnID8gYC4ke3RhZ31gIDogJyc7XG4gIGNvbnN0IHN0cmVhbUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBba2V5OiBgY2h1bms6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgIH0sXG4gICAgXTtcbiAgICBba2V5OiBgY2xvc2U6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICBdO1xuICB9PigpO1xuXG4gIC8vIFRyYWNrIHdoaWNoIHN0cmVhbXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgYSBydW4gKGluLW1lbW9yeSBjYWNoZSlcbiAgY29uc3QgcmVnaXN0ZXJlZFN0cmVhbXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXIgdG8gcmVjb3JkIHRoZSBydW5JZCA8PiBzdHJlYW1JZCBhc3NvY2lhdGlvblxuICBhc3luYyBmdW5jdGlvbiByZWdpc3RlclN0cmVhbUZvclJ1bihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0cmVhbU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIHN0cmVhbU5hbWUpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cnVuSWR9OiR7c3RyZWFtTmFtZX1gO1xuICAgIGlmIChyZWdpc3RlcmVkU3RyZWFtcy5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICB9XG5cbiAgICBjb25zdCBydW5TdHJlYW1zUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0cmVhbXMvcnVucycsIHJ1bklkLCB0YWcpO1xuXG4gICAgLy8gUmVhZCBleGlzdGluZyBzdHJlYW1zIGZvciB0aGlzIHJ1biAodHJ5IHRhZ2dlZCBmaXJzdCwgZmFsbCBiYWNrIHRvIHVudGFnZ2VkKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICBydW5JZCxcbiAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXMgPSBleGlzdGluZz8uc3RyZWFtcyA/PyBbXTtcblxuICAgIC8vIEFkZCBzdHJlYW0gaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghc3RyZWFtcy5pbmNsdWRlcyhzdHJlYW1OYW1lKSkge1xuICAgICAgc3RyZWFtcy5wdXNoKHN0cmVhbU5hbWUpO1xuICAgICAgYXdhaXQgd3JpdGVKU09OKHJ1blN0cmVhbXNQYXRoLCB7IHN0cmVhbXMgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJlZFN0cmVhbXMuYWRkKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIEhlbHBlciB0byBjb252ZXJ0IGEgY2h1bmsgdG8gYSBCdWZmZXJcbiAgZnVuY3Rpb24gdG9CdWZmZXIoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKSk7XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtczoge1xuICAgICAgYXN5bmMgd3JpdGUoXG4gICAgICAgIF9ydW5JZDogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+LFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5XG4gICAgICApIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgVUxJRCBzeW5jaHJvbm91c2x5IEJFRk9SRSBhbnkgYXdhaXQgdG8gcHJlc2VydmUgY2FsbCBvcmRlci5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgY2h1bmtzIHdyaXR0ZW4gaW4gc2VxdWVuY2UgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlblxuICAgICAgICAvLyB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZSB0aGF0IG11bHRpcGxlIHdyaXRlcyBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgY29uc3QgY2h1bmtJZCA9IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWA7XG5cbiAgICAgICAgLy8gQXdhaXQgcnVuSWQgaWYgaXQncyBhIHByb21pc2UgdG8gZW5zdXJlIHByb3BlciBmbHVzaGluZ1xuICAgICAgICBjb25zdCBydW5JZCA9IGF3YWl0IF9ydW5JZDtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGlzIHN0cmVhbSBmb3IgdGhlIHJ1blxuICAgICAgICBhd2FpdCByZWdpc3RlclN0cmVhbUZvclJ1bihydW5JZCwgbmFtZSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBjaHVuayB0byBidWZmZXIgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3QgY2h1bmtCdWZmZXIgPSB0b0J1ZmZlcihjaHVuayk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZUNodW5rKHtcbiAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgZW9mOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgJ3N0cmVhbXMnLFxuICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgIGAke25hbWV9LSR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy8gRW1pdCByZWFsLXRpbWUgZXZlbnQgd2l0aCBVaW50OEFycmF5IChjcmVhdGUgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnQpXG4gICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlcik7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwge1xuICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgd3JpdGVNdWx0aShcbiAgICAgICAgX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY2h1bmtzOiAoc3RyaW5nIHwgVWludDhBcnJheSlbXVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYWxsIFVMSURzIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBjaHVua3MgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlbiB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgY2h1bmtJZHMgPSBjaHVua3MubWFwKCgpID0+IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWApO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGNodW5rIGRhdGEgZm9yIHBhcmFsbGVsIHdyaXRlc1xuICAgICAgICBjb25zdCBjaHVua0J1ZmZlcnMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gdG9CdWZmZXIoY2h1bmspKTtcblxuICAgICAgICAvLyBXcml0ZSBhbGwgY2h1bmtzIGluIHBhcmFsbGVsIGZvciBlZmZpY2llbmN5LCBidXQgdHJhY2sgaW5kaXZpZHVhbCBjb21wbGV0aW9uXG4gICAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZXMgPSBjaHVua0J1ZmZlcnMubWFwKGFzeW5jIChjaHVua0J1ZmZlciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblxuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVDaHVuayh7XG4gICAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgICBlb2Y6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdHJlYW1zJyxcbiAgICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgICAgYCR7bmFtZX0tJHtjaHVua0lkfSR7dGFnU3VmZml4fS5iaW5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgICAvLyBSZXR1cm4gZGF0YSBuZWVkZWQgZm9yIGV2ZW50IGVtaXNzaW9uXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW1pdCBldmVudHMgaW4gb3JkZXIsIHdhaXRpbmcgZm9yIGVhY2ggY2h1bmsncyB3cml0ZSB0byBjb21wbGV0ZVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZXZlbnRzIGFyZSBlbWl0dGVkIGluIG9yZGVyIHdoaWxlIHdyaXRlcyBoYXBwZW4gaW4gcGFyYWxsZWxcbiAgICAgICAgZm9yIChjb25zdCB3cml0ZVByb21pc2Ugb2Ygd3JpdGVQcm9taXNlcykge1xuICAgICAgICAgIGNvbnN0IHsgY2h1bmtJZCwgY2h1bmtEYXRhIH0gPSBhd2FpdCB3cml0ZVByb21pc2U7XG5cbiAgICAgICAgICBzdHJlYW1FbWl0dGVyLmVtaXQoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCB7XG4gICAgICAgICAgICBzdHJlYW1OYW1lOiBuYW1lLFxuICAgICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgICAgY2h1bmtJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgY2xvc2UoX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICAvLyBHZW5lcmF0ZSBVTElEIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICBjb25zdCBjaHVua0lkID0gYGNobmtfJHttb25vdG9uaWNVbGlkKCl9YDtcblxuICAgICAgICAvLyBBd2FpdCBydW5JZCBpZiBpdCdzIGEgcHJvbWlzZSB0byBlbnN1cmUgcHJvcGVyIGZsdXNoaW5nXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuIChpbiBjYXNlIHdyaXRlIHdhc24ndCBjYWxsZWQpXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgJ3N0cmVhbXMnLFxuICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgIGAke25hbWV9LSR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKFxuICAgICAgICAgIGNodW5rUGF0aCxcbiAgICAgICAgICBzZXJpYWxpemVDaHVuayh7IGNodW5rOiBCdWZmZXIuZnJvbShbXSksIGVvZjogdHJ1ZSB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHN0cmVhbUVtaXR0ZXIuZW1pdChgY2xvc2U6JHtuYW1lfWAgYXMgY29uc3QsIHsgc3RyZWFtTmFtZTogbmFtZSB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGxpc3QocnVuSWQ6IHN0cmluZykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAnc3RyZWFtcy9ydW5zJyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBSdW5TdHJlYW1zU2NoZW1hLFxuICAgICAgICAgIHRhZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZGF0YT8uc3RyZWFtcyA/PyBbXTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldENodW5rcyhcbiAgICAgICAgX3J1bklkOiBzdHJpbmcsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IEdldENodW5rc09wdGlvbnNcbiAgICAgICk6IFByb21pc2U8U3RyZWFtQ2h1bmtzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyAxMDA7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgeyBmaWxlczogY2h1bmtGaWxlcywgZXh0TWFwOiBmaWxlRXh0TWFwIH0gPVxuICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBEZWNvZGUgY3Vyc29yXG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmN1cnNvcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgQnVmZmVyLmZyb20ob3B0aW9ucy5jdXJzb3IsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBkZWNvZGVkLmk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWxrIGZyb20gc3RhcnRJbmRleCwgcmVhZGluZyBvbmx5IHRoZSBmaWxlcyB3ZSBuZWVkLlxuICAgICAgICAvLyBGaWxlcyBiZWZvcmUgdGhlIGN1cnNvciBhcmUgc2tpcHBlZCBlbnRpcmVseS5cbiAgICAgICAgbGV0IHN0cmVhbURvbmUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q2h1bmtzOiB7IGluZGV4OiBudW1iZXI7IGRhdGE6IFVpbnQ4QXJyYXkgfVtdID0gW107XG4gICAgICAgIGxldCBkYXRhSW5kZXggPSAwOyAvLyBydW5uaW5nIGNvdW50IG9mIGRhdGEgKG5vbi1FT0YpIGZpbGVzIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCk7XG5cbiAgICAgICAgICAvLyBCZWZvcmUgdGhlIGN1cnNvcjogb25seSBuZWVkIHRvIGNoZWNrIEVPRiAoMSBieXRlKSwgc2tpcCBjb250ZW50XG4gICAgICAgICAgaWYgKGRhdGFJbmRleCA8IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpc0VvZkJ5dGUoYXdhaXQgcmVhZEZpcnN0Qnl0ZShmaWxlUGF0aCkpKSB7XG4gICAgICAgICAgICAgIHN0cmVhbURvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29sbGVjdGVkIGVub3VnaCBkYXRhIGNodW5rcyDigJQgcGVlayBhdCB0aGUgbmV4dCBmaWxlIGZvciBFT0YvaGFzTW9yZVxuICAgICAgICAgIGlmIChyZXN1bHRDaHVua3MubGVuZ3RoID49IGxpbWl0KSB7XG4gICAgICAgICAgICBpZiAoaXNFb2ZCeXRlKGF3YWl0IHJlYWRGaXJzdEJ5dGUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE1vcmUgZGF0YSBmaWxlcyBleGlzdCBiZXlvbmQgdGhpcyBwYWdlXG4gICAgICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW4gdGhlIHBhZ2Ugd2luZG93OiBkZXNlcmlhbGl6ZSBmdWxseVxuICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhhd2FpdCByZWFkQnVmZmVyKGZpbGVQYXRoKSk7XG4gICAgICAgICAgaWYgKGNodW5rLmVvZikge1xuICAgICAgICAgICAgc3RyZWFtRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0Q2h1bmtzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGRhdGFJbmRleCxcbiAgICAgICAgICAgIGRhdGE6IFVpbnQ4QXJyYXkuZnJvbShjaHVuay5jaHVuayksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGF0YUluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYXNNb3JlID0gd2Uga25vdyB0aGVyZSBhcmUgZGF0YSBmaWxlcyBiZXlvbmQgdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGhhc01vcmUgPVxuICAgICAgICAgICFzdHJlYW1Eb25lICYmIGRhdGFJbmRleCA+IHN0YXJ0SW5kZXggKyByZXN1bHRDaHVua3MubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBzdGFydEluZGV4ICsgcmVzdWx0Q2h1bmtzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV4dEN1cnNvciA9IGhhc01vcmVcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgaTogbmV4dEluZGV4IH0pKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiByZXN1bHRDaHVua3MsXG4gICAgICAgICAgY3Vyc29yOiBuZXh0Q3Vyc29yLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgZG9uZTogc3RyZWFtRG9uZSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldEluZm8oX3J1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RyZWFtSW5mb1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgeyBmaWxlczogY2h1bmtGaWxlcywgZXh0TWFwOiBmaWxlRXh0TWFwIH0gPVxuICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBSZWFkIG9ubHkgdGhlIEVPRiBtYXJrZXIgYnl0ZSBiZWNhdXNlIG1ldGFkYXRhIG5ldmVyIG5lZWRzIHBheWxvYWRzLlxuICAgICAgICBsZXQgc3RyZWFtRG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZGF0YUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHRhaWxJbmRleDogZGF0YUNvdW50IC0gMSwgZG9uZTogc3RyZWFtRG9uZSB9O1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgbGV0IHJlbW92ZUxpc3RlbmVycyA9ICgpID0+IHt9O1xuICAgICAgICBsZXQgcG9sbEludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAvLyBUcmFjayBjaHVua3MgZGVsaXZlcmVkIHZpYSBldmVudHMgdG8gcHJldmVudCBkdXBsaWNhdGVzIGFuZCBtYWludGFpbiBvcmRlci5cbiAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJlZENodW5rSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAvLyBCdWZmZXIgZm9yIGNodW5rcyB0aGF0IGFycml2ZSB2aWEgZXZlbnRzIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkRXZlbnRDaHVua3M6IEFycmF5PHtcbiAgICAgICAgICAgICAgY2h1bmtJZDogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICB9PiA9IFtdO1xuICAgICAgICAgICAgbGV0IGlzUmVhZGluZ0Zyb21EaXNrID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBjbG9zZSBldmVudCBpZiBpdCBhcnJpdmVzIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGxldCBwZW5kaW5nQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFNldCB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGNsb3NlZDsgZ3VhcmRzIGFnYWluc3QgZW5xdWV1ZS1hZnRlci1jbG9zZVxuICAgICAgICAgICAgLy8gaW4gdGhlIHBvbGxpbmcgY2FsbGJhY2sgd2hlbiBjbG9zZUxpc3RlbmVyIGZpcmVzIG1pZC1pdGVyYXRpb24uXG4gICAgICAgICAgICBsZXQgc3RyZWFtQ2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGNodW5rTGlzdGVuZXIgPSAoZXZlbnQ6IHtcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBjaHVua3MgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBkaXNrIHJlYWRpbmcgYmVoYXZpb3JcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmNodW5rRGF0YS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGV2ZW50LmNodW5rSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBCdWZmZXIgY2h1bmtzIHRoYXQgYXJyaXZlIGR1cmluZyBkaXNrIHJlYWRpbmcgdG8gbWFpbnRhaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCB3aGVuIGVucXVldWVkIGxhdGVyXG4gICAgICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGV2ZW50LmNodW5rSWQsXG4gICAgICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShldmVudC5jaHVua0RhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWxpdmVyZWRDaHVua0lkcy5oYXMoZXZlbnQuY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGR1cGxpY2F0ZXM6IHBvbGxpbmcgbWF5IGhhdmUgYWxyZWFkeSBjbGFpbWVkIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBjaHVuayBiZXR3ZWVuIGl0cyBoYXMoKSBjaGVjayBhbmQgcmVhZEJ1ZmZlcigpIHlpZWxkLlxuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBBZnRlciBkaXNrIHJlYWRpbmcgaXMgY29tcGxldGUsIGRlbGl2ZXIgY2h1bmtzIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnRcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGV2ZW50LmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgZGlzayByZWFkaW5nIGlzIHN0aWxsIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdDbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgYmVmb3JlIGNsb3NpbmdcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCBjaHVua0xpc3RlbmVyKTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNsb3NlOiR7bmFtZX1gIGFzIGNvbnN0LCBjbG9zZUxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCAoZS5nLiwgZnJvbSBjYW5jZWwoKSBvciBFT0YpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMgPSBjbG9zZUxpc3RlbmVyO1xuXG4gICAgICAgICAgICAvLyBTZXQgdXAgbGlzdGVuZXJzIEZJUlNUIHRvIGF2b2lkIG1pc3NpbmcgZXZlbnRzXG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG5cbiAgICAgICAgICAgIC8vIE5vdyBsb2FkIGV4aXN0aW5nIGNodW5rcyBmcm9tIGRpc2suXG4gICAgICAgICAgICBjb25zdCB7IGZpbGVzOiBjaHVua0ZpbGVzLCBleHRNYXA6IGZpbGVFeHRNYXAgfSA9XG4gICAgICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBuZWdhdGl2ZSBzdGFydEluZGV4IHJlbGF0aXZlIHRvIHRoZSBudW1iZXIgb2YgZGF0YSBjaHVua3NcbiAgICAgICAgICAgIC8vIChleGNsdWRpbmcgdGhlIHRyYWlsaW5nIEVPRiBtYXJrZXIgY2h1bmssIGlmIHByZXNlbnQpLlxuICAgICAgICAgICAgbGV0IGRhdGFDaHVua0NvdW50ID0gY2h1bmtGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICBzdGFydEluZGV4IDwgMCAmJlxuICAgICAgICAgICAgICBjaHVua0ZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBsYXN0RmlsZSA9IGNodW5rRmlsZXNbY2h1bmtGaWxlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEV4dCA9IGZpbGVFeHRNYXAuZ2V0KGxhc3RGaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc0VvZkJ5dGUoXG4gICAgICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtsYXN0RmlsZX0ke2xhc3RFeHR9YClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRhdGFDaHVua0NvdW50LS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3RhcnRJbmRleCA9XG4gICAgICAgICAgICAgIHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJyAmJiBzdGFydEluZGV4IDwgMFxuICAgICAgICAgICAgICAgID8gTWF0aC5tYXgoMCwgZGF0YUNodW5rQ291bnQgKyBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgIDogc3RhcnRJbmRleDtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyBleGlzdGluZyBjaHVua3MsIHNraXBwaW5nIGFueSBhbHJlYWR5IGRlbGl2ZXJlZCB2aWEgZXZlbnRzXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlc29sdmVkU3RhcnRJbmRleDsgaSA8IGNodW5rRmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGNodW5rRmlsZXNbaV07XG4gICAgICAgICAgICAgIC8vIEV4dHJhY3QgY2h1bmsgSUQgZnJvbSBmaWxlbmFtZTogXCJzdHJlYW1OYW1lLWNodW5rSWRcIiBvciBcInN0cmVhbU5hbWUtY2h1bmtJZC50YWdcIlxuICAgICAgICAgICAgICBjb25zdCByYXdDaHVua0lkID0gZmlsZS5zdWJzdHJpbmcobmFtZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgLy8gU3RyaXAgdGFnIHN1ZmZpeCAoZS5nLiwgXCJjaG5rX1VMSUQudml0ZXN0LTBcIiDihpIgXCJjaG5rX1VMSURcIilcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmtJZCA9IHRhZ1xuICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgOiByYXdDaHVua0lkO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50XG4gICAgICAgICAgICAgIGlmIChkZWxpdmVyZWRDaHVua0lkcy5oYXMoY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBkZXNlcmlhbGl6ZUNodW5rKFxuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWRCdWZmZXIocGF0aC5qb2luKGNodW5rc0RpciwgYCR7ZmlsZX0ke2V4dH1gKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUcmFjayBhcyBoYW5kbGVkIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyXG4gICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChjaHVua0lkKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gZGlzayAtIG5vdyBkZWxpdmVyIGJ1ZmZlcmVkIGV2ZW50IGNodW5rcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICAgICAgICBpc1JlYWRpbmdGcm9tRGlzayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBTb3J0IGJ1ZmZlcmVkIGNodW5rcyBieSBVTElEIChjaHJvbm9sb2dpY2FsIG9yZGVyKVxuICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICBhLmNodW5rSWQubG9jYWxlQ29tcGFyZShiLmNodW5rSWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXJlZCBvZiBidWZmZXJlZEV2ZW50Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgZm9yIGRlZmVuc2UgaW4gZGVwdGggKGFscmVhZHkgY29waWVkIGF0IHN0b3JhZ2UsIGJ1dCBiZSBleHRyYSBzYWZlKVxuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGJ1ZmZlcmVkLmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkIChlLmcuLCBmcm9tIGNsb3NlTGlzdGVuZXIgZXZlbnQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5nIGNsb3NlIGV2ZW50IHRoYXQgYXJyaXZlZCBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZ0Nsb3NlKSB7XG4gICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhY2sgcHJlLXN0YXJ0SW5kZXggY2h1bmtzIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyIHRoZW1cbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgaSA8IHJlc29sdmVkU3RhcnRJbmRleCAmJiBpIDwgY2h1bmtGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBjaHVua0ZpbGVzW2ldO1xuICAgICAgICAgICAgICBjb25zdCByYXdDaHVua0lkID0gZmlsZS5zdWJzdHJpbmcobmFtZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmtJZCA9IHRhZ1xuICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgOiByYXdDaHVua0lkO1xuICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGZpbGVzeXN0ZW0gcG9sbGluZyBmb3IgY3Jvc3MtcHJvY2VzcyBzdHJlYW1pbmcgc3VwcG9ydC5cbiAgICAgICAgICAgIC8vIFRoZSBFdmVudEVtaXR0ZXIgb25seSB3b3JrcyBpbi1wcm9jZXNzOyB3aGVuIHRoZSB3cml0ZXIgaXMgaW4gYVxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgcHJvY2VzcyAoZS5nLiBlMmUgdGVzdCBydW5uZXIg4oaUIHdvcmtiZW5jaCBhcHApLCBwb2xsaW5nXG4gICAgICAgICAgICAvLyB0aGUgc2hhcmVkIGZpbGVzeXN0ZW0gaXMgdGhlIGZhbGxiYWNrIGRlbGl2ZXJ5IG1lY2hhbmlzbS5cbiAgICAgICAgICAgIGxldCBpc1BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHBvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGlzUG9sbGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICBpc1BvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsZXM6IGN1cnJlbnRGaWxlcywgZXh0TWFwOiBjdXJyZW50RXh0TWFwIH0gPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzRGlyLCBuYW1lLCB0YWcpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGN1cnJlbnRGaWxlcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmF3Q2h1bmtJZCA9IGZpbGUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVua0lkID0gdGFnXG4gICAgICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgICAgIDogcmF3Q2h1bmtJZDtcblxuICAgICAgICAgICAgICAgICAgaWYgKGRlbGl2ZXJlZENodW5rSWRzLmhhcyhjaHVua0lkKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGN1cnJlbnRFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEJ1ZmZlcihwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBlbnF1ZXVlLWFmdGVyLWNsb3NlOiBjbG9zZUxpc3RlbmVyIG1heSBoYXZlXG4gICAgICAgICAgICAgICAgICAvLyBmaXJlZCBiZXR3ZWVuIG91ciByZWFkQnVmZmVyKCkgeWllbGQgYW5kIHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtQ2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5jaHVuay5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0cmFuc2llbnQgZmlsZXN5c3RlbSBlcnJvcnMgKEVOT0VOVCwgRUFDQ0VTLCBldGMuKVxuICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgdW5leHBlY3RlZCBlcnJvcnMgc28gYnVncyBhcmVuJ3QgaGlkZGVuXG4gICAgICAgICAgICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t3b3JsZC1sb2NhbF0gVW5leHBlY3RlZCBwb2xsaW5nIGVycm9yOicsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlzUG9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIGlmIChwb2xsSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
508
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RyZWFtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLFNBQVMsQ0FBQztBQUVqQiwyRUFBMkU7QUFDM0Usa0RBQWtEO0FBQ2xELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTVELDZDQUE2QztBQUM3QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzdCLENBQUMsQ0FBQztBQWNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixTQUFTLFNBQVMsQ0FBQyxJQUF3QjtJQUN6QyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBWTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sTUFBTSxD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QztZQUNMLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0Q2h1bmtzT3B0aW9ucyxcbiAgU3RyZWFtQ2h1bmtzUmVzcG9uc2UsXG4gIFN0cmVhbWVyLFxuICBTdHJlYW1JbmZvUmVzcG9uc2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgcmVhZEJ1ZmZlcixcbiAgcmVhZEZpcnN0Qnl0ZSxcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuXG4vLyBDcmVhdGUgYSBtb25vdG9uaWMgVUxJRCBmYWN0b3J5IHRoYXQgZW5zdXJlcyBVTElEcyBhcmUgYWx3YXlzIGluY3JlYXNpbmdcbi8vIGV2ZW4gd2hlbiBnZW5lcmF0ZWQgd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kXG5jb25zdCBtb25vdG9uaWNVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLy8gU2NoZW1hIGZvciB0aGUgcnVuLXRvLXN0cmVhbXMgbWFwcGluZyBmaWxlXG5jb25zdCBSdW5TdHJlYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJlYW1zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxufSk7XG5cbi8qKlxuICogQSBjaHVuayBjb25zaXN0cyBvZiBhIGJvb2xlYW4gYGVvZmAgaW5kaWNhdGluZyBpZiBpdCdzIHRoZSBsYXN0IGNodW5rLFxuICogYW5kIGEgYGNodW5rYCB3aGljaCBpcyBhIEJ1ZmZlciBvZiBkYXRhLlxuICogVGhlIHNlcmlhbGl6ZWQgZm9ybWF0IGlzOlxuICogLSAxIGJ5dGUgZm9yIGBlb2ZgICgwIG9yIDEpXG4gKiAtIGFuZCB0aGUgcmVzdCBpcyB0aGUgY2h1bmsgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaHVuayB7XG4gIGVvZjogYm9vbGVhbjtcbiAgY2h1bms6IEJ1ZmZlcjtcbn1cblxuY29uc3QgRU9GX01BUktFUiA9IDE7XG5cbmZ1bmN0aW9uIGlzRW9mQnl0ZShieXRlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJ5dGUgPT09IEVPRl9NQVJLRVI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDaHVuayhjaHVuazogQ2h1bmspIHtcbiAgY29uc3QgZW9mQnl0ZSA9IEJ1ZmZlci5mcm9tKFtjaHVuay5lb2YgPyBFT0ZfTUFSS0VSIDogMF0pO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbZW9mQnl0ZSwgY2h1bmsuY2h1bmtdKTtcbn1cblxuLyoqIENoZWNrIG9ubHkgdGhlIEVPRiBmbGFnIGJ5dGUgd2l0aG91dCBjb3B5aW5nIGNodW5rIHBheWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFb2ZDaHVuayhzZXJpYWxpemVkOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRW9mQnl0ZShzZXJpYWxpemVkWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ2h1bmsoc2VyaWFsaXplZDogQnVmZmVyKSB7XG4gIGNvbnN0IGVvZiA9IGlzRW9mQ2h1bmsoc2VyaWFsaXplZCk7XG4gIC8vIENyZWF0ZSBhIGNvcHkgaW5zdGVhZCBvZiBhIHZpZXcgdG8gcHJldmVudCBBcnJheUJ1ZmZlciBkZXRhY2htZW50XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZC5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7IGVvZiwgY2h1bmsgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdENodW5rRW50cmllcyhjaHVua3NEaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZGRpcihjaHVua3NEaXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihcbiAgZXh0TWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBlbnRyaWVzOiBzdHJpbmdbXSxcbiAgc291cmNlRXh0ZW5zaW9uOiBzdHJpbmcsXG4gIGZpbGVFeHRlbnNpb24gPSBzb3VyY2VFeHRlbnNpb24sXG4gIGluY2x1ZGU6IChmaWxlOiBzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5lbmRzV2l0aChzb3VyY2VFeHRlbnNpb24pKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWxlID0gZW50cnkuc2xpY2UoMCwgLXNvdXJjZUV4dGVuc2lvbi5sZW5ndGgpO1xuICAgIGlmIChpbmNsdWRlKGZpbGUpKSBleHRNYXAuc2V0KGZpbGUsIGZpbGVFeHRlbnNpb24pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcGVyLXN0cmVhbSBjaHVuayBkaXJlY3RvcnkuIENodW5rcyBhcmUgc2hhcmRlZCBvbmUgZGlyZWN0b3J5XG4gKiBwZXIgc3RyZWFtIChgc3RyZWFtcy9jaHVua3MvPHN0cmVhbU5hbWU+L2ApIHNvIHRoYXQgbGlzdGluZyBhIHN0cmVhbSdzXG4gKiBjaHVua3MgY29zdHMgTyhjaHVua3MgaW4gdGhhdCBzdHJlYW0pIHJhdGhlciB0aGFuIE8oY2h1bmtzIGluIHRoZSB3aG9sZVxuICogd29ybGQpLiBBIHRhaWwgcmVhZGVyIHBvbGxpbmcgZm9yIG5ldyBjaHVua3Mgd291bGQgb3RoZXJ3aXNlIGByZWFkZGlyYCB0aGVcbiAqIGVudGlyZSBnbG9iYWwgY2h1bmtzIGRpcmVjdG9yeSBldmVyeSAxMDBtcyDigJQgc2VlIHZlcmNlbC93b3JrZmxvdyMyNzk3LlxuICovXG5mdW5jdGlvbiBjaHVua0RpckZvclN0cmVhbShjaHVua3NCYXNlRGlyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5hbWUgYmVjb21lcyBhIHBhdGggc2VnbWVudCBiZWxvdzsgdmFsaWRhdGUgaXQgY2FuJ3QgZXNjYXBlIGNodW5rc0Jhc2VEaXIuXG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIG5hbWUpO1xuICByZXR1cm4gcGF0aC5qb2luKGNodW5rc0Jhc2VEaXIsIG5hbWUpO1xufVxuXG4vKipcbiAqIExpc3QgY2h1bmsgZmlsZXMgZm9yIGEgc3RyZWFtLCBzb3J0ZWQgY2hyb25vbG9naWNhbGx5IChVTElEIG9yZGVyKS5cbiAqIFJldHVybnMgdGhlIHNvcnRlZCBjaHVuayBrZXlzIChlYWNoIGtleSBpcyB0aGUgY2h1bmsgVUxJRCksIGEgbWFwIG9mXG4gKiBrZXkg4oaSIGV4dGVuc2lvbiBmb3IgcmVzb2x2aW5nIHRoZSBmdWxsIHBhdGgsIGFuZCB0aGUgcGVyLXN0cmVhbSBkaXJlY3RvcnlcbiAqIHRoZSBmaWxlcyBsaXZlIGluLiBIYW5kbGVzIHRhZ2dlZCBhbmQgbGVnYWN5ICguanNvbikgZm9ybWF0cy5cbiAqXG4gKiBGaWxlcyBhcmUgc3RvcmVkIHBlci1zdHJlYW0gKGA8Y2h1bmtEaXI+LzxjaHVua0lkPjx0YWdTdWZmaXg+LmJpbmApLCBzbyB0aGVcbiAqIGtleSByZXR1cm5lZCBoZXJlIGlzIGFscmVhZHkgdGhlIGNodW5rIGlkIOKAlCBubyBzdHJlYW0tbmFtZSBwcmVmaXggdG8gc3RyaXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKFxuICBjaHVua3NCYXNlRGlyOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPHsgZmlsZXM6IHN0cmluZ1tdOyBleHRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47IGRpcjogc3RyaW5nIH0+IHtcbiAgY29uc3QgZGlyID0gY2h1bmtEaXJGb3JTdHJlYW0oY2h1bmtzQmFzZURpciwgbmFtZSk7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBsaXN0Q2h1bmtFbnRyaWVzKGRpcik7XG4gIGNvbnN0IGV4dE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihleHRNYXAsIGVudHJpZXMsICcuanNvbicpO1xuICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oXG4gICAgZXh0TWFwLFxuICAgIGVudHJpZXMsXG4gICAgJy5iaW4nLFxuICAgICcuYmluJyxcbiAgICB0YWcgPyAoZmlsZSkgPT4gIWZpbGUuZW5kc1dpdGgoYC4ke3RhZ31gKSA6IHVuZGVmaW5lZFxuICApO1xuXG4gIGlmICh0YWcpIHtcbiAgICBjb25zdCB0YWdnZWRFeHRlbnNpb24gPSBgLiR7dGFnfS5iaW5gO1xuICAgIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihleHRNYXAsIGVudHJpZXMsIHRhZ2dlZEV4dGVuc2lvbik7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IFsuLi5leHRNYXAua2V5cygpXS5zb3J0KCk7XG5cbiAgcmV0dXJuIHsgZmlsZXMsIGV4dE1hcCwgZGlyIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW1lcihiYXNlZGlyOiBzdHJpbmcsIHRhZz86IHN0cmluZyk6IFN0cmVhbWVyIHtcbiAgY29uc3QgdGFnU3VmZml4ID0gdGFnID8gYC4ke3RhZ31gIDogJyc7XG4gIGNvbnN0IHN0cmVhbUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBba2V5OiBgY2h1bms6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgIH0sXG4gICAgXTtcbiAgICBba2V5OiBgY2xvc2U6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICBdO1xuICB9PigpO1xuXG4gIC8vIFRyYWNrIHdoaWNoIHN0cmVhbXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgYSBydW4gKGluLW1lbW9yeSBjYWNoZSlcbiAgY29uc3QgcmVnaXN0ZXJlZFN0cmVhbXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXIgdG8gcmVjb3JkIHRoZSBydW5JZCA8PiBzdHJlYW1JZCBhc3NvY2lhdGlvblxuICBhc3luYyBmdW5jdGlvbiByZWdpc3RlclN0cmVhbUZvclJ1bihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0cmVhbU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIHN0cmVhbU5hbWUpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cnVuSWR9OiR7c3RyZWFtTmFtZX1gO1xuICAgIGlmIChyZWdpc3RlcmVkU3RyZWFtcy5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICB9XG5cbiAgICBjb25zdCBydW5TdHJlYW1zUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0cmVhbXMvcnVucycsIHJ1bklkLCB0YWcpO1xuXG4gICAgLy8gUmVhZCBleGlzdGluZyBzdHJlYW1zIGZvciB0aGlzIHJ1biAodHJ5IHRhZ2dlZCBmaXJzdCwgZmFsbCBiYWNrIHRvIHVudGFnZ2VkKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICBydW5JZCxcbiAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXMgPSBleGlzdGluZz8uc3RyZWFtcyA/PyBbXTtcblxuICAgIC8vIEFkZCBzdHJlYW0gaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghc3RyZWFtcy5pbmNsdWRlcyhzdHJlYW1OYW1lKSkge1xuICAgICAgc3RyZWFtcy5wdXNoKHN0cmVhbU5hbWUpO1xuICAgICAgYXdhaXQgd3JpdGVKU09OKHJ1blN0cmVhbXNQYXRoLCB7IHN0cmVhbXMgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJlZFN0cmVhbXMuYWRkKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIEhlbHBlciB0byBjb252ZXJ0IGEgY2h1bmsgdG8gYSBCdWZmZXJcbiAgZnVuY3Rpb24gdG9CdWZmZXIoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKSk7XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtczoge1xuICAgICAgYXN5bmMgd3JpdGUoXG4gICAgICAgIF9ydW5JZDogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+LFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5XG4gICAgICApIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgVUxJRCBzeW5jaHJvbm91c2x5IEJFRk9SRSBhbnkgYXdhaXQgdG8gcHJlc2VydmUgY2FsbCBvcmRlci5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgY2h1bmtzIHdyaXR0ZW4gaW4gc2VxdWVuY2UgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlblxuICAgICAgICAvLyB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZSB0aGF0IG11bHRpcGxlIHdyaXRlcyBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgY29uc3QgY2h1bmtJZCA9IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWA7XG5cbiAgICAgICAgLy8gQXdhaXQgcnVuSWQgaWYgaXQncyBhIHByb21pc2UgdG8gZW5zdXJlIHByb3BlciBmbHVzaGluZ1xuICAgICAgICBjb25zdCBydW5JZCA9IGF3YWl0IF9ydW5JZDtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGlzIHN0cmVhbSBmb3IgdGhlIHJ1blxuICAgICAgICBhd2FpdCByZWdpc3RlclN0cmVhbUZvclJ1bihydW5JZCwgbmFtZSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBjaHVuayB0byBidWZmZXIgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3QgY2h1bmtCdWZmZXIgPSB0b0J1ZmZlcihjaHVuayk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZUNodW5rKHtcbiAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgZW9mOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGNodW5rRGlyRm9yU3RyZWFtKHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKSwgbmFtZSksXG4gICAgICAgICAgYCR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy8gRW1pdCByZWFsLXRpbWUgZXZlbnQgd2l0aCBVaW50OEFycmF5IChjcmVhdGUgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnQpXG4gICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlcik7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwge1xuICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgd3JpdGVNdWx0aShcbiAgICAgICAgX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY2h1bmtzOiAoc3RyaW5nIHwgVWludDhBcnJheSlbXVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYWxsIFVMSURzIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBjaHVua3MgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlbiB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgY2h1bmtJZHMgPSBjaHVua3MubWFwKCgpID0+IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWApO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGNodW5rIGRhdGEgZm9yIHBhcmFsbGVsIHdyaXRlc1xuICAgICAgICBjb25zdCBjaHVua0J1ZmZlcnMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gdG9CdWZmZXIoY2h1bmspKTtcblxuICAgICAgICAvLyBXcml0ZSBhbGwgY2h1bmtzIGluIHBhcmFsbGVsIGZvciBlZmZpY2llbmN5LCBidXQgdHJhY2sgaW5kaXZpZHVhbCBjb21wbGV0aW9uXG4gICAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZXMgPSBjaHVua0J1ZmZlcnMubWFwKGFzeW5jIChjaHVua0J1ZmZlciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblxuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVDaHVuayh7XG4gICAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgICBlb2Y6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgY2h1bmtEaXJGb3JTdHJlYW0ocGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpLCBuYW1lKSxcbiAgICAgICAgICAgIGAke2NodW5rSWR9JHt0YWdTdWZmaXh9LmJpbmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYXdhaXQgd3JpdGUoY2h1bmtQYXRoLCBzZXJpYWxpemVkKTtcblxuICAgICAgICAgIC8vIFJldHVybiBkYXRhIG5lZWRlZCBmb3IgZXZlbnQgZW1pc3Npb25cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2h1bmtJZCxcbiAgICAgICAgICAgIGNodW5rRGF0YTogVWludDhBcnJheS5mcm9tKGNodW5rQnVmZmVyKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50cyBpbiBvcmRlciwgd2FpdGluZyBmb3IgZWFjaCBjaHVuaydzIHdyaXRlIHRvIGNvbXBsZXRlXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBldmVudHMgYXJlIGVtaXR0ZWQgaW4gb3JkZXIgd2hpbGUgd3JpdGVzIGhhcHBlbiBpbiBwYXJhbGxlbFxuICAgICAgICBmb3IgKGNvbnN0IHdyaXRlUHJvbWlzZSBvZiB3cml0ZVByb21pc2VzKSB7XG4gICAgICAgICAgY29uc3QgeyBjaHVua0lkLCBjaHVua0RhdGEgfSA9IGF3YWl0IHdyaXRlUHJvbWlzZTtcblxuICAgICAgICAgIHN0cmVhbUVtaXR0ZXIuZW1pdChgY2h1bms6JHtuYW1lfWAgYXMgY29uc3QsIHtcbiAgICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgICBjaHVua0RhdGEsXG4gICAgICAgICAgICBjaHVua0lkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjbG9zZShfcnVuSWQ6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIFVMSUQgc3luY2hyb25vdXNseSBCRUZPUkUgYW55IGF3YWl0IHRvIHByZXNlcnZlIGNhbGwgb3JkZXIuXG4gICAgICAgIGNvbnN0IGNodW5rSWQgPSBgY2hua18ke21vbm90b25pY1VsaWQoKX1gO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlIHRvIGVuc3VyZSBwcm9wZXIgZmx1c2hpbmdcbiAgICAgICAgY29uc3QgcnVuSWQgPSBhd2FpdCBfcnVuSWQ7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhpcyBzdHJlYW0gZm9yIHRoZSBydW4gKGluIGNhc2Ugd3JpdGUgd2Fzbid0IGNhbGxlZClcbiAgICAgICAgYXdhaXQgcmVnaXN0ZXJTdHJlYW1Gb3JSdW4ocnVuSWQsIG5hbWUpO1xuICAgICAgICBjb25zdCBjaHVua1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgY2h1bmtEaXJGb3JTdHJlYW0ocGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpLCBuYW1lKSxcbiAgICAgICAgICBgJHtjaHVua0lkfSR7dGFnU3VmZml4fS5iaW5gXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgd3JpdGUoXG4gICAgICAgICAgY2h1bmtQYXRoLFxuICAgICAgICAgIHNlcmlhbGl6ZUNodW5rKHsgY2h1bms6IEJ1ZmZlci5mcm9tKFtdKSwgZW9mOiB0cnVlIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgeyBzdHJlYW1OYW1lOiBuYW1lIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgbGlzdChydW5JZDogc3RyaW5nKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICAgICAgdGFnXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkYXRhPy5zdHJlYW1zID8/IFtdO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0Q2h1bmtzKFxuICAgICAgICBfcnVuSWQ6IHN0cmluZyxcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogR2V0Q2h1bmtzT3B0aW9uc1xuICAgICAgKTogUHJvbWlzZTxTdHJlYW1DaHVua3NSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0ID8/IDEwMDtcbiAgICAgICAgY29uc3QgY2h1bmtzQmFzZURpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGZpbGVzOiBjaHVua0ZpbGVzLFxuICAgICAgICAgIGV4dE1hcDogZmlsZUV4dE1hcCxcbiAgICAgICAgICBkaXI6IGNodW5rc0RpcixcbiAgICAgICAgfSA9IGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0Jhc2VEaXIsIG5hbWUsIHRhZyk7XG5cbiAgICAgICAgLy8gRGVjb2RlIGN1cnNvclxuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIGlmIChvcHRpb25zPy5jdXJzb3IpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKG9wdGlvbnMuY3Vyc29yLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04JylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gZGVjb2RlZC5pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FsayBmcm9tIHN0YXJ0SW5kZXgsIHJlYWRpbmcgb25seSB0aGUgZmlsZXMgd2UgbmVlZC5cbiAgICAgICAgLy8gRmlsZXMgYmVmb3JlIHRoZSBjdXJzb3IgYXJlIHNraXBwZWQgZW50aXJlbHkuXG4gICAgICAgIGxldCBzdHJlYW1Eb25lID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdENodW5rczogeyBpbmRleDogbnVtYmVyOyBkYXRhOiBVaW50OEFycmF5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgZGF0YUluZGV4ID0gMDsgLy8gcnVubmluZyBjb3VudCBvZiBkYXRhIChub24tRU9GKSBmaWxlcyBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApO1xuXG4gICAgICAgICAgLy8gQmVmb3JlIHRoZSBjdXJzb3I6IG9ubHkgbmVlZCB0byBjaGVjayBFT0YgKDEgYnl0ZSksIHNraXAgY29udGVudFxuICAgICAgICAgIGlmIChkYXRhSW5kZXggPCBzdGFydEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoaXNFb2ZCeXRlKGF3YWl0IHJlYWRGaXJzdEJ5dGUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENvbGxlY3RlZCBlbm91Z2ggZGF0YSBjaHVua3Mg4oCUIHBlZWsgYXQgdGhlIG5leHQgZmlsZSBmb3IgRU9GL2hhc01vcmVcbiAgICAgICAgICBpZiAocmVzdWx0Q2h1bmtzLmxlbmd0aCA+PSBsaW1pdCkge1xuICAgICAgICAgICAgaWYgKGlzRW9mQnl0ZShhd2FpdCByZWFkRmlyc3RCeXRlKGZpbGVQYXRoKSkpIHtcbiAgICAgICAgICAgICAgc3RyZWFtRG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBNb3JlIGRhdGEgZmlsZXMgZXhpc3QgYmV5b25kIHRoaXMgcGFnZVxuICAgICAgICAgICAgICBkYXRhSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEluIHRoZSBwYWdlIHdpbmRvdzogZGVzZXJpYWxpemUgZnVsbHlcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGRlc2VyaWFsaXplQ2h1bmsoYXdhaXQgcmVhZEJ1ZmZlcihmaWxlUGF0aCkpO1xuICAgICAgICAgIGlmIChjaHVuay5lb2YpIHtcbiAgICAgICAgICAgIHN0cmVhbURvbmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgIGluZGV4OiBkYXRhSW5kZXgsXG4gICAgICAgICAgICBkYXRhOiBVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFzTW9yZSA9IHdlIGtub3cgdGhlcmUgYXJlIGRhdGEgZmlsZXMgYmV5b25kIHRoaXMgcGFnZVxuICAgICAgICBjb25zdCBoYXNNb3JlID1cbiAgICAgICAgICAhc3RyZWFtRG9uZSAmJiBkYXRhSW5kZXggPiBzdGFydEluZGV4ICsgcmVzdWx0Q2h1bmtzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gc3RhcnRJbmRleCArIHJlc3VsdENodW5rcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5leHRDdXJzb3IgPSBoYXNNb3JlXG4gICAgICAgICAgPyBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGk6IG5leHRJbmRleCB9KSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogcmVzdWx0Q2h1bmtzLFxuICAgICAgICAgIGN1cnNvcjogbmV4dEN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIGRvbmU6IHN0cmVhbURvbmUsXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICBhc3luYyBnZXRJbmZvKF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFN0cmVhbUluZm9SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBjaHVua3NCYXNlRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZmlsZXM6IGNodW5rRmlsZXMsXG4gICAgICAgICAgZXh0TWFwOiBmaWxlRXh0TWFwLFxuICAgICAgICAgIGRpcjogY2h1bmtzRGlyLFxuICAgICAgICB9ID0gYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzQmFzZURpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBSZWFkIG9ubHkgdGhlIEVPRiBtYXJrZXIgYnl0ZSBiZWNhdXNlIG1ldGFkYXRhIG5ldmVyIG5lZWRzIHBheWxvYWRzLlxuICAgICAgICBsZXQgc3RyZWFtRG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZGF0YUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHRhaWxJbmRleDogZGF0YUNvdW50IC0gMSwgZG9uZTogc3RyZWFtRG9uZSB9O1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc0Jhc2VEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3N0cmVhbXMnLCAnY2h1bmtzJyk7XG4gICAgICAgIC8vIFRlYXJzIGRvd24gZXZlcnl0aGluZyB0aGUgcmVhZGVyIGhvbGRzIG9wZW46IGJvdGggZW1pdHRlciBsaXN0ZW5lcnNcbiAgICAgICAgLy8gYW5kIHRoZSBmaWxlc3lzdGVtIHBvbGwgaW50ZXJ2YWwuIEFzc2lnbmVkIG9uY2UgbGlzdGVuZXJzIGFyZSB3aXJlZFxuICAgICAgICAvLyB1cCBpbiBzdGFydCgpOyBjYWxsZWQgb24gY2FuY2VsKCkgYW5kIG9uIHRlcm1pbmFsIChFT0YvY2xvc2UpIHBhdGhzLlxuICAgICAgICAvLyBLZXB0IHJvYnVzdCAodW5jb25kaXRpb25hbCkgc28gYSBjYW5jZWwoKSB3aGlsZSBzdGlsbCByZWFkaW5nIGZyb21cbiAgICAgICAgLy8gZGlzayBjYW4ndCBsZWFrIGEgbGlzdGVuZXIvcG9sbCDigJQgYSBzaWduYWwtYmVhcmluZyBzdGVwIG9wZW5zIG9uZSBvZlxuICAgICAgICAvLyB0aGVzZSByZWFkZXJzIHBlciBpbnZvY2F0aW9uLCBzbyBhbnkgbGVhayBhY2N1bXVsYXRlcyBmYXN0LlxuICAgICAgICBsZXQgdGVhcmRvd24gPSAoKSA9PiB7fTtcbiAgICAgICAgbGV0IHBvbGxJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIC8vIFNldCB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGNsb3NlZC9jYW5jZWxsZWQ7IGd1YXJkcyBhZ2FpbnN0XG4gICAgICAgIC8vIGVucXVldWUtYWZ0ZXItY2xvc2UgaW4gdGhlIHBvbGxpbmcgY2FsbGJhY2sgd2hlbiB0ZWFyZG93biBmaXJlc1xuICAgICAgICAvLyBtaWQtaXRlcmF0aW9uLlxuICAgICAgICBsZXQgc3RyZWFtQ2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgICAgICAgYXN5bmMgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgLy8gVHJhY2sgY2h1bmtzIGRlbGl2ZXJlZCB2aWEgZXZlbnRzIHRvIHByZXZlbnQgZHVwbGljYXRlcyBhbmQgbWFpbnRhaW4gb3JkZXIuXG4gICAgICAgICAgICBjb25zdCBkZWxpdmVyZWRDaHVua0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgLy8gQnVmZmVyIGZvciBjaHVua3MgdGhhdCBhcnJpdmUgdmlhIGV2ZW50cyBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBjb25zdCBidWZmZXJlZEV2ZW50Q2h1bmtzOiBBcnJheTx7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgY2h1bmtEYXRhOiBVaW50OEFycmF5O1xuICAgICAgICAgICAgfT4gPSBbXTtcbiAgICAgICAgICAgIGxldCBpc1JlYWRpbmdGcm9tRGlzayA9IHRydWU7XG4gICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgaXQgYXJyaXZlcyBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBsZXQgcGVuZGluZ0Nsb3NlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGNodW5rTGlzdGVuZXIgPSAoZXZlbnQ6IHtcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBjaHVua3MgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBkaXNrIHJlYWRpbmcgYmVoYXZpb3JcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmNodW5rRGF0YS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGV2ZW50LmNodW5rSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBCdWZmZXIgY2h1bmtzIHRoYXQgYXJyaXZlIGR1cmluZyBkaXNrIHJlYWRpbmcgdG8gbWFpbnRhaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCB3aGVuIGVucXVldWVkIGxhdGVyXG4gICAgICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGV2ZW50LmNodW5rSWQsXG4gICAgICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShldmVudC5jaHVua0RhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWxpdmVyZWRDaHVua0lkcy5oYXMoZXZlbnQuY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGR1cGxpY2F0ZXM6IHBvbGxpbmcgbWF5IGhhdmUgYWxyZWFkeSBjbGFpbWVkIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBjaHVuayBiZXR3ZWVuIGl0cyBoYXMoKSBjaGVjayBhbmQgcmVhZEJ1ZmZlcigpIHlpZWxkLlxuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBBZnRlciBkaXNrIHJlYWRpbmcgaXMgY29tcGxldGUsIGRlbGl2ZXIgY2h1bmtzIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnRcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGV2ZW50LmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgZGlzayByZWFkaW5nIGlzIHN0aWxsIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdDbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgYmVmb3JlIGNsb3NpbmdcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkIChlLmcuLCBmcm9tIGNhbmNlbCgpIG9yIEVPRilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFRlYXIgZG93biBsaXN0ZW5lcnMgYW5kIHRoZSBwb2xsIHVuY29uZGl0aW9uYWxseS4gVW5saWtlXG4gICAgICAgICAgICAvLyBjbG9zZUxpc3RlbmVyIHRoaXMgbmV2ZXIgZGVmZXJzIG9uIGlzUmVhZGluZ0Zyb21EaXNrLCBzbyBjYW5jZWwoKVxuICAgICAgICAgICAgLy8gcmVsaWFibHkgcmVsZWFzZXMgdGhlIHJlYWRlciBldmVuIG1pZC1kaXNrLXJlYWQuXG4gICAgICAgICAgICB0ZWFyZG93biA9ICgpID0+IHtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCBjaHVua0xpc3RlbmVyKTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNsb3NlOiR7bmFtZX1gIGFzIGNvbnN0LCBjbG9zZUxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTZXQgdXAgbGlzdGVuZXJzIEZJUlNUIHRvIGF2b2lkIG1pc3NpbmcgZXZlbnRzXG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG5cbiAgICAgICAgICAgIC8vIE5vdyBsb2FkIGV4aXN0aW5nIGNodW5rcyBmcm9tIGRpc2suXG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGZpbGVzOiBjaHVua0ZpbGVzLFxuICAgICAgICAgICAgICBleHRNYXA6IGZpbGVFeHRNYXAsXG4gICAgICAgICAgICAgIGRpcjogY2h1bmtzRGlyLFxuICAgICAgICAgICAgfSA9IGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0Jhc2VEaXIsIG5hbWUsIHRhZyk7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgbmVnYXRpdmUgc3RhcnRJbmRleCByZWxhdGl2ZSB0byB0aGUgbnVtYmVyIG9mIGRhdGEgY2h1bmtzXG4gICAgICAgICAgICAvLyAoZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBFT0YgbWFya2VyIGNodW5rLCBpZiBwcmVzZW50KS5cbiAgICAgICAgICAgIGxldCBkYXRhQ2h1bmtDb3VudCA9IGNodW5rRmlsZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCA8IDAgJiZcbiAgICAgICAgICAgICAgY2h1bmtGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEZpbGUgPSBjaHVua0ZpbGVzW2NodW5rRmlsZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIGNvbnN0IGxhc3RFeHQgPSBmaWxlRXh0TWFwLmdldChsYXN0RmlsZSkgPz8gJy5iaW4nO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEZpcnN0Qnl0ZShcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGNodW5rc0RpciwgYCR7bGFzdEZpbGV9JHtsYXN0RXh0fWApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkYXRhQ2h1bmtDb3VudC0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFN0YXJ0SW5kZXggPVxuICAgICAgICAgICAgICB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcicgJiYgc3RhcnRJbmRleCA8IDBcbiAgICAgICAgICAgICAgICA/IE1hdGgubWF4KDAsIGRhdGFDaHVua0NvdW50ICsgc3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICA6IHN0YXJ0SW5kZXg7XG5cbiAgICAgICAgICAgIC8vIFByb2Nlc3MgZXhpc3RpbmcgY2h1bmtzLCBza2lwcGluZyBhbnkgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50c1xuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSByZXNvbHZlZFN0YXJ0SW5kZXg7IGkgPCBjaHVua0ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBjaHVua0ZpbGVzW2ldO1xuICAgICAgICAgICAgICAvLyBGaWxlcyBhcmUgc2hhcmRlZCBwZXIgc3RyZWFtLCBzbyB0aGUga2V5IGlzIGFscmVhZHkgdGhlIGNodW5rIGlkXG4gICAgICAgICAgICAgIC8vIChubyBzdHJlYW0tbmFtZSBwcmVmaXgsIHRhZyBzdWZmaXggYWxyZWFkeSBzdHJpcHBlZCkuXG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBmaWxlO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50XG4gICAgICAgICAgICAgIGlmIChkZWxpdmVyZWRDaHVua0lkcy5oYXMoY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBkZXNlcmlhbGl6ZUNodW5rKFxuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWRCdWZmZXIocGF0aC5qb2luKGNodW5rc0RpciwgYCR7ZmlsZX0ke2V4dH1gKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUcmFjayBhcyBoYW5kbGVkIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyXG4gICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChjaHVua0lkKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gZGlzayAtIG5vdyBkZWxpdmVyIGJ1ZmZlcmVkIGV2ZW50IGNodW5rcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICAgICAgICBpc1JlYWRpbmdGcm9tRGlzayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBTb3J0IGJ1ZmZlcmVkIGNodW5rcyBieSBVTElEIChjaHJvbm9sb2dpY2FsIG9yZGVyKVxuICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICBhLmNodW5rSWQubG9jYWxlQ29tcGFyZShiLmNodW5rSWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXJlZCBvZiBidWZmZXJlZEV2ZW50Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgZm9yIGRlZmVuc2UgaW4gZGVwdGggKGFscmVhZHkgY29waWVkIGF0IHN0b3JhZ2UsIGJ1dCBiZSBleHRyYSBzYWZlKVxuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGJ1ZmZlcmVkLmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgICBzdHJlYW1DbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGlmIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBjbG9zZWQgKGUuZy4sIGZyb20gY2xvc2VMaXN0ZW5lciBldmVudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb2Nlc3MgYW55IHBlbmRpbmcgY2xvc2UgZXZlbnQgdGhhdCBhcnJpdmVkIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nQ2xvc2UpIHtcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmUtc3RhcnRJbmRleCBjaHVua3Mgc28gcG9sbGluZyBkb2Vzbid0IHJlLWRlbGl2ZXIgdGhlbVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICBpIDwgcmVzb2x2ZWRTdGFydEluZGV4ICYmIGkgPCBjaHVua0ZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gRmlsZXMgYXJlIHNoYXJkZWQgcGVyIHN0cmVhbTogdGhlIGtleSBpcyBhbHJlYWR5IHRoZSBjaHVuayBpZC5cbiAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGNodW5rRmlsZXNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVhZGVyIHdhcyBhbHJlYWR5IGNhbmNlbGxlZC9jbG9zZWQgd2hpbGUgd2Ugd2VyZSByZWFkaW5nXG4gICAgICAgICAgICAvLyBmcm9tIGRpc2sgYWJvdmUgKHN0YXJ0KCkgeWllbGRzIGF0IGV2ZXJ5IGF3YWl0KSwgZG9uJ3QgYXJtIHRoZVxuICAgICAgICAgICAgLy8gcG9sbCDigJQgY2FuY2VsKCkncyB0ZWFyZG93biByYW4gYmVmb3JlIHRoaXMgcG9pbnQgYW5kIHdvdWxkIGxlYXZlXG4gICAgICAgICAgICAvLyB0aGUgZnJlc2hseS1jcmVhdGVkIGludGVydmFsIG9ycGhhbmVkLlxuICAgICAgICAgICAgaWYgKHN0cmVhbUNsb3NlZCkge1xuICAgICAgICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGZpbGVzeXN0ZW0gcG9sbGluZyBmb3IgY3Jvc3MtcHJvY2VzcyBzdHJlYW1pbmcgc3VwcG9ydC5cbiAgICAgICAgICAgIC8vIFRoZSBFdmVudEVtaXR0ZXIgb25seSB3b3JrcyBpbi1wcm9jZXNzOyB3aGVuIHRoZSB3cml0ZXIgaXMgaW4gYVxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgcHJvY2VzcyAoZS5nLiBlMmUgdGVzdCBydW5uZXIg4oaUIHdvcmtiZW5jaCBhcHApLCBwb2xsaW5nXG4gICAgICAgICAgICAvLyB0aGUgc2hhcmVkIGZpbGVzeXN0ZW0gaXMgdGhlIGZhbGxiYWNrIGRlbGl2ZXJ5IG1lY2hhbmlzbS5cbiAgICAgICAgICAgIGxldCBpc1BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHBvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGlzUG9sbGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICBpc1BvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsZXM6IGN1cnJlbnRGaWxlcywgZXh0TWFwOiBjdXJyZW50RXh0TWFwIH0gPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzQmFzZURpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBjdXJyZW50RmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZpbGVzIGFyZSBzaGFyZGVkIHBlciBzdHJlYW06IHRoZSBrZXkgaXMgYWxyZWFkeSB0aGUgY2h1bmsgaWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVua0lkID0gZmlsZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGRlbGl2ZXJlZENodW5rSWRzLmhhcyhjaHVua0lkKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGN1cnJlbnRFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEJ1ZmZlcihwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVucXVldWUtYWZ0ZXItY2xvc2U6IGNsb3NlTGlzdGVuZXIgbWF5IGhhdmVcbiAgICAgICAgICAgICAgICAgIC8vIGZpcmVkIGJldHdlZW4gb3VyIHJlYWRCdWZmZXIoKSB5aWVsZCBhbmQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1DbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFVpbnQ4QXJyYXkuZnJvbShjaHVuay5jaHVuaykpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHRyYW5zaWVudCBmaWxlc3lzdGVtIGVycm9ycyAoRU5PRU5ULCBFQUNDRVMsIGV0Yy4pXG4gICAgICAgICAgICAgICAgLy8gU3VyZmFjZSB1bmV4cGVjdGVkIGVycm9ycyBzbyBidWdzIGFyZW4ndCBoaWRkZW5cbiAgICAgICAgICAgICAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyKSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3dvcmxkLWxvY2FsXSBVbmV4cGVjdGVkIHBvbGxpbmcgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaXNQb2xsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIHN0cmVhbUNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/world-local",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.24",
|
|
4
4
|
"description": "Local development World implementation for Workflow SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"ulid": "~3.0.1",
|
|
29
29
|
"undici": "7.28.0",
|
|
30
30
|
"zod": "~4.3.6",
|
|
31
|
-
"@workflow/errors": "5.0.0-beta.
|
|
32
|
-
"@workflow/utils": "5.0.0-beta.
|
|
33
|
-
"@workflow/world": "5.0.0-beta.
|
|
31
|
+
"@workflow/errors": "5.0.0-beta.10",
|
|
32
|
+
"@workflow/utils": "5.0.0-beta.6",
|
|
33
|
+
"@workflow/world": "5.0.0-beta.16"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@opentelemetry/api": "1.9.0",
|