@cartanova/qgrid-cli 2.5.8 → 2.5.9

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.
@@ -12,7 +12,7 @@ import { freemem } from "node:os";
12
12
  /**
13
13
  * OpenAIDispatcher — codex app-server worker pool + 토큰 라우팅.
14
14
  *
15
- * - 토큰당 CodexAppServerWorker 자동 확장 (기본 5~15, hard cap 20)
15
+ * - 토큰당 CodexAppServerWorker 자동 확장 (기본 1~3, hard cap 20)
16
16
  * - idle worker round-robin 선택 + 큐 대기 (전부 busy 시)
17
17
  * - TokenSubscriber 이벤트로 worker pool 동기화
18
18
  * - backpressure: 큐 full 또는 timeout 시 SERVER_BUSY
@@ -57,6 +57,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
57
57
  queue = [];
58
58
  poolConfig;
59
59
  quotaBlockedTokenIds = /* @__PURE__ */ new Set();
60
+ startingTokenIds = /* @__PURE__ */ new Set();
60
61
  rateLimitsGenerationByToken = /* @__PURE__ */ new Map();
61
62
  weightedSelector = new SmoothWeightedRoundRobin();
62
63
  workerCursorByToken = /* @__PURE__ */ new Map();
@@ -80,10 +81,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
80
81
  await this.spawnWorkers(t.id, t.name, t.credentials, t.quota_threshold, t.weight);
81
82
  if (!t.active) this.onTokenDeactivated(t.id);
82
83
  }));
83
- if (this.poolConfig.autoscale) {
84
- this.scalerTimer = setInterval(() => this.requestAutoscaleEvaluation(), this.poolConfig.scaleIntervalMs);
85
- this.scalerTimer.unref?.();
86
- }
84
+ this.scalerTimer = setInterval(() => this.requestAutoscaleEvaluation(), this.poolConfig.scaleIntervalMs);
85
+ this.scalerTimer.unref?.();
87
86
  }
88
87
  async stop() {
89
88
  this.stopped = true;
@@ -103,6 +102,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
103
102
  this.rateLimitsCache.clear();
104
103
  this.rateLimitsGenerationByToken.clear();
105
104
  this.quotaBlockedTokenIds.clear();
105
+ this.startingTokenIds.clear();
106
106
  }
107
107
  async onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
108
108
  this.quotaBlockedTokenIds.delete(id);
@@ -121,7 +121,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
121
121
  this.invalidateRateLimitsCache(id);
122
122
  this.quotaBlockedTokenIds.delete(id);
123
123
  await Promise.allSettled(workers.map((w) => w.kill()));
124
- if (this.getAllReadyActiveWorkers().length === 0) this.rejectAllQueued("NO_OPENAI_WORKERS");
124
+ if (!this.hasActiveTokenCandidate(/* @__PURE__ */ new Set())) this.rejectAllQueued("NO_OPENAI_WORKERS");
125
125
  if (workers.length > 0) {
126
126
  const label = tokenName ?? `token ${id}`;
127
127
  logger.info(`workers removed: ${label} (${workers.length})`);
@@ -162,7 +162,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
162
162
  w.active = false;
163
163
  });
164
164
  if (changed) this.weightedSelector.resetScores();
165
- if (this.getAllReadyActiveWorkers().length === 0) this.rejectAllQueued("NO_ACTIVE_WORKERS");
165
+ if (!this.hasActiveTokenCandidate(/* @__PURE__ */ new Set())) this.rejectAllQueued("NO_ACTIVE_WORKERS");
166
166
  const label = tokenName ?? `token ${id}`;
167
167
  logger.info(`workers deactivated: ${label}`);
168
168
  }
@@ -292,8 +292,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
292
292
  }
293
293
  async enqueue(execute, excludedTokenIds = /* @__PURE__ */ new Set()) {
294
294
  const eligibility = await this.resolveTokenEligibility(excludedTokenIds);
295
- if (eligibility.readyActiveTokenIds.size === 0) throw new Error("NO_OPENAI_WORKERS");
296
- if (eligibility.eligibleTokenIds.size === 0) this.throwQuotaThresholdExceeded(eligibility);
295
+ if (eligibility.readyActiveTokenIds.size === 0 && !this.hasActiveTokenCandidate(excludedTokenIds)) throw new Error("NO_OPENAI_WORKERS");
296
+ if (eligibility.readyActiveTokenIds.size > 0 && eligibility.eligibleTokenIds.size === 0) this.throwQuotaThresholdExceeded(eligibility);
297
297
  if (this.queue.length >= MAX_QUEUE_SIZE) throw new Error("SERVER_BUSY");
298
298
  return new Promise((resolve, reject) => {
299
299
  const item = {
@@ -314,6 +314,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
314
314
  excludedTokenIds: new Set(excludedTokenIds)
315
315
  };
316
316
  this.queue.push(item);
317
+ this.requestDrainQueue();
317
318
  this.requestAutoscaleEvaluation();
318
319
  });
319
320
  }
@@ -439,14 +440,23 @@ var OpenAIDispatcher = class OpenAIDispatcher {
439
440
  await worker.executeTurnStream(turnReq, wrappedCb, reuseThreadId);
440
441
  }
441
442
  async spawnWorkers(tokenId, tokenName, credentials, quotaThreshold, weight = 1) {
443
+ if (this.startingTokenIds.has(tokenId)) return;
444
+ this.startingTokenIds.add(tokenId);
442
445
  this.setTokenMetadata(tokenId, tokenName, credentials, quotaThreshold, weight);
446
+ const expectedMetadata = this.tokenMetadata.get(tokenId);
443
447
  const workers = [];
444
- for (let i = 0; i < this.poolConfig.minWorkersPerToken; i++) {
445
- if (i > 0) await sleep(SPAWN_INTERVAL_MS);
446
- const worker = await this.spawnSingleWorker(tokenId, tokenName, credentials, i);
447
- if (worker) workers.push(worker);
448
+ try {
449
+ for (let i = 0; i < this.poolConfig.minWorkersPerToken; i++) {
450
+ if (i > 0) await sleep(SPAWN_INTERVAL_MS);
451
+ const worker = await this.spawnSingleWorker(tokenId, tokenName, credentials, i);
452
+ if (worker) workers.push(worker);
453
+ }
454
+ if (!this.stopped && expectedMetadata?.active && this.tokenMetadata.get(tokenId) === expectedMetadata && !this.workerPool.has(tokenId)) {
455
+ if (workers.length > 0) this.workerPool.set(tokenId, workers);
456
+ } else await Promise.allSettled(workers.map((worker) => worker.kill()));
457
+ } finally {
458
+ this.startingTokenIds.delete(tokenId);
448
459
  }
449
- if (workers.length > 0) this.workerPool.set(tokenId, workers);
450
460
  }
451
461
  async spawnSingleWorker(tokenId, tokenName, credentials, workerIndex) {
452
462
  const worker = new CodexAppServerWorker({
@@ -458,6 +468,9 @@ var OpenAIDispatcher = class OpenAIDispatcher {
458
468
  workerIndex
459
469
  });
460
470
  worker.onReady = () => this.requestDrainQueue();
471
+ worker.onTerminalFailure = () => {
472
+ this.handleWorkerTerminalFailure(worker).catch((e) => logger.warn(`terminal worker cleanup failed: ${tokenName}[${workerIndex}]: ${e.message}`));
473
+ };
461
474
  worker.setServerRequestHandler(async (method) => {
462
475
  if (method === "account/chatgptAuthTokens/refresh") return handleChatgptAuthTokensRefresh(tokenId);
463
476
  throw new Error(`unhandled server-request: ${method}`);
@@ -473,18 +486,20 @@ var OpenAIDispatcher = class OpenAIDispatcher {
473
486
  }
474
487
  }
475
488
  async evaluateAutoscaling() {
489
+ if (this.stopped) return;
490
+ const minimumDeficitTokenIds = await this.ensureMinimumWorkersOneStep();
476
491
  if (!this.poolConfig.autoscale || this.stopped) return;
477
492
  if (this.queue.length > 0) {
478
- await this.scaleUpOneStep();
493
+ await this.scaleUpOneStep(minimumDeficitTokenIds);
479
494
  return;
480
495
  }
481
496
  if (Date.now() - this.lastRequestAt >= this.poolConfig.scaleDownIdleMs) await this.scaleDownOneStep();
482
497
  }
483
- async scaleUpOneStep() {
498
+ async scaleUpOneStep(excludedTokenIds = /* @__PURE__ */ new Set()) {
484
499
  if (!this.poolConfig.autoscale || this.stopped) return;
485
500
  await this.runScaling(async () => {
486
501
  const candidates = [...this.tokenMetadata.entries()].filter(([tokenId, metadata]) => {
487
- if (!metadata.active || this.quotaBlockedTokenIds.has(tokenId)) return false;
502
+ if (!metadata.active || this.startingTokenIds.has(tokenId) || excludedTokenIds.has(tokenId) || this.quotaBlockedTokenIds.has(tokenId)) return false;
488
503
  return (this.workerPool.get(tokenId)?.length ?? 0) < this.poolConfig.maxWorkersPerToken;
489
504
  });
490
505
  if (candidates.length === 0) return;
@@ -498,22 +513,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
498
513
  logger.warn(`openai autoscale blocked: host available ${hostAvailableGiB.toFixed(2)}GiB below ${this.poolConfig.minHostAvailableGiB.toFixed(2)}GiB`);
499
514
  return;
500
515
  }
501
- const added = (await Promise.all(candidates.map(async ([tokenId, metadata]) => {
502
- const workers = this.workerPool.get(tokenId) ?? [];
503
- const workerIndex = this.nextAvailableWorkerIndex(workers);
504
- if (workerIndex >= this.poolConfig.maxWorkersPerToken) return null;
505
- const worker = await this.spawnSingleWorker(tokenId, metadata.name, metadata.credentials, workerIndex);
506
- if (!worker) return null;
507
- const currentMetadata = this.tokenMetadata.get(tokenId);
508
- const currentWorkers = this.workerPool.get(tokenId);
509
- if (!currentMetadata?.active || this.quotaBlockedTokenIds.has(tokenId) || currentMetadata !== metadata || !currentWorkers || currentWorkers.some((entry) => entry.workerIndex === workerIndex)) {
510
- await worker.kill().catch(() => {});
511
- return null;
512
- }
513
- currentWorkers.push(worker);
514
- currentWorkers.sort((a, b) => a.workerIndex - b.workerIndex);
515
- return worker;
516
- }))).filter((worker) => worker !== null).length;
516
+ const added = (await Promise.all(candidates.map(([tokenId, metadata]) => this.spawnAndCommitWorker(tokenId, metadata, true)))).filter((worker) => worker !== null).length;
517
517
  if (added > 0) {
518
518
  logger.info(`openai autoscale up: +${added} workers (${this.workerCount} total, queue ${this.queue.length})`);
519
519
  this.requestDrainQueue();
@@ -521,6 +521,25 @@ var OpenAIDispatcher = class OpenAIDispatcher {
521
521
  }
522
522
  });
523
523
  }
524
+ async ensureMinimumWorkersOneStep() {
525
+ const minimumDeficitTokenIds = /* @__PURE__ */ new Set();
526
+ if (this.stopped) return minimumDeficitTokenIds;
527
+ await this.runScaling(async () => {
528
+ const candidates = [...this.tokenMetadata.entries()].filter(([tokenId, metadata]) => {
529
+ if (!metadata.active || this.startingTokenIds.has(tokenId)) return false;
530
+ return (this.workerPool.get(tokenId)?.length ?? 0) < this.poolConfig.minWorkersPerToken;
531
+ });
532
+ if (candidates.length === 0) return;
533
+ candidates.forEach(([tokenId]) => minimumDeficitTokenIds.add(tokenId));
534
+ const added = (await Promise.all(candidates.map(([tokenId, metadata]) => this.spawnAndCommitWorker(tokenId, metadata, false)))).filter((worker) => worker !== null).length;
535
+ if (added > 0) {
536
+ logger.info(`openai worker pool repaired: +${added} workers (${this.workerCount} total)`);
537
+ this.requestDrainQueue();
538
+ if (this.queue.length > 0) setTimeout(() => this.requestAutoscaleEvaluation(), Math.min(this.poolConfig.scaleIntervalMs, 1e3)).unref?.();
539
+ }
540
+ });
541
+ return minimumDeficitTokenIds;
542
+ }
524
543
  async scaleDownOneStep() {
525
544
  if (!this.poolConfig.autoscale || this.stopped) return;
526
545
  await this.runScaling(async () => {
@@ -543,8 +562,37 @@ var OpenAIDispatcher = class OpenAIDispatcher {
543
562
  for (let index = 0; index < this.poolConfig.maxWorkersPerToken; index++) if (!used.has(index)) return index;
544
563
  return this.poolConfig.maxWorkersPerToken;
545
564
  }
565
+ async spawnAndCommitWorker(tokenId, metadata, respectQuotaBlock) {
566
+ const expectedWorkers = this.workerPool.get(tokenId);
567
+ const workerIndex = this.nextAvailableWorkerIndex(expectedWorkers ?? []);
568
+ if (workerIndex >= this.poolConfig.maxWorkersPerToken) return null;
569
+ const worker = await this.spawnSingleWorker(tokenId, metadata.name, metadata.credentials, workerIndex);
570
+ if (!worker) return null;
571
+ const currentMetadata = this.tokenMetadata.get(tokenId);
572
+ const currentWorkers = this.workerPool.get(tokenId);
573
+ if (!currentMetadata?.active || currentMetadata !== metadata || currentWorkers !== expectedWorkers || respectQuotaBlock && this.quotaBlockedTokenIds.has(tokenId) || currentWorkers?.some((entry) => entry.workerIndex === workerIndex)) {
574
+ await worker.kill().catch(() => {});
575
+ return null;
576
+ }
577
+ const nextWorkers = currentWorkers ?? [];
578
+ nextWorkers.push(worker);
579
+ nextWorkers.sort((a, b) => a.workerIndex - b.workerIndex);
580
+ if (!currentWorkers) this.workerPool.set(tokenId, nextWorkers);
581
+ return worker;
582
+ }
583
+ async handleWorkerTerminalFailure(worker) {
584
+ if (!this.workerPool.get(worker.tokenId)?.includes(worker)) return;
585
+ await worker.kill().catch(() => {});
586
+ const currentWorkers = this.workerPool.get(worker.tokenId);
587
+ if (!currentWorkers?.includes(worker)) return;
588
+ const remaining = currentWorkers.filter((entry) => entry !== worker);
589
+ if (remaining.length > 0) this.workerPool.set(worker.tokenId, remaining);
590
+ else this.workerPool.delete(worker.tokenId);
591
+ logger.warn(`terminal worker removed: ${worker.tokenName}[${worker.workerIndex}] (${remaining.length} remaining)`);
592
+ this.requestAutoscaleEvaluation();
593
+ }
546
594
  requestAutoscaleEvaluation() {
547
- if (!this.poolConfig.autoscale || this.stopped) return;
595
+ if (this.stopped) return;
548
596
  this.evaluateAutoscaling().catch((e) => logger.warn(`openai autoscale evaluation failed: ${e.message}`));
549
597
  }
550
598
  async runScaling(task) {
@@ -597,6 +645,9 @@ var OpenAIDispatcher = class OpenAIDispatcher {
597
645
  });
598
646
  this.weightedSelector.setToken(id, weight);
599
647
  }
648
+ hasActiveTokenCandidate(excludedTokenIds) {
649
+ return [...this.tokenMetadata.entries()].some(([tokenId, metadata]) => metadata.active && !excludedTokenIds.has(tokenId));
650
+ }
600
651
  getQuotaThreshold(tokenId) {
601
652
  return this.tokenMetadata.get(tokenId)?.quotaThreshold;
602
653
  }
@@ -806,4 +857,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
806
857
  //#endregion
807
858
  export { ImageGenerationError, OpenAIDispatcher, makeOpenAIWorkerId };
808
859
 
809
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBDb2RleEFwcFNlcnZlcldvcmtlciDsnpDrj5kg7ZmV7J6lICjquLDrs7ggNX4xNSwgaGFyZCBjYXAgMjApXG4gKiAtIGlkbGUgd29ya2VyIHJvdW5kLXJvYmluIOyEoO2DnSArIO2BkCDrjIDquLAgKOyghOu2gCBidXN5IOyLnClcbiAqIC0gVG9rZW5TdWJzY3JpYmVyIOydtOuypO2KuOuhnCB3b3JrZXIgcG9vbCDrj5nquLDtmZRcbiAqIC0gYmFja3ByZXNzdXJlOiDtgZAgZnVsbCDrmJDripQgdGltZW91dCDsi5wgU0VSVkVSX0JVU1lcbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGZyZWVtZW0gfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9HZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlXCI7XG5pbXBvcnQge1xuICB0eXBlIEdlbmVyYXRlUmVxdWVzdCxcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgdHlwZSBQcm92aWRlckRpc3BhdGNoZXIsXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IENvZGV4QXBwU2VydmVyV29ya2VyLCB0eXBlIFN0cmVhbUNhbGxiYWNrcywgdHlwZSBUdXJuUmVxdWVzdCB9IGZyb20gXCIuL2NvZGV4LXdvcmtlclwiO1xuaW1wb3J0IHtcbiAgcmVhZE9wZW5BSVF1b3RhVXNhZ2UsXG4gIHR5cGUgT3BlbkFJUXVvdGFVc2FnZVJlc3VsdCxcbiAgdHlwZSBPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGEsXG59IGZyb20gXCIuL29wZW5haS1xdW90YVwiO1xuaW1wb3J0IHsgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoIH0gZnJvbSBcIi4vb3BlbmFpLXJlZnJlc2hcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCLFxuICB0eXBlIE9wZW5BSVdvcmtlclBvb2xDb25maWcsXG4gIHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnLFxufSBmcm9tIFwiLi9vcGVuYWktd29ya2VyLXBvb2wtY29uZmlnXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuLy8g7J2066+47KeAIOyDneyEsSDsmpTssq3snbQg6rKM7J207Yq4L+yDneyEseyXkCDsi6TtjKjtlojsnYQg65WM7J2YIOq1rOu2hOyekC5cbi8vIC0gXCJnYXRlXCI6IOyCrOyghCDqsoDspp0g7Iuk7YyoKGNhcGFiaWxpdHkv66qo6424IOupgO2LsOuqqOuLrCDrtojstqnsobEpIOKAlCB0dXJuIOuvuOyLpO2WiS5cbi8vIC0gXCJub3RfY2FsbGVkXCI6IHR1cm4g7J2AIOyEseqzte2WiOycvOuCmCDrqqjrjbjsnbQgaW1hZ2UgdG9vbCDsnYQg7Zi47LacIOyViCDtlagg4oCUIOyerOyLnOuPhCDrrLTsnbUo7ZSE66Gs7ZSE7Yq4IOusuOygnCkuXG4vLyAtIFwiaW5jb21wbGV0ZVwiOiB0b29sIOyLnOuPhOuQkOycvOuCmCDsmYTshLEg7J2066+47KeAIOuvuOuPhOywqSDigJQg7J6s7Iuc64+EIO2bhOuztCjshJzrsoTsuKEg7Iuk7YyoL+qxsOu2gCkuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuY29uc3QgUVVFVUVfVElNRU9VVF9NUyA9IDYwXzAwMDtcbmNvbnN0IE1BWF9RVUVVRV9TSVpFID0gNTA7XG5jb25zdCBTUEFXTl9JTlRFUlZBTF9NUyA9IDUwMDtcblxuZnVuY3Rpb24gcmVhZEhvc3RBdmFpbGFibGVHaUIoKTogbnVtYmVyIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaCA9IHJlYWRGaWxlU3luYyhcIi9wcm9jL21lbWluZm9cIiwgXCJ1dGY4XCIpLm1hdGNoKC9eTWVtQXZhaWxhYmxlOlxccysoXFxkKylcXHMra0IkL20pO1xuICAgIGlmIChtYXRjaD8uWzFdKSByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSAvIDEwMjQgLyAxMDI0O1xuICB9IGNhdGNoIHt9XG4gIHJldHVybiBmcmVlbWVtKCkgLyAxMDI0IC8gMTAyNCAvIDEwMjQ7XG59XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi4xOSkg66W8IO2VmOuCmOydmCDslYjsoJUg7Iir7J6Q66GcIOyduOy9lOuUqS5cbmNvbnN0IE9QRU5BSV9XT1JLRVJfSURfU1RSSURFID0gMTAwO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VPcGVuQUlXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIsIHdvcmtlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZCAqIE9QRU5BSV9XT1JLRVJfSURfU1RSSURFICsgd29ya2VySW5kZXg7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbnR5cGUgUXVldWVJdGVtID0ge1xuICByZXNvbHZlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGFib3J0Q2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+O1xufTtcblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xufTtcblxudHlwZSBUb2tlbkVsaWdpYmlsaXR5ID0ge1xuICByZWFkeUFjdGl2ZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgZWxpZ2libGVUb2tlbklkczogU2V0PG51bWJlcj47XG4gIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IG51bWJlcjtcbn07XG5cbnR5cGUgUmF0ZUxpbWl0c0NhY2hlRW50cnkgPSBPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGEgJiB7XG4gIGdlbmVyYXRpb246IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICB0b2tlbk1ldGFkYXRhID0gbmV3IE1hcDxudW1iZXIsIFRva2VuTWV0YWRhdGE+KCk7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuICByZWFkb25seSBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1b3RhQmxvY2tlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSkge1xuICAgICAgdGhpcy5zY2FsZXJUaW1lciA9IHNldEludGVydmFsKFxuICAgICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICAgIHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsXG4gICAgICApO1xuICAgICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjYWxlclRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuc2NhbGVyVGltZXIpO1xuICAgICAgdGhpcy5zY2FsZXJUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U/LmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIkRJU1BBVENIRVJfU0hVVERPV05cIik7XG4gICAgY29uc3Qga2lsbHMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubWFwKCh3KSA9PiB3LmtpbGwoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGtpbGxzKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZW1vdmVUb2tlbihpZCk7XG4gICAgdGhpcy53b3JrZXJQb29sLmNsZWFyKCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmNsZWFyKCk7XG4gICAgdGhpcy53b3JrZXJDdXJzb3JCeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5jbGVhcigpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUb2tlbiBldmVudHMgKGZyb20gVG9rZW5TdWJzY3JpYmVyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhpZCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgaWYgKHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIk5PX09QRU5BSV9XT1JLRVJTXCIpO1xuICAgIH1cbiAgICBpZiAod29ya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRva2VuTmFtZSA/PyBgdG9rZW4gJHtpZH1gO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgcmVtb3ZlZDogJHtsYWJlbH0gKCR7d29ya2Vycy5sZW5ndGh9KWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0aHJlc2hvbGRDaGFuZ2VkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZChpZCkgIT09IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh0aHJlc2hvbGRDaGFuZ2VkKSB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5zZXRUb2tlbk1ldGFkYXRhKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG5cbiAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmcuZXZlcnkoKHcpID0+IHcuY2FuUmV1c2VGb3JUb2tlbihuYW1lLCBjcmVkZW50aWFscykpKSB7XG4gICAgICBleGlzdGluZy5mb3JFYWNoKCh3KSA9PiB3LnVwZGF0ZVRva2VuU3RhdGUobmFtZSwgY3JlZGVudGlhbHMpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHVwZGF0ZWQgaW4tcGxhY2U6ICR7bmFtZX1gKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGE/LmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgY29uc3QgY2hhbmdlZCA9IHdvcmtlcnMuc29tZSgod29ya2VyKSA9PiB3b3JrZXIuYWN0aXZlKTtcbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKGVsaWdpYmlsaXR5LnJlYWR5QWN0aXZlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgaWYgKGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+PSBNQVhfUVVFVUVfU0laRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcbiAgICAgICAgcmVzb2x2ZTogKHdvcmtlcikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2Uod29ya2VyLCBleGVjdXRlKSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdDogKGVycikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVyOiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21RdWV1ZShpdGVtKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgICAgICB9LCBRVUVVRV9USU1FT1VUX01TKSxcbiAgICAgICAgZXhjbHVkZWRUb2tlbklkczogbmV3IFNldChleGNsdWRlZFRva2VuSWRzKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucXVldWUucHVzaChpdGVtKTtcbiAgICAgIHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUZyb21RdWV1ZShpdGVtOiBRdWV1ZUl0ZW0pOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucXVldWUuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkgdGhpcy5xdWV1ZS5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuXG4gIHJlamVjdEFsbFF1ZXVlZChyZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihyZWFzb24pO1xuICAgIHRoaXMucXVldWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgaXRlbS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cblxuICBhc3luYyBkcmFpblF1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRyYWluaW5nKSB7XG4gICAgICB0aGlzLmRyYWluQWdhaW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhaW5pbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IGZhbHNlO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWluUXVldWVPbmNlKCk7XG4gICAgICB9IHdoaWxlICh0aGlzLmRyYWluQWdhaW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5kcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW5RdWV1ZU9uY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWVbMF0hO1xuICAgICAgbGV0IHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlSWRsZVdvcmtlcihuZXh0LmV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcikge1xuICAgICAgICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgICBuZXh0LnJlamVjdChlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgbmV4dC5yZXNvbHZlKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBleGVjdXRlQW5kUmVsZWFzZTxUPihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIGV4ZWN1dGU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGUod29ya2VyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd29ya2VyLnJlbGVhc2VUdXJuKCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV1c2VUaHJlYWRJZCDqsIAg7J6I7Jy866m0IOq4sOyhtCB0aHJlYWQg7JeQIGRlbHRhKHJldXNlSW5wdXQp66eMLCDsl4bsnLzrqbQg7IOIIHRocmVhZCDsl5Ag7KCE7LK0XG4gIC8vIHByb21wdChjb2xkSW5wdXQpICsgaGlzdG9yeSBpbmplY3QuIHJldXNlIOqwgCBkaXNwYXRjaGVyIOuLqOyXkOyEnCDtj7TrsLHrkJjrqbQg7ZuE7J6Q66GcIOuWqOyWtOynhOuLpC5cbiAgcHJpdmF0ZSBidWlsZFR1cm5SZXF1ZXN0KHJlcTogR2VuZXJhdGVSZXF1ZXN0LCByZXVzZVRocmVhZElkPzogc3RyaW5nKTogVHVyblJlcXVlc3Qge1xuICAgIGNvbnN0IHJldXNpbmcgPSByZXVzZVRocmVhZElkICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiByZXVzaW5nICYmIHJlcS5yZXVzZUlucHV0ID8gcmVxLnJldXNlSW5wdXQgOiByZXEuY29sZElucHV0LFxuICAgICAgaGlzdG9yeTogcmV1c2luZyA/IHVuZGVmaW5lZCA6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHksXG4gICAgICByZWFzb25pbmdTdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgIHNlcnZpY2VUaWVyOiByZXEuc2VydmljZVRpZXIsXG4gICAgICBpbWFnZUdlbmVyYXRpb246IHJlcS5pbWFnZUdlbmVyYXRpb24sXG4gICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyalOyyrSDsgqzsoIQg6rKM7J207Yq4KFI1KTog67Cw7KCV65CcIHdvcmtlciDsnZggY2FwYWJpbGl0eSArIOyggeyaqSDrqqjrjbgg66mA7Yuw66qo64usLlxuICAgIC8vIOu2iOy2qeyhseydtOuptCB0dXJuIOydhCDsi6TtlontlZjsp4Ag7JWK6rOgIOuqheyLnOyggSDsl5Drn6wuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGF3YWl0IHdvcmtlci5jaGVja0ltYWdlR2VuZXJhdGlvblN1cHBvcnQocmVxLm1vZGVsKTtcbiAgICAgIGlmIChyZWFzb24pIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImdhdGVcIiwgcmVhc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuKHR1cm5SZXEsIHJldXNlVGhyZWFkSWQpO1xuXG4gICAgLy8g7J2066+47KeAIDDqsJwg7Iuk7YyoIOu2hOulmChSNik6IHRvb2wg66+47Zi47LacKOyerOyLnOuPhCDrrLTsnbUpIHZzIOyLnOuPhCDtm4Qg66+47JmE7ISxKOyerOyLnOuPhCDtm4Trs7QpLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uICYmICghcmVzdWx0LmltYWdlcyB8fCByZXN1bHQuaW1hZ2VzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRocm93IHJlc3VsdC5pbWFnZUF0dGVtcHRlZFxuICAgICAgICA/IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJpbWFnZSB0b29sIHJhbiBidXQgcHJvZHVjZWQgbm8gY29tcGxldGVkIGltYWdlXCIpXG4gICAgICAgIDogbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwibm90X2NhbGxlZFwiLCBcIm1vZGVsIGRpZCBub3QgY2FsbCB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSxcbiAgICAgIHVzYWdlOiByZXN1bHQudXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyxcbiAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICB3b3JrZXJJZDogbWFrZU9wZW5BSVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICB0aHJlYWRJZDogcmVzdWx0LnRocmVhZElkLFxuICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgfSxcbiAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVN0cmVhbVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gICAgcmV1c2VUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHVyblJlcSA9IHRoaXMuYnVpbGRUdXJuUmVxdWVzdChyZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIC8vIHdvcmtlciDsnZggVHVyblJlc3VsdCDsl5AgdG9rZW5OYW1lL3RocmVhZENvb3JkIOulvCDrtpnsl6wg7IOB7JyEKEdlbmVyYXRlUmVzdWx0KeuhnCDsmKzrprDri6QuXG4gICAgLy8gdGhyZWFkSWQg64qUIOyDiCB0aHJlYWQg66m0IG9uVGhyZWFkSWQg66GcIO2ZleygleuQmOuvgOuhnCDrr7jrpqwg67O06rSA7ZW0IOuRkOqzoCBvbkNvbXBsZXRlIOuVjCDsnb3ripTri6QuXG4gICAgbGV0IHJlc29sdmVkVGhyZWFkSWQgPSByZXVzZVRocmVhZElkID8/IFwiXCI7XG4gICAgY29uc3Qgd3JhcHBlZENiOiBTdHJlYW1DYWxsYmFja3MgPSB7XG4gICAgICAuLi5jYixcbiAgICAgIG9uVGhyZWFkSWQ6ICh0aHJlYWRJZCkgPT4ge1xuICAgICAgICByZXNvbHZlZFRocmVhZElkID0gdGhyZWFkSWQ7XG4gICAgICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICBjYi5vbkNvbXBsZXRlKHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgICB3b3JrZXJJZDogbWFrZU9wZW5BSVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlc29sdmVkVGhyZWFkSWQsXG4gICAgICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IsIHJldXNlVGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdFJlcXVlc3RBdCA+PSB0aGlzLnBvb2xDb25maWcuc2NhbGVEb3duSWRsZU1zKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxlRG93bk9uZVN0ZXAoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzY2FsZVVwT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4udGhpcy50b2tlbk1ldGFkYXRhLmVudHJpZXMoKV0uZmlsdGVyKChbdG9rZW5JZCwgbWV0YWRhdGFdKSA9PiB7XG4gICAgICAgIGlmICghbWV0YWRhdGEuYWN0aXZlIHx8IHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKT8ubGVuZ3RoID8/IDApIDwgdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHByb2plY3RlZFdvcmtlckNvdW50ID0gdGhpcy53b3JrZXJDb3VudCArIGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgICAgY29uc3QgcHJvamVjdGVkUnNzR2lCID0gZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIocHJvamVjdGVkV29ya2VyQ291bnQpO1xuICAgICAgaWYgKHByb2plY3RlZFJzc0dpQiA+IHRoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogZXN0aW1hdGVkIFJTUyAke3Byb2plY3RlZFJzc0dpQi50b0ZpeGVkKDIpfUdpQiBleGNlZWRzICR7dGhpcy5wb29sQ29uZmlnLm1heEVzdGltYXRlZFJzc0dpQi50b0ZpeGVkKDIpfUdpQmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9zdEF2YWlsYWJsZUdpQiA9IHRoaXMuZ2V0SG9zdEF2YWlsYWJsZUdpQigpO1xuICAgICAgaWYgKGhvc3RBdmFpbGFibGVHaUIgPCB0aGlzLnBvb2xDb25maWcubWluSG9zdEF2YWlsYWJsZUdpQikge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgb3BlbmFpIGF1dG9zY2FsZSBibG9ja2VkOiBob3N0IGF2YWlsYWJsZSAke2hvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUIgYmVsb3cgJHt0aGlzLnBvb2xDb25maWcubWluSG9zdEF2YWlsYWJsZUdpQi50b0ZpeGVkKDIpfUdpQmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcChhc3luYyAoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IHdvcmtlckluZGV4ID0gdGhpcy5uZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2Vycyk7XG4gICAgICAgICAgaWYgKHdvcmtlckluZGV4ID49IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW4pIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgICAgbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhLmNyZWRlbnRpYWxzLFxuICAgICAgICAgICAgd29ya2VySW5kZXgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXdvcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY3VycmVudE1ldGFkYXRhPy5hY3RpdmUgfHxcbiAgICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpIHx8XG4gICAgICAgICAgICBjdXJyZW50TWV0YWRhdGEgIT09IG1ldGFkYXRhIHx8XG4gICAgICAgICAgICAhY3VycmVudFdvcmtlcnMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRXb3JrZXJzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS53b3JrZXJJbmRleCA9PT0gd29ya2VySW5kZXgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50V29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgY3VycmVudFdvcmtlcnMuc29ydCgoYSwgYikgPT4gYS53b3JrZXJJbmRleCAtIGIud29ya2VySW5kZXgpO1xuICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgdXA6ICske2FkZGVkfSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsLCBxdWV1ZSAke3RoaXMucXVldWUubGVuZ3RofSlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLCAxXzAwMCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aW1lci51bnJlZj8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNjYWxlRG93bk9uZVN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVkOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkge1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXTtcbiAgICAgICAgaWYgKHdvcmtlcnMubGVuZ3RoIDw9IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW4pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNcbiAgICAgICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGIud29ya2VySW5kZXggLSBhLndvcmtlckluZGV4KVxuICAgICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkuaGFzQ2FwYWNpdHkpO1xuICAgICAgICBpZiAoIXdvcmtlcikgY29udGludWU7XG5cbiAgICAgICAgdGhpcy53b3JrZXJQb29sLnNldChcbiAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgIHdvcmtlcnMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkgIT09IHdvcmtlciksXG4gICAgICAgICk7XG4gICAgICAgIHJlbW92ZWQucHVzaCh3b3JrZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChyZW1vdmVkLm1hcCgod29ya2VyKSA9PiB3b3JrZXIua2lsbCgpKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgb3BlbmFpIGF1dG9zY2FsZSBkb3duOiAtJHtyZW1vdmVkLmxlbmd0aH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbClgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dEF2YWlsYWJsZVdvcmtlckluZGV4KHdvcmtlcnM6IENvZGV4QXBwU2VydmVyV29ya2VyW10pOiBudW1iZXIge1xuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KHdvcmtlcnMubWFwKCh3b3JrZXIpID0+IHdvcmtlci53b3JrZXJJbmRleCkpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuOyBpbmRleCsrKSB7XG4gICAgICBpZiAoIXVzZWQuaGFzKGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5ldmFsdWF0ZUF1dG9zY2FsaW5nKCkuY2F0Y2goKGUpID0+XG4gICAgICBsb2dnZXIud2Fybihgb3BlbmFpIGF1dG9zY2FsZSBldmFsdWF0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TY2FsaW5nKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGluZyA9IHRhc2soKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjYWxpbmdQcm9taXNlID09PSBzY2FsaW5nKSB0aGlzLnNjYWxpbmdQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcbiAgICB0aGlzLnNjYWxpbmdQcm9taXNlID0gc2NhbGluZztcbiAgICBhd2FpdCBzY2FsaW5nO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHJhdGVMaW1pdHNDYWNoZSA9IG5ldyBNYXA8bnVtYmVyLCBSYXRlTGltaXRzQ2FjaGVFbnRyeT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICBhc3luYyBnZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQ6IG51bWJlcik6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldCh0b2tlbklkKTtcbiAgICBpZiAoXG4gICAgICBjYWNoZWQgJiZcbiAgICAgIGNhY2hlZC5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uICYmXG4gICAgICBEYXRlLm5vdygpIC0gY2FjaGVkLmNhY2hlZEF0IDwgT3BlbkFJRGlzcGF0Y2hlci5SQVRFX0xJTUlUU19DQUNIRV9UVExcbiAgICApIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IGNhY2hlZC5kYXRhLCBjYWNoZWRBdDogY2FjaGVkLmNhY2hlZEF0IH07XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VyID0gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW10pLmZpbmQoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgaWYgKCF3b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIm5vIHJlYWR5IG9wZW5haSB3b3JrZXJzXCIpO1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgd29ya2VyLmdldFJhdGVMaW1pdHMoKSkgYXMgR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZTtcbiAgICBjb25zdCBlbnRyeTogUmF0ZUxpbWl0c0NhY2hlRW50cnkgPSB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpLCBnZW5lcmF0aW9uIH07XG4gICAgaWYgKCh0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMCkgPT09IGdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGE6IGVudHJ5LmRhdGEsIGNhY2hlZEF0OiBlbnRyeS5jYWNoZWRBdCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0RHJhaW5RdWV1ZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZHJhaW5RdWV1ZSgpLmNhdGNoKChlKSA9PiBsb2dnZXIud2FybihgZHJhaW5RdWV1ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKHRva2VuSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZSh0b2tlbklkKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5zZXQoXG4gICAgICB0b2tlbklkLFxuICAgICAgKHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwKSArIDEsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VG9rZW5NZXRhZGF0YShcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHtcbiAgICAgIG5hbWUsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICAgIHF1b3RhVGhyZXNob2xkLFxuICAgICAgd2VpZ2h0LFxuICAgICAgYWN0aXZlOiB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKT8uYWN0aXZlID8/IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKT8ucXVvdGFUaHJlc2hvbGQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBQcm9taXNlPFRva2VuRWxpZ2liaWxpdHk+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBjb25zdCBieVRva2VuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB3b3JrZXJzKSB7XG4gICAgICBpZiAoIWJ5VG9rZW4uaGFzKHdvcmtlci50b2tlbklkKSkgYnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlci50b2tlbk5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWR5QWN0aXZlVG9rZW5JZHMgPSBuZXcgU2V0KGJ5VG9rZW4ua2V5cygpKTtcbiAgICBjb25zdCBlbGlnaWJsZVRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgdGhyZXNob2xkZWRUb2tlbkNvdW50ID0gMDtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKGJ5VG9rZW4uZW50cmllcygpKTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBlbnRyaWVzLm1hcChhc3luYyAoW3Rva2VuSWQsIHRva2VuTmFtZV0pID0+IHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB7XG4gICAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZCkpIHtcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgZWxpZ2libGU6IGF3YWl0IHRoaXMuaXNUb2tlblF1b3RhRWxpZ2libGUodG9rZW5JZCwgdG9rZW5OYW1lKSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgIGlmIChjaGVjay52YWx1ZS5lbGlnaWJsZSkge1xuICAgICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgICAgaWYgKHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiBjaGVjay52YWx1ZS50b2tlbk5hbWUsIHRocmVzaG9sZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFt0b2tlbklkLCB0b2tlbk5hbWVdID0gZW50cnk7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkLCB0b2tlbk5hbWUsIFN0cmluZyhjaGVjay5yZWFzb24pKTtcbiAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQodG9rZW5JZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyByZWFkeUFjdGl2ZVRva2VuSWRzLCBlbGlnaWJsZVRva2VuSWRzLCBvdmVyVGhyZXNob2xkVG9rZW5zLCB0aHJlc2hvbGRlZFRva2VuQ291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNUb2tlblF1b3RhRWxpZ2libGUoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHM/OiBTZXQ8bnVtYmVyPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgdG9rZW5NZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0b2tlbk1ldGFkYXRhPy5xdW90YVRocmVzaG9sZDtcbiAgICAgIGlmICghdG9rZW5NZXRhZGF0YT8uYWN0aXZlIHx8IHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IHRocmVzaG9sZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQ6IE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSgoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSAhPT0gdG9rZW5NZXRhZGF0YSkgY29udGludWU7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uZWQgPSAhdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5oYXModG9rZW5JZCk7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgICBpZiAodHJhbnNpdGlvbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dRdW90YU92ZXJUaHJlc2hvbGQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCkpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YVJlY292ZXJlZCh0b2tlbklkLCB0b2tlbk1ldGFkYXRhLm5hbWUgPz8gdG9rZW5OYW1lLCB0aHJlc2hvbGQsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhT3ZlclRocmVzaG9sZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbk5hbWV9WyR7dG9rZW5JZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJvdmVyX3RocmVzaG9sZFwiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YVJlY292ZXJlZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogcmVjb3ZlcmVkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJyZWNvdmVyZWRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIE1vbml0IO2RnOyLnOyaqSDigJQg7Yag7YGw67OEIO2YhOyerCDsm4zsu6Qg7IiYIOyKpOuDheyDtyAo7J2066aE7IicIOygleugrClcbiAgZ2V0IHdvcmtlckNvdW50c0J5VG9rZW4oKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFt0b2tlbklkLCB3b3JrZXJzXSkgPT4gKHtcbiAgICAgICAgbmFtZTogd29ya2Vyc1swXT8udG9rZW5OYW1lID8/IGB0b2tlbiAke3Rva2VuSWR9YCxcbiAgICAgICAgY291bnQ6IHdvcmtlcnMubGVuZ3RoLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuY291bnQgPiAwKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxtQkFBbUIsQ0FBQztBQVF2RCxJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FFbkM7Q0FEWCxZQUNFLE1BQ0EsU0FDQTtFQUNBLE1BQU0sT0FBTztFQUhKLEtBQUEsT0FBQTtFQUlULEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFFQSxNQUFN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
860
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBDb2RleEFwcFNlcnZlcldvcmtlciDsnpDrj5kg7ZmV7J6lICjquLDrs7ggMX4zLCBoYXJkIGNhcCAyMClcbiAqIC0gaWRsZSB3b3JrZXIgcm91bmQtcm9iaW4g7ISg7YOdICsg7YGQIOuMgOq4sCAo7KCE67aAIGJ1c3kg7IucKVxuICogLSBUb2tlblN1YnNjcmliZXIg7J2067Kk7Yq466GcIHdvcmtlciBwb29sIOuPmeq4sO2ZlFxuICogLSBiYWNrcHJlc3N1cmU6IO2BkCBmdWxsIOuYkOuKlCB0aW1lb3V0IOyLnCBTRVJWRVJfQlVTWVxuICovXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgZnJlZW1lbSB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvciB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL0dldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLCB0eXBlIFR1cm5SZXF1ZXN0IH0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQge1xuICByZWFkT3BlbkFJUXVvdGFVc2FnZSxcbiAgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0LFxuICB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSxcbn0gZnJvbSBcIi4vb3BlbmFpLXF1b3RhXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuaW1wb3J0IHtcbiAgZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIsXG4gIHR5cGUgT3BlbkFJV29ya2VyUG9vbENvbmZpZyxcbiAgcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcsXG59IGZyb20gXCIuL29wZW5haS13b3JrZXItcG9vbC1jb25maWdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIOyalOyyreydtCDqsozsnbTtirgv7IOd7ISx7JeQIOyLpO2MqO2WiOydhCDrlYzsnZgg6rWs67aE7J6QLlxuLy8gLSBcImdhdGVcIjog7IKs7KCEIOqygOymnSDsi6TtjKgoY2FwYWJpbGl0eS/rqqjrjbgg66mA7Yuw66qo64usIOu2iOy2qeyhsSkg4oCUIHR1cm4g66+47Iuk7ZaJLlxuLy8gLSBcIm5vdF9jYWxsZWRcIjogdHVybiDsnYAg7ISx6rO17ZaI7Jy864KYIOuqqOuNuOydtCBpbWFnZSB0b29sIOydhCDtmLjstpwg7JWIIO2VqCDigJQg7J6s7Iuc64+EIOustOydtSjtlITroaztlITtirgg66y47KCcKS5cbi8vIC0gXCJpbmNvbXBsZXRlXCI6IHRvb2wg7Iuc64+E65CQ7Jy864KYIOyZhOyEsSDsnbTrr7jsp4Ag66+464+E7LCpIOKAlCDsnqzsi5zrj4Qg7ZuE67O0KOyEnOuyhOy4oSDsi6TtjKgv6rGw67aAKS5cbmV4cG9ydCB0eXBlIEltYWdlRmFpbHVyZUtpbmQgPSBcImdhdGVcIiB8IFwibm90X2NhbGxlZFwiIHwgXCJpbmNvbXBsZXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUdlbmVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkga2luZDogSW1hZ2VGYWlsdXJlS2luZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiSW1hZ2VHZW5lcmF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0VGRk9SVCA9IFwibG93XCI7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZWFkSG9zdEF2YWlsYWJsZUdpQigpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVhZEZpbGVTeW5jKFwiL3Byb2MvbWVtaW5mb1wiLCBcInV0ZjhcIikubWF0Y2goL15NZW1BdmFpbGFibGU6XFxzKyhcXGQrKVxccytrQiQvbSk7XG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pIC8gMTAyNCAvIDEwMjQ7XG4gIH0gY2F0Y2gge31cbiAgcmV0dXJuIGZyZWVtZW0oKSAvIDEwMjQgLyAxMDI0IC8gMTAyNDtcbn1cblxuLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUg6rOg7KCVKS4g64GE66m0IOq4sOyhtCBcIuunpCB0dXJuIOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdFwiIOuPmeyekS5cbmNvbnN0IFRIUkVBRF9SRVVTRV9FTkFCTEVEID0gcHJvY2Vzcy5lbnYuUUdSSURfT1BFTkFJX1RIUkVBRF9SRVVTRSAhPT0gXCJmYWxzZVwiO1xuLy8g7KKM7ZGcIHdvcmtlciDqsIAgYnVzeSDsnbwg65WMIGZyZWUg66W8IOq4sOuLpOumrOuKlCDstZzrjIAg7Iuc6rCELiDstIjqs7wg7IucIOyDiCB0aHJlYWQg66GcIO2PtOuwsS5cbmNvbnN0IFJFVVNFX1dPUktFUl9XQUlUX01TID0gNV8wMDA7XG5jb25zdCBSRVVTRV9XT1JLRVJfUE9MTF9NUyA9IDUwO1xuXG4vLyB3b3JrZXJJZCDtlanshLE6IHRva2VuSWQg7JmAIHdvcmtlckluZGV4KDAuLjE5KSDrpbwg7ZWY64KY7J2YIOyViOyglSDsiKvsnpDroZwg7J247L2U65SpLlxuY29uc3QgT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgPSAxMDA7XG5leHBvcnQgZnVuY3Rpb24gbWFrZU9wZW5BSVdvcmtlcklkKHRva2VuSWQ6IG51bWJlciwgd29ya2VySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b2tlbklkICogT1BFTkFJX1dPUktFUl9JRF9TVFJJREUgKyB3b3JrZXJJbmRleDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24gcXVvdGFUaHJlc2hvbGRFeGNlZWRlZE1lc3NhZ2UoXG4gIHByb3ZpZGVyOiBzdHJpbmcsXG4gIHRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBkZXRhaWxzID0gdG9rZW5zXG4gICAgLm1hcCgodG9rZW4pID0+IGAke3Rva2VuLnRva2VuTmFtZX0gKHRocmVzaG9sZCAke3Rva2VuLnRocmVzaG9sZH0lKWApXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgcmV0dXJuIGRldGFpbHMubGVuZ3RoID4gMFxuICAgID8gYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbHN9YFxuICAgIDogYEFsbCAke3Byb3ZpZGVyfSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkYDtcbn1cblxudHlwZSBRdWV1ZUl0ZW0gPSB7XG4gIHJlc29sdmU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgYWJvcnRDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj47XG59O1xuXG50eXBlIFRva2VuTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xuICBhY3RpdmU6IGJvb2xlYW47XG59O1xuXG50eXBlIFRva2VuRWxpZ2liaWxpdHkgPSB7XG4gIHJlYWR5QWN0aXZlVG9rZW5JZHM6IFNldDxudW1iZXI+O1xuICBlbGlnaWJsZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIHRocmVzaG9sZGVkVG9rZW5Db3VudDogbnVtYmVyO1xufTtcblxudHlwZSBSYXRlTGltaXRzQ2FjaGVFbnRyeSA9IE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSAmIHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG4gIHJlYWRvbmx5IHBvb2xDb25maWc6IE9wZW5BSVdvcmtlclBvb2xDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVvdGFCbG9ja2VkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFydGluZ1Rva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBhdXRvc2NhbGUgb2Zm64+EIGZpeGVkIG1pbuydmCBoZWFsdGggbWFpbnRlbmFuY2XripQg6rOE7IaNIO2VhOyalO2VmOuLpC5cbiAgICB0aGlzLnNjYWxlclRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICB0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLFxuICAgICk7XG4gICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NhbGVyVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY2FsZXJUaW1lcik7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZT8uY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5kZWxldGUoaWQpO1xuICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZShpZCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdGhyZXNob2xkQ2hhbmdlZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoaWQpICE9PSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAodGhyZXNob2xkQ2hhbmdlZCkgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuXG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGV4aXN0aW5nLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlbkRlYWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdG9rZW5OYW1lID0gd29ya2Vyc1swXT8udG9rZW5OYW1lO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKG1ldGFkYXRhPy5hY3RpdmUpIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHsgLi4ubWV0YWRhdGEsIGFjdGl2ZTogZmFsc2UgfSk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUoaWQpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUobmV3IFNldCgpKSkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKFxuICAgICAgZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplID09PSAwICYmXG4gICAgICAhdGhpcy5oYXNBY3RpdmVUb2tlbkNhbmRpZGF0ZShleGNsdWRlZFRva2VuSWRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPiAwICYmIGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPj0gTUFYX1FVRVVFX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBRdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHJlc29sdmU6ICh3b3JrZXIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgZXhlY3V0ZSkpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnIpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lcjogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUoaXRlbSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlNFUlZFUl9CVVNZXCIpKTtcbiAgICAgICAgfSwgUVVFVUVfVElNRU9VVF9NUyksXG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM6IG5ldyBTZXQoZXhjbHVkZWRUb2tlbklkcyksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goaXRlbSk7XG4gICAgICAvLyBlbGlnaWJpbGl0eSDtmZXsnbjqs7wgcXVldWUg7IK97J6FIOyCrOydtOyXkCB3b3JrZXLqsIAgcmVhZHkvaWRsZeydtCDrkJwg6rK97Jqw7J2YIGxvc3Qgd2FrZS11cOydhFxuICAgICAgLy8g64ur64qU64ukLiBmaXhlZCBtb2Rl7JeQ7ISc64+EIGlkbGUgd29ya2Vy6rCAIOymieyLnCBxdWV1ZeulvCDqsIDsoLjqsIDslbwg7ZWc64ukLlxuICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIGRyYWluUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZHJhaW5pbmcpIHtcbiAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5kcmFpbkFnYWluID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJhaW5RdWV1ZU9uY2UoKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMuZHJhaW5BZ2Fpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpblF1ZXVlT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXSE7XG4gICAgICBsZXQgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKG5leHQuZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIG5leHQucmVqZWN0KGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoIXdvcmtlcikgYnJlYWs7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKtIOyCrOyghCDqsozsnbTtirgoUjUpOiDrsLDsoJXrkJwgd29ya2VyIOydmCBjYXBhYmlsaXR5ICsg7KCB7JqpIOuqqOuNuCDrqYDti7Drqqjri6wuXG4gICAgLy8g67aI7Lap7KGx7J2066m0IHR1cm4g7J2EIOyLpO2Wie2VmOyngCDslYrqs6Ag66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgY29uc3QgcmVhc29uID0gYXdhaXQgd29ya2VyLmNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChyZXEubW9kZWwpO1xuICAgICAgaWYgKHJlYXNvbikgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCByZWFzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm4odHVyblJlcSwgcmV1c2VUaHJlYWRJZCk7XG5cbiAgICAvLyDsnbTrr7jsp4AgMOqwnCDsi6TtjKgg67aE66WYKFI2KTogdG9vbCDrr7jtmLjstpwo7J6s7Iuc64+EIOustOydtSkgdnMg7Iuc64+EIO2bhCDrr7jsmYTshLEo7J6s7Iuc64+EIO2bhOuztCkuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgKCFyZXN1bHQuaW1hZ2VzIHx8IHJlc3VsdC5pbWFnZXMubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgcmVzdWx0LmltYWdlQXR0ZW1wdGVkXG4gICAgICAgID8gbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcImltYWdlIHRvb2wgcmFuIGJ1dCBwcm9kdWNlZCBubyBjb21wbGV0ZWQgaW1hZ2VcIilcbiAgICAgICAgOiBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJub3RfY2FsbGVkXCIsIFwibW9kZWwgZGlkIG5vdCBjYWxsIHRoZSBpbWFnZV9nZW5lcmF0aW9uIHRvb2xcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgdXNhZ2U6IHJlc3VsdC51c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdE1zOiByZXN1bHQudHRmdE1zLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgIHRocmVhZElkOiByZXN1bHQudGhyZWFkSWQsXG4gICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICB9LFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgLy8gd29ya2VyIOydmCBUdXJuUmVzdWx0IOyXkCB0b2tlbk5hbWUvdGhyZWFkQ29vcmQg66W8IOu2meyXrCDsg4HsnIQoR2VuZXJhdGVSZXN1bHQp66GcIOyYrOumsOuLpC5cbiAgICAvLyB0aHJlYWRJZCDripQg7IOIIHRocmVhZCDrqbQgb25UaHJlYWRJZCDroZwg7ZmV7KCV65CY66+A66GcIOuvuOumrCDrs7TqtIDtlbQg65GQ6rOgIG9uQ29tcGxldGUg65WMIOydveuKlOuLpC5cbiAgICBsZXQgcmVzb2x2ZWRUaHJlYWRJZCA9IHJldXNlVGhyZWFkSWQgPz8gXCJcIjtcbiAgICBjb25zdCB3cmFwcGVkQ2I6IFN0cmVhbUNhbGxiYWNrcyA9IHtcbiAgICAgIC4uLmNiLFxuICAgICAgb25UaHJlYWRJZDogKHRocmVhZElkKSA9PiB7XG4gICAgICAgIHJlc29sdmVkVGhyZWFkSWQgPSB0aHJlYWRJZDtcbiAgICAgICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoe1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVzb2x2ZWRUaHJlYWRJZCxcbiAgICAgICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuU3RyZWFtKHR1cm5SZXEsIHdyYXBwZWRDYiwgcmV1c2VUaHJlYWRJZCk7XG4gIH1cblxuICAvLyDilIDilIAgU3Bhd24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgc3Bhd25Xb3JrZXJzKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm47XG4gICAgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcih0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBpKTtcbiAgICAgICAgaWYgKHdvcmtlcikgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RvcHBlZCAmJlxuICAgICAgICBleHBlY3RlZE1ldGFkYXRhPy5hY3RpdmUgJiZcbiAgICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSA9PT0gZXhwZWN0ZWRNZXRhZGF0YSAmJlxuICAgICAgICAhdGhpcy53b3JrZXJQb29sLmhhcyh0b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIHRoaXMud29ya2VyUG9vbC5zZXQodG9rZW5JZCwgd29ya2Vycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLmtpbGwoKSkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXJ0aW5nVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB3b3JrZXIub25UZXJtaW5hbEZhaWx1cmUgPSAoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMuaGFuZGxlV29ya2VyVGVybWluYWxGYWlsdXJlKHdvcmtlcikuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGB0ZXJtaW5hbCB3b3JrZXIgY2xlYW51cCBmYWlsZWQ6ICR7dG9rZW5OYW1lfVske3dvcmtlckluZGV4fV06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgY29uc3QgbWluaW11bURlZmljaXRUb2tlbklkcyA9IGF3YWl0IHRoaXMuZW5zdXJlTWluaW11bVdvcmtlcnNPbmVTdGVwKCk7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIGJhc2VsaW5lIOuzteq1rOulvCDsi5zrj4TtlZwgdG9rZW7rp4wg6rCZ7J2AIGV2YWx1YXRpb27snZggZGVtYW5kIGV4cGFuc2lvbuyXkOyEnCDsoJzsmbjtlZzri6QuXG4gICAgICAvLyDri6Trpbgg7KCV7IOBIHRva2Vu7J2YIO2Zleyepeq5jOyngCDrp4nsp4DripQg7JWK64qU64ukLlxuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcChtaW5pbXVtRGVmaWNpdFRva2VuSWRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RSZXF1ZXN0QXQgPj0gdGhpcy5wb29sQ29uZmlnLnNjYWxlRG93bklkbGVNcykge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZURvd25PbmVTdGVwKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2NhbGVVcE9uZVN0ZXAoZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldLmZpbHRlcigoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIW1ldGFkYXRhLmFjdGl2ZSB8fFxuICAgICAgICAgIHRoaXMuc3RhcnRpbmdUb2tlbklkcy5oYXModG9rZW5JZCkgfHxcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSB8fFxuICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwcm9qZWN0ZWRXb3JrZXJDb3VudCA9IHRoaXMud29ya2VyQ291bnQgKyBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHByb2plY3RlZFJzc0dpQiA9IGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCKHByb2plY3RlZFdvcmtlckNvdW50KTtcbiAgICAgIGlmIChwcm9qZWN0ZWRSc3NHaUIgPiB0aGlzLnBvb2xDb25maWcubWF4RXN0aW1hdGVkUnNzR2lCKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIGJsb2NrZWQ6IGVzdGltYXRlZCBSU1MgJHtwcm9qZWN0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUIgZXhjZWVkcyAke3RoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3RBdmFpbGFibGVHaUIgPSB0aGlzLmdldEhvc3RBdmFpbGFibGVHaUIoKTtcbiAgICAgIGlmIChob3N0QXZhaWxhYmxlR2lCIDwgdGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogaG9zdCBhdmFpbGFibGUgJHtob3N0QXZhaWxhYmxlR2lCLnRvRml4ZWQoMil9R2lCIGJlbG93ICR7dGhpcy5wb29sQ29uZmlnLm1pbkhvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUJgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwYXduZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2FuZGlkYXRlcy5tYXAoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHRoaXMuc3Bhd25BbmRDb21taXRXb3JrZXIodG9rZW5JZCwgbWV0YWRhdGEsIHRydWUpKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZGVkID0gc3Bhd25lZC5maWx0ZXIoKHdvcmtlcikgPT4gd29ya2VyICE9PSBudWxsKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIHVwOiArJHthZGRlZH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbCwgcXVldWUgJHt0aGlzLnF1ZXVlLmxlbmd0aH0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpLFxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcywgMV8wMDApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXIudW5yZWY/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmVNaW5pbXVtV29ya2Vyc09uZVN0ZXAoKTogUHJvbWlzZTxTZXQ8bnVtYmVyPj4ge1xuICAgIGNvbnN0IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm4gbWluaW11bURlZmljaXRUb2tlbklkcztcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5maWx0ZXIoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YS5hY3RpdmUgfHwgdGhpcy5zdGFydGluZ1Rva2VuSWRzLmhhcyh0b2tlbklkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCk/Lmxlbmd0aCA/PyAwKSA8IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW47XG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgY2FuZGlkYXRlcy5mb3JFYWNoKChbdG9rZW5JZF0pID0+IG1pbmltdW1EZWZpY2l0VG9rZW5JZHMuYWRkKHRva2VuSWQpKTtcblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcCgoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT5cbiAgICAgICAgICB0aGlzLnNwYXduQW5kQ29tbWl0V29ya2VyKHRva2VuSWQsIG1ldGFkYXRhLCBmYWxzZSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYG9wZW5haSB3b3JrZXIgcG9vbCByZXBhaXJlZDogKyR7YWRkZWR9IHdvcmtlcnMgKCR7dGhpcy53b3JrZXJDb3VudH0gdG90YWwpYCk7XG4gICAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKSxcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsIDFfMDAwKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRpbWVyLnVucmVmPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW5pbXVtRGVmaWNpdFRva2VuSWRzO1xuICB9XG5cbiAgYXN5bmMgc2NhbGVEb3duT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQ6IENvZGV4QXBwU2VydmVyV29ya2VyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdG9rZW5JZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICBpZiAod29ya2Vycy5sZW5ndGggPD0gdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1xuICAgICAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYi53b3JrZXJJbmRleCAtIGEud29ya2VySW5kZXgpXG4gICAgICAgICAgLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5oYXNDYXBhY2l0eSk7XG4gICAgICAgIGlmICghd29ya2VyKSBjb250aW51ZTtcblxuICAgICAgICB0aGlzLndvcmtlclBvb2wuc2V0KFxuICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgd29ya2Vycy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gd29ya2VyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVtb3ZlZC5wdXNoKHdvcmtlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHJlbW92ZWQubWFwKCh3b3JrZXIpID0+IHdvcmtlci5raWxsKCkpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBvcGVuYWkgYXV0b3NjYWxlIGRvd246IC0ke3JlbW92ZWQubGVuZ3RofSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsKWApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgdXNlZCA9IG5ldyBTZXQod29ya2Vycy5tYXAoKHdvcmtlcikgPT4gd29ya2VyLndvcmtlckluZGV4KSk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47IGluZGV4KyspIHtcbiAgICAgIGlmICghdXNlZC5oYXMoaW5kZXgpKSByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZENvbW1pdFdvcmtlcihcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgbWV0YWRhdGE6IFRva2VuTWV0YWRhdGEsXG4gICAgcmVzcGVjdFF1b3RhQmxvY2s6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwZWN0ZWRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICBjb25zdCB3b3JrZXJJbmRleCA9IHRoaXMubmV4dEF2YWlsYWJsZVdvcmtlckluZGV4KGV4cGVjdGVkV29ya2VycyA/PyBbXSk7XG4gICAgaWYgKHdvcmtlckluZGV4ID49IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW4pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcihcbiAgICAgIHRva2VuSWQsXG4gICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgbWV0YWRhdGEuY3JlZGVudGlhbHMsXG4gICAgICB3b3JrZXJJbmRleCxcbiAgICApO1xuICAgIGlmICghd29ya2VyKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3QgY3VycmVudFdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChcbiAgICAgICFjdXJyZW50TWV0YWRhdGE/LmFjdGl2ZSB8fFxuICAgICAgY3VycmVudE1ldGFkYXRhICE9PSBtZXRhZGF0YSB8fFxuICAgICAgY3VycmVudFdvcmtlcnMgIT09IGV4cGVjdGVkV29ya2VycyB8fFxuICAgICAgKHJlc3BlY3RRdW90YUJsb2NrICYmIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB8fFxuICAgICAgY3VycmVudFdvcmtlcnM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS53b3JrZXJJbmRleCA9PT0gd29ya2VySW5kZXgpXG4gICAgKSB7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRXb3JrZXJzID0gY3VycmVudFdvcmtlcnMgPz8gW107XG4gICAgbmV4dFdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgIG5leHRXb3JrZXJzLnNvcnQoKGEsIGIpID0+IGEud29ya2VySW5kZXggLSBiLndvcmtlckluZGV4KTtcbiAgICBpZiAoIWN1cnJlbnRXb3JrZXJzKSB0aGlzLndvcmtlclBvb2wuc2V0KHRva2VuSWQsIG5leHRXb3JrZXJzKTtcbiAgICByZXR1cm4gd29ya2VyO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlV29ya2VyVGVybWluYWxGYWlsdXJlKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCF3b3JrZXJzPy5pbmNsdWRlcyh3b3JrZXIpKSByZXR1cm47XG5cbiAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCFjdXJyZW50V29ya2Vycz8uaW5jbHVkZXMod29ya2VyKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGN1cnJlbnRXb3JrZXJzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSB3b3JrZXIpO1xuICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy53b3JrZXJQb29sLnNldCh3b3JrZXIudG9rZW5JZCwgcmVtYWluaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZSh3b3JrZXIudG9rZW5JZCk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYHRlcm1pbmFsIHdvcmtlciByZW1vdmVkOiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLndvcmtlckluZGV4fV0gKCR7cmVtYWluaW5nLmxlbmd0aH0gcmVtYWluaW5nKWAsXG4gICAgKTtcbiAgICB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICB2b2lkIHRoaXMuZXZhbHVhdGVBdXRvc2NhbGluZygpLmNhdGNoKChlKSA9PlxuICAgICAgbG9nZ2VyLndhcm4oYG9wZW5haSBhdXRvc2NhbGUgZXZhbHVhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2NhbGluZyh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2NhbGluZ1Byb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxpbmcgPSB0YXNrKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSA9PT0gc2NhbGluZykgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG4gICAgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IHNjYWxpbmc7XG4gICAgYXdhaXQgc2NhbGluZztcbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgUmF0ZUxpbWl0c0NhY2hlRW50cnk+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4ge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJhdGVMaW1pdHNDYWNoZS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkICYmXG4gICAgICBjYWNoZWQuZ2VuZXJhdGlvbiA9PT0gZ2VuZXJhdGlvbiAmJlxuICAgICAgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiBjYWNoZWQuZGF0YSwgY2FjaGVkQXQ6IGNhY2hlZC5jYWNoZWRBdCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9ICh0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdKS5maW5kKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGlmICghd29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFkeSBvcGVuYWkgd29ya2Vyc1wiKTtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHdvcmtlci5nZXRSYXRlTGltaXRzKCkpIGFzIEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2U7XG4gICAgY29uc3QgZW50cnk6IFJhdGVMaW1pdHNDYWNoZUVudHJ5ID0geyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSwgZ2VuZXJhdGlvbiB9O1xuICAgIGlmICgodGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uZ2V0KHRva2VuSWQpID8/IDApID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5zZXQodG9rZW5JZCwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhOiBlbnRyeS5kYXRhLCBjYWNoZWRBdDogZW50cnkuY2FjaGVkQXQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdERyYWluUXVldWUoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmRyYWluUXVldWUoKS5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZSh0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5kZWxldGUodG9rZW5JZCk7XG4gICAgdGhpcy5yYXRlTGltaXRzR2VuZXJhdGlvbkJ5VG9rZW4uc2V0KFxuICAgICAgdG9rZW5JZCxcbiAgICAgICh0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMCkgKyAxLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldFRva2VuTWV0YWRhdGEoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIHdlaWdodDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuc2V0KGlkLCB7XG4gICAgICBuYW1lLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgICBxdW90YVRocmVzaG9sZCxcbiAgICAgIHdlaWdodCxcbiAgICAgIGFjdGl2ZTogdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk/LmFjdGl2ZSA/PyB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQWN0aXZlVG9rZW5DYW5kaWRhdGUoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldLnNvbWUoXG4gICAgICAoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4gbWV0YWRhdGEuYWN0aXZlICYmICFleGNsdWRlZFRva2VuSWRzLmhhcyh0b2tlbklkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKT8ucXVvdGFUaHJlc2hvbGQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBQcm9taXNlPFRva2VuRWxpZ2liaWxpdHk+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBjb25zdCBieVRva2VuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB3b3JrZXJzKSB7XG4gICAgICBpZiAoIWJ5VG9rZW4uaGFzKHdvcmtlci50b2tlbklkKSkgYnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlci50b2tlbk5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWR5QWN0aXZlVG9rZW5JZHMgPSBuZXcgU2V0KGJ5VG9rZW4ua2V5cygpKTtcbiAgICBjb25zdCBlbGlnaWJsZVRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgdGhyZXNob2xkZWRUb2tlbkNvdW50ID0gMDtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKGJ5VG9rZW4uZW50cmllcygpKTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBlbnRyaWVzLm1hcChhc3luYyAoW3Rva2VuSWQsIHRva2VuTmFtZV0pID0+IHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB7XG4gICAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZCkpIHtcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgZWxpZ2libGU6IGF3YWl0IHRoaXMuaXNUb2tlblF1b3RhRWxpZ2libGUodG9rZW5JZCwgdG9rZW5OYW1lKSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgIGlmIChjaGVjay52YWx1ZS5lbGlnaWJsZSkge1xuICAgICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgICAgaWYgKHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiBjaGVjay52YWx1ZS50b2tlbk5hbWUsIHRocmVzaG9sZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFt0b2tlbklkLCB0b2tlbk5hbWVdID0gZW50cnk7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkLCB0b2tlbk5hbWUsIFN0cmluZyhjaGVjay5yZWFzb24pKTtcbiAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQodG9rZW5JZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyByZWFkeUFjdGl2ZVRva2VuSWRzLCBlbGlnaWJsZVRva2VuSWRzLCBvdmVyVGhyZXNob2xkVG9rZW5zLCB0aHJlc2hvbGRlZFRva2VuQ291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNUb2tlblF1b3RhRWxpZ2libGUoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHM/OiBTZXQ8bnVtYmVyPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgdG9rZW5NZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0b2tlbk1ldGFkYXRhPy5xdW90YVRocmVzaG9sZDtcbiAgICAgIGlmICghdG9rZW5NZXRhZGF0YT8uYWN0aXZlIHx8IHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IHRocmVzaG9sZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQ6IE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSgoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSAhPT0gdG9rZW5NZXRhZGF0YSkgY29udGludWU7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uZWQgPSAhdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5oYXModG9rZW5JZCk7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgICBpZiAodHJhbnNpdGlvbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dRdW90YU92ZXJUaHJlc2hvbGQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCkpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YVJlY292ZXJlZCh0b2tlbklkLCB0b2tlbk1ldGFkYXRhLm5hbWUgPz8gdG9rZW5OYW1lLCB0aHJlc2hvbGQsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhT3ZlclRocmVzaG9sZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbk5hbWV9WyR7dG9rZW5JZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJvdmVyX3RocmVzaG9sZFwiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YVJlY292ZXJlZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogcmVjb3ZlcmVkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJyZWNvdmVyZWRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIE1vbml0IO2RnOyLnOyaqSDigJQg7Yag7YGw67OEIO2YhOyerCDsm4zsu6Qg7IiYIOyKpOuDheyDtyAo7J2066aE7IicIOygleugrClcbiAgZ2V0IHdvcmtlckNvdW50c0J5VG9rZW4oKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFt0b2tlbklkLCB3b3JrZXJzXSkgPT4gKHtcbiAgICAgICAgbmFtZTogd29ya2Vyc1swXT8udG9rZW5OYW1lID8/IGB0b2tlbiAke3Rva2VuSWR9YCxcbiAgICAgICAgY291bnQ6IHdvcmtlcnMubGVuZ3RoLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuY291bnQgPiAwKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxtQkFBbUIsQ0FBQztBQVF2RCxJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FFbkM7Q0FEWCxZQUNFLE1BQ0EsU0FDQTtFQUNBLE1BQU0sT0FBTztFQUhKLEtBQUEsT0FBQTtFQUlULEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFFQSxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG9CQUFvQjtBQUUxQixTQUFTLHVCQUErQjtDQUN0QyxJQUFJO0VBQ0YsTUFBTSxRQUFRLGFBQWEsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sK0JBQStCO0VBQ3pGLElBQUksUUFBUSxJQUFJLE9BQU8sT0FBTyxNQUFNLEVBQUUsSUFBSSxPQUFPO0NBQ25ELFFBQVEsQ0FBQztDQUNULE9BQU8sUUFBUSxJQUFJLE9BQU8sT0FBTztBQUNuQztBQUdBLE1BQU0sdUJBQXVCLFFBQVEsSUFBSSw4QkFBOEI7QUFFdkUsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx1QkFBdUI7QUFHN0IsTUFBTSwwQkFBMEI7QUFDaEMsU0FBZ0IsbUJBQW1CLFNBQWlCLGFBQTZCO0NBQy9FLE9BQU8sVUFBVSwwQkFBMEI7QUFDN0M7QUFFQSxTQUFTLE1BQU0sSUFBMkI7Q0FDeEMsT0FBTyxJQUFJLFNBQVMsWUFBWSxXQUFXLFNBQVMsRUFBRSxDQUFDO0FBQ3pEO0FBRUEsU0FBUyw4QkFDUCxVQUNBLFFBQ1E7Q0FDUixNQUFNLFVBQVUsT0FDYixLQUFLLFVBQVUsR0FBRyxNQUFNLFVBQVUsY0FBYyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQ3BFLEtBQUssSUFBSTtDQUNaLE9BQU8sUUFBUSxTQUFTLElBQ3BCLE9BQU8sU0FBUyxvQ0FBb0MsWUFDcEQsT0FBTyxTQUFTO0FBQ3RCO0FBNkJBLElBQWEsbUJBQWIsTUFBYSxpQkFBK0M7Q0FDMUQsNkJBQWEsSUFBSSxJQUFvQztDQUNyRCxnQ0FBZ0IsSUFBSSxJQUEyQjtDQUMvQyxRQUFxQixDQUFDO0NBQ3RCO0NBQ0EsdUNBQXdDLElBQUksSUFBWTtDQUN4RCxtQ0FBb0MsSUFBSSxJQUFZO0NBQ3BELDhDQUErQyxJQUFJLElBQW9CO0NBQ3ZFLG1CQUFvQyxJQUFJLHlCQUF5QjtDQUNqRSxzQ0FBdUMsSUFBSSxJQUFvQjtDQUMvRDtDQUNBLFdBQW1CO0NBQ25CLGFBQXFCO0NBQ3JCLGNBQTZEO0NBQzdELGlCQUErQztDQUMvQyxnQkFBd0IsS0FBSyxJQUFJO0NBQ2pDLFVBQWtCO0NBRWxCLFlBQ0UsYUFBcUMsOEJBQThCLEdBQ25FLHNCQUFvQyxzQkFDcEM7RUFDQSxLQUFLLGFBQWE7RUFDbEIsS0FBSyxzQkFBc0I7Q0FDN0I7Q0FFQSxNQUFNLFFBQXVCO0VBQzNCLEtBQUssVUFBVTtFQUNmLE1BQU0sRUFBRSxTQUFTLE1BQU0sV0FBVyxTQUFTLEdBQUc7RUFDOUMsTUFBTSxlQUFlLEtBQUssUUFBUSxNQUFNLEVBQUUsYUFBYSxRQUFRO0VBQy9ELE9BQU8sS0FDTCxLQUFLLFdBQVcsWUFDWixZQUFZLGFBQWEsT0FBTyxrQkFBa0IsS0FBSyxXQUFXLG1CQUFtQixHQUFHLEtBQUssV0FBVyxtQkFBbUIsNkJBQzNILFlBQVksYUFBYSxPQUFPLGtCQUFrQixLQUFLLFdBQVcsbUJBQW1CLGVBQzNGO0VBRUEsTUFBTSxRQUFRLFdBQ1osYUFBYSxJQUFJLE9BQU8sTUFBTTtHQUM1QixNQUFNLEtBQUssYUFDVCxFQUFFLElBQ0YsRUFBRSxNQUNGLEVBQUUsYUFDRixFQUFFLGlCQUNGLEVBQUUsTUFDSjtHQUNBLElBQUksQ0FBQyxFQUFFLFFBQVEsS0FBSyxtQkFBbUIsRUFBRSxFQUFFO0VBQzdDLENBQUMsQ0FDSDtFQUdBLEtBQUssY0FBYyxrQkFDWCxLQUFLLDJCQUEyQixHQUN0QyxLQUFLLFdBQVcsZUFDbEI7RUFDQSxLQUFLLFlBQVksUUFBUTtDQUMzQjtDQUVBLE1BQU0sT0FBc0I7RUFDMUIsS0FBSyxVQUFVO0VBQ2YsSUFBSSxLQUFLLGFBQWE7R0FDcEIsY0FBYyxLQUFLLFdBQVc7R0FDOUIsS0FBSyxjQUFjO0VBQ3JCO0VBQ0EsTUFBTSxLQUFLLGdCQUFnQixZQUFZLENBQUMsQ0FBQztFQUN6QyxLQUFLLGdCQUFnQixxQkFBcUI7RUFDMUMsTUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLFdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxLQUFLLENBQUM7RUFDdEUsTUFBTSxRQUFRLFdBQVcsS0FBSztFQUM5QixLQUFLLE1BQU0sTUFBTSxLQUFLLGNBQWMsS0FBSyxHQUFHLEtBQUssaUJBQWlCLFlBQVksRUFBRTtFQUNoRixLQUFLLFdBQVcsTUFBTTtFQUN0QixLQUFLLGNBQWMsTUFBTTtFQUN6QixLQUFLLG9CQUFvQixNQUFNO0VBQy9CLEtBQUssaUJBQWlCLFlBQVk7RUFDbEMsS0FBSyxnQkFBZ0IsTUFBTTtFQUMzQixLQUFLLDRCQUE0QixNQUFNO0VBQ3ZDLEtBQUsscUJBQXFCLE1BQU07RUFDaEMsS0FBSyxpQkFBaUIsTUFBTTtDQUM5QjtDQUlBLE1BQU0sYUFDSixJQUNBLE1BQ0EsYUFDQSxnQkFDQSxTQUFTLEdBQ007RUFDZixLQUFLLHFCQUFxQixPQUFPLEVBQUU7RUFDbkMsS0FBSywwQkFBMEIsRUFBRTtFQUNqQyxLQUFLLGlCQUFpQixJQUFJLE1BQU0sYUFBYSxnQkFBZ0IsTUFBTTtFQUNuRSxJQUFJLEtBQUssV0FBVyxJQUFJLEVBQUUsR0FBRztFQUM3QixNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sYUFBYSxnQkFBZ0IsTUFBTTtDQUN2RTtDQUVBLE1BQU0sZUFBZSxJQUEyQjtFQUM5QyxNQUFNLFVBQVUsS0FBSyxXQUFXLElBQUksRUFBRSxLQUFLLENBQUM7RUFDNUMsTUFBTSxZQUFZLFFBQVEsRUFBRSxFQUFFO0VBQzlCLEtBQUssV0FBVyxPQUFPLEVBQUU7RUFDekIsS0FBSyxjQUFjLE9BQU8sRUFBRTtFQUM1QixLQUFLLGlCQUFpQixZQUFZLEVBQUU7RUFDcEMsS0FBSyxvQkFBb0IsT0FBTyxFQUFFO0VBQ2xDLEtBQUssMEJBQTBCLEVBQUU7RUFDakMsS0FBSyxxQkFBcUIsT0FBTyxFQUFFO0VBQ25DLE1BQU0sUUFBUSxXQUFXLFFBQVEsS0FBSyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDckQsSUFBSSxDQUFDLEtBQUssd0NBQXdCLElBQUksSUFBSSxDQUFDLEdBQ3pDLEtBQUssZ0JBQWdCLG1CQUFtQjtFQUUxQyxJQUFJLFFBQVEsU0FBUyxHQUFHO0dBQ3RCLE1BQU0sUUFBUSxhQUFhLFNBQVM7R0FDcEMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLElBQUksUUFBUSxPQUFPLEVBQUU7RUFDN0Q7Q0FDRjtDQUVBLE1BQU0sZUFDSixJQUNBLE1BQ0EsYUFDQSxnQkFDQSxTQUFTLEdBQ007RUFDZixNQUFNLFdBQVcsS0FBSyxXQUFXLElBQUksRUFBRSxLQUFLLENBQUM7RUFFN0MsSUFEeUIsS0FBSyxrQkFBa0IsRUFBRSxNQUFNLGdCQUNsQyxLQUFLLHFCQUFxQixPQUFPLEVBQUU7RUFDekQsS0FBSyxpQkFBaUIsSUFBSSxNQUFNLGFBQWEsZ0JBQWdCLE1BQU07RUFFbkUsSUFBSSxTQUFTLFdBQVcsR0FBRztHQUN6QixLQUFLLDBCQUEwQixFQUFFO0dBQ2pDLE1BQU0sS0FBSyxhQUFhLElBQUksTUFBTSxhQUFhLGdCQUFnQixNQUFNO0dBQ3JFO0VBQ0Y7RUFFQSxJQUFJLFNBQVMsT0FBTyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sV0FBVyxDQUFDLEdBQUc7R0FDaEUsU0FBUyxTQUFTLE1BQU0sRUFBRSxpQkFBaUIsTUFBTSxXQUFXLENBQUM7R0FDN0QsT0FBTyxLQUFLLDZCQUE2QixNQUFNO0dBQy9DLEtBQUssa0JBQWtCO0dBQ3ZCO0VBQ0Y7RUFFQSxLQUFLLFdBQVcsT0FBTyxFQUFFO0VBQ3pCLEtBQUssMEJBQTBCLEVBQUU7RUFDakMsS0FBSyxxQkFBcUIsT0FBTyxFQUFFO0VBQ25DLE1BQU0sUUFBUSxXQUFXLFNBQVMsS0FBSyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDdEQsTUFBTSxLQUFLLGFBQWEsSUFBSSxNQUFNLGFBQWEsZ0JBQWdCLE1BQU07Q0FDdkU7Q0FFQSxtQkFBbUIsSUFBa0I7RUFDbkMsTUFBTSxVQUFVLEtBQUssV0FBVyxJQUFJLEVBQUUsS0FBSyxDQUFDO0VBQzVDLE1BQU0sWUFBWSxRQUFRLEVBQUUsRUFBRTtFQUM5QixNQUFNLFdBQVcsS0FBSyxjQUFjLElBQUksRUFBRTtFQUMxQyxJQUFJLFVBQVUsUUFBUSxLQUFLLGNBQWMsSUFBSSxJQUFJO0dBQUUsR0FBRztHQUFVLFFBQVE7RUFBTSxDQUFDO0VBQy9FLEtBQUsscUJBQXFCLE9BQU8sRUFBRTtFQUNuQyxNQUFNLFVBQVUsUUFBUSxNQUFNLFdBQVcsT0FBTyxNQUFNO0VBQ3RELFFBQVEsU0FBUyxNQUFNO0dBQ3JCLEVBQUUsU0FBUztFQUNiLENBQUM7RUFDRCxJQUFJLFNBQVMsS0FBSyxpQkFBaUIsWUFBWTtFQUMvQyxJQUFJLENBQUMsS0FBSyx3Q0FBd0IsSUFBSSxJQUFJLENBQUMsR0FDekMsS0FBSyxnQkFBZ0IsbUJBQW1CO0VBRTFDLE1BQU0sUUFBUSxhQUFhLFNBQVM7RUFDcEMsT0FBTyxLQUFLLHdCQUF3QixPQUFPO0NBQzdDO0NBRUEsaUJBQWlCLElBQWtCO0VBQ2pDLE1BQU0sVUFBVSxLQUFLLFdBQVcsSUFBSSxFQUFFLEtBQUssQ0FBQztFQUM1QyxNQUFNLFlBQVksUUFBUSxFQUFFLEVBQUU7RUFDOUIsTUFBTSxXQUFXLEtBQUssY0FBYyxJQUFJLEVBQUU7RUFDMUMsSUFBSSxZQUFZLENBQUMsU0FBUyxRQUFRLEtBQUssY0FBYyxJQUFJLElBQUk7R0FBRSxHQUFHO0dBQVUsUUFBUTtFQUFLLENBQUM7RUFDMUYsTUFBTSxVQUFVLFFBQVEsTUFBTSxXQUFXLENBQUMsT0FBTyxNQUFNO0VBQ3ZELFFBQVEsU0FBUyxNQUFNO0dBQ3JCLEVBQUUsU0FBUztFQUNiLENBQUM7RUFDRCxJQUFJLFNBQVMsS0FBSyxpQkFBaUIsWUFBWTtFQUMvQyxLQUFLLGtCQUFrQjtFQUN2QixNQUFNLFFBQVEsYUFBYSxTQUFTO0VBQ3BDLE9BQU8sS0FBSyxzQkFBc0IsT0FBTztDQUMzQztDQUVBLE1BQU0sY0FDSixNQU9lO0VBQ2YsTUFBTSxPQUFPLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFLEVBQUUsQ0FBQztFQUMxQyxLQUFLLE1BQU0sTUFBTSxNQUFNLEtBQUssS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUNoRCxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssZUFBZSxFQUFFO0VBR2pELEtBQUssTUFBTSxPQUFPLE1BQU07R0FDdEIsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEVBQUUsR0FDNUIsTUFBTSxLQUFLLGVBQ1QsSUFBSSxJQUNKLElBQUksTUFDSixJQUFJLGFBQ0osSUFBSSxnQkFDSixJQUFJLE1BQ047UUFFQSxNQUFNLEtBQUssYUFBYSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksYUFBYSxJQUFJLGdCQUFnQixJQUFJLE1BQU07R0FFM0YsS0FBSyxpQkFBaUIsSUFBSSxFQUFFO0VBQzlCO0NBQ0Y7Q0FJQSxNQUFNLFNBQVMsS0FBK0M7RUFDNUQsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJO0VBQzlCLE1BQU0sbUNBQW1CLElBQUksSUFBWTtFQUV6QyxNQUFNLGNBQWMsTUFBTSxLQUFLLG1CQUFtQixLQUFLLGdCQUFnQjtFQUN2RSxJQUFJLGFBQWE7R0FDZixPQUFPLEtBQ0wsS0FBSyxZQUFZLFVBQVUsR0FBRyxZQUFZLFFBQVEsbUJBQW1CLElBQUksTUFBTSxFQUNqRjtHQUNBLE9BQU8sS0FBSyxrQkFBa0IsY0FBYyxNQUMxQyxLQUFLLFlBQVksR0FBRyxLQUFLLElBQUksTUFBTyxRQUFRLENBQzlDO0VBQ0Y7RUFFQSxNQUFNLFNBQVMsTUFBTSxLQUFLLGtCQUFrQixnQkFBZ0I7RUFDNUQsSUFBSSxRQUFRO0dBQ1YsT0FBTyxLQUFLLEtBQUssT0FBTyxVQUFVLEdBQUcsT0FBTyxRQUFRLFlBQVksSUFBSSxNQUFNLEVBQUU7R0FDNUUsT0FBTyxLQUFLLGtCQUFrQixTQUFTLE1BQU0sS0FBSyxZQUFZLEdBQUcsR0FBRyxDQUFDO0VBQ3ZFO0VBQ0EsT0FBTyxLQUFLLFNBQVMsTUFBTTtHQUN6QixPQUFPLEtBQUssS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFLFFBQVEsWUFBWSxJQUFJLE1BQU0sVUFBVTtHQUMxRSxPQUFPLEtBQUssWUFBWSxHQUFHLEdBQUc7RUFDaEMsR0FBRyxnQkFBZ0I7Q0FDckI7Q0FFQSxNQUFNLGVBQWUsS0FBc0IsSUFBNEM7RUFDckYsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJO0VBRzlCLElBQUksSUFBSSxpQkFDTixNQUFNLElBQUkscUJBQ1IsUUFDQSx5REFDRjtFQUVGLE1BQU0sbUNBQW1CLElBQUksSUFBWTtFQUN6QyxNQUFNLGNBQWMsTUFBTSxLQUFLLG1CQUFtQixLQUFLLGdCQUFnQjtFQUN2RSxJQUFJLGFBQWE7R0FDZixPQUFPLEtBQUssS0FBSyxZQUFZLFVBQVUsR0FBRyxZQUFZLFFBQVEsMkJBQTJCO0dBQ3pGLE9BQU8sS0FBSyxrQkFBa0IsY0FBYyxNQUMxQyxLQUFLLGtCQUFrQixHQUFHLEtBQUssSUFBSSxJQUFJLE1BQU8sUUFBUSxDQUN4RDtFQUNGO0VBRUEsTUFBTSxTQUFTLE1BQU0sS0FBSyxrQkFBa0IsZ0JBQWdCO0VBQzVELElBQUksUUFBUTtHQUNWLE9BQU8sS0FBSyxLQUFLLE9BQU8sVUFBVSxHQUFHLE9BQU8sUUFBUSxZQUFZLElBQUksTUFBTSxZQUFZO0dBQ3RGLE9BQU8sS0FBSyxrQkFBa0IsU0FBUyxNQUFNLEtBQUssa0JBQWtCLEdBQUcsS0FBSyxFQUFFLENBQUM7RUFDakY7RUFDQSxPQUFPLEtBQUssU0FBUyxNQUFNO0dBQ3pCLE9BQU8sS0FBSyxLQUFLLEVBQUUsVUFBVSxHQUFHLEVBQUUsUUFBUSxZQUFZLElBQUksTUFBTSxvQkFBb0I7R0FDcEYsT0FBTyxLQUFLLGtCQUFrQixHQUFHLEtBQUssRUFBRTtFQUMxQyxHQUFHLGdCQUFnQjtDQUNyQjtDQUtBLE1BQU0sbUJBQ0osS0FDQSxtQ0FBbUIsSUFBSSxJQUFZLEdBQ0c7RUFHdEMsSUFBSSxJQUFJLGlCQUFpQixPQUFPO0VBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLE9BQU8sT0FBTztFQUNoRCxNQUFNLEVBQUUsVUFBVSxVQUFVLFVBQVUsSUFBSTtFQUUxQyxNQUFNLFNBQVMsS0FBSyxlQUFlLFFBQVE7RUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLFFBQVEsT0FBTztFQUN6RCxJQUFJLE9BQU8sVUFBVSxPQUFPLE9BQU87RUFDbkMsSUFBSSxDQUFDLE9BQU8sVUFBVSxRQUFRLEdBQUcsT0FBTztFQUN4QyxNQUFNLGdCQUFnQixLQUFLLGNBQWMsSUFBSSxPQUFPLE9BQU87RUFDM0QsSUFBSSxDQUFFLE1BQU0sS0FBSyxxQkFBcUIsT0FBTyxTQUFTLE9BQU8sV0FBVyxnQkFBZ0IsR0FDdEYsT0FBTztFQUVULElBQ0UsQ0FBQyxPQUFPLFdBQ1IsQ0FBQyxPQUFPLFVBQ1IsS0FBSyxjQUFjLElBQUksT0FBTyxPQUFPLE1BQU0saUJBQzNDLEtBQUsscUJBQXFCLElBQUksT0FBTyxPQUFPLEdBQzVDO0dBQ0EsSUFBSSxLQUFLLHFCQUFxQixJQUFJLE9BQU8sT0FBTyxHQUM5QyxpQkFBaUIsSUFBSSxPQUFPLE9BQU87R0FFckMsT0FBTztFQUNUO0VBRUEsTUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0VBQzlCLFNBQVM7R0FFUCxJQUNFLENBQUMsT0FBTyxXQUNSLENBQUMsT0FBTyxVQUNSLE9BQU8sVUFBVSxTQUNqQixDQUFDLE9BQU8sVUFBVSxRQUFRLEtBQzFCLEtBQUssY0FBYyxJQUFJLE9BQU8sT0FBTyxNQUFNLGlCQUMzQyxLQUFLLHFCQUFxQixJQUFJLE9BQU8sT0FBTyxHQUM1QztJQUNBLElBQUksS0FBSyxxQkFBcUIsSUFBSSxPQUFPLE9BQU8sR0FDOUMsaUJBQWlCLElBQUksT0FBTyxPQUFPO0lBRXJDLE9BQU87R0FDVDtHQUNBLElBQUksT0FBTyxlQUFlLEdBQUcsT0FBTztHQUNwQyxJQUFJLEtBQUssSUFBSSxLQUFLLFVBQVUsT0FBTztHQUNuQyxNQUFNLE1BQU0sb0JBQW9CO0VBQ2xDO0NBQ0Y7Q0FFQSxlQUFlLFVBQStDO0VBQzVELEtBQUssTUFBTSxXQUFXLEtBQUssV0FBVyxPQUFPLEdBQzNDLEtBQUssTUFBTSxLQUFLLFNBQ2QsSUFBSSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsV0FBVyxNQUFNLFVBQVUsT0FBTztFQUcxRSxPQUFPO0NBQ1Q7Q0FFQSxNQUFNLG9CQUFvQixVQUFrQixRQUErQjtFQUN6RSxNQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsTUFBTSxFQUFFLE9BQU87RUFDL0UsTUFBTSxRQUFRLFdBQVcsV0FBVyxLQUFLLE1BQU0sRUFBRSxjQUFjLFVBQVUsTUFBTSxDQUFDLENBQUM7Q0FDbkY7Q0FJQSxNQUFNLGtCQUNKLG1DQUFtQixJQUFJLElBQVksR0FDRztFQUN0QyxNQUFNLGNBQWMsTUFBTSxLQUFLLHdCQUF3QixnQkFBZ0I7RUFDdkUsSUFBSSxZQUFZLG9CQUFvQixTQUFTLEdBQUcsT0FBTztFQUN2RCxJQUFJLFlBQVksaUJBQWlCLFNBQVMsR0FBRyxLQUFLLDRCQUE0QixXQUFXO0VBRXpGLE1BQU0saUNBQWlCLElBQUksSUFBb0M7RUFDL0QsS0FBSyxNQUFNLFVBQVUsS0FBSyx5QkFBeUIsR0FBRztHQUNwRCxJQUFJLENBQUMsWUFBWSxpQkFBaUIsSUFBSSxPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sYUFBYTtHQUM5RSxNQUFNLFVBQVUsZUFBZSxJQUFJLE9BQU8sT0FBTyxLQUFLLENBQUM7R0FDdkQsUUFBUSxLQUFLLE1BQU07R0FDbkIsZUFBZSxJQUFJLE9BQU8sU0FBUyxPQUFPO0VBQzVDO0VBRUEsTUFBTSxrQkFBa0IsS0FBSyxpQkFBaUIsT0FBTyxJQUFJLElBQUksZUFBZSxLQUFLLENBQUMsQ0FBQztFQUNuRixJQUFJLG9CQUFvQixNQUFNLE9BQU87RUFDckMsTUFBTSxVQUFVLGVBQWUsSUFBSSxlQUFlO0VBQ2xELE1BQU0sU0FBUyxLQUFLLG9CQUFvQixJQUFJLGVBQWUsS0FBSztFQUNoRSxLQUFLLElBQUksU0FBUyxHQUFHLFNBQVMsUUFBUSxRQUFRLFVBQVU7R0FDdEQsTUFBTSxTQUFTLFNBQVMsVUFBVSxRQUFRO0dBQzFDLE1BQU0sU0FBUyxRQUFRO0dBQ3ZCLElBQUksT0FBTyxlQUFlLEdBQUc7SUFDM0IsS0FBSyxvQkFBb0IsSUFBSSxrQkFBa0IsUUFBUSxLQUFLLFFBQVEsTUFBTTtJQUMxRSxPQUFPO0dBQ1Q7RUFDRjtFQUNBLE1BQU0sSUFBSSxNQUNSLGtCQUFrQixnQkFBZ0IsK0NBQ3BDO0NBQ0Y7Q0FFQSwyQkFBbUQ7RUFDakQsT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU07Q0FDakY7Q0FJQSxNQUFNLFFBQ0osU0FDQSxtQ0FBbUIsSUFBSSxJQUFZLEdBQ3ZCO0VBQ1osTUFBTSxjQUFjLE1BQU0sS0FBSyx3QkFBd0IsZ0JBQWdCO0VBQ3ZFLElBQ0UsWUFBWSxvQkFBb0IsU0FBUyxLQUN6QyxDQUFDLEtBQUssd0JBQXdCLGdCQUFnQixHQUU5QyxNQUFNLElBQUksTUFBTSxtQkFBbUI7RUFFckMsSUFBSSxZQUFZLG9CQUFvQixPQUFPLEtBQUssWUFBWSxpQkFBaUIsU0FBUyxHQUNwRixLQUFLLDRCQUE0QixXQUFXO0VBRTlDLElBQUksS0FBSyxNQUFNLFVBQVUsZ0JBQ3ZCLE1BQU0sSUFBSSxNQUFNLGFBQWE7RUFHL0IsT0FBTyxJQUFJLFNBQVksU0FBUyxXQUFXO0dBQ3pDLE1BQU0sT0FBa0I7SUFDdEIsVUFBVSxXQUFXO0tBQ25CLGFBQWEsS0FBSyxLQUFLO0tBQ3ZCLEtBQUssZUFBZTtLQUNwQixRQUFRLFFBQVEsQ0FBQyxDQUNkLFdBQVcsS0FBSyxrQkFBa0IsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUNuRCxLQUFLLFNBQVMsTUFBTTtJQUN6QjtJQUNBLFNBQVMsUUFBUTtLQUNmLGFBQWEsS0FBSyxLQUFLO0tBQ3ZCLEtBQUssZUFBZTtLQUNwQixPQUFPLEdBQUc7SUFDWjtJQUNBLE9BQU8saUJBQWlCO0tBQ3RCLEtBQUssZ0JBQWdCLElBQUk7S0FDekIsdUJBQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztJQUNqQyxHQUFHLGdCQUFnQjtJQUNuQixrQkFBa0IsSUFBSSxJQUFJLGdCQUFnQjtHQUM1QztHQUVBLEtBQUssTUFBTSxLQUFLLElBQUk7R0FHcEIsS0FBSyxrQkFBa0I7R0FDdkIsS0FBSywyQkFBMkI7RUFDbEMsQ0FBQztDQUNIO0NBRUEsZ0JBQWdCLE1BQXVCO0VBQ3JDLGFBQWEsS0FBSyxLQUFLO0VBQ3ZCLEtBQUssZUFBZTtFQUNwQixNQUFNLE1BQU0sS0FBSyxNQUFNLFFBQVEsSUFBSTtFQUNuQyxJQUFJLFFBQVEsSUFBSSxLQUFLLE1BQU0sT0FBTyxLQUFLLENBQUM7Q0FDMUM7Q0FFQSxnQkFBZ0IsUUFBc0I7RUFDcEMsTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNO0VBQzVCLEtBQUssTUFBTSxTQUFTLFNBQVM7R0FDM0IsYUFBYSxLQUFLLEtBQUs7R0FDdkIsS0FBSyxlQUFlO0dBQ3BCLEtBQUssT0FBTyxHQUFHO0VBQ2pCLENBQUM7RUFDRCxLQUFLLFFBQVEsQ0FBQztDQUNoQjtDQUVBLE1BQU0sYUFBNEI7RUFDaEMsSUFBSSxLQUFLLFVBQVU7R0FDakIsS0FBSyxhQUFhO0dBQ2xCO0VBQ0Y7RUFFQSxLQUFLLFdBQVc7RUFDaEIsSUFBSTtHQUNGLEdBQUc7SUFDRCxLQUFLLGFBQWE7SUFDbEIsTUFBTSxLQUFLLGVBQWU7R0FDNUIsU0FBUyxLQUFLO0VBQ2hCLFNBQVMsR0FBRztHQUNWLE9BQU8sS0FBSyxzQkFBdUIsRUFBWSxTQUFTO0VBQzFELFVBQVU7R0FDUixLQUFLLFdBQVc7RUFDbEI7Q0FDRjtDQUVBLE1BQWMsaUJBQWdDO0VBQzVDLE9BQU8sS0FBSyxNQUFNLFNBQVMsR0FBRztHQUM1QixNQUFNLE9BQU8sS0FBSyxNQUFNO0dBQ3hCLElBQUk7R0FDSixJQUFJO0lBQ0YsU0FBUyxNQUFNLEtBQUssa0JBQWtCLEtBQUssZ0JBQWdCO0dBQzdELFNBQVMsR0FBRztJQUNWLElBQUksYUFBYSw2QkFBNkI7S0FDNUMsS0FBSyxNQUFNLE1BQU07S0FDakIsS0FBSyxPQUFPLENBQUM7S0FDYjtJQUNGO0lBQ0EsTUFBTTtHQUNSO0dBQ0EsSUFBSSxDQUFDLFFBQVE7R0FDYixLQUFLLE1BQU0sTUFBTTtHQUNqQixLQUFLLFFBQVEsTUFBTTtFQUNyQjtDQUNGO0NBSUEsTUFBTSxrQkFDSixRQUNBLFNBQ1k7RUFDWixJQUFJO0dBQ0YsT0FBTyxNQUFNLFFBQVEsTUFBTTtFQUM3QixVQUFVO0dBQ1IsT0FBTyxZQUFZO0dBQ25CLEtBQUssa0JBQWtCO0VBQ3pCO0NBQ0Y7Q0FJQSxpQkFBeUIsS0FBc0IsZUFBcUM7RUFDbEYsTUFBTSxVQUFVLGtCQUFrQjtFQUNsQyxPQUFPO0dBQ0wsT0FBTyxXQUFXLElBQUksYUFBYSxJQUFJLGFBQWEsSUFBSTtHQUN4RCxTQUFTLFVBQVUsU0FBWSxJQUFJO0dBQ25DLHVCQUF1QixJQUFJO0dBQzNCLGNBQWMsSUFBSTtHQUNsQixRQUFRLElBQUksVUFBVTtHQUN0QixPQUFPLElBQUk7R0FDWCxXQUFXLElBQUk7R0FDZixrQkFBa0IsSUFBSTtHQUN0QixhQUFhLElBQUk7R0FDakIsaUJBQWlCLElBQUk7R0FDckIsd0JBQXdCLElBQUk7RUFDOUI7Q0FDRjtDQUVBLE1BQU0sWUFDSixRQUNBLEtBQ0EsZUFDeUI7RUFHekIsSUFBSSxJQUFJLGlCQUFpQjtHQUN2QixNQUFNLFNBQVMsTUFBTSxPQUFPLDRCQUE0QixJQUFJLEtBQUs7R0FDakUsSUFBSSxRQUFRLE1BQU0sSUFBSSxxQkFBcUIsUUFBUSxNQUFNO0VBQzNEO0VBRUEsTUFBTSxVQUFVLEtBQUssaUJBQWlCLEtBQUssYUFBYTtFQUN4RCxNQUFNLFNBQVMsTUFBTSxPQUFPLFlBQVksU0FBUyxhQUFhO0VBRzlELElBQUksSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLFVBQVUsT0FBTyxPQUFPLFdBQVcsSUFDckUsTUFBTSxPQUFPLGlCQUNULElBQUkscUJBQXFCLGNBQWMsZ0RBQWdELElBQ3ZGLElBQUkscUJBQXFCLGNBQWMsOENBQThDO0VBRzNGLE9BQU87R0FDTCxNQUFNLE9BQU87R0FDYixXQUFXLE9BQU87R0FDbEIsT0FBTyxPQUFPO0dBQ2QsWUFBWSxPQUFPO0dBQ25CLFFBQVEsT0FBTztHQUNmLE9BQU8sT0FBTztHQUNkLGFBQWE7SUFDWCxVQUFVLG1CQUFtQixPQUFPLFNBQVMsT0FBTyxXQUFXO0lBQy9ELFVBQVUsT0FBTztJQUNqQixPQUFPLE9BQU87R0FDaEI7R0FDQSxRQUFRLE9BQU87RUFDakI7Q0FDRjtDQUVBLE1BQU0sa0JBQ0osUUFDQSxLQUNBLElBQ0EsZUFDZTtFQUNmLE1BQU0sVUFBVSxLQUFLLGlCQUFpQixLQUFLLGFBQWE7RUFHeEQsSUFBSSxtQkFBbUIsaUJBQWlCO0VBQ3hDLE1BQU0sWUFBNkI7R0FDakMsR0FBRztHQUNILGFBQWEsYUFBYTtJQUN4QixtQkFBbUI7SUFDbkIsR0FBRyxhQUFhLFFBQVE7R0FDMUI7R0FDQSxhQUFhLFdBQVc7SUFDdEIsR0FBRyxXQUFXO0tBQ1osR0FBRztLQUNILFdBQVcsT0FBTztLQUNsQixhQUFhO01BQ1gsVUFBVSxtQkFBbUIsT0FBTyxTQUFTLE9BQU8sV0FBVztNQUMvRCxVQUFVO01BQ1YsT0FBTyxPQUFPO0tBQ2hCO0lBQ0YsQ0FBQztHQUNIO0VBQ0Y7RUFDQSxNQUFNLE9BQU8sa0JBQWtCLFNBQVMsV0FBVyxhQUFhO0NBQ2xFO0NBSUEsTUFBTSxhQUNKLFNBQ0EsV0FDQSxhQUNBLGdCQUNBLFNBQVMsR0FDTTtFQUNmLElBQUksS0FBSyxpQkFBaUIsSUFBSSxPQUFPLEdBQUc7RUFDeEMsS0FBSyxpQkFBaUIsSUFBSSxPQUFPO0VBQ2pDLEtBQUssaUJBQWlCLFNBQVMsV0FBVyxhQUFhLGdCQUFnQixNQUFNO0VBQzdFLE1BQU0sbUJBQW1CLEtBQUssY0FBYyxJQUFJLE9BQU87RUFDdkQsTUFBTSxVQUFrQyxDQUFDO0VBQ3pDLElBQUk7R0FDRixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxXQUFXLG9CQUFvQixLQUFLO0lBQzNELElBQUksSUFBSSxHQUFHLE1BQU0sTUFBTSxpQkFBaUI7SUFDeEMsTUFBTSxTQUFTLE1BQU0sS0FBSyxrQkFBa0IsU0FBUyxXQUFXLGFBQWEsQ0FBQztJQUM5RSxJQUFJLFFBQVEsUUFBUSxLQUFLLE1BQU07R0FDakM7R0FFQSxJQUNFLENBQUMsS0FBSyxXQUNOLGtCQUFrQixVQUNsQixLQUFLLGNBQWMsSUFBSSxPQUFPLE1BQU0sb0JBQ3BDLENBQUMsS0FBSyxXQUFXLElBQUksT0FBTyxHQUU1QjtRQUFJLFFBQVEsU0FBUyxHQUFHLEtBQUssV0FBVyxJQUFJLFNBQVMsT0FBTztHQUFBLE9BRTVELE1BQU0sUUFBUSxXQUFXLFFBQVEsS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFDLENBQUM7RUFFbkUsVUFBVTtHQUNSLEtBQUssaUJBQWlCLE9BQU8sT0FBTztFQUN0QztDQUNGO0NBRUEsTUFBTSxrQkFDSixTQUNBLFdBQ0EsYUFDQSxhQUNzQztFQUN0QyxNQUFNLFNBQVMsSUFBSSxxQkFBcUI7R0FDdEM7R0FDQTtHQUNBLGFBQWEsWUFBWTtHQUN6QixXQUFXLFlBQVk7R0FDdkIsVUFBVSxZQUFZO0dBQ3RCO0VBQ0YsQ0FBQztFQUVELE9BQU8sZ0JBQWdCLEtBQUssa0JBQWtCO0VBQzlDLE9BQU8sMEJBQTBCO0dBQy9CLEFBQUssS0FBSyw0QkFBNEIsTUFBTSxDQUFDLENBQUMsT0FBTyxNQUNuRCxPQUFPLEtBQ0wsbUNBQW1DLFVBQVUsR0FBRyxZQUFZLEtBQU0sRUFBWSxTQUNoRixDQUNGO0VBQ0Y7RUFFQSxPQUFPLHdCQUF3QixPQUFPLFdBQVc7R0FDL0MsSUFBSSxXQUFXLHFDQUNiLE9BQU8sK0JBQStCLE9BQU87R0FFL0MsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLFFBQVE7RUFDdkQsQ0FBQztFQUVELElBQUk7R0FDRixNQUFNLE9BQU8sV0FBVztHQUN4QixPQUFPLEtBQUssbUJBQW1CLFVBQVUsR0FBRyxZQUFZLEVBQUU7R0FDMUQsT0FBTztFQUNULFNBQVMsR0FBRztHQUNWLE9BQU8sS0FBSyx3QkFBd0IsVUFBVSxHQUFHLFlBQVksS0FBTSxFQUFZLFNBQVM7R0FDeEYsTUFBTSxPQUFPLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0dBQ2xDLE9BQU87RUFDVDtDQUNGO0NBRUEsTUFBTSxzQkFBcUM7RUFDekMsSUFBSSxLQUFLLFNBQVM7RUFDbEIsTUFBTSx5QkFBeUIsTUFBTSxLQUFLLDRCQUE0QjtFQUN0RSxJQUFJLENBQUMsS0FBSyxXQUFXLGFBQWEsS0FBSyxTQUFTO0VBQ2hELElBQUksS0FBSyxNQUFNLFNBQVMsR0FBRztHQUd6QixNQUFNLEtBQUssZUFBZSxzQkFBc0I7R0FDaEQ7RUFDRjtFQUNBLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxpQkFBaUIsS0FBSyxXQUFXLGlCQUNyRCxNQUFNLEtBQUssaUJBQWlCO0NBRWhDO0NBRUEsTUFBTSxlQUFlLG1DQUFtQixJQUFJLElBQVksR0FBa0I7RUFDeEUsSUFBSSxDQUFDLEtBQUssV0FBVyxhQUFhLEtBQUssU0FBUztFQUNoRCxNQUFNLEtBQUssV0FBVyxZQUFZO0dBQ2hDLE1BQU0sYUFBYSxDQUFDLEdBQUcsS0FBSyxjQUFjLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsY0FBYztJQUNuRixJQUNFLENBQUMsU0FBUyxVQUNWLEtBQUssaUJBQWlCLElBQUksT0FBTyxLQUNqQyxpQkFBaUIsSUFBSSxPQUFPLEtBQzVCLEtBQUsscUJBQXFCLElBQUksT0FBTyxHQUVyQyxPQUFPO0lBRVQsUUFBUSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsRUFBRSxVQUFVLEtBQUssS0FBSyxXQUFXO0dBQ3ZFLENBQUM7R0FDRCxJQUFJLFdBQVcsV0FBVyxHQUFHO0dBRzdCLE1BQU0sa0JBQWtCLDJCQURLLEtBQUssY0FBYyxXQUFXLE1BQ1k7R0FDdkUsSUFBSSxrQkFBa0IsS0FBSyxXQUFXLG9CQUFvQjtJQUN4RCxPQUFPLEtBQ0wsMkNBQTJDLGdCQUFnQixRQUFRLENBQUMsRUFBRSxjQUFjLEtBQUssV0FBVyxtQkFBbUIsUUFBUSxDQUFDLEVBQUUsSUFDcEk7SUFDQTtHQUNGO0dBRUEsTUFBTSxtQkFBbUIsS0FBSyxvQkFBb0I7R0FDbEQsSUFBSSxtQkFBbUIsS0FBSyxXQUFXLHFCQUFxQjtJQUMxRCxPQUFPLEtBQ0wsNENBQTRDLGlCQUFpQixRQUFRLENBQUMsRUFBRSxZQUFZLEtBQUssV0FBVyxvQkFBb0IsUUFBUSxDQUFDLEVBQUUsSUFDckk7SUFDQTtHQUNGO0dBTUEsTUFBTSxTQUFRLE1BSlEsUUFBUSxJQUM1QixXQUFXLEtBQUssQ0FBQyxTQUFTLGNBQWMsS0FBSyxxQkFBcUIsU0FBUyxVQUFVLElBQUksQ0FBQyxDQUM1RixFQUVjLENBQVEsUUFBUSxXQUFXLFdBQVcsSUFBSSxDQUFDLENBQUM7R0FDMUQsSUFBSSxRQUFRLEdBQUc7SUFDYixPQUFPLEtBQ0wseUJBQXlCLE1BQU0sWUFBWSxLQUFLLFlBQVksZ0JBQWdCLEtBQUssTUFBTSxPQUFPLEVBQ2hHO0lBQ0EsS0FBSyxrQkFBa0I7SUFDdkIsSUFBSSxLQUFLLE1BQU0sU0FBUyxHQUt0QixBQUpjLGlCQUNOLEtBQUssMkJBQTJCLEdBQ3RDLEtBQUssSUFBSSxLQUFLLFdBQVcsaUJBQWlCLEdBQUssQ0FFakQsQ0FBQSxDQUFNLFFBQVE7R0FFbEI7RUFDRixDQUFDO0NBQ0g7Q0FFQSxNQUFNLDhCQUFvRDtFQUN4RCxNQUFNLHlDQUF5QixJQUFJLElBQVk7RUFDL0MsSUFBSSxLQUFLLFNBQVMsT0FBTztFQUN6QixNQUFNLEtBQUssV0FBVyxZQUFZO0dBQ2hDLE1BQU0sYUFBYSxDQUFDLEdBQUcsS0FBSyxjQUFjLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsY0FBYztJQUNuRixJQUFJLENBQUMsU0FBUyxVQUFVLEtBQUssaUJBQWlCLElBQUksT0FBTyxHQUFHLE9BQU87SUFDbkUsUUFBUSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsRUFBRSxVQUFVLEtBQUssS0FBSyxXQUFXO0dBQ3ZFLENBQUM7R0FDRCxJQUFJLFdBQVcsV0FBVyxHQUFHO0dBQzdCLFdBQVcsU0FBUyxDQUFDLGFBQWEsdUJBQXVCLElBQUksT0FBTyxDQUFDO0dBT3JFLE1BQU0sU0FBUSxNQUxRLFFBQVEsSUFDNUIsV0FBVyxLQUFLLENBQUMsU0FBUyxjQUN4QixLQUFLLHFCQUFxQixTQUFTLFVBQVUsS0FBSyxDQUNwRCxDQUNGLEVBQ2MsQ0FBUSxRQUFRLFdBQVcsV0FBVyxJQUFJLENBQUMsQ0FBQztHQUMxRCxJQUFJLFFBQVEsR0FBRztJQUNiLE9BQU8sS0FBSyxpQ0FBaUMsTUFBTSxZQUFZLEtBQUssWUFBWSxRQUFRO0lBQ3hGLEtBQUssa0JBQWtCO0lBQ3ZCLElBQUksS0FBSyxNQUFNLFNBQVMsR0FLdEIsQUFKYyxpQkFDTixLQUFLLDJCQUEyQixHQUN0QyxLQUFLLElBQUksS0FBSyxXQUFXLGlCQUFpQixHQUFLLENBRWpELENBQUEsQ0FBTSxRQUFRO0dBRWxCO0VBQ0YsQ0FBQztFQUNELE9BQU87Q0FDVDtDQUVBLE1BQU0sbUJBQWtDO0VBQ3RDLElBQUksQ0FBQyxLQUFLLFdBQVcsYUFBYSxLQUFLLFNBQVM7RUFDaEQsTUFBTSxLQUFLLFdBQVcsWUFBWTtHQUNoQyxNQUFNLFVBQWtDLENBQUM7R0FDekMsS0FBSyxNQUFNLFdBQVcsS0FBSyxjQUFjLEtBQUssR0FBRztJQUMvQyxNQUFNLFVBQVUsS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLENBQUM7SUFDakQsSUFBSSxRQUFRLFVBQVUsS0FBSyxXQUFXLG9CQUFvQjtJQUUxRCxNQUFNLFNBQVMsUUFDWixVQUFVLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FDakQsTUFBTSxVQUFVLE1BQU0sV0FBVztJQUNwQyxJQUFJLENBQUMsUUFBUTtJQUViLEtBQUssV0FBVyxJQUNkLFNBQ0EsUUFBUSxRQUFRLFVBQVUsVUFBVSxNQUFNLENBQzVDO0lBQ0EsUUFBUSxLQUFLLE1BQU07R0FDckI7R0FFQSxJQUFJLFFBQVEsV0FBVyxHQUFHO0dBQzFCLE1BQU0sUUFBUSxXQUFXLFFBQVEsS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFDLENBQUM7R0FDL0QsT0FBTyxLQUFLLDJCQUEyQixRQUFRLE9BQU8sWUFBWSxLQUFLLFlBQVksUUFBUTtFQUM3RixDQUFDO0NBQ0g7Q0FFQSx5QkFBaUMsU0FBeUM7RUFDeEUsTUFBTSxPQUFPLElBQUksSUFBSSxRQUFRLEtBQUssV0FBVyxPQUFPLFdBQVcsQ0FBQztFQUNoRSxLQUFLLElBQUksUUFBUSxHQUFHLFFBQVEsS0FBSyxXQUFXLG9CQUFvQixTQUM5RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssR0FBRyxPQUFPO0VBRS9CLE9BQU8sS0FBSyxXQUFXO0NBQ3pCO0NBRUEsTUFBYyxxQkFDWixTQUNBLFVBQ0EsbUJBQ3NDO0VBQ3RDLE1BQU0sa0JBQWtCLEtBQUssV0FBVyxJQUFJLE9BQU87RUFDbkQsTUFBTSxjQUFjLEtBQUsseUJBQXlCLG1CQUFtQixDQUFDLENBQUM7RUFDdkUsSUFBSSxlQUFlLEtBQUssV0FBVyxvQkFBb0IsT0FBTztFQUU5RCxNQUFNLFNBQVMsTUFBTSxLQUFLLGtCQUN4QixTQUNBLFNBQVMsTUFDVCxTQUFTLGFBQ1QsV0FDRjtFQUNBLElBQUksQ0FBQyxRQUFRLE9BQU87RUFFcEIsTUFBTSxrQkFBa0IsS0FBSyxjQUFjLElBQUksT0FBTztFQUN0RCxNQUFNLGlCQUFpQixLQUFLLFdBQVcsSUFBSSxPQUFPO0VBQ2xELElBQ0UsQ0FBQyxpQkFBaUIsVUFDbEIsb0JBQW9CLFlBQ3BCLG1CQUFtQixtQkFDbEIscUJBQXFCLEtBQUsscUJBQXFCLElBQUksT0FBTyxLQUMzRCxnQkFBZ0IsTUFBTSxVQUFVLE1BQU0sZ0JBQWdCLFdBQVcsR0FDakU7R0FDQSxNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7R0FDbEMsT0FBTztFQUNUO0VBRUEsTUFBTSxjQUFjLGtCQUFrQixDQUFDO0VBQ3ZDLFlBQVksS0FBSyxNQUFNO0VBQ3ZCLFlBQVksTUFBTSxHQUFHLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVztFQUN4RCxJQUFJLENBQUMsZ0JBQWdCLEtBQUssV0FBVyxJQUFJLFNBQVMsV0FBVztFQUM3RCxPQUFPO0NBQ1Q7Q0FFQSxNQUFNLDRCQUE0QixRQUE2QztFQUU3RSxJQUFJLENBRFksS0FBSyxXQUFXLElBQUksT0FBTyxPQUN0QyxDQUFBLEVBQVMsU0FBUyxNQUFNLEdBQUc7RUFFaEMsTUFBTSxPQUFPLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0VBRWxDLE1BQU0saUJBQWlCLEtBQUssV0FBVyxJQUFJLE9BQU8sT0FBTztFQUN6RCxJQUFJLENBQUMsZ0JBQWdCLFNBQVMsTUFBTSxHQUFHO0VBQ3ZDLE1BQU0sWUFBWSxlQUFlLFFBQVEsVUFBVSxVQUFVLE1BQU07RUFDbkUsSUFBSSxVQUFVLFNBQVMsR0FDckIsS0FBSyxXQUFXLElBQUksT0FBTyxTQUFTLFNBQVM7T0FFN0MsS0FBSyxXQUFXLE9BQU8sT0FBTyxPQUFPO0VBRXZDLE9BQU8sS0FDTCw0QkFBNEIsT0FBTyxVQUFVLEdBQUcsT0FBTyxZQUFZLEtBQUssVUFBVSxPQUFPLFlBQzNGO0VBQ0EsS0FBSywyQkFBMkI7Q0FDbEM7Q0FFQSw2QkFBMkM7RUFDekMsSUFBSSxLQUFLLFNBQVM7RUFDbEIsQUFBSyxLQUFLLG9CQUFvQixDQUFDLENBQUMsT0FBTyxNQUNyQyxPQUFPLEtBQUssdUNBQXdDLEVBQVksU0FBUyxDQUMzRTtDQUNGO0NBRUEsTUFBYyxXQUFXLE1BQTBDO0VBQ2pFLElBQUksS0FBSyxnQkFBZ0I7R0FDdkIsTUFBTSxLQUFLO0dBQ1g7RUFDRjtFQUNBLE1BQU0sVUFBVSxLQUFLLENBQUMsQ0FBQyxjQUFjO0dBQ25DLElBQUksS0FBSyxtQkFBbUIsU0FBUyxLQUFLLGlCQUFpQjtFQUM3RCxDQUFDO0VBQ0QsS0FBSyxpQkFBaUI7RUFDdEIsTUFBTTtDQUNSO0NBSUEsa0NBQWtCLElBQUksSUFBa0M7Q0FDeEQsT0FBZ0Isd0JBQXdCO0NBRXhDLE1BQU0sdUJBQXVCLFNBQW9EO0VBQy9FLE1BQU0sYUFBYSxLQUFLLDRCQUE0QixJQUFJLE9BQU8sS0FBSztFQUNwRSxNQUFNLFNBQVMsS0FBSyxnQkFBZ0IsSUFBSSxPQUFPO0VBQy9DLElBQ0UsVUFDQSxPQUFPLGVBQWUsY0FDdEIsS0FBSyxJQUFJLElBQUksT0FBTyxXQUFXLGlCQUFpQix1QkFFaEQsT0FBTztHQUFFLE1BQU0sT0FBTztHQUFNLFVBQVUsT0FBTztFQUFTO0VBR3hELE1BQU0sVUFBVSxLQUFLLFdBQVcsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFBLENBQUcsTUFBTSxNQUFNLEVBQUUsT0FBTztFQUN6RSxJQUFJLENBQUMsUUFBUSxNQUFNLElBQUksTUFBTSx5QkFBeUI7RUFFdEQsTUFBTSxRQUE4QjtHQUFFLFlBRGxCLE9BQU8sY0FBYztHQUNHLFVBQVUsS0FBSyxJQUFJO0dBQUc7RUFBVztFQUM3RSxLQUFLLEtBQUssNEJBQTRCLElBQUksT0FBTyxLQUFLLE9BQU8sWUFDM0QsS0FBSyxnQkFBZ0IsSUFBSSxTQUFTLEtBQUs7RUFFekMsT0FBTztHQUFFLE1BQU0sTUFBTTtHQUFNLFVBQVUsTUFBTTtFQUFTO0NBQ3REO0NBRUEsb0JBQWtDO0VBQ2hDLEFBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxPQUFPLE1BQU0sT0FBTyxLQUFLLHNCQUF1QixFQUFZLFNBQVMsQ0FBQztDQUMvRjtDQUVBLDBCQUFrQyxTQUF1QjtFQUN2RCxLQUFLLGdCQUFnQixPQUFPLE9BQU87RUFDbkMsS0FBSyw0QkFBNEIsSUFDL0IsVUFDQyxLQUFLLDRCQUE0QixJQUFJLE9BQU8sS0FBSyxLQUFLLENBQ3pEO0NBQ0Y7Q0FFQSxpQkFDRSxJQUNBLE1BQ0EsYUFDQSxnQkFDQSxRQUNNO0VBQ04sS0FBSyxjQUFjLElBQUksSUFBSTtHQUN6QjtHQUNBO0dBQ0E7R0FDQTtHQUNBLFFBQVEsS0FBSyxjQUFjLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVTtFQUNoRCxDQUFDO0VBQ0QsS0FBSyxpQkFBaUIsU0FBUyxJQUFJLE1BQU07Q0FDM0M7Q0FFQSx3QkFBZ0Msa0JBQXdDO0VBQ3RFLE9BQU8sQ0FBQyxHQUFHLEtBQUssY0FBYyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQ3RDLENBQUMsU0FBUyxjQUFjLFNBQVMsVUFBVSxDQUFDLGlCQUFpQixJQUFJLE9BQU8sQ0FDM0U7Q0FDRjtDQUVBLGtCQUEwQixTQUE0QztFQUNwRSxPQUFPLEtBQUssY0FBYyxJQUFJLE9BQU8sQ0FBQyxFQUFFO0NBQzFDO0NBRUEsa0JBQTBCLFNBQTBCO0VBQ2xELE1BQU0sWUFBWSxLQUFLLGtCQUFrQixPQUFPO0VBQ2hELE9BQU8sY0FBYyxVQUFhLGNBQWM7Q0FDbEQ7Q0FFQSxNQUFjLHdCQUF3QixrQkFBMEQ7RUFDOUYsTUFBTSxVQUFVLEtBQUsseUJBQXlCO0VBQzlDLE1BQU0sMEJBQVUsSUFBSSxJQUFvQjtFQUN4QyxLQUFLLE1BQU0sVUFBVSxTQUNuQixJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sT0FBTyxHQUFHLFFBQVEsSUFBSSxPQUFPLFNBQVMsT0FBTyxTQUFTO0VBR2hGLE1BQU0sc0JBQXNCLElBQUksSUFBSSxRQUFRLEtBQUssQ0FBQztFQUNsRCxNQUFNLG1DQUFtQixJQUFJLElBQVk7RUFDekMsTUFBTSxzQkFBdUUsQ0FBQztFQUM5RSxJQUFJLHdCQUF3QjtFQUU1QixNQUFNLFVBQVUsTUFBTSxLQUFLLFFBQVEsUUFBUSxDQUFDO0VBbUI1QyxPQWxCcUIsUUFBUSxXQUMzQixRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsZUFBZTtHQUMxQyxJQUFJLGlCQUFpQixJQUFJLE9BQU8sR0FBRztJQUNqQztJQUNBLE9BQU87S0FBRTtLQUFTO0tBQVcsVUFBVTtJQUFNO0dBQy9DO0dBQ0EsSUFBSSxDQUFDLEtBQUssa0JBQWtCLE9BQU8sR0FDakMsT0FBTztJQUFFO0lBQVM7SUFBVyxVQUFVO0dBQUs7R0FFOUM7R0FDQSxPQUFPO0lBQ0w7SUFDQTtJQUNBLFVBQVUsTUFBTSxLQUFLLHFCQUFxQixTQUFTLFNBQVM7R0FDOUQ7RUFDRixDQUFDLENBQ0gsRUFFQSxDQUFPLFNBQVMsT0FBTyxVQUFVO0dBQy9CLElBQUksTUFBTSxXQUFXLGFBQWE7SUFDaEMsSUFBSSxNQUFNLE1BQU0sVUFDZCxpQkFBaUIsSUFBSSxNQUFNLE1BQU0sT0FBTztTQUNuQztLQUNMLE1BQU0sWUFBWSxLQUFLLGtCQUFrQixNQUFNLE1BQU0sT0FBTztLQUM1RCxJQUFJLGNBQWMsVUFBYSxjQUFjLE1BQzNDLG9CQUFvQixLQUFLO01BQUUsV0FBVyxNQUFNLE1BQU07TUFBVztLQUFVLENBQUM7SUFFNUU7SUFDQTtHQUNGO0dBRUEsTUFBTSxRQUFRLFFBQVE7R0FDdEIsSUFBSSxPQUFPO0lBQ1QsTUFBTSxDQUFDLFNBQVMsYUFBYTtJQUM3QixLQUFLLHVCQUF1QixTQUFTLFdBQVcsT0FBTyxNQUFNLE1BQU0sQ0FBQztJQUNwRSxpQkFBaUIsSUFBSSxPQUFPO0dBQzlCO0VBQ0YsQ0FBQztFQUVELE9BQU87R0FBRTtHQUFxQjtHQUFrQjtHQUFxQjtFQUFzQjtDQUM3RjtDQUVBLE1BQWMscUJBQ1osU0FDQSxXQUNBLGtCQUNrQjtFQUNsQixTQUFTO0dBQ1AsTUFBTSxnQkFBZ0IsS0FBSyxjQUFjLElBQUksT0FBTztHQUNwRCxNQUFNLFlBQVksZUFBZTtHQUNqQyxJQUFJLENBQUMsZUFBZSxVQUFVLGNBQWMsVUFBYSxjQUFjLE1BQU07SUFDM0UsS0FBSyxxQkFBcUIsT0FBTyxPQUFPO0lBQ3hDLE9BQU87R0FDVDtHQUVBLElBQUk7R0FDSixJQUFJO0lBQ0YsU0FBUyxNQUFNLDJCQUEyQixLQUFLLHVCQUF1QixPQUFPLENBQUM7R0FDaEYsU0FBUyxHQUFHO0lBQ1YsSUFBSSxLQUFLLGNBQWMsSUFBSSxPQUFPLE1BQU0sZUFBZTtJQUN2RCxLQUFLLHFCQUFxQixPQUFPLE9BQU87SUFDeEMsS0FBSyx1QkFBdUIsU0FBUyxjQUFjLFFBQVEsV0FBWSxFQUFZLE9BQU87SUFDMUYsT0FBTztHQUNUO0dBRUEsSUFBSSxLQUFLLGNBQWMsSUFBSSxPQUFPLE1BQU0sZUFBZTtHQUV2RCxJQUFJLE9BQU8sU0FBUyxpQkFBaUI7SUFDbkMsS0FBSyxxQkFBcUIsT0FBTyxPQUFPO0lBQ3hDLEtBQUssdUJBQXVCLFNBQVMsY0FBYyxRQUFRLFdBQVcsT0FBTyxNQUFNO0lBQ25GLE9BQU87R0FDVDtHQUVBLElBQUksT0FBTyxrQkFBa0IsV0FBVztJQUN0QyxNQUFNLGVBQWUsQ0FBQyxLQUFLLHFCQUFxQixJQUFJLE9BQU87SUFDM0QsS0FBSyxxQkFBcUIsSUFBSSxPQUFPO0lBQ3JDLElBQUksY0FDRixLQUFLLHNCQUFzQixTQUFTLGNBQWMsUUFBUSxXQUFXLFdBQVcsTUFBTTtJQUV4RixrQkFBa0IsSUFBSSxPQUFPO0lBQzdCLE9BQU87R0FDVDtHQUVBLElBQUksS0FBSyxxQkFBcUIsT0FBTyxPQUFPLEdBQzFDLEtBQUssa0JBQWtCLFNBQVMsY0FBYyxRQUFRLFdBQVcsV0FBVyxNQUFNO0dBRXBGLE9BQU87RUFDVDtDQUNGO0NBRUEsc0JBQ0UsU0FDQSxXQUNBLFdBQ0EsUUFDTTtFQUNOLE9BQU8sS0FDTCx3Q0FBd0MsVUFBVSxHQUFHLFFBQVEsS0FBSyxPQUFPLGVBQWUsT0FBTyxVQUFVLEtBQ3pHO0dBQ0U7R0FDQTtHQUNBLFVBQVU7R0FDVjtHQUNBLG1CQUFtQixPQUFPO0dBQzFCLFVBQVUsT0FBTztHQUNqQixvQkFBb0IsT0FBTztHQUMzQixVQUFVLE9BQU87R0FDakIsU0FBUyxPQUFPO0dBQ2hCLFFBQVE7RUFDVixDQUNGO0NBQ0Y7Q0FFQSxrQkFDRSxTQUNBLFdBQ0EsV0FDQSxRQUNNO0VBQ04sT0FBTyxLQUNMLG1DQUFtQyxVQUFVLEdBQUcsUUFBUSxLQUFLLE9BQU8sZUFBZSxNQUFNLFVBQVUsS0FDbkc7R0FDRTtHQUNBO0dBQ0EsVUFBVTtHQUNWO0dBQ0EsbUJBQW1CLE9BQU87R0FDMUIsVUFBVSxPQUFPO0dBQ2pCLG9CQUFvQixPQUFPO0dBQzNCLFVBQVUsT0FBTztHQUNqQixTQUFTLE9BQU87R0FDaEIsUUFBUTtFQUNWLENBQ0Y7Q0FDRjtDQUVBLHVCQUErQixTQUFpQixXQUFtQixRQUFzQjtFQUN2RixNQUFNLFlBQVksS0FBSyxrQkFBa0IsT0FBTztFQUNoRCxPQUFPLEtBQUssMENBQTBDO0dBQ3BEO0dBQ0E7R0FDQSxVQUFVO0dBQ1Y7R0FDQSxRQUFRO0dBQ1IsY0FBYztFQUNoQixDQUFDO0NBQ0g7Q0FFQSw0QkFBb0MsYUFBc0M7RUFDeEUsT0FBTyxLQUFLLHNDQUFzQztHQUNoRCxVQUFVO0dBQ1YsWUFBWSxZQUFZLG9CQUFvQjtHQUM1Qyx1QkFBdUIsWUFBWTtHQUNuQyxxQkFBcUIsWUFBWTtHQUNqQyxRQUFRO0VBQ1YsQ0FBQztFQUNELE1BQU0sSUFBSSw0QkFDUiw4QkFBOEIsVUFBVSxZQUFZLG1CQUFtQixDQUN6RTtDQUNGO0NBSUEsZUFJVztDQUVYLE1BQU0sa0JBQWtCLE1BQTRDO0VBQ2xFLElBQUksS0FBSyxjQUFjO0dBQ3JCLEtBQUssYUFBYSxPQUFPLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0dBQzlDLGFBQWEsS0FBSyxhQUFhLEtBQUs7R0FDcEMsS0FBSyxlQUFlO0VBQ3RCO0VBR0EsTUFBTSxTQUFTLElBQUkscUJBQXFCO0dBQ3RDLFNBRmEsS0FBSyxJQUVUO0dBQ1QsV0FBVztHQUNYLGFBQWE7R0FDYixXQUFXO0VBQ2IsQ0FBQztFQUVELE1BQU0sVUFBVSxNQUFNLE9BQU8sa0JBQWtCO0VBRS9DLE1BQU0sUUFBUSxpQkFBaUI7R0FDN0IsSUFBSSxLQUFLLGNBQWMsV0FBVyxRQUFRO0lBQ3hDLE9BQU8sS0FBSyw2QkFBNkIsS0FBSyxpQkFBaUI7SUFDL0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1QixLQUFLLGVBQWU7R0FDdEI7RUFDRixHQUFHLEdBQU87RUFFVixLQUFLLGVBQWU7R0FBRTtHQUFRO0dBQU07RUFBTTtFQUMxQyxPQUFPLEVBQUUsUUFBUTtDQUNuQjtDQUVBLElBQUksbUJBQWtDO0VBQ3BDLE9BQU8sS0FBSyxjQUFjLFFBQVE7Q0FDcEM7Q0FFQSxNQUFNLHVCQUtIO0VBQ0QsSUFBSSxDQUFDLEtBQUssY0FBYyxNQUFNLElBQUksTUFBTSxrQkFBa0I7RUFDMUQsTUFBTSxFQUFFLFFBQVEsVUFBVSxLQUFLO0VBRS9CLElBQUk7R0FDRixNQUFNLE9BQU8sNEJBQTRCO0dBQ3pDLE1BQU0sUUFBUSxNQUFNLE9BQU8sdUJBQXVCO0dBQ2xELElBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLHdDQUF3QztHQUNwRSxPQUFPO0VBQ1QsVUFBVTtHQUNSLGFBQWEsS0FBSztHQUNsQixLQUFLLGVBQWU7R0FDcEIsTUFBTSxPQUFPLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0VBQ3BDO0NBQ0Y7Q0FJQSxJQUFJLGNBQXNCO0VBQ3hCLE9BQU8sQ0FBQyxHQUFHLEtBQUssV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQzlDO0NBRUEsSUFBSSxtQkFBMkI7RUFDN0IsT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDdkU7Q0FFQSxJQUFJLGNBQXNCO0VBQ3hCLE9BQU8sS0FBSyxNQUFNO0NBQ3BCO0NBR0EsSUFBSSxzQkFBOEQ7RUFDaEUsT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLFFBQVEsQ0FBQyxDQUFDLENBQ2xDLEtBQUssQ0FBQyxTQUFTLGNBQWM7R0FDNUIsTUFBTSxRQUFRLEVBQUUsRUFBRSxhQUFhLFNBQVM7R0FDeEMsT0FBTyxRQUFRO0VBQ2pCLEVBQUUsQ0FBQyxDQUNGLFFBQVEsVUFBVSxNQUFNLFFBQVEsQ0FBQyxDQUFDLENBQ2xDLFVBQVUsR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0NBQ3BEO0FBQ0YifQ==