@nlabs/lex 1.49.3 → 1.49.5

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.
@@ -2,7 +2,7 @@ import boxen from "boxen";
2
2
  import chalk from "chalk";
3
3
  import express from "express";
4
4
  import { readFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
5
- import { networkInterfaces, homedir } from "os";
5
+ import { homedir } from "os";
6
6
  import { resolve as pathResolve, join } from "path";
7
7
  import { WebSocketServer } from "ws";
8
8
  import { LexConfig } from "../../LexConfig.js";
@@ -57,35 +57,6 @@ const fetchPublicIp = (forceRefresh = false) => new Promise((resolve) => {
57
57
  resolve(ip);
58
58
  }).catch(() => resolve(void 0));
59
59
  });
60
- const getNetworkAddresses = () => {
61
- const interfaces = networkInterfaces();
62
- const addresses = {
63
- local: "localhost",
64
- private: null,
65
- public: null
66
- };
67
- for (const name of Object.keys(interfaces)) {
68
- const networkInterface = interfaces[name];
69
- if (!networkInterface) {
70
- continue;
71
- }
72
- for (const iface of networkInterface) {
73
- if (iface.family === "IPv4" && !iface.internal) {
74
- const ip = iface.address;
75
- if (ip.startsWith("10.") || ip.startsWith("192.168.") || ip.startsWith("172.")) {
76
- if (!addresses.private) {
77
- addresses.private = ip;
78
- }
79
- } else {
80
- if (!addresses.public) {
81
- addresses.public = ip;
82
- }
83
- }
84
- }
85
- }
86
- }
87
- return addresses;
88
- };
89
60
  const displayServerStatus = (httpPort, httpsPort, wsPort, host, quiet, publicIp) => {
90
61
  if (quiet) {
91
62
  return;
@@ -113,11 +84,11 @@ ${chalk.green("Public:")} ${chalk.underline(`http://${publicIp}:${httpPort}`)
113
84
  ${urlLines}
114
85
  ${chalk.yellow("Press Ctrl+C to stop the server")}`,
115
86
  {
116
- padding: 1,
117
- margin: 1,
118
- borderStyle: "round",
87
+ backgroundColor: "#1a1a1a",
119
88
  borderColor: "cyan",
120
- backgroundColor: "#1a1a1a"
89
+ borderStyle: "round",
90
+ margin: 1,
91
+ padding: 1
121
92
  }
122
93
  );
123
94
  console.log(`
@@ -188,7 +159,7 @@ const captureConsoleLogs = (handler, quiet) => {
188
159
  }
189
160
  };
190
161
  };
191
- const createExpressServer = async (config, outputDir, httpPort, host, quiet, debug, printOutput) => {
162
+ const createExpressServer = async (config, outputDir, httpPort, host, quiet, debug) => {
192
163
  const app = express();
193
164
  app.use((req, res, next) => {
194
165
  res.header("Access-Control-Allow-Origin", "*");
@@ -272,25 +243,24 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
272
243
  originalConsoleLog(`[GraphQL] ${logMessage}`);
273
244
  };
274
245
  const context = {
275
- req,
276
- res,
246
+ awsRequestId: "test-request-id",
277
247
  functionName: "graphql",
278
248
  functionVersion: "$LATEST",
249
+ getRemainingTimeInMillis: () => 3e4,
279
250
  invokedFunctionArn: "arn:aws:lambda:us-east-1:123456789012:function:graphql",
280
- memoryLimitInMB: "128",
281
- awsRequestId: "test-request-id",
282
251
  logGroupName: "/aws/lambda/graphql",
283
252
  logStreamName: "test-log-stream",
284
- getRemainingTimeInMillis: () => 3e4
253
+ req,
254
+ res
285
255
  };
286
256
  const wrappedHandler = captureConsoleLogs(graphqlHandler, quiet);
287
257
  try {
288
258
  const result = await wrappedHandler({
259
+ body: JSON.stringify(req.body),
260
+ headers: req.headers,
289
261
  httpMethod: "POST",
290
262
  path: graphqlPath,
291
- headers: req.headers,
292
- queryStringParameters: {},
293
- body: JSON.stringify(req.body)
263
+ queryStringParameters: {}
294
264
  }, context);
295
265
  console.log = originalConsoleLog;
296
266
  if (result && typeof result === "object" && result.statusCode) {
@@ -319,7 +289,8 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
319
289
  try {
320
290
  const url = req.url || "/";
321
291
  const method = req.method || "GET";
322
- log(`${method} ${url}`, "info", false);
292
+ const pathname = req.path || url.split("?")[0];
293
+ log(`${method} ${url} (pathname: ${pathname})`, "info", false);
323
294
  let matchedFunction = null;
324
295
  if (config.functions) {
325
296
  for (const [functionName, functionConfig] of Object.entries(config.functions)) {
@@ -328,7 +299,7 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
328
299
  if (event.http) {
329
300
  const eventPath = event.http.path || "/";
330
301
  const eventMethod = event.http.method || "GET";
331
- if (eventPath && eventPath === url && eventMethod === method) {
302
+ if (eventPath && eventPath === pathname && eventMethod === method) {
332
303
  matchedFunction = functionName;
333
304
  break;
334
305
  }
@@ -353,14 +324,14 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
353
324
  queryStringParameters: req.query
354
325
  };
355
326
  const context = {
327
+ awsRequestId: "test-request-id",
356
328
  functionName: matchedFunction,
357
329
  functionVersion: "$LATEST",
330
+ getRemainingTimeInMillis: () => 3e4,
358
331
  invokedFunctionArn: `arn:aws:lambda:us-east-1:123456789012:function:${matchedFunction}`,
359
- memoryLimitInMB: "128",
360
- awsRequestId: "test-request-id",
361
332
  logGroupName: `/aws/lambda/${matchedFunction}`,
362
333
  logStreamName: "test-log-stream",
363
- getRemainingTimeInMillis: () => 3e4
334
+ memoryLimitInMB: "128"
364
335
  };
365
336
  try {
366
337
  const result = await wrappedHandler(event, context);
@@ -392,7 +363,7 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
392
363
  });
393
364
  return app;
394
365
  };
395
- const createWebSocketServer = (config, outputDir, wsPort, quiet, debug, printOutput) => {
366
+ const createWebSocketServer = (config, outputDir, wsPort, quiet, debug) => {
396
367
  const wss = new WebSocketServer({ port: wsPort });
397
368
  wss.on("connection", async (ws, req) => {
398
369
  log(`WebSocket connection established: ${req.url}`, "info", false);
@@ -423,24 +394,24 @@ const createWebSocketServer = (config, outputDir, wsPort, quiet, debug, printOut
423
394
  if (handler) {
424
395
  const wrappedHandler = captureConsoleLogs(handler, quiet);
425
396
  const event = {
397
+ body: data.body || null,
426
398
  requestContext: {
427
- routeKey: data.action || "$default",
428
- connectionId: "test-connection-id",
429
399
  apiGateway: {
430
400
  endpoint: `ws://localhost:${wsPort}`
431
- }
432
- },
433
- body: data.body || null
401
+ },
402
+ connectionId: "test-connection-id",
403
+ routeKey: data.action || "$default"
404
+ }
434
405
  };
435
406
  const context = {
407
+ awsRequestId: "test-request-id",
436
408
  functionName: matchedFunction,
437
409
  functionVersion: "$LATEST",
410
+ getRemainingTimeInMillis: () => 3e4,
438
411
  invokedFunctionArn: `arn:aws:lambda:us-east-1:123456789012:function:${matchedFunction}`,
439
- memoryLimitInMB: "128",
440
- awsRequestId: "test-request-id",
441
412
  logGroupName: `/aws/lambda/${matchedFunction}`,
442
413
  logStreamName: "test-log-stream",
443
- getRemainingTimeInMillis: () => 3e4
414
+ memoryLimitInMB: "128"
444
415
  };
445
416
  const result = await wrappedHandler(event, context);
446
417
  if (result && typeof result === "object" && result.statusCode) {
@@ -498,17 +469,16 @@ const serverless = async (cmd, callback = () => ({})) => {
498
469
  const {
499
470
  cliName = "Lex",
500
471
  config,
472
+ debug = false,
501
473
  host = "localhost",
502
474
  httpPort = 3e3,
503
475
  httpsPort = 3001,
504
- wsPort = 3002,
505
476
  quiet = false,
506
477
  remove = false,
478
+ test = false,
507
479
  usePublicIp,
508
480
  variables,
509
- debug = false,
510
- printOutput = false,
511
- test = false
481
+ wsPort = 3002
512
482
  } = cmd;
513
483
  const spinner = createSpinner(quiet);
514
484
  log(`${cliName} starting serverless development server...`, "info", quiet);
@@ -569,11 +539,11 @@ ${cliName} Error: Environment variables option is not a valid JSON object.`, "er
569
539
  ...serverlessConfig,
570
540
  custom: {
571
541
  "serverless-offline": {
542
+ cors: serverlessConfig.custom?.["serverless-offline"]?.cors !== false,
543
+ host: serverlessConfig.custom?.["serverless-offline"]?.host || host,
572
544
  httpPort: serverlessConfig.custom?.["serverless-offline"]?.httpPort || httpPort,
573
545
  httpsPort: serverlessConfig.custom?.["serverless-offline"]?.httpsPort || httpsPort,
574
- wsPort: serverlessConfig.custom?.["serverless-offline"]?.wsPort || wsPort,
575
- host: serverlessConfig.custom?.["serverless-offline"]?.host || host,
576
- cors: serverlessConfig.custom?.["serverless-offline"]?.cors !== false
546
+ wsPort: serverlessConfig.custom?.["serverless-offline"]?.wsPort || wsPort
577
547
  }
578
548
  }
579
549
  };
@@ -592,16 +562,14 @@ ${cliName} Error: Environment variables option is not a valid JSON object.`, "er
592
562
  httpPort2,
593
563
  host2,
594
564
  quiet,
595
- debug,
596
- printOutput
565
+ debug
597
566
  );
598
567
  const wsServer = createWebSocketServer(
599
568
  finalConfig,
600
569
  outputDir,
601
570
  wsPort2,
602
571
  quiet,
603
- debug,
604
- printOutput
572
+ debug
605
573
  );
606
574
  wsServer.on("error", (error) => {
607
575
  log(`WebSocket server error: ${error.message}`, "error", quiet);
@@ -659,4 +627,4 @@ ${cliName} Error: ${error.message}`, "error", quiet);
659
627
  export {
660
628
  serverless
661
629
  };
662
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlcmxlc3Mvc2VydmVybGVzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge25ldHdvcmtJbnRlcmZhY2VzLCBob21lZGlyfSBmcm9tICdvcyc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGpvaW59IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gJ3dzJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIHJlbW92ZUZpbGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVybGVzc09wdGlvbnMge1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBodHRwc1BvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHdzUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmU/OiBib29sZWFuO1xuICByZWFkb25seSB2YXJpYWJsZXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVzZVB1YmxpY0lwPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBwcmludE91dHB1dD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBQdWJsaWNJcENhY2hlIHtcbiAgaXA6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJsZXNzSGFuZGxlciB7XG4gIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgZXZlbnRzPzogQXJyYXk8e1xuICAgIHJlYWRvbmx5IGh0dHA/OiB7XG4gICAgICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgY29ycz86IGJvb2xlYW47XG4gICAgfTtcbiAgICByZWFkb25seSB3ZWJzb2NrZXQ/OiB7XG4gICAgICByZWFkb25seSByb3V0ZT86IHN0cmluZztcbiAgICB9O1xuICB9Pjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NDb25maWcge1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTZXJ2ZXJsZXNzSGFuZGxlcj47XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgY2FjaGUgaXMgb2xkZXIgdGhhbiAxIHdlZWtcbiAgICBjb25zdCBvbmVXZWVrTXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBpZihEYXRlLm5vdygpIC0gY2FjaGUudGltZXN0YW1wID4gb25lV2Vla01zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgZmV0Y2ggaW5zdGVhZCBvZiBodHRwc1xuICBmZXRjaCgnaHR0cHM6Ly9hcGkuaXBpZnkub3JnJylcbiAgICAudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpcCA9IGRhdGEudHJpbSgpO1xuICAgICAgaWYoaXApIHtcbiAgICAgICAgd3JpdGVQdWJsaWNJcENhY2hlKGlwKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoaXApO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgZ2V0TmV0d29ya0FkZHJlc3NlcyA9ICgpID0+IHtcbiAgY29uc3QgaW50ZXJmYWNlcyA9IG5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IHtcbiAgICBsb2NhbDogJ2xvY2FsaG9zdCcsXG4gICAgcHJpdmF0ZTogbnVsbCxcbiAgICBwdWJsaWM6IG51bGxcbiAgfTtcblxuICBmb3IoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnRlcmZhY2VzKSkge1xuICAgIGNvbnN0IG5ldHdvcmtJbnRlcmZhY2UgPSBpbnRlcmZhY2VzW25hbWVdO1xuICAgIGlmKCFuZXR3b3JrSW50ZXJmYWNlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IoY29uc3QgaWZhY2Ugb2YgbmV0d29ya0ludGVyZmFjZSkge1xuICAgICAgaWYoaWZhY2UuZmFtaWx5ID09PSAnSVB2NCcgJiYgIWlmYWNlLmludGVybmFsKSB7XG4gICAgICAgIGNvbnN0IGlwID0gaWZhY2UuYWRkcmVzcztcblxuICAgICAgICBpZihpcC5zdGFydHNXaXRoKCcxMC4nKSB8fCBpcC5zdGFydHNXaXRoKCcxOTIuMTY4LicpIHx8IGlwLnN0YXJ0c1dpdGgoJzE3Mi4nKSkge1xuICAgICAgICAgIGlmKCFhZGRyZXNzZXMucHJpdmF0ZSkge1xuICAgICAgICAgICAgYWRkcmVzc2VzLnByaXZhdGUgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoIWFkZHJlc3Nlcy5wdWJsaWMpIHtcbiAgICAgICAgICAgIGFkZHJlc3Nlcy5wdWJsaWMgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRkcmVzc2VzO1xufTtcblxuY29uc3QgZGlzcGxheVNlcnZlclN0YXR1cyA9IChcbiAgaHR0cFBvcnQ6IG51bWJlcixcbiAgaHR0cHNQb3J0OiBudW1iZXIsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBwdWJsaWNJcD86IHN0cmluZ1xuKSA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaHR0cFVybCA9IGBodHRwOi8vJHtob3N0fToke2h0dHBQb3J0fWA7XG4gIGNvbnN0IGh0dHBzVXJsID0gYGh0dHBzOi8vJHtob3N0fToke2h0dHBzUG9ydH1gO1xuICBjb25zdCB3c1VybCA9IGB3czovLyR7aG9zdH06JHt3c1BvcnR9YDtcbiAgY29uc3Qgd3NzVXJsID0gYHdzczovLyR7aG9zdH06JHt3c1BvcnR9YDtcblxuICBsZXQgdXJsTGluZXMgPSBgJHtjaGFsay5ncmVlbignSFRUUDonKX0gICAgICAke2NoYWxrLnVuZGVybGluZShodHRwVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignSFRUUFM6Jyl9ICAgICAke2NoYWxrLnVuZGVybGluZShodHRwc1VybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1dlYlNvY2tldDonKX0gJHtjaGFsay51bmRlcmxpbmUod3NVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXU1M6Jyl9ICAgICAgICR7Y2hhbGsudW5kZXJsaW5lKHdzc1VybCl9XFxuYDtcblxuICBpZihwdWJsaWNJcCkge1xuICAgIHVybExpbmVzICs9IGBcXG4ke2NoYWxrLmdyZWVuKCdQdWJsaWM6Jyl9ICAgICR7Y2hhbGsudW5kZXJsaW5lKGBodHRwOi8vJHtwdWJsaWNJcH06JHtodHRwUG9ydH1gKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCdcdUQ4M0RcdURFODAgU2VydmVybGVzcyBEZXZlbG9wbWVudCBTZXJ2ZXIgUnVubmluZycpfVxcblxcbiR7dXJsTGluZXN9XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdQcmVzcyBDdHJsK0MgdG8gc3RvcCB0aGUgc2VydmVyJyl9YCxcbiAgICB7XG4gICAgICBwYWRkaW5nOiAxLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgYm9yZGVyU3R5bGU6ICdyb3VuZCcsXG4gICAgICBib3JkZXJDb2xvcjogJ2N5YW4nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzFhMWExYSdcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coYFxcbiR7c3RhdHVzQm94fVxcbmApO1xufTtcblxuY29uc3QgbG9hZEhhbmRsZXIgPSBhc3luYyAoaGFuZGxlclBhdGg6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dERpciwgaGFuZGxlclBhdGgpO1xuICAgIGxvZyhgTG9hZGluZyBoYW5kbGVyIGZyb206ICR7ZnVsbFBhdGh9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICBpZighZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciBmaWxlIG5vdCBmb3VuZDogJHtmdWxsUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyBEeW5hbWljIGltcG9ydCBvZiB0aGUgaGFuZGxlciB3aXRoIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGZ1bGxQYXRoKTtcbiAgICAgIGxvZyhgSGFuZGxlciBtb2R1bGUgbG9hZGVkOiAke09iamVjdC5rZXlzKGhhbmRsZXJNb2R1bGUpfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgbG9nKGBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9IGNhdGNoIChpbXBvcnRFcnJvcikge1xuICAgICAgbG9nKGBJbXBvcnQgZXJyb3IgZm9yIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7aW1wb3J0RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiBGdW5jdGlvbiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKGNvbmZpZzogU2VydmVybGVzc0NvbmZpZywgb3V0cHV0RGlyOiBzdHJpbmcsIGh0dHBQb3J0OiBudW1iZXIsIGhvc3Q6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4sIGRlYnVnOiBib29sZWFuLCBwcmludE91dHB1dDogYm9vbGVhbikgPT4ge1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gRW5hYmxlIENPUlNcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLCAnR0VULCBQT1NULCBQVVQsIERFTEVURSwgUEFUQ0gsIE9QVElPTlMnKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJywgJyonKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscycsICd0cnVlJyk7XG5cbiAgICBpZihyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgIHJlcy5zZW5kU3RhdHVzKDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhcnNlIEpTT04gYm9kaWVzXG4gIGFwcC51c2UoZXhwcmVzcy5qc29uKCkpO1xuXG4gIC8vIExvYWQgR3JhcGhRTCBoYW5kbGVyXG4gIGNvbnN0IGxvYWRHcmFwaFFMU2NoZW1hID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhIEdyYXBoUUwgaGFuZGxlclxuICAgICAgbGV0IGdyYXBocWxIYW5kbGVyID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAgJiYgZXZlbnQuaHR0cC5wYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgR3JhcGhRTCBlbmRwb2ludHNcbiAgICAgICAgICAgICAgICBpZihldmVudC5odHRwLnBhdGggPT09ICcvcHVibGljJyB8fCBldmVudC5odHRwLnBhdGggPT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgICAgICAgIGdyYXBocWxIYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoZnVuY3Rpb25Db25maWcuaGFuZGxlciwgb3V0cHV0RGlyKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgIGxvZygnRm91bmQgR3JhcGhRTCBoYW5kbGVyJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIHJldHVybiBncmFwaHFsSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ1x1RDgzRFx1REQwRCBHcmFwaFFMIERlYnVnIE1vZGU6IEFuYWx5emluZyByZXF1ZXN0Li4uJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgbG9nKGBcdUQ4M0RcdURDREQgR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNEXHVEQ0NBIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNDXHVERkY3XHVGRTBGICBHcmFwaFFMIE9wZXJhdGlvbjogJHtyZXEuYm9keS5vcGVyYXRpb25OYW1lfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBhcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICAgICAgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpKVxuICAgICAgICAgICkuam9pbignICcpO1xuICAgICAgICAgIGxvZ3MucHVzaChsb2dNZXNzYWdlKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnNvbGVMb2coYFtHcmFwaFFMXSAke2xvZ01lc3NhZ2V9YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRleHQgZm9yIHRoZSBoYW5kbGVyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdncmFwaHFsJyxcbiAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46ICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOmdyYXBocWwnLFxuICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCcsXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHBhdGg6IGdyYXBocWxQYXRoLFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxLmJvZHkpXG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUmVzdG9yZSBjb25zb2xlLmxvZ1xuICAgICAgICAgIGNvbnNvbGUubG9nID0gb3JpZ2luYWxDb25zb2xlTG9nO1xuICAgICAgICAgIGxvZyhgR3JhcGhRTCBoYW5kbGVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbG9nKGBHcmFwaFFMIGVuZHBvaW50IGF2YWlsYWJsZSBhdCBodHRwOi8vJHtob3N0fToke2h0dHBQb3J0fSR7Z3JhcGhxbFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgRXJyb3Igc2V0dGluZyB1cCBHcmFwaFFMOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgZm9yIG5vbi1HcmFwaFFMIHJvdXRlcyAtIGhhbmRsZSBhbGwgcmVtYWluaW5nIHJvdXRlc1xuICBhcHAudXNlKCcvJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHJlcS51cmwgfHwgJy8nO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZCB8fCAnR0VUJztcblxuICAgICAgbG9nKGAke21ldGhvZH0gJHt1cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgZnVuY3Rpb25cbiAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSBldmVudC5odHRwLm1ldGhvZCB8fCAnR0VUJztcblxuICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBwYXRoIG1hdGNoaW5nIC0gYXZvaWQgY29tcGxleCByZWdleFxuICAgICAgICAgICAgICAgIGlmKGV2ZW50UGF0aCAmJiBldmVudFBhdGggPT09IHVybCAmJiBldmVudE1ldGhvZCA9PT0gbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAvLyBSZXNvbHZlIGhhbmRsZXIgcGF0aCByZWxhdGl2ZSB0byBvdXRwdXQgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXI7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihoYW5kbGVyUGF0aCwgb3V0cHV0RGlyKTtcblxuICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoaGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogdXJsLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiByZXEucXVlcnlcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnLFxuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDBcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5oZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXMuc2VuZChyZXN1bHQuYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXMuanNvbihyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtlcnJvcjogJ0Z1bmN0aW9uIG5vdCBmb3VuZCd9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBSb3V0ZSBoYW5kbGluZyBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGFwcDtcbn07XG5cbmNvbnN0IGNyZWF0ZVdlYlNvY2tldFNlcnZlciA9IChjb25maWc6IFNlcnZlcmxlc3NDb25maWcsIG91dHB1dERpcjogc3RyaW5nLCB3c1BvcnQ6IG51bWJlciwgcXVpZXQ6IGJvb2xlYW4sIGRlYnVnOiBib29sZWFuLCBwcmludE91dHB1dDogYm9vbGVhbikgPT4ge1xuICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB3c1BvcnR9KTtcblxuICB3c3Mub24oJ2Nvbm5lY3Rpb24nLCBhc3luYyAod3MsIHJlcSkgPT4ge1xuICAgIGxvZyhgV2ViU29ja2V0IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQ6ICR7cmVxLnVybH1gLCAnaW5mbycsIGZhbHNlKTtcblxuICAgIHdzLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBXZWJTb2NrZXQgZnVuY3Rpb25cbiAgICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYoZXZlbnQud2Vic29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IGV2ZW50LndlYnNvY2tldC5yb3V0ZSB8fCAnJGNvbm5lY3QnO1xuICAgICAgICAgICAgICAgICAgaWYocm91dGUgPT09ICckZGVmYXVsdCcgfHwgcm91dGUgPT09IGRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlciwgb3V0cHV0RGlyKTtcblxuICAgICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIC8vIFdyYXAgaGFuZGxlciB3aXRoIGNvbnNvbGUgbG9nIGNhcHR1cmVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogJ3Rlc3QtY29ubmVjdGlvbi1pZCcsXG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBkYXRhLmJvZHkgfHwgbnVsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCcsXG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBMYW1iZGEgcmVzcG9uc2UgZm9ybWF0IGZvciBXZWJTb2NrZXRcbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgTGFtYmRhIHJlc3BvbnNlIG9iamVjdCwgZXh0cmFjdCB0aGUgYm9keVxuICAgICAgICAgICAgICBjb25zdCBib2R5ID0gcmVzdWx0LmJvZHkgfHwgJyc7XG4gICAgICAgICAgICAgIHdzLnNlbmQoYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlLCBzdHJpbmdpZnkgaXRcbiAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnV2ViU29ja2V0IGZ1bmN0aW9uIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBXYXJuaW5nOiBDb3VsZCBub3QgbG9hZCAuZW52IGZpbGUgYXQgJHtlbnZQYXRofTogJHtlcnJvci5tZXNzYWdlfWAsICd3YXJuJywgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIGVudlZhcnM7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VydmVybGVzcyA9IGFzeW5jIChjbWQ6IFNlcnZlcmxlc3NPcHRpb25zLCBjYWxsYmFjazogU2VydmVybGVzc0NhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIGhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICBodHRwUG9ydCA9IDMwMDAsXG4gICAgaHR0cHNQb3J0ID0gMzAwMSxcbiAgICB3c1BvcnQgPSAzMDAyLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgcmVtb3ZlID0gZmFsc2UsXG4gICAgdXNlUHVibGljSXAsXG4gICAgdmFyaWFibGVzLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgcHJpbnRPdXRwdXQgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2VcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRW52aXJvbm1lbnQgdmFyaWFibGVzIG9wdGlvbiBpcyBub3QgYSB2YWxpZCBKU09OIG9iamVjdC5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIC8vIElmIGluIHRlc3QgbW9kZSwgZXhpdCBlYXJseSBhZnRlciBsb2FkaW5nIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZih0ZXN0KSB7XG4gICAgbG9nKCdUZXN0IG1vZGU6IEVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQsIGV4aXRpbmcnLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKHJlbW92ZSkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0NsZWFuaW5nIG91dHB1dCBkaXJlY3RvcnkuLi4nKTtcbiAgICBhd2FpdCByZW1vdmVGaWxlcyhvdXRwdXRGdWxsUGF0aCB8fCAnJyk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCBvdXRwdXQgZGlyZWN0b3J5IScpO1xuICB9XG5cbiAgLy8gTG9hZCBzZXJ2ZXJsZXNzIGNvbmZpZ3VyYXRpb25cbiAgbGV0IHNlcnZlcmxlc3NDb25maWc6IFNlcnZlcmxlc3NDb25maWcgPSB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWcgfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2xleC5jb25maWcubWpzJyk7XG4gICAgbG9nKGBMb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIGlmKGV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ01vZHVsZSA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgIHNlcnZlcmxlc3NDb25maWcgPSBjb25maWdNb2R1bGUuZGVmYXVsdD8uc2VydmVybGVzcyB8fCBjb25maWdNb2R1bGUuc2VydmVybGVzcyB8fCB7fTtcbiAgICAgIGxvZygnU2VydmVybGVzcyBjb25maWcgbG9hZGVkIHN1Y2Nlc3NmdWxseScsICdpbmZvJywgcXVpZXQpO1xuICAgICAgbG9nKGBMb2FkZWQgZnVuY3Rpb25zOiAke09iamVjdC5rZXlzKHNlcnZlcmxlc3NDb25maWcuZnVuY3Rpb25zIHx8IHt9KS5qb2luKCcsICcpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYE5vIHNlcnZlcmxlc3MgY29uZmlnIGZvdW5kIGF0ICR7Y29uZmlnUGF0aH0sIHVzaW5nIGRlZmF1bHRzYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgbG9hZGluZyBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAvLyBEb24ndCBleGl0LCBjb250aW51ZSB3aXRoIGVtcHR5IGNvbmZpZ1xuICB9XG5cbiAgLy8gTWVyZ2UgY29uZmlnIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnNcbiAgY29uc3QgZmluYWxDb25maWc6IFNlcnZlcmxlc3NDb25maWcgPSB7XG4gICAgLi4uc2VydmVybGVzc0NvbmZpZyxcbiAgICBjdXN0b206IHtcbiAgICAgICdzZXJ2ZXJsZXNzLW9mZmxpbmUnOiB7XG4gICAgICAgIGh0dHBQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cFBvcnQgfHwgaHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBzUG9ydCB8fCBodHRwc1BvcnQsXG4gICAgICAgIHdzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LndzUG9ydCB8fCB3c1BvcnQsXG4gICAgICAgIGhvc3Q6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ob3N0IHx8IGhvc3QsXG4gICAgICAgIGNvcnM6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5jb3JzICE9PSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcbiAgbG9nKGBVc2luZyBvdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gLCAnaW5mbycsIHF1aWV0KTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBodHRwUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwUG9ydCE7XG4gICAgY29uc3Qgd3NQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLndzUG9ydCE7XG4gICAgY29uc3QgaG9zdCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5ob3N0ITtcblxuICAgIGxvZyhgQ3JlYXRpbmcgSFRUUCBzZXJ2ZXIgb24gJHtob3N0fToke2h0dHBQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgQ3JlYXRpbmcgV2ViU29ja2V0IHNlcnZlciBvbiBwb3J0ICR7d3NQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gQ3JlYXRlIEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3QgZXhwcmVzc0FwcCA9IGF3YWl0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIGh0dHBQb3J0LFxuICAgICAgaG9zdCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWcsXG4gICAgICBwcmludE91dHB1dFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgV2ViU29ja2V0IHNlcnZlclxuICAgIGNvbnN0IHdzU2VydmVyID0gY3JlYXRlV2ViU29ja2V0U2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICB3c1BvcnQsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnLFxuICAgICAgcHJpbnRPdXRwdXRcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNlcnZlciBlcnJvcnNcbiAgICB3c1NlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICB3c1BvcnQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHF1aWV0XG4gICAgICApO1xuXG4gICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICBpZihwdWJsaWNJcCkge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICAgICAgd3NQb3J0LFxuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgICAgcHVibGljSXBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFeHByZXNzIHNlcnZlciBlcnJvcnNcbiAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYEV4cHJlc3Mgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgRXhwcmVzcyBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgICAgbG9nKCdcXG5TaHV0dGluZyBkb3duIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHdzU2VydmVyLmNsb3NlKCk7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG5cbiAgICAvLyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlXG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgIGxvZygnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcnVubmluZy4gUHJlc3MgQ3RybCtDIHRvIHN0b3AuJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBEb24ndCBjYWxsIGNhbGxiYWNrIGhlcmUsIGxldCB0aGUgcHJvY2VzcyBzdGF5IGFsaXZlXG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLicpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQU8sV0FBVztBQUNsQixPQUFPLFdBQVc7QUFDbEIsT0FBTyxhQUFhO0FBQ3BCLFNBQVEsY0FBYyxZQUFZLFdBQVcscUJBQW9CO0FBQ2pFLFNBQVEsbUJBQW1CLGVBQWM7QUFDekMsU0FBUSxXQUFXLGFBQWEsWUFBVztBQUMzQyxTQUFRLHVCQUFzQjtBQUU5QixTQUFRLGlCQUFnQjtBQUN4QixTQUFRLGVBQWUsbUJBQWtCO0FBQ3pDLFNBQVEsV0FB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
630
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlcmxlc3Mvc2VydmVybGVzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbn0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBQdWJsaWNJcENhY2hlIHtcbiAgaXA6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJsZXNzSGFuZGxlciB7XG4gIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgZXZlbnRzPzogQXJyYXk8e1xuICAgIHJlYWRvbmx5IGh0dHA/OiB7XG4gICAgICByZWFkb25seSBjb3JzPzogYm9vbGVhbjtcbiAgICAgIHJlYWRvbmx5IG1ldGhvZD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gICAgfTtcbiAgICByZWFkb25seSB3ZWJzb2NrZXQ/OiB7XG4gICAgICByZWFkb25seSByb3V0ZT86IHN0cmluZztcbiAgICB9O1xuICB9Pjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NDb25maWcge1xuICByZWFkb25seSBjdXN0b20/OiB7XG4gICAgcmVhZG9ubHkgJ3NlcnZlcmxlc3Mtb2ZmbGluZSc/OiB7XG4gICAgICByZWFkb25seSBjb3JzPzogYm9vbGVhbjtcbiAgICAgIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG4gICAgICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgICAgIHJlYWRvbmx5IGh0dHBzUG9ydD86IG51bWJlcjtcbiAgICAgIHJlYWRvbmx5IHdzUG9ydD86IG51bWJlcjtcbiAgICB9O1xuICB9O1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTZXJ2ZXJsZXNzSGFuZGxlcj47XG59XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgY2FjaGUgaXMgb2xkZXIgdGhhbiAxIHdlZWtcbiAgICBjb25zdCBvbmVXZWVrTXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBpZihEYXRlLm5vdygpIC0gY2FjaGUudGltZXN0YW1wID4gb25lV2Vla01zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgZmV0Y2ggaW5zdGVhZCBvZiBodHRwc1xuICBmZXRjaCgnaHR0cHM6Ly9hcGkuaXBpZnkub3JnJylcbiAgICAudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpcCA9IGRhdGEudHJpbSgpO1xuICAgICAgaWYoaXApIHtcbiAgICAgICAgd3JpdGVQdWJsaWNJcENhY2hlKGlwKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoaXApO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgZGlzcGxheVNlcnZlclN0YXR1cyA9IChcbiAgaHR0cFBvcnQ6IG51bWJlcixcbiAgaHR0cHNQb3J0OiBudW1iZXIsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBwdWJsaWNJcD86IHN0cmluZ1xuKSA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaHR0cFVybCA9IGBodHRwOi8vJHtob3N0fToke2h0dHBQb3J0fWA7XG4gIGNvbnN0IGh0dHBzVXJsID0gYGh0dHBzOi8vJHtob3N0fToke2h0dHBzUG9ydH1gO1xuICBjb25zdCB3c1VybCA9IGB3czovLyR7aG9zdH06JHt3c1BvcnR9YDtcbiAgY29uc3Qgd3NzVXJsID0gYHdzczovLyR7aG9zdH06JHt3c1BvcnR9YDtcblxuICBsZXQgdXJsTGluZXMgPSBgJHtjaGFsay5ncmVlbignSFRUUDonKX0gICAgICAke2NoYWxrLnVuZGVybGluZShodHRwVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignSFRUUFM6Jyl9ICAgICAke2NoYWxrLnVuZGVybGluZShodHRwc1VybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1dlYlNvY2tldDonKX0gJHtjaGFsay51bmRlcmxpbmUod3NVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXU1M6Jyl9ICAgICAgICR7Y2hhbGsudW5kZXJsaW5lKHdzc1VybCl9XFxuYDtcblxuICBpZihwdWJsaWNJcCkge1xuICAgIHVybExpbmVzICs9IGBcXG4ke2NoYWxrLmdyZWVuKCdQdWJsaWM6Jyl9ICAgICR7Y2hhbGsudW5kZXJsaW5lKGBodHRwOi8vJHtwdWJsaWNJcH06JHtodHRwUG9ydH1gKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCdcdUQ4M0RcdURFODAgU2VydmVybGVzcyBEZXZlbG9wbWVudCBTZXJ2ZXIgUnVubmluZycpfVxcblxcbiR7dXJsTGluZXN9XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdQcmVzcyBDdHJsK0MgdG8gc3RvcCB0aGUgc2VydmVyJyl9YCxcbiAgICB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMWExYTFhJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnY3lhbicsXG4gICAgICBib3JkZXJTdHlsZTogJ3JvdW5kJyxcbiAgICAgIG1hcmdpbjogMSxcbiAgICAgIHBhZGRpbmc6IDFcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coYFxcbiR7c3RhdHVzQm94fVxcbmApO1xufTtcblxuY29uc3QgbG9hZEhhbmRsZXIgPSBhc3luYyAoaGFuZGxlclBhdGg6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dERpciwgaGFuZGxlclBhdGgpO1xuICAgIGxvZyhgTG9hZGluZyBoYW5kbGVyIGZyb206ICR7ZnVsbFBhdGh9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICBpZighZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciBmaWxlIG5vdCBmb3VuZDogJHtmdWxsUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyBEeW5hbWljIGltcG9ydCBvZiB0aGUgaGFuZGxlciB3aXRoIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGZ1bGxQYXRoKTtcbiAgICAgIGxvZyhgSGFuZGxlciBtb2R1bGUgbG9hZGVkOiAke09iamVjdC5rZXlzKGhhbmRsZXJNb2R1bGUpfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgbG9nKGBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9IGNhdGNoIChpbXBvcnRFcnJvcikge1xuICAgICAgbG9nKGBJbXBvcnQgZXJyb3IgZm9yIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7aW1wb3J0RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiBQcm9taXNlPGFueT4sIHF1aWV0OiBib29sZWFuKSA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuIGhhbmRsZXI7XG4gIH1cblxuICByZXR1cm4gYXN5bmMgKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICAgIC8vIENhcHR1cmUgY29uc29sZS5sb2csIGNvbnNvbGUuZXJyb3IsIGV0Yy5cbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVJbmZvID0gY29uc29sZS5pbmZvO1xuXG4gICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtMT0ddICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVMb2coLi4uYXJncyk7XG4gICAgfTtcblxuICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0VSUk9SXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlRXJyb3IoLi4uYXJncyk7XG4gICAgfTtcblxuICAgIGNvbnNvbGUud2FybiA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbV0FSTl0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZVdhcm4oLi4uYXJncyk7XG4gICAgfTtcblxuICAgIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbSU5GT10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUluZm8oLi4uYXJncyk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgLy8gT3V0cHV0IGNhcHR1cmVkIGxvZ3NcbiAgICAgIGlmKGxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gSGFuZGxlciBDb25zb2xlIE91dHB1dCAtLS0nKSk7XG4gICAgICAgIGxvZ3MuZm9yRWFjaCgobG9nKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGxvZykpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnLS0tIEVuZCBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBjb25zb2xlIG1ldGhvZHNcbiAgICAgIGNvbnNvbGUubG9nID0gb3JpZ2luYWxDb25zb2xlTG9nO1xuICAgICAgY29uc29sZS5lcnJvciA9IG9yaWdpbmFsQ29uc29sZUVycm9yO1xuICAgICAgY29uc29sZS53YXJuID0gb3JpZ2luYWxDb25zb2xlV2FybjtcbiAgICAgIGNvbnNvbGUuaW5mbyA9IG9yaWdpbmFsQ29uc29sZUluZm87XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgY3JlYXRlRXhwcmVzc1NlcnZlciA9IGFzeW5jIChcbiAgY29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnLFxuICBvdXRwdXREaXI6IHN0cmluZyxcbiAgaHR0cFBvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgZGVidWc6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gRW5hYmxlIENPUlNcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLCAnR0VULCBQT1NULCBQVVQsIERFTEVURSwgUEFUQ0gsIE9QVElPTlMnKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJywgJyonKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscycsICd0cnVlJyk7XG5cbiAgICBpZihyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgIHJlcy5zZW5kU3RhdHVzKDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhcnNlIEpTT04gYm9kaWVzXG4gIGFwcC51c2UoZXhwcmVzcy5qc29uKCkpO1xuXG4gIC8vIExvYWQgR3JhcGhRTCBoYW5kbGVyXG4gIGNvbnN0IGxvYWRHcmFwaFFMU2NoZW1hID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhIEdyYXBoUUwgaGFuZGxlclxuICAgICAgbGV0IGdyYXBocWxIYW5kbGVyID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAgJiYgZXZlbnQuaHR0cC5wYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgR3JhcGhRTCBlbmRwb2ludHNcbiAgICAgICAgICAgICAgICBpZihldmVudC5odHRwLnBhdGggPT09ICcvcHVibGljJyB8fCBldmVudC5odHRwLnBhdGggPT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgICAgICAgIGdyYXBocWxIYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoZnVuY3Rpb25Db25maWcuaGFuZGxlciwgb3V0cHV0RGlyKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgIGxvZygnRm91bmQgR3JhcGhRTCBoYW5kbGVyJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIHJldHVybiBncmFwaHFsSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ1x1RDgzRFx1REQwRCBHcmFwaFFMIERlYnVnIE1vZGU6IEFuYWx5emluZyByZXF1ZXN0Li4uJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgbG9nKGBcdUQ4M0RcdURDREQgR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNEXHVEQ0NBIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNDXHVERkY3XHVGRTBGICBHcmFwaFFMIE9wZXJhdGlvbjogJHtyZXEuYm9keS5vcGVyYXRpb25OYW1lfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBhcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICAgICAgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpKVxuICAgICAgICAgICkuam9pbignICcpO1xuICAgICAgICAgIGxvZ3MucHVzaChsb2dNZXNzYWdlKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnNvbGVMb2coYFtHcmFwaFFMXSAke2xvZ01lc3NhZ2V9YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRleHQgZm9yIHRoZSBoYW5kbGVyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdncmFwaHFsJyxcbiAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgIGludm9rZWRGdW5jdGlvbkFybjogJ2Fybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246Z3JhcGhxbCcsXG4gICAgICAgICAgbG9nR3JvdXBOYW1lOiAnL2F3cy9sYW1iZGEvZ3JhcGhxbCcsXG4gICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHJlc1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFdyYXAgaGFuZGxlciB3aXRoIGNvbnNvbGUgbG9nIGNhcHR1cmVcbiAgICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoZ3JhcGhxbEhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgd2l0aCBHcmFwaFFMIHBhcmFtZXRlcnNcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcih7XG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHBhdGg6IGdyYXBocWxQYXRoLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiB7fVxuICAgICAgICAgIH0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgLy8gUmVzdG9yZSBjb25zb2xlLmxvZ1xuICAgICAgICAgIGNvbnNvbGUubG9nID0gb3JpZ2luYWxDb25zb2xlTG9nO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSByZXN1bHRcbiAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc2VuZChyZXN1bHQuYm9keSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgICAgICBsb2coYEdyYXBoUUwgaGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZyhgR3JhcGhRTCBlbmRwb2ludCBhdmFpbGFibGUgYXQgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH0ke2dyYXBocWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIGxvZyhgJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudFBhdGggPSBldmVudC5odHRwLnBhdGggfHwgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TWV0aG9kID0gZXZlbnQuaHR0cC5tZXRob2QgfHwgJ0dFVCc7XG5cbiAgICAgICAgICAgICAgICAvLyBJbXByb3ZlZCBwYXRoIG1hdGNoaW5nIC0gY29tcGFyZSBwYXRobmFtZSB3aXRob3V0IHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50UGF0aCAmJiBldmVudFBhdGggPT09IHBhdGhuYW1lICYmIGV2ZW50TWV0aG9kID09PSBtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihtYXRjaGVkRnVuY3Rpb24gJiYgY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dKSB7XG4gICAgICAgIC8vIFJlc29sdmUgaGFuZGxlciBwYXRoIHJlbGF0aXZlIHRvIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlcjtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGhhbmRsZXJQYXRoLCBvdXRwdXREaXIpO1xuXG4gICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBwYXRoOiB1cmwsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHJlcS5xdWVyeVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgSGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnRnVuY3Rpb24gbm90IGZvdW5kJ30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFJvdXRlIGhhbmRsaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuY29uc3QgY3JlYXRlV2ViU29ja2V0U2VydmVyID0gKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogd3NQb3J0fSk7XG5cbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgYXN5bmMgKHdzLCByZXEpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LndlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBldmVudC53ZWJzb2NrZXQucm91dGUgfHwgJyRjb25uZWN0JztcbiAgICAgICAgICAgICAgICAgIGlmKHJvdXRlID09PSAnJGRlZmF1bHQnIHx8IHJvdXRlID09PSBkYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogZGF0YS5ib2R5IHx8IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6ICd0ZXN0LWNvbm5lY3Rpb24taWQnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIExhbWJkYSByZXNwb25zZSBvYmplY3QsIGV4dHJhY3QgdGhlIGJvZHlcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlc3VsdC5ib2R5IHx8ICcnO1xuICAgICAgICAgICAgICB3cy5zZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCByZXNwb25zZSwgc3RyaW5naWZ5IGl0XG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2coYFdlYlNvY2tldCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3cy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBsb2coJ1dlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlZCcsICdpbmZvJywgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gd3NzO1xufTtcblxuY29uc3QgbG9hZEVudkZpbGUgPSAoZW52UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBpZighZXhpc3RzU3luYyhlbnZQYXRoKSkge1xuICAgIHJldHVybiBlbnZWYXJzO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnZDb250ZW50ID0gcmVhZEZpbGVTeW5jKGVudlBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbGluZXMgPSBlbnZDb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgIGZvcihjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuXG4gICAgICAvLyBTa2lwIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50c1xuICAgICAgaWYoIXRyaW1tZWRMaW5lIHx8IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgS0VZPXZhbHVlIGZvcm1hdFxuICAgICAgY29uc3QgZXF1YWxJbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmKGVxdWFsSW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRyaW1tZWRMaW5lLnN1YnN0cmluZygwLCBlcXVhbEluZGV4KS50cmltKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKGVxdWFsSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHF1b3RlcyBpZiBwcmVzZW50XG4gICAgICAgIGNvbnN0IGNsZWFuVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csICcnKTtcblxuICAgICAgICBpZihrZXkpIHtcbiAgICAgICAgICBlbnZWYXJzW2tleV0gPSBjbGVhblZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgV2FybmluZzogQ291bGQgbm90IGxvYWQgLmVudiBmaWxlIGF0ICR7ZW52UGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBlbnZWYXJzO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcnZlcmxlc3MgPSBhc3luYyAoXG4gIGNtZDogU2VydmVybGVzc09wdGlvbnMsXG4gIGNhbGxiYWNrOiBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbmZpZyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICBodHRwUG9ydCA9IDMwMDAsXG4gICAgaHR0cHNQb3J0ID0gMzAwMSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB1c2VQdWJsaWNJcCxcbiAgICB2YXJpYWJsZXMsXG4gICAgd3NQb3J0ID0gMzAwMlxuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gc3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAvLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXNcbiAgY29uc3QgZW52UGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5sb2NhbCcpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LmRldmVsb3BtZW50JylcbiAgXTtcblxuICBsZXQgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8vIExvYWQgZnJvbSAuZW52IGZpbGVzIGluIG9yZGVyIChsYXRlciBmaWxlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpXG4gIGZvcihjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3QgZmlsZUVudlZhcnMgPSBsb2FkRW52RmlsZShlbnZQYXRoKTtcbiAgICBpZihPYmplY3Qua2V5cyhmaWxlRW52VmFycykubGVuZ3RoID4gMCkge1xuICAgICAgbG9nKGBMb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb206ICR7ZW52UGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgZW52VmFycyA9IHsuLi5lbnZWYXJzLCAuLi5maWxlRW52VmFyc307XG4gIH1cblxuICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgTk9ERV9FTlYgYW5kIGxvYWRlZCAuZW52IHZhcmlhYmxlc1xuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCcsIC4uLmVudlZhcnN9O1xuXG4gIC8vIE92ZXJyaWRlIHdpdGggY29tbWFuZCBsaW5lIHZhcmlhYmxlcyBpZiBwcm92aWRlZFxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpVmFycyA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICAgIHZhcmlhYmxlc09iaiA9IHsuLi52YXJpYWJsZXNPYmosIC4uLmNsaVZhcnN9O1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZyB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbGV4LmNvbmZpZy5tanMnKTtcbiAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coYExvYWRlZCBmdW5jdGlvbnM6ICR7T2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pLmpvaW4oJywgJyl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQgYXQgJHtjb25maWdQYXRofSwgdXNpbmcgZGVmYXVsdHNgLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIC8vIERvbid0IGV4aXQsIGNvbnRpbnVlIHdpdGggZW1wdHkgY29uZmlnXG4gIH1cblxuICAvLyBNZXJnZSBjb25maWcgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uc1xuICBjb25zdCBmaW5hbENvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHtcbiAgICAuLi5zZXJ2ZXJsZXNzQ29uZmlnLFxuICAgIGN1c3RvbToge1xuICAgICAgJ3NlcnZlcmxlc3Mtb2ZmbGluZSc6IHtcbiAgICAgICAgY29yczogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LmNvcnMgIT09IGZhbHNlLFxuICAgICAgICBob3N0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaG9zdCB8fCBob3N0LFxuICAgICAgICBodHRwUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBQb3J0IHx8IGh0dHBQb3J0LFxuICAgICAgICBodHRwc1BvcnQ6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5odHRwc1BvcnQgfHwgaHR0cHNQb3J0LFxuICAgICAgICB3c1BvcnQ6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy53c1BvcnQgfHwgd3NQb3J0XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG91dHB1dERpciA9IG91dHB1dEZ1bGxQYXRoIHx8ICdsaWInO1xuICBsb2coYFVzaW5nIG91dHB1dCBkaXJlY3Rvcnk6ICR7b3V0cHV0RGlyfWAsICdpbmZvJywgcXVpZXQpO1xuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnU3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nKTtcblxuICAgIGNvbnN0IGh0dHBQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmh0dHBQb3J0ITtcbiAgICBjb25zdCB3c1BvcnQgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEud3NQb3J0ITtcbiAgICBjb25zdCBob3N0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmhvc3QhO1xuXG4gICAgbG9nKGBDcmVhdGluZyBIVFRQIHNlcnZlciBvbiAke2hvc3R9OiR7aHR0cFBvcnR9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgbG9nKGBDcmVhdGluZyBXZWJTb2NrZXQgc2VydmVyIG9uIHBvcnQgJHt3c1BvcnR9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBDcmVhdGUgRXhwcmVzcyBzZXJ2ZXJcbiAgICBjb25zdCBleHByZXNzQXBwID0gYXdhaXQgY3JlYXRlRXhwcmVzc1NlcnZlcihcbiAgICAgIGZpbmFsQ29uZmlnLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgaHR0cFBvcnQsXG4gICAgICBob3N0LFxuICAgICAgcXVpZXQsXG4gICAgICBkZWJ1Z1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgV2ViU29ja2V0IHNlcnZlclxuICAgIGNvbnN0IHdzU2VydmVyID0gY3JlYXRlV2ViU29ja2V0U2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICB3c1BvcnQsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnXG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSBzZXJ2ZXIgZXJyb3JzXG4gICAgd3NTZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYFdlYlNvY2tldCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBXZWJTb2NrZXQgc2VydmVyLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCBFeHByZXNzIHNlcnZlclxuICAgIGNvbnN0IHNlcnZlciA9IGV4cHJlc3NBcHAubGlzdGVuKGh0dHBQb3J0LCBob3N0LCAoKSA9PiB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1NlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyIHN0YXJ0ZWQuJyk7XG5cbiAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgIGh0dHBQb3J0LFxuICAgICAgICBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cHNQb3J0ISxcbiAgICAgICAgd3NQb3J0LFxuICAgICAgICBob3N0LFxuICAgICAgICBxdWlldFxuICAgICAgKTtcblxuICAgICAgZmV0Y2hQdWJsaWNJcCh1c2VQdWJsaWNJcCkudGhlbigocHVibGljSXApID0+IHtcbiAgICAgICAgaWYocHVibGljSXApIHtcbiAgICAgICAgICBkaXNwbGF5U2VydmVyU3RhdHVzKFxuICAgICAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgICAgICBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cHNQb3J0ISxcbiAgICAgICAgICAgIHdzUG9ydCxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBxdWlldCxcbiAgICAgICAgICAgIHB1YmxpY0lwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgRXhwcmVzcyBzZXJ2ZXIgZXJyb3JzXG4gICAgc2VydmVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgbG9nKGBFeHByZXNzIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IEV4cHJlc3Mgc2VydmVyLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICBjb25zdCBzaHV0ZG93biA9ICgpID0+IHtcbiAgICAgIGxvZygnXFxuU2h1dHRpbmcgZG93biBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICB3c1NlcnZlci5jbG9zZSgpO1xuICAgICAgY2FsbGJhY2soMCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc2h1dGRvd24pO1xuXG4gICAgLy8gS2VlcCB0aGUgcHJvY2VzcyBhbGl2ZVxuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG5cbiAgICBsb2coJ1NlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyIGlzIHJ1bm5pbmcuIFByZXNzIEN0cmwrQyB0byBzdG9wLicsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gRG9uJ3QgY2FsbCBjYWxsYmFjayBoZXJlLCBsZXQgdGhlIHByb2Nlc3Mgc3RheSBhbGl2ZVxuICAgIHJldHVybiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4nKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sYUFBYTtBQUNwQixTQUFRLGNBQWMsWUFBWSxXQUFXLHFC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V0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVO0FBQzVCLFVBQUkseUJBQXlCLE1BQU0sT0FBTyxJQUFJLFNBQVMsS0FBSztBQUM1RCxjQUFRLEtBQUssaUNBQWlDO0FBQzlDLGVBQVMsQ0FBQztBQUNWO0FBQUEsSUFDRixDQUFDO0FBR0QsVUFBTSxXQUFXLE1BQU07QUFDckIsVUFBSSxvREFBb0QsUUFBUSxLQUFLO0FBQ3JFLGFBQU8sTUFBTTtBQUNiLGVBQVMsTUFBTTtBQUNmLGVBQVMsQ0FBQztBQUFBLElBQ1o7QUFFQSxZQUFRLEdBQUcsVUFBVSxRQUFRO0FBQzdCLFlBQVEsR0FBRyxXQUFXLFFBQVE7QUFHOUIsWUFBUSxNQUFNLE9BQU87QUFFckIsUUFBSSxtRUFBbUUsUUFBUSxLQUFLO0FBR3BGLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUNkLFFBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFDMUQsWUFBUSxLQUFLLGdEQUFnRDtBQUM3RCxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogWyJsb2ciLCAiaHR0cFBvcnQiLCAid3NQb3J0IiwgImhvc3QiXQp9Cg==
@@ -46,5 +46,5 @@ export interface TestOptions {
46
46
  }
47
47
  export type TestCallback = typeof process.exit;
48
48
  export declare const getTestFilePatterns: (testPathPattern?: string) => string[];
49
- export declare const test: (options: TestOptions, args: string[], callback?: TestCallback) => Promise<number>;
49
+ export declare const test: (options: TestOptions, args?: string[], filesOrCallback?: string[] | TestCallback, callbackParam?: TestCallback) => Promise<number>;
50
50
  export default test;