@workflow/core 5.0.0-beta.16 → 5.0.0-beta.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/capabilities.d.ts +3 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +12 -1
  4. package/dist/runtime/resume-hook.d.ts.map +1 -1
  5. package/dist/runtime/resume-hook.js +14 -10
  6. package/dist/runtime/start.d.ts +11 -1
  7. package/dist/runtime/start.d.ts.map +1 -1
  8. package/dist/runtime/start.js +52 -9
  9. package/dist/runtime/step-executor.d.ts +6 -0
  10. package/dist/runtime/step-executor.d.ts.map +1 -1
  11. package/dist/runtime/step-executor.js +14 -10
  12. package/dist/runtime/step-handler.d.ts.map +1 -1
  13. package/dist/runtime/step-handler.js +54 -23
  14. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  15. package/dist/runtime/suspension-handler.js +8 -5
  16. package/dist/runtime.d.ts.map +1 -1
  17. package/dist/runtime.js +54 -17
  18. package/dist/serialization/client.d.ts.map +1 -1
  19. package/dist/serialization/client.js +6 -3
  20. package/dist/serialization/codec.d.ts +16 -0
  21. package/dist/serialization/codec.d.ts.map +1 -1
  22. package/dist/serialization/codec.js +1 -1
  23. package/dist/serialization/compression.d.ts +104 -0
  24. package/dist/serialization/compression.d.ts.map +1 -0
  25. package/dist/serialization/compression.js +260 -0
  26. package/dist/serialization/index.d.ts +7 -6
  27. package/dist/serialization/index.d.ts.map +1 -1
  28. package/dist/serialization/index.js +9 -7
  29. package/dist/serialization/step.d.ts.map +1 -1
  30. package/dist/serialization/step.js +6 -3
  31. package/dist/serialization/types.d.ts +4 -0
  32. package/dist/serialization/types.d.ts.map +1 -1
  33. package/dist/serialization/types.js +5 -1
  34. package/dist/serialization-format.d.ts +15 -0
  35. package/dist/serialization-format.d.ts.map +1 -1
  36. package/dist/serialization-format.js +133 -9
  37. package/dist/serialization.d.ts +8 -7
  38. package/dist/serialization.d.ts.map +1 -1
  39. package/dist/serialization.js +106 -20
  40. package/dist/telemetry/semantic-conventions.d.ts +28 -0
  41. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  42. package/dist/telemetry/semantic-conventions.js +21 -1
  43. package/dist/telemetry.d.ts +57 -0
  44. package/dist/telemetry.d.ts.map +1 -1
  45. package/dist/telemetry.js +85 -4
  46. package/dist/version.d.ts +1 -1
  47. package/dist/version.js +2 -2
  48. package/dist/workflow.d.ts.map +1 -1
  49. package/dist/workflow.js +7 -2
  50. package/package.json +9 -6
@@ -1,14 +1,14 @@
1
1
  import { EntityConflictError, FatalError, RetryableError, RunExpiredError, StepNotRegisteredError, ThrottleError, TooEarlyError, WorkflowRuntimeError, WorkflowWorldError, } from '@workflow/errors';
2
- import { formatStepName, pluralize } from '@workflow/utils';
2
+ import { formatStepName, pluralize, stepDisplayName } from '@workflow/utils';
3
3
  import { getPort } from '@workflow/utils/get-port';
4
- import { getQueueTopicPrefix, resolveQueueNamespace, SPEC_VERSION_CURRENT, StepInvokePayloadSchema, } from '@workflow/world';
4
+ import { getQueueTopicPrefix, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, StepInvokePayloadSchema, } from '@workflow/world';
5
5
  import { describeError } from '../describe-error.js';
6
6
  import { runtimeLogger, stepLogger } from '../logger.js';
7
7
  import { getStepFunction } from '../private.js';
8
8
  import { cancelAbortReaders, dehydrateStepError, dehydrateStepReturnValue, hydrateStepArguments, hydrateStepError, } from '../serialization.js';
9
9
  import { contextStorage } from '../step/context-storage.js';
10
10
  import * as Attribute from '../telemetry/semantic-conventions.js';
11
- import { getSpanKind, linkToCurrentContext, serializeTraceCarrier, trace, withTraceContext, } from '../telemetry.js';
11
+ import { buildInvocationSpanLinks, getNextTraceCarrier, getSpanKind, getWorkflowTraceMode, isUsableTraceCarrier, trace, withTraceContext, } from '../telemetry.js';
12
12
  import { getErrorName, getErrorStack, normalizeUnknownError, promoteAbortErrorToFatal, } from '../types.js';
13
13
  import { MAX_QUEUE_DELIVERIES } from './constants.js';
14
14
  import { getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, memoizeEncryptionKey, parseHealthCheckPayload, queueMessage, withHealthCheck, } from './helpers.js';
@@ -28,8 +28,24 @@ function createStepHandler(namespace) {
28
28
  await handleHealthCheckMessage(healthCheck, 'step', worldHandlers.specVersion);
29
29
  return;
30
30
  }
31
- const { workflowName, workflowRunId, workflowStartedAt, stepId, traceCarrier: traceContext, requestedAt, } = StepInvokePayloadSchema.parse(message_);
31
+ const { workflowName, workflowRunId, workflowStartedAt, stepId, traceCarrier: incomingTraceCarrier, requestedAt, } = StepInvokePayloadSchema.parse(message_);
32
32
  const { requestId } = metadata;
33
+ // serializeTraceCarrier() returns `{}` when no OTEL SDK is registered
34
+ // or no span is active — treat an empty carrier the same as an absent
35
+ // one so linked mode falls back to a fresh origin instead of
36
+ // forwarding a useless `{}` forever.
37
+ const traceContext = isUsableTraceCarrier(incomingTraceCarrier)
38
+ ? incomingTraceCarrier
39
+ : undefined;
40
+ // --- Trace correlation mode ---
41
+ // 'linked' (default): the STEP span below starts a NEW root trace with
42
+ // span links to the delivery context and the run-origin context from
43
+ // the message's trace carrier. 'continuous': legacy behavior — the
44
+ // restored run-origin context parents this invocation's spans.
45
+ const traceMode = getWorkflowTraceMode();
46
+ // Trace carrier to attach to messages this invocation enqueues — see
47
+ // getNextTraceCarrier for the linked/continuous semantics.
48
+ const nextTraceCarrier = () => getNextTraceCarrier(traceMode, traceContext);
33
49
  // --- Max delivery check ---
34
50
  // Enforce max delivery limit before any infrastructure calls.
35
51
  // This prevents runaway steps from consuming infinite queue deliveries.
@@ -61,7 +77,7 @@ function createStepHandler(namespace) {
61
77
  // Re-queue the workflow to handle the failed step
62
78
  await queueMessage(world, getWorkflowQueueName(workflowName, resolvedNamespace), {
63
79
  runId: workflowRunId,
64
- traceCarrier: await serializeTraceCarrier(),
80
+ traceCarrier: await nextTraceCarrier(),
65
81
  requestedAt: new Date(),
66
82
  });
67
83
  }
@@ -84,9 +100,14 @@ function createStepHandler(namespace) {
84
100
  }
85
101
  return;
86
102
  }
87
- const spanLinks = await linkToCurrentContext();
88
- // Execute step within the propagated trace context
89
- return await withTraceContext(traceContext, async () => {
103
+ // Span links to the incoming delivery context and (in linked mode)
104
+ // the run-origin context from the trace carrier.
105
+ const spanLinks = await buildInvocationSpanLinks(traceMode, traceContext);
106
+ // Execute step within the propagated trace context (continuous mode
107
+ // only — in linked mode the STEP span below becomes a new trace root
108
+ // carrying span links instead, so withTraceContext is a passthrough).
109
+ const parentTraceCarrier = traceMode === 'continuous' ? traceContext : undefined;
110
+ return await withTraceContext(parentTraceCarrier, async () => {
90
111
  // Extract the step name from the topic name
91
112
  const stepName = metadata.queueName.slice(stepPrefix.length);
92
113
  const world = await getWorld();
@@ -104,7 +125,9 @@ function createStepHandler(namespace) {
104
125
  isVercel ? undefined : getPort(),
105
126
  getSpanKind('CONSUMER'),
106
127
  ]);
107
- return trace(`STEP ${stepName}`, { kind: spanKind, links: spanLinks }, async (span) => {
128
+ return trace(`step.execute ${stepDisplayName(stepName)}`, traceMode === 'linked'
129
+ ? { kind: spanKind, links: spanLinks, root: true }
130
+ : { kind: spanKind, links: spanLinks }, async (span) => {
108
131
  span?.setAttributes({
109
132
  ...Attribute.StepName(stepName),
110
133
  ...Attribute.StepAttempt(metadata.attempt),
@@ -124,6 +147,7 @@ function createStepHandler(namespace) {
124
147
  ...Attribute.WorkflowRunId(workflowRunId),
125
148
  ...Attribute.StepId(stepId),
126
149
  ...Attribute.StepTracePropagated(!!traceContext),
150
+ ...Attribute.WorkflowTraceMode(traceMode),
127
151
  });
128
152
  // step_started validates state and returns the step entity, so no separate
129
153
  // world.steps.get() call is needed. The server checks:
@@ -131,6 +155,13 @@ function createStepHandler(namespace) {
131
155
  // - retryAfter timestamp reached (returns 425 with Retry-After header)
132
156
  // - Workflow still active (returns 410 if completed)
133
157
  let step;
158
+ // Gate payload compression on the step entity's specVersion
159
+ // (stamped by the same-deployment orchestrator that created the
160
+ // step, so spec >= 5 implies every reader of this run's payloads
161
+ // understands the 'gzip' format). Returns false on the early
162
+ // failure paths where step_started didn't return an entity.
163
+ const compressionForStep = () => (step?.specVersion ?? 0) >=
164
+ SPEC_VERSION_SUPPORTS_COMPRESSION;
134
165
  try {
135
166
  const startResult = await world.events.create(workflowRunId, {
136
167
  eventType: 'step_started',
@@ -175,7 +206,7 @@ function createStepHandler(namespace) {
175
206
  });
176
207
  await queueMessage(world, getWorkflowQueueName(workflowName, resolvedNamespace), {
177
208
  runId: workflowRunId,
178
- traceCarrier: await serializeTraceCarrier(),
209
+ traceCarrier: await nextTraceCarrier(),
179
210
  requestedAt: new Date(),
180
211
  });
181
212
  return;
@@ -228,7 +259,7 @@ function createStepHandler(namespace) {
228
259
  correlationId: stepId,
229
260
  eventData: {
230
261
  stepName,
231
- error: await dehydrateStepError(err, workflowRunId, await getEncryptionKey()),
262
+ error: await dehydrateStepError(err, workflowRunId, await getEncryptionKey(), [], globalThis, compressionForStep()),
232
263
  },
233
264
  }, { requestId });
234
265
  }
@@ -251,7 +282,7 @@ function createStepHandler(namespace) {
251
282
  // Re-invoke the workflow to handle the failed step
252
283
  await queueMessage(world, getWorkflowQueueName(workflowName, resolvedNamespace), {
253
284
  runId: workflowRunId,
254
- traceCarrier: await serializeTraceCarrier(),
285
+ traceCarrier: await nextTraceCarrier(),
255
286
  requestedAt: new Date(),
256
287
  });
257
288
  return;
@@ -302,7 +333,7 @@ function createStepHandler(namespace) {
302
333
  correlationId: stepId,
303
334
  eventData: {
304
335
  stepName,
305
- error: await dehydrateStepError(wrappedError, workflowRunId, await getEncryptionKey()),
336
+ error: await dehydrateStepError(wrappedError, workflowRunId, await getEncryptionKey(), [], globalThis, compressionForStep()),
306
337
  },
307
338
  }, { requestId });
308
339
  }
@@ -325,7 +356,7 @@ function createStepHandler(namespace) {
325
356
  // Re-invoke the workflow to handle the failed step
326
357
  await queueMessage(world, getWorkflowQueueName(workflowName, resolvedNamespace), {
327
358
  runId: workflowRunId,
328
- traceCarrier: await serializeTraceCarrier(),
359
+ traceCarrier: await nextTraceCarrier(),
329
360
  requestedAt: new Date(),
330
361
  });
331
362
  return;
@@ -350,7 +381,7 @@ function createStepHandler(namespace) {
350
381
  correlationId: stepId,
351
382
  eventData: {
352
383
  stepName,
353
- error: await dehydrateStepError(new FatalError(errorMessage), workflowRunId, await getEncryptionKey()),
384
+ error: await dehydrateStepError(new FatalError(errorMessage), workflowRunId, await getEncryptionKey(), [], globalThis, compressionForStep()),
354
385
  },
355
386
  }, { requestId });
356
387
  }
@@ -363,7 +394,7 @@ function createStepHandler(namespace) {
363
394
  // Re-queue the workflow so it can process the step failure
364
395
  await queueMessage(world, getWorkflowQueueName(workflowName, resolvedNamespace), {
365
396
  runId: workflowRunId,
366
- traceCarrier: await serializeTraceCarrier(),
397
+ traceCarrier: await nextTraceCarrier(),
367
398
  requestedAt: new Date(),
368
399
  });
369
400
  return;
@@ -451,7 +482,7 @@ function createStepHandler(namespace) {
451
482
  // running on this same deployment (version skew
452
483
  // protection ensures it). Byte-stream framing is
453
484
  // therefore always safe here.
454
- const dehydrated = await dehydrateStepReturnValue(result, workflowRunId, encryptionKey, ops, globalThis, false, true);
485
+ const dehydrated = await dehydrateStepReturnValue(result, workflowRunId, encryptionKey, ops, globalThis, false, true, compressionForStep());
455
486
  const durationMs = Date.now() - startTime;
456
487
  dehydrateSpan?.setAttributes({
457
488
  ...Attribute.QueueSerializeTimeMs(durationMs),
@@ -541,7 +572,7 @@ function createStepHandler(namespace) {
541
572
  correlationId: stepId,
542
573
  eventData: {
543
574
  stepName,
544
- error: await dehydrateStepError(effectiveErr, workflowRunId, encryptionKey),
575
+ error: await dehydrateStepError(effectiveErr, workflowRunId, encryptionKey, [], globalThis, compressionForStep()),
545
576
  },
546
577
  }, { requestId });
547
578
  }
@@ -610,7 +641,7 @@ function createStepHandler(namespace) {
610
641
  correlationId: stepId,
611
642
  eventData: {
612
643
  stepName,
613
- error: await dehydrateStepError(wrappedError, workflowRunId, encryptionKey),
644
+ error: await dehydrateStepError(wrappedError, workflowRunId, encryptionKey, [], globalThis, compressionForStep()),
614
645
  },
615
646
  }, { requestId });
616
647
  }
@@ -667,7 +698,7 @@ function createStepHandler(namespace) {
667
698
  correlationId: stepId,
668
699
  eventData: {
669
700
  stepName,
670
- error: await dehydrateStepError(err, workflowRunId, encryptionKey),
701
+ error: await dehydrateStepError(err, workflowRunId, encryptionKey, [], globalThis, compressionForStep()),
671
702
  ...(RetryableError.is(err) && {
672
703
  retryAfter: err.retryAfter,
673
704
  }),
@@ -706,7 +737,7 @@ function createStepHandler(namespace) {
706
737
  // Re-invoke the workflow to handle the failed/retrying step
707
738
  await queueMessage(world, getWorkflowQueueName(workflowName, resolvedNamespace), {
708
739
  runId: workflowRunId,
709
- traceCarrier: await serializeTraceCarrier(),
740
+ traceCarrier: await nextTraceCarrier(),
710
741
  requestedAt: new Date(),
711
742
  });
712
743
  return;
@@ -754,7 +785,7 @@ function createStepHandler(namespace) {
754
785
  }
755
786
  throw err;
756
787
  }),
757
- serializeTraceCarrier(),
788
+ nextTraceCarrier(),
758
789
  ]);
759
790
  if (stepCompleted409) {
760
791
  return;
@@ -787,4 +818,4 @@ export const stepEntrypoint =
787
818
  }
788
819
  return cachedStepHandler(req);
789
820
  });
790
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUVwQix1QkFBdUIsR0FDeEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixLQUFLLEVBQ0wsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLHdCQUF3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QUFPLE1BQU0sQ0FBQztpQkFDM0MsQ0FBQyxDQUFDO2dCQUVILCtFQUErRTtnQkFDL0UsTUFBTSxZQUFZLENBQ2hCLEtBQUssRUFDTCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsRUFDckQ7b0JBQ0UsS0FBSyxFQUFFLGFBQWE7b0JBQ3BCLFlBQVk7b0JBQ1osV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO2lCQUN4QixDQUNGLENBQUM7WUFDSixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztBQUV4Qzs7OztHQUlHO0FBQ0gsSUFBSSxpQkFBb0UsQ0FBQztBQUN6RSxNQUFNLENBQUMsTUFBTSxjQUFjO0FBQ3pCLGVBQWUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO0lBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3IsXG4gIFRocm90dGxlRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZm9ybWF0U3RlcE5hbWUsIHBsdXJhbGl6ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBnZXRQb3J0IH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL2dldC1wb3J0JztcbmltcG9ydCB7XG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIHR5cGUgU3RlcCxcbiAgU3RlcEludm9rZVBheWxvYWRTY2hlbWEsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZXNjcmliZUVycm9yIH0gZnJvbSAnLi4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciwgc3RlcExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuLi9wcml2YXRlLmpzJztcbmltcG9ydCB7XG4gIGNhbmNlbEFib3J0UmVhZGVycyxcbiAgZGVoeWRyYXRlU3RlcEVycm9yLFxuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBoeWRyYXRlU3RlcEVycm9yLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBnZXRTcGFuS2luZCxcbiAgbGlua1RvQ3VycmVudENvbnRleHQsXG4gIHNlcmlhbGl6ZVRyYWNlQ2FycmllcixcbiAgdHJhY2UsXG4gIHdpdGhUcmFjZUNvbnRleHQsXG59IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQge1xuICBnZXRFcnJvck5hbWUsXG4gIGdldEVycm9yU3RhY2ssXG4gIG5vcm1hbGl6ZVVua25vd25FcnJvcixcbiAgcHJvbW90ZUFib3J0RXJyb3JUb0ZhdGFsLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCB7IE1BWF9RVUVVRV9ERUxJVkVSSUVTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQsIGdldFdvcmxkSGFuZGxlcnMsIHR5cGUgV29ybGRIYW5kbGVycyB9IGZyb20gJy4vd29ybGQuanMnO1xuXG5jb25zdCBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMgPSAzO1xuXG5mdW5jdGlvbiBjcmVhdGVTdGVwSGFuZGxlcihuYW1lc3BhY2U/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb2x2ZWROYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2UobmFtZXNwYWNlKTtcbiAgY29uc3Qgc3RlcFByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3N0ZXAnLCByZXNvbHZlZE5hbWVzcGFjZSk7XG5cbiAgcmV0dXJuICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKHN0ZXBQcmVmaXgsIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAnc3RlcCcsXG4gICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgc3RlcElkLFxuICAgICAgICB0cmFjZUNhcnJpZXI6IHRyYWNlQ29udGV4dCxcbiAgICAgICAgcmVxdWVzdGVkQXQsXG4gICAgICB9ID0gU3RlcEludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuXG4gICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSBzdGVwcyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Ugd2FudCB0byBkbyB0aGUgbWluaW1hbCBhbW91bnQgb2Ygd29yayAobm8gZmV0Y2hpbmdcbiAgICAgIC8vIG9mIHRoZSBzdGVwIGRldGFpbHMsIGV0Yy4gV2Ugc2ltcGx5IGF0dGVtcHQgdG8gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWRcbiAgICAgIC8vIGFuZCBlbnF1ZXVlIHRoZSB3b3JrZmxvdyBvbmNlLCBhbmQgaWYgZWl0aGVyIG9mIHRob3NlIGZhaWxzLCB0aGUgbWVzc2FnZVxuICAgICAgLy8gaXMgc3RpbGwgY29uc3VtZWQgYnV0IHdpdGggYWRlcXVhdGUgbG9nZ2luZyB0aGF0IGFuIGVycm9yIG9jY3VycmVkLlxuICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBzdGVwIGludm9jYXRpb24g4oCUIGF0dGFjaGVzIHJ1bi9zdGVwIGNvbnRleHQgdG9cbiAgICAgIC8vIGV2ZXJ5IGxvZyBsaW5lIGJlbG93IHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgY29uc3Qgc3RlcE5hbWVGcm9tUXVldWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uoc3RlcFByZWZpeC5sZW5ndGgpO1xuICAgICAgY29uc3Qgc3RlcFJ1bnRpbWVMb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB7IHN0ZXBJZCwgc3RlcE5hbWU6IHN0ZXBOYW1lRnJvbVF1ZXVlIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gTUFYX1FVRVVFX0RFTElWRVJJRVMpIHtcbiAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYFN0ZXAgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuSWQpO1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgYFN0ZXAgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7TUFYX1FVRVVFX0RFTElWRVJJRVN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcE5hbWVGcm9tUXVldWUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJlLXF1ZXVlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZCBzdGVwXG4gICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ2FuJ3QgZXZlbiBtYXJrIHRoZSBzdGVwIGFzIGZhaWxlZC4gQ29uc3VtZSB0aGUgbWVzc2FnZSB0byBzdG9wXG4gICAgICAgICAgLy8gZnVydGhlciByZXRyaWVzLiBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlLlxuICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHN0ZXAgYXMgZmFpbGVkIGFmdGVyICR7bWV0YWRhdGEuYXR0ZW1wdH0gZGVsaXZlcnkgYXR0ZW1wdHMuIGAgK1xuICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHN0ZXAgZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBydW4gd2lsbCByZW1haW4gaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgbWFudWFsbHkgcmVzb2x2ZWQuIGAgK1xuICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BhbkxpbmtzID0gYXdhaXQgbGlua1RvQ3VycmVudENvbnRleHQoKTtcbiAgICAgIC8vIEV4ZWN1dGUgc3RlcCB3aXRoaW4gdGhlIHByb3BhZ2F0ZWQgdHJhY2UgY29udGV4dFxuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUcmFjZUNvbnRleHQodHJhY2VDb250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHN0ZXAgbmFtZSBmcm9tIHRoZSB0b3BpYyBuYW1lXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHN0ZXBQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBNZW1vaXplZCBhY2Nlc3NvciBmb3IgdGhlIHBlci1ydW4gQUVTLTI1NiBlbmNyeXB0aW9uIGtleS4gVGhlIGZpcnN0XG4gICAgICAgIC8vIGNhbGxlciAodHlwaWNhbGx5IGBoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZm9yIGlucHV0IGRlc2VyaWFsaXphdGlvbixcbiAgICAgICAgLy8gb3Igb25lIG9mIHRoZSBlYXJseS1yZXR1cm4gZGVoeWRyYXRlU3RlcEVycm9yIHBhdGhzIGlmIHN0ZXBfc3RhcnRlZFxuICAgICAgICAvLyBmYWlscykgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbjsgc3Vic2VxdWVudFxuICAgICAgICAvLyBjYWxsZXJzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS4gU3RlcHMgdGhhdCBmYWlsIGJlZm9yZSBhbnlcbiAgICAgICAgLy8gZW5jcnlwdGlvbi1hd2FyZSB3b3JrIGhhcHBlbnMgKGUuZy4gYW4gaW1tZWRpYXRlIHN0ZXBfc3RhcnRlZFxuICAgICAgICAvLyBjb25mbGljdCkgc2tpcCB0aGUgZmV0Y2ggZW50aXJlbHkuXG4gICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW5JZCk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBsb2NhbCBhc3luYyB2YWx1ZXMgY29uY3VycmVudGx5IGJlZm9yZSBlbnRlcmluZyB0aGUgdHJhY2Ugc3BhblxuICAgICAgICBjb25zdCBbcG9ydCwgc3BhbktpbmRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGlzVmVyY2VsID8gdW5kZWZpbmVkIDogZ2V0UG9ydCgpLFxuICAgICAgICAgIGdldFNwYW5LaW5kKCdDT05TVU1FUicpLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgYFNURVAgJHtzdGVwTmFtZX1gLFxuICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChtZXRhZGF0YS5hdHRlbXB0KSxcbiAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gTm90ZTogU3RlcCBmdW5jdGlvbiB2YWxpZGF0aW9uIGhhcHBlbnMgYWZ0ZXIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIHN0ZXAgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICAgICAgICAgICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCB2YWxpZGF0ZXMgc3RhdGUgYW5kIHJldHVybnMgdGhlIHN0ZXAgZW50aXR5LCBzbyBubyBzZXBhcmF0ZVxuICAgICAgICAgICAgLy8gd29ybGQuc3RlcHMuZ2V0KCkgY2FsbCBpcyBuZWVkZWQuIFRoZSBzZXJ2ZXIgY2hlY2tzOlxuICAgICAgICAgICAgLy8gLSBTdGVwIG5vdCBpbiB0ZXJtaW5hbCBzdGF0ZSAocmV0dXJucyA0MDkpXG4gICAgICAgICAgICAvLyAtIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIHJlYWNoZWQgKHJldHVybnMgNDI1IHdpdGggUmV0cnktQWZ0ZXIgaGVhZGVyKVxuICAgICAgICAgICAgLy8gLSBXb3JrZmxvdyBzdGlsbCBhY3RpdmUgKHJldHVybnMgNDEwIGlmIGNvbXBsZXRlZClcbiAgICAgICAgICAgIGxldCBzdGVwITogU3RlcDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgc3RlcE5hbWUgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoIXN0YXJ0UmVzdWx0LnN0ZXApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgc3RlcF9zdGFydGVkIGV2ZW50IGZvciBcIiR7c3RlcElkfVwiIGRpZCBub3QgcmV0dXJuIHN0ZXAgZW50aXR5YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RlcCA9IHN0YXJ0UmVzdWx0LnN0ZXA7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKFRocm90dGxlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5UmV0cnlBZnRlciA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIucmV0cnlBZnRlciA9PT0gJ251bWJlcicgPyBlcnIucmV0cnlBZnRlciA6IDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAnVGhyb3R0bGVkIGFnYWluIG9uIHJldHJ5LCBkZWZlcnJpbmcgdG8gcXVldWUnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogcmV0cnlSZXRyeUFmdGVyLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHJldHJ5UmV0cnlBZnRlciB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIHdoZW4gYSBydW4gaXMgY2FuY2VsbGVkIHdoaWxlIGEgc3RlcCBpcyBpbi1mbGlnaHQuXG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gaGFzIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgIHsgZXJyb3JOYW1lOiBlcnIubmFtZSwgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiBhIHRlcm1pbmFsIHN0YXRlIOKAlCBhbm90aGVyIHdvcmtlciBmaW5pc2hlZFxuICAgICAgICAgICAgICAgIC8vIGl0IG9yIGl0IHdhcyByZXRyaWVkIHRvIGNvbXBsZXRpb24uIFJlLWVucXVldWUgdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IHNvIGl0IGNhbiBvYnNlcnZlIHRoZSBvdXRjb21lLlxuICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgJ1N0ZXAgaW4gdGVybWluYWwgc3RhdGUsIHJlLWVucXVldWluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcHBlZCh0cnVlKSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcFJlYXNvbignY29tcGxldGVkJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/Lignc3RlcC5za2lwcGVkJywge1xuICAgICAgICAgICAgICAgICAgJ3NraXAucmVhc29uJzogJ3Rlcm1pbmFsX3N0YXRlJyxcbiAgICAgICAgICAgICAgICAgICdzdGVwLm5hbWUnOiBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICdzdGVwLmlkJzogc3RlcElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCByZXNvbHZlZE5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFRvbyBlYXJseTogcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHJlYWNoZWQgeWV0XG4gICAgICAgICAgICAgIC8vIFJldHVybiB0aW1lb3V0IHRvIHF1ZXVlIHNvIGl0IHJldHJpZXMgbGF0ZXJcbiAgICAgICAgICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBzcGFuIGV2ZW50IGZvciBkZWxheWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/Lignc3RlcC5kZWxheWVkJywge1xuICAgICAgICAgICAgICAgICAgJ2RlbGF5LnJlYXNvbic6ICdyZXRyeV9hZnRlcl9ub3RfcmVhY2hlZCcsXG4gICAgICAgICAgICAgICAgICAnZGVsYXkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCByZXRyeUFmdGVyIHRpbWVzdGFtcCBub3QgeWV0IHJlYWNoZWQnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogZXJyLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBleGVjdXRpb24gZGV0YWlscycsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgc3RlcCBmdW5jdGlvbiBleGlzdHMgQUZURVIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgc3RlcCBmYWlsdXJlIGdyYWNlZnVsbHksXG4gICAgICAgICAgICAvLyBzaW1pbGFyIHRvIGhvdyBGYXRhbEVycm9yIGlzIGhhbmRsZWQuXG4gICAgICAgICAgICBpZiAoIXN0ZXBGbiB8fCB0eXBlb2Ygc3RlcEZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwIChub3QgcnVuKScsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBGYXRhbEVycm9yIHBhdHRlcm4gLSBmYWlsIHRoZSBzdGVwIGFuZCByZS1xdWV1ZSB3b3JrZmxvd1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgdHJhbnNpdGlvbmVkIHRvIGEgdGVybWluYWwgc3RhdGUg4oCUIGR1cGxpY2F0ZVxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb3IgY29uY3VycmVudCBjYW5jZWxsYXRpb24uIERyb3Agc2lsZW50bHkuXG4gICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwIGZvciBtaXNzaW5nIGZ1bmN0aW9uLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXMgPz8gREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgICAgICAgICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZClcbiAgICAgICAgICAgIC8vIHN0ZXAuYXR0ZW1wdCB0cmFja3MgaG93IG1hbnkgdGltZXMgc3RlcF9zdGFydGVkIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAvLyBVc2UgPiBoZXJlIChub3QgPj0pIGJlY2F1c2UgdGhpcyBndWFyZHMgYWdhaW5zdCByZS1pbnZvY2F0aW9uIEFGVEVSIGFsbCBhdHRlbXB0cyBhcmUgdXNlZC5cbiAgICAgICAgICAgIC8vIFRoZSBwb3N0LWZhaWx1cmUgY2hlY2sgdXNlcyA+PSB0byBkZWNpZGUgd2hldGhlciB0byByZXRyeSBhZnRlciBhIGZhaWx1cmUuXG4gICAgICAgICAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgIC8vIFBlcnNpc3RlZCBtZXNzYWdlIOKAlCBrZXB0IHNob3J0LCBubyBtYWNoaW5lIGBzdGVwTmFtZWAsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIG9ic2VydmFiaWxpdHkgYWxyZWFkeSBhdHRyaWJ1dGVzIHRoZSBldmVudCB0byBhXG4gICAgICAgICAgICAgIC8vIHNwZWNpZmljIHN0ZXAuXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWA7XG4gICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFN0ZXAgJHtmb3JtYXRTdGVwTmFtZShzdGVwTmFtZSl9IGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBwcmlvciBhdHRlbXB0J3Mgc2VyaWFsaXplZCBlcnJvciBhcyB0aGUgY2F1c2Ugc29cbiAgICAgICAgICAgICAgLy8gdGhlIHVuZGVybHlpbmcgZmFpbHVyZSBpcyByZWNvdmVyYWJsZSBmcm9tIGBzdGVwLmVycm9yLmNhdXNlYFxuICAgICAgICAgICAgICAvLyBhZnRlciBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGVcbiAgICAgICAgICAgICAgLy8gc3RlcF9yZXRyeWluZyBldmVudCBoaXN0b3J5LiBNaXJyb3JzIHRoZSBwb3N0LWZhaWx1cmUgcGF0aFxuICAgICAgICAgICAgICAvLyBiZWxvdyB0aGF0IHdyYXBzIHRoZSBsaXZlIGBlcnJgIGFzIGNhdXNlLlxuICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICh3cmFwcGVkRXJyb3IgYXMgRXJyb3IpLmNhdXNlID0gYXdhaXQgaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gSWdub3JlOiBiZXN0LWVmZm9ydCBjYXVzZSBhdHRhY2htZW50LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgICAgICAgIC8vIEZhdGFsRXJyb3Igc3RhY2svbWVzc2FnZSBzdGlsbCBzdXJmYWNlIHRoZSBmYWlsdXJlLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gYSB0ZXJtaW5hbCBzdGF0ZSDigJQgZHVwbGljYXRlXG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvciBjb25jdXJyZW50IGNvbXBsZXRpb24uIERyb3Agc2lsZW50bHkuXG4gICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeUV4aGF1c3RlZCh0cnVlKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZCBzdGVwXG4gICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHN0ZXAgaW5wdXQgLS0tXG4gICAgICAgICAgICAvLyBOZXR3b3JrL3NlcnZlciBlcnJvcnMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeS5cbiAgICAgICAgICAgIC8vIFdvcmtmbG93UnVudGltZUVycm9yIChkYXRhIGludGVncml0eSBpc3N1ZXMpIGFyZSBmYXRhbCDigJQgcmV0cnlpbmdcbiAgICAgICAgICAgIC8vIHdvbid0IGZpeCB0aGVtLCBzbyB3ZSByZS1xdWV1ZSB0aGUgd29ya2Zsb3cgdG8gc3VyZmFjZSB0aGUgZXJyb3IuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHN0ZXAgaXMgaW4gdmFsaWQgc3RhdGUgKHBlbmRpbmcvcnVubmluZylcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm5lZCB0aGUgdXBkYXRlZCBzdGVwIGVudGl0eSB3aXRoIGluY3JlbWVudGVkIGF0dGVtcHRcblxuICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IGlzIG5vdyB0aGUgY3VycmVudCBhdHRlbXB0IG51bWJlciAoYWZ0ZXIgaW5jcmVtZW50KVxuICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcElkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGA7XG4gICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKCdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyBzdGVwIHNldHVwJywge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlLXF1ZXVlIHRoZSB3b3JrZmxvdyBzbyBpdCBjYW4gcHJvY2VzcyB0aGUgc3RlcCBmYWlsdXJlXG4gICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhcHR1cmUgc3RhcnRlZEF0IGZvciB1c2UgaW4gYXN5bmMgY2FsbGJhY2sgKFR5cGVTY3JpcHQgbmFycm93aW5nIGRvZXNuJ3QgcGVyc2lzdClcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBTdGFydGVkQXQgPSBzdGVwLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgbm93IHRoYXQgd2UncmUgY29tbWl0dGVkIHRvIHJ1bm5pbmdcbiAgICAgICAgICAgIC8vIHVzZXIgY29kZTogaW5wdXQgaHlkcmF0aW9uIG5lZWRzIGl0LCBhbmQgYGNvbnRleHRTdG9yYWdlYCAoYW5kXG4gICAgICAgICAgICAvLyBhbnkgdXNlci1jb2RlIHBhdGhzIHRoYXQgcnVuIGluc2lkZSBpdCkgY2FwdHVyZSB0aGUgcmVzb2x2ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLiBUcmlnZ2VycyB0aGUgdW5kZXJseWluZyB3b3JsZCAvIEtNUyBmZXRjaCBvbmNlLCB3aXRoXG4gICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGRlaHlkcmF0ZSBwYXRocyByZXVzaW5nIHRoZSBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRoZSBzdGVwIGlucHV0IGFyZ3VtZW50cywgY2xvc3VyZSB2YXJpYWJsZXMsIGFuZCB0aGlzVmFsXG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNhcHR1cmVzIG9ubHkgdGhlIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgaHlkcmF0aW9uLiBBbnkgYXN5bmNcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbnMgKGUuZy4sIHN0cmVhbSBsb2FkaW5nKSBhcmUgYWRkZWQgdG8gYG9wc2AgYW5kIGV4ZWN1dGVkIGxhdGVyXG4gICAgICAgICAgICAvLyB2aWEgUHJvbWlzZS5hbGwob3BzKSAtIHRoZWlyIHRpbWluZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBjb25zdCBoeWRyYXRlZElucHV0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICdzdGVwLmh5ZHJhdGUnLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgYXN5bmMgKGh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEFyZ3VtZW50c0NvdW50KHJlc3VsdC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuXG4gICAgICAgICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgICAgICAgIC8vIE9ubHkgZXJyb3JzIGZyb20gc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzaG91bGQgcHJvZHVjZVxuICAgICAgICAgICAgLy8gc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZy4gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIChuZXR3b3JrLCBzZXJ2ZXIpXG4gICAgICAgICAgICAvLyBtdXN0IHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgYXV0b21hdGljIHJldHJ5LlxuICAgICAgICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICAgICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmV4ZWN1dGUnLCB7fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0U3RvcmFnZS5ydW4oXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwU3RhcnRlZEF0OiBuZXcgRGF0ZSgrc3RlcFN0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgRGF0ZSgrd29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoZXJlIHNob3VsZCBiZSBhIGdldFVybCBtZXRob2Qgb24gdGhlIHdvcmxkIGludGVyZmFjZSBpdHNlbGYuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzb2x1dGlvbiBvbmx5IHdvcmtzIGZvciB2ZXJjZWwgKyBsb2NhbCB3b3JsZHMuXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiBpc1ZlcmNlbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnQgPz8gMzAwMH1gLFxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQsXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVZhcnM6IGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgKCkgPT4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRXhlY3V0aW9uVGltZU1zKGV4ZWN1dGlvblRpbWVNcyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gLS0tIERlaHlkcmF0ZSAoc2VyaWFsaXplKSB0aGUgc3RlcCdzIHJldHVybiB2YWx1ZSAtLS1cbiAgICAgICAgICAgIC8vIEEgbm9uLXNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUgaXMgYSB1c2VyLWNvZGUgYnVnLCBub3QgYW5cbiAgICAgICAgICAgIC8vIGluZnJhc3RydWN0dXJlIGZhaWx1cmUuIFJvdXRlIGl0IHRocm91Z2ggdGhlIHNhbWUgc3RlcC1mYWlsdXJlXG4gICAgICAgICAgICAvLyBwYXRoIGFzIGEgdGhyb3duIGVycm9yIHNvIFNlcmlhbGl6YXRpb25FcnJvciAod2hpY2ggaXMgbWFya2VkXG4gICAgICAgICAgICAvLyBgZmF0YWw6IHRydWVgKSBzaG9ydC1jaXJjdWl0cyB0aGUgcmV0cnkgbG9vcCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAvLyBidWJibGluZyBhcyBhbiBIVFRQIDUwMCBhbmQgYnVybmluZyB0aHJvdWdoIGFsbCA0IHF1ZXVlXG4gICAgICAgICAgICAvLyBkZWxpdmVyaWVzIG9uIGEgZ3VhcmFudGVlZC10by1mYWlsIG1lc3NhZ2UuXG4gICAgICAgICAgICBpZiAoIXVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICAgICAnc3RlcC5kZWh5ZHJhdGUnLFxuICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICBhc3luYyAoZGVoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIHJldHVybiB2YWx1ZXMgYXJlIGNvbnN1bWVkIGJ5IHRoZSB3b3JrZmxvdyBWTVxuICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nIG9uIHRoaXMgc2FtZSBkZXBsb3ltZW50ICh2ZXJzaW9uIHNrZXdcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBlbnN1cmVzIGl0KS4gQnl0ZS1zdHJlYW0gZnJhbWluZyBpc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgYWx3YXlzIHNhZmUgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVoeWRyYXRlZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZVNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIGRlaHlkcmF0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlaHlkcmF0ZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEhhbmRsZSB1c2VyIGNvZGUgZXJyb3JzIC0tLVxuICAgICAgICAgICAgaWYgKHVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IHVzZXJDb2RlRXJyb3I7XG5cbiAgICAgICAgICAgICAgLy8gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIHRoYXQgc29tZWhvdyBzdXJmYWNlZCB0aHJvdWdoIHVzZXIgY29kZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeSwgbm90IGNvbnN1bWVcbiAgICAgICAgICAgICAgLy8gc3RlcCBhdHRlbXB0cy5cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkLCBzbyBuby1vcFxuICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgZXJyLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBBYm9ydCBmYWlsdXJlcyBjYW4gY3Jvc3MgVk0vc2VyaWFsaXphdGlvbiByZWFsbXMsIHdoZXJlXG4gICAgICAgICAgICAgIC8vIGBpbnN0YW5jZW9mIEVycm9yYCBpcyBub3QgcmVsaWFibGUuXG4gICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUVyciA9IHByb21vdGVBYm9ydEVycm9yVG9GYXRhbChlcnIpO1xuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IoZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YWNrID1cbiAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayhlZmZlY3RpdmVFcnIpIHx8ICcnO1xuXG4gICAgICAgICAgICAgIC8vIFJlY29yZCBleGNlcHRpb24gZm9yIE9URUwgZXJyb3IgdHJhY2tpbmdcbiAgICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4oZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIERldGVybWluZSBlcnJvciBjYXRlZ29yeSBhbmQgcmV0cnlhYmlsaXR5XG4gICAgICAgICAgICAgIGNvbnN0IGlzRmF0YWwgPSBGYXRhbEVycm9yLmlzKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gUmV0cnlhYmxlRXJyb3IuaXMoZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JDYXRlZ29yeSA9IGlzRmF0YWxcbiAgICAgICAgICAgICAgICA/ICdmYXRhbCdcbiAgICAgICAgICAgICAgICA6IGlzUmV0cnlhYmxlXG4gICAgICAgICAgICAgICAgICA/ICdyZXRyeWFibGUnXG4gICAgICAgICAgICAgICAgICA6ICd0cmFuc2llbnQnO1xuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRXJyb3JOYW1lKGdldEVycm9yTmFtZShlZmZlY3RpdmVFcnIpKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTWVzc2FnZShub3JtYWxpemVkRXJyb3IubWVzc2FnZSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShnZXRFcnJvck5hbWUoZWZmZWN0aXZlRXJyKSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yQ2F0ZWdvcnkoZXJyb3JDYXRlZ29yeSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yUmV0cnlhYmxlKCFpc0ZhdGFsKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzRmF0YWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcmllbmRseVN0ZXAgPSBmb3JtYXRTdGVwTmFtZShzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJhbWluZyA9XG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgICAgICAgICAgICAgPyBgU3RlcCAke2ZyaWVuZGx5U3RlcH0gZmFpbGVkIHdpdGggYSBGYXRhbEVycm9yIGZyb20gdGhlIFNESyBydW50aW1lIOKAlCBidWJibGluZyB1cCB0byBwYXJlbnQgd29ya2Zsb3dgXG4gICAgICAgICAgICAgICAgICAgIDogYFN0ZXAgJHtmcmllbmRseVN0ZXB9IHRocmV3IGEgRmF0YWxFcnJvciDigJQgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93YDtcbiAgICAgICAgICAgICAgICAvLyBNaXJyb3IgdGhlIHdvcmtmbG93LWxldmVsIGxvZyBmb3JtYXR0aW5nOiBwdXQgdGhlIGZyYW1pbmcgK1xuICAgICAgICAgICAgICAgIC8vIHN0YWNrIGludG8gdGhlIG1lc3NhZ2Ugc28gY29uc29sZS5lcnJvciByZW5kZXJzIHRoZSBzdGFja1xuICAgICAgICAgICAgICAgIC8vIGlubGluZSwgYW5kIGtlZXAgdGhlIG1ldGFkYXRhIG9iamVjdCBzbWFsbCB3aXRoIG9ubHkgdGhlXG4gICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlZCBmaWVsZHMgdGhhdCBsb2cgZHJhaW5zIHdhbnQgdG8gaW5kZXguXG4gICAgICAgICAgICAgICAgLy8gTm8gYGhpbnRgIGZpZWxkIGhlcmUg4oCUIGFjdGlvbmFibGUgaGludCB0ZXh0IGxpdmVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UgaXRzZWxmIChzbyBpdCBzdXJ2aXZlcyBzZXJpYWxpemF0aW9uIOKGklxuICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZyDihpIgb2JzZXJ2YWJpbGl0eSByZWh5ZHJhdGUpLCBhbmQgYWRkaW5nIGl0XG4gICAgICAgICAgICAgICAgLy8gYWdhaW4gaGVyZSBqdXN0IGR1cGxpY2F0ZXMgaXQgb24gc3RkZXJyLlxuICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBgJHtmcmFtaW5nfVxcbiR7bm9ybWFsaXplZFN0YWNrIHx8IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IGRlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IG5vcm1hbGl6ZWRFcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgc3RlcCB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKS5cbiAgICAgICAgICAgICAgICAvLyBQZXJzaXN0IHRoZSBwcm9tb3RlZCBGYXRhbEVycm9yIGZvciBhYm9ydHMgc28gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBkaXN0aW5ndWlzaCBjYW5jZWxsYXRpb24gZnJvbSByZXRyeSBleGhhdXN0aW9uLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4UmV0cmllcyA9XG4gICAgICAgICAgICAgICAgICBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG4gICAgICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IHdhcyBpbmNyZW1lbnRlZCBieSBzdGVwX3N0YXJ0ZWQsIHVzZSBpdCBoZXJlXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChjdXJyZW50QXR0ZW1wdCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBtYXhSZXRyaWVzIGlzIHRoZSBudW1iZXIgb2YgUkVUUklFUyBhZnRlciB0aGUgZmlyc3QgYXR0ZW1wdCwgc28gdG90YWwgYXR0ZW1wdHMgPSBtYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QXR0ZW1wdCA+PSBtYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgLy8gTWF4IHJldHJpZXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyaWVuZGx5U3RlcCA9IGZvcm1hdFN0ZXBOYW1lKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1pbmcgPVxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgICAgICAgICAgICAgICA/IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBoaXQgbWF4IHJldHJpZXMgb24gYW4gU0RLIHJ1bnRpbWUgZXJyb3Ig4oCUIGJ1YmJsaW5nIHRvIHBhcmVudCB3b3JrZmxvd2BcbiAgICAgICAgICAgICAgICAgICAgICA6IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBoaXQgbWF4IHJldHJpZXMg4oCUIGJ1YmJsaW5nIGVycm9yIHRocm93biBieSB5b3VyIHN0ZXAgdG8gdGhlIHBhcmVudCB3b3JrZmxvd2A7XG4gICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgJHtmcmFtaW5nfVxcbiR7bm9ybWFsaXplZFN0YWNrIHx8IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogZGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgbWFjaGluZSBzdGVwIG5hbWUgaW4gdGhlIHBlcnNpc3RlZFxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSDigJQgb2JzZXJ2YWJpbGl0eSBhbHJlYWR5IHNob3dzIHdoaWNoIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VkIHRoZSBldmVudCwgYW5kIGBzdGVwTmFtZTogJ3N0ZXAvLy4vLi4uL2ZvbydgXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGl0bGUgaXMganVzdCBub2lzZS4gVGhlIENMSSBsb2dnZXIgcmVuZGVyc1xuICAgICAgICAgICAgICAgICAgLy8gYFN0ZXAgZm9vICguLy4uLikgaGl0IG1heCByZXRyaWVzYCBzZXBhcmF0ZWx5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCBtYXhSZXRyaWVzKX06ICR7bm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBvcmlnaW5hbCBlcnJvciB3aXRoIGEgRmF0YWxFcnJvciB0aGF0IHByZXNlcnZlc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHdyYXBwZWQgbWVzc2FnZSBwbHVzIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGBjYXVzZWAgc28gaXQncyByZWNvdmVyYWJsZSBhZnRlciBoeWRyYXRpb24uXG4gICAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBlcnI7XG4gICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFN0YWNrKSB3cmFwcGVkRXJyb3Iuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3RlcEZhaWxFcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5vdCBhdCBtYXggcmV0cmllcyB5ZXQgLSBsb2cgYXMgYSByZXRyeWFibGUgZXJyb3JcbiAgICAgICAgICAgICAgICAgIGlmIChSZXRyeWFibGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAnRW5jb3VudGVyZWQgUmV0cnlhYmxlRXJyb3IsIHN0ZXAgd2lsbCBiZSByZXRyaWVkJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjazogbm9ybWFsaXplZFN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuaW5mbygnRW5jb3VudGVyZWQgRXJyb3IsIHN0ZXAgd2lsbCBiZSByZXRyaWVkJywge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IG5vcm1hbGl6ZWRFcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbm9ybWFsaXplZEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjazogbm9ybWFsaXplZFN0YWNrLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIFNldCBzdGVwIHRvIHBlbmRpbmcgZm9yIHJldHJ5IHZpYSBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwX3JldHJ5aW5nIHJlY29yZHMgdGhlIGVycm9yIGFuZCBzZXRzIHN0YXR1cyB0byBwZW5kaW5nLlxuICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGwgdHlwZSBpZGVudGl0eVxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXAgdGhyb3VnaCB0aGUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKFJldHJ5YWJsZUVycm9yLmlzKGVycikgJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IGVyci5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIHJldHJ5aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3RlcFJldHJ5RXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcFJldHJ5RXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcFJldHJ5RXJyO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICBSZXRyeWFibGVFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgOiAxXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzKHRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVdpbGxSZXRyeSh0cnVlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAvLyBBZGQgc3BhbiBldmVudCBmb3IgcmV0cnkgc2NoZWR1bGluZ1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/LigncmV0cnkuc2NoZWR1bGVkJywge1xuICAgICAgICAgICAgICAgICAgICAncmV0cnkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS5hdHRlbXB0JzogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS5tYXhfcmV0cmllcyc6IG1heFJldHJpZXMsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIHJldHJ5YWJsZSBlcnJvciAtIHNvIGhhdmUgdGhlIHF1ZXVlIGtlZXAgdGhlIG1lc3NhZ2UgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBnZXRzIHJldHJpZWQuXG4gICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQvcmV0cnlpbmcgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCByZXNvbHZlZE5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogY29tcGxldGUgdGhlIHN0ZXAgLS0tXG4gICAgICAgICAgICAvLyBFcnJvcnMgaGVyZSAobmV0d29yayBmYWlsdXJlcywgc2VydmVyIGVycm9ycykgcHJvcGFnYXRlIHRvIHRoZVxuICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBmb3IgYXV0b21hdGljIHJldHJ5LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5PVEU6IE5vbmUgb2YgdGhlIGNvZGUgZnJvbSB0aGlzIHBvaW50IGlzIGd1YXJhbnRlZWQgdG8gcnVuLlxuICAgICAgICAgICAgLy8gU2luY2UgdGhlIHN0ZXAgbWlnaHQgZmFpbCBvciBjYXVzZSBhIGZ1bmN0aW9uIHRpbWVvdXQgYW5kIHRoZVxuICAgICAgICAgICAgLy8gcHJvY2VzcyBtaWdodCBiZSBTSUdLSUxMJ2QsIHRoZSB3b3JrZmxvdyBydW50aW1lIG11c3QgYmVcbiAgICAgICAgICAgIC8vIHJlc2lsaWVudCB0byB0aGUgYmVsb3cgY29kZSBub3QgZXhlY3V0aW5nIG9uIGEgZmFpbGVkIHN0ZXAuXG4gICAgICAgICAgICAvLyAoRGVoeWRyYXRpb24gYWxyZWFkeSBoYXBwZW5lZCBhYm92ZSBhbmQgaXMgYWNjb3VudGVkIGZvciBpbiB0aGVcbiAgICAgICAgICAgIC8vIHVzZXJDb2RlRmFpbGVkIHBhdGguKVxuICAgICAgICAgICAgLy8gVGhlc2Ugc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgICAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAgICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzb1xuICAgICAgICAgICAgLy8gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBmbHVzaCBvZiBzdGVwIHN0cmVhbSBvcHMgZmFpbGVkJyxcbiAgICAgICAgICAgICAgICB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFJ1biBzdGVwX2NvbXBsZXRlZCBhbmQgdHJhY2Ugc2VyaWFsaXphdGlvbiBjb25jdXJyZW50bHk7XG4gICAgICAgICAgICAvLyB0aGUgdHJhY2UgY2FycmllciBpcyB1c2VkIGluIHRoZSBmaW5hbCBxdWV1ZU1lc3NhZ2UgY2FsbCBiZWxvd1xuICAgICAgICAgICAgbGV0IHN0ZXBDb21wbGV0ZWQ0MDkgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IFssIHRyYWNlQ2Fycmllcl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIHdvcmxkLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzdGVwQ29tcGxldGVkNDA5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBpZiAoc3RlcENvbXBsZXRlZDQwOSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgcmVzdWx0KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uIHdpdGggdGhlIGNvbmN1cnJlbnRseS1yZXNvbHZlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbn1cblxuY29uc3Qgc3RlcEhhbmRsZXIgPSBjcmVhdGVTdGVwSGFuZGxlcigpO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJvdXRlIHRoYXQgaGFuZGxlcyBhbnkgc3RlcCBleGVjdXRpb24gcmVxdWVzdCBhbmQgcm91dGVzIHRvIHRoZVxuICogYXBwcm9wcmlhdGUgc3RlcCBmdW5jdGlvbi4gV2UgbWF5IGV2ZW50dWFsbHkgd2FudCB0byBjcmVhdGUgZGlmZmVyZW50IGJ1bmRsZXNcbiAqIGZvciBlYWNoIHN0ZXAsIHRoaXMgaXMgdGVtcG9yYXJ5LlxuICovXG5sZXQgY2FjaGVkU3RlcEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG5leHBvcnQgY29uc3Qgc3RlcEVudHJ5cG9pbnQ6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+ID1cbiAgLyogQF9fUFVSRV9fICovIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaWYgKCFjYWNoZWRTdGVwSGFuZGxlcikge1xuICAgICAgY2FjaGVkU3RlcEhhbmRsZXIgPSBzdGVwSGFuZGxlcihhd2FpdCBnZXRXb3JsZEhhbmRsZXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkU3RlcEhhbmRsZXIocmVxKTtcbiAgfSk7XG4iXX0=
821
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsaUNBQWlDLEVBRWpDLHVCQUF1QixHQUN4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsZ0JBQWdCLEdBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLGdCQUFnQixHQUNqQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pC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QkFDeEIsT0FBTzt3QkFDVCxDQUFDO3dCQUNELE1BQU0sR0FBRyxDQUFDO29CQUNaLENBQUMsQ0FBQztvQkFDSixnQkFBZ0IsRUFBRTtpQkFDbkIsQ0FBQyxDQUFDO2dCQUVILElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDckIsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksRUFBRSxhQUFhLENBQUM7b0JBQ2xCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7b0JBQ3BDLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLE1BQU0sQ0FBQztpQkFDM0MsQ0FBQyxDQUFDO2dCQUVILCtFQUErRTtnQkFDL0UsTUFBTSxZQUFZLENBQ2hCLEtBQUssRUFDTCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsRUFDckQ7b0JBQ0UsS0FBSyxFQUFFLGFBQWE7b0JBQ3BCLFlBQVk7b0JBQ1osV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO2lCQUN4QixDQUNGLENBQUM7WUFDSixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztBQUV4Qzs7OztHQUlHO0FBQ0gsSUFBSSxpQkFBb0UsQ0FBQztBQUN6RSxNQUFNLENBQUMsTUFBTSxjQUFjO0FBQ3pCLGVBQWUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO0lBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3IsXG4gIFRocm90dGxlRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZm9ybWF0U3RlcE5hbWUsIHBsdXJhbGl6ZSwgc3RlcERpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IGdldFBvcnQgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvZ2V0LXBvcnQnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFN0ZXAsXG4gIFN0ZXBJbnZva2VQYXlsb2FkU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4uL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIsIHN0ZXBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbn0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxuICBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHsgTUFYX1FVRVVFX0RFTElWRVJJRVMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgd2l0aEhlYWx0aENoZWNrLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCwgZ2V0V29ybGRIYW5kbGVycywgdHlwZSBXb3JsZEhhbmRsZXJzIH0gZnJvbSAnLi93b3JsZC5qcyc7XG5cbmNvbnN0IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyA9IDM7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0ZXBIYW5kbGVyKG5hbWVzcGFjZT86IHN0cmluZykge1xuICBjb25zdCByZXNvbHZlZE5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShuYW1lc3BhY2UpO1xuICBjb25zdCBzdGVwUHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeCgnc3RlcCcsIHJlc29sdmVkTmFtZXNwYWNlKTtcblxuICByZXR1cm4gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoc3RlcFByZWZpeCwgYXN5bmMgKG1lc3NhZ2VfLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAvLyBOT1RFOiBIZWFsdGggY2hlY2sgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgdW5hdXRoZW50aWNhdGVkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLlxuICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc2ltcGxlIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICdzdGVwJyxcbiAgICAgICAgICB3b3JsZEhhbmRsZXJzLnNwZWNWZXJzaW9uXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIHRyYWNlQ2FycmllcjogaW5jb21pbmdUcmFjZUNhcnJpZXIsXG4gICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgfSA9IFN0ZXBJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuIGFic2VudFxuICAgICAgLy8gb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgLy8gJ2xpbmtlZCcgKGRlZmF1bHQpOiB0aGUgU1RFUCBzcGFuIGJlbG93IHN0YXJ0cyBhIE5FVyByb290IHRyYWNlIHdpdGhcbiAgICAgIC8vIHNwYW4gbGlua3MgdG8gdGhlIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbVxuICAgICAgLy8gdGhlIG1lc3NhZ2UncyB0cmFjZSBjYXJyaWVyLiAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlXG4gICAgICAvLyByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHQgcGFyZW50cyB0aGlzIGludm9jYXRpb24ncyBzcGFucy5cbiAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJQgc2VlXG4gICAgICAvLyBnZXROZXh0VHJhY2VDYXJyaWVyIGZvciB0aGUgbGlua2VkL2NvbnRpbnVvdXMgc2VtYW50aWNzLlxuICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSBzdGVwcyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Ugd2FudCB0byBkbyB0aGUgbWluaW1hbCBhbW91bnQgb2Ygd29yayAobm8gZmV0Y2hpbmdcbiAgICAgIC8vIG9mIHRoZSBzdGVwIGRldGFpbHMsIGV0Yy4gV2Ugc2ltcGx5IGF0dGVtcHQgdG8gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWRcbiAgICAgIC8vIGFuZCBlbnF1ZXVlIHRoZSB3b3JrZmxvdyBvbmNlLCBhbmQgaWYgZWl0aGVyIG9mIHRob3NlIGZhaWxzLCB0aGUgbWVzc2FnZVxuICAgICAgLy8gaXMgc3RpbGwgY29uc3VtZWQgYnV0IHdpdGggYWRlcXVhdGUgbG9nZ2luZyB0aGF0IGFuIGVycm9yIG9jY3VycmVkLlxuICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBzdGVwIGludm9jYXRpb24g4oCUIGF0dGFjaGVzIHJ1bi9zdGVwIGNvbnRleHQgdG9cbiAgICAgIC8vIGV2ZXJ5IGxvZyBsaW5lIGJlbG93IHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgY29uc3Qgc3RlcE5hbWVGcm9tUXVldWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uoc3RlcFByZWZpeC5sZW5ndGgpO1xuICAgICAgY29uc3Qgc3RlcFJ1bnRpbWVMb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB7IHN0ZXBJZCwgc3RlcE5hbWU6IHN0ZXBOYW1lRnJvbVF1ZXVlIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gTUFYX1FVRVVFX0RFTElWRVJJRVMpIHtcbiAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYFN0ZXAgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuSWQpO1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgYFN0ZXAgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7TUFYX1FVRVVFX0RFTElWRVJJRVN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcE5hbWVGcm9tUXVldWUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJlLXF1ZXVlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZCBzdGVwXG4gICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENhbid0IGV2ZW4gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWQuIENvbnN1bWUgdGhlIG1lc3NhZ2UgdG8gc3RvcFxuICAgICAgICAgIC8vIGZ1cnRoZXIgcmV0cmllcy4gVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gbWFyayBzdGVwIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBzdGVwIGZyb20gYmVpbmcgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgIGBvciBhIGJ1ZyBpbiB0aGUgd29ya2Zsb3cgcnVudGltZSBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBXb3JrZmxvdyB0ZWFtLmAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgIC8vIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgdHJhY2UgY2Fycmllci5cbiAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyh0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgIC8vIEV4ZWN1dGUgc3RlcCB3aXRoaW4gdGhlIHByb3BhZ2F0ZWQgdHJhY2UgY29udGV4dCAoY29udGludW91cyBtb2RlXG4gICAgICAvLyBvbmx5IOKAlCBpbiBsaW5rZWQgbW9kZSB0aGUgU1RFUCBzcGFuIGJlbG93IGJlY29tZXMgYSBuZXcgdHJhY2Ugcm9vdFxuICAgICAgLy8gY2Fycnlpbmcgc3BhbiBsaW5rcyBpbnN0ZWFkLCBzbyB3aXRoVHJhY2VDb250ZXh0IGlzIGEgcGFzc3Rocm91Z2gpLlxuICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgc3RlcCBuYW1lIGZyb20gdGhlIHRvcGljIG5hbWVcbiAgICAgICAgY29uc3Qgc3RlcE5hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uoc3RlcFByZWZpeC5sZW5ndGgpO1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgIGNvbnN0IGlzVmVyY2VsID0gcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE1lbW9pemVkIGFjY2Vzc29yIGZvciB0aGUgcGVyLXJ1biBBRVMtMjU2IGVuY3J5cHRpb24ga2V5LiBUaGUgZmlyc3RcbiAgICAgICAgLy8gY2FsbGVyICh0eXBpY2FsbHkgYGh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmb3IgaW5wdXQgZGVzZXJpYWxpemF0aW9uLFxuICAgICAgICAvLyBvciBvbmUgb2YgdGhlIGVhcmx5LXJldHVybiBkZWh5ZHJhdGVTdGVwRXJyb3IgcGF0aHMgaWYgc3RlcF9zdGFydGVkXG4gICAgICAgIC8vIGZhaWxzKSB0cmlnZ2VycyB0aGUgYWN0dWFsIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uOyBzdWJzZXF1ZW50XG4gICAgICAgIC8vIGNhbGxlcnMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLiBTdGVwcyB0aGF0IGZhaWwgYmVmb3JlIGFueVxuICAgICAgICAvLyBlbmNyeXB0aW9uLWF3YXJlIHdvcmsgaGFwcGVucyAoZS5nLiBhbiBpbW1lZGlhdGUgc3RlcF9zdGFydGVkXG4gICAgICAgIC8vIGNvbmZsaWN0KSBza2lwIHRoZSBmZXRjaCBlbnRpcmVseS5cbiAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcblxuICAgICAgICAvLyBSZXNvbHZlIGxvY2FsIGFzeW5jIHZhbHVlcyBjb25jdXJyZW50bHkgYmVmb3JlIGVudGVyaW5nIHRoZSB0cmFjZSBzcGFuXG4gICAgICAgIGNvbnN0IFtwb3J0LCBzcGFuS2luZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgaXNWZXJjZWwgPyB1bmRlZmluZWQgOiBnZXRQb3J0KCksXG4gICAgICAgICAgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICBgc3RlcC5leGVjdXRlICR7c3RlcERpc3BsYXlOYW1lKHN0ZXBOYW1lKX1gLFxuICAgICAgICAgIHRyYWNlTW9kZSA9PT0gJ2xpbmtlZCdcbiAgICAgICAgICAgID8geyBraW5kOiBzcGFuS2luZCwgbGlua3M6IHNwYW5MaW5rcywgcm9vdDogdHJ1ZSB9XG4gICAgICAgICAgICA6IHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChtZXRhZGF0YS5hdHRlbXB0KSxcbiAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gTm90ZTogU3RlcCBmdW5jdGlvbiB2YWxpZGF0aW9uIGhhcHBlbnMgYWZ0ZXIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIHN0ZXAgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICAgICAgICAgICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eSwgc28gbm8gc2VwYXJhdGVcbiAgICAgICAgICAgIC8vIHdvcmxkLnN0ZXBzLmdldCgpIGNhbGwgaXMgbmVlZGVkLiBUaGUgc2VydmVyIGNoZWNrczpcbiAgICAgICAgICAgIC8vIC0gU3RlcCBub3QgaW4gdGVybWluYWwgc3RhdGUgKHJldHVybnMgNDA5KVxuICAgICAgICAgICAgLy8gLSByZXRyeUFmdGVyIHRpbWVzdGFtcCByZWFjaGVkIChyZXR1cm5zIDQyNSB3aXRoIFJldHJ5LUFmdGVyIGhlYWRlcilcbiAgICAgICAgICAgIC8vIC0gV29ya2Zsb3cgc3RpbGwgYWN0aXZlIChyZXR1cm5zIDQxMCBpZiBjb21wbGV0ZWQpXG4gICAgICAgICAgICBsZXQgc3RlcCE6IFN0ZXA7XG4gICAgICAgICAgICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHN0ZXAgZW50aXR5J3Mgc3BlY1ZlcnNpb25cbiAgICAgICAgICAgIC8vIChzdGFtcGVkIGJ5IHRoZSBzYW1lLWRlcGxveW1lbnQgb3JjaGVzdHJhdG9yIHRoYXQgY3JlYXRlZCB0aGVcbiAgICAgICAgICAgIC8vIHN0ZXAsIHNvIHNwZWMgPj0gNSBpbXBsaWVzIGV2ZXJ5IHJlYWRlciBvZiB0aGlzIHJ1bidzIHBheWxvYWRzXG4gICAgICAgICAgICAvLyB1bmRlcnN0YW5kcyB0aGUgJ2d6aXAnIGZvcm1hdCkuIFJldHVybnMgZmFsc2Ugb24gdGhlIGVhcmx5XG4gICAgICAgICAgICAvLyBmYWlsdXJlIHBhdGhzIHdoZXJlIHN0ZXBfc3RhcnRlZCBkaWRuJ3QgcmV0dXJuIGFuIGVudGl0eS5cbiAgICAgICAgICAgIGNvbnN0IGNvbXByZXNzaW9uRm9yU3RlcCA9ICgpID0+XG4gICAgICAgICAgICAgICgoc3RlcCBhcyBTdGVwIHwgdW5kZWZpbmVkKT8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBzdGVwTmFtZSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICghc3RhcnRSZXN1bHQuc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBzdGVwX3N0YXJ0ZWQgZXZlbnQgZm9yIFwiJHtzdGVwSWR9XCIgZGlkIG5vdCByZXR1cm4gc3RlcCBlbnRpdHlgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGVwID0gc3RhcnRSZXN1bHQuc3RlcDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgdHlwZW9mIGVyci5yZXRyeUFmdGVyID09PSAnbnVtYmVyJyA/IGVyci5yZXRyeUFmdGVyIDogMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdUaHJvdHRsZWQgYWdhaW4gb24gcmV0cnksIGRlZmVycmluZyB0byBxdWV1ZScsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeVJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogcmV0cnlSZXRyeUFmdGVyIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgd2hlbiBhIHJ1biBpcyBjYW5jZWxsZWQgd2hpbGUgYSBzdGVwIGlzIGluLWZsaWdodC5cbiAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgeyBlcnJvck5hbWU6IGVyci5uYW1lLCBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIGEgdGVybWluYWwgc3RhdGUg4oCUIGFub3RoZXIgd29ya2VyIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgLy8gaXQgb3IgaXQgd2FzIHJldHJpZWQgdG8gY29tcGxldGlvbi4gUmUtZW5xdWV1ZSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgc28gaXQgY2FuIG9ic2VydmUgdGhlIG91dGNvbWUuXG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgcmUtZW5xdWV1aW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwcGVkKHRydWUpLFxuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudD8uKCdzdGVwLnNraXBwZWQnLCB7XG4gICAgICAgICAgICAgICAgICAnc2tpcC5yZWFzb24nOiAndGVybWluYWxfc3RhdGUnLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAubmFtZSc6IHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAuaWQnOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFRvbyBlYXJseTogcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHJlYWNoZWQgeWV0XG4gICAgICAgICAgICAgIC8vIFJldHVybiB0aW1lb3V0IHRvIHF1ZXVlIHNvIGl0IHJldHJpZXMgbGF0ZXJcbiAgICAgICAgICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBzcGFuIGV2ZW50IGZvciBkZWxheWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/Lignc3RlcC5kZWxheWVkJywge1xuICAgICAgICAgICAgICAgICAgJ2RlbGF5LnJlYXNvbic6ICdyZXRyeV9hZnRlcl9ub3RfcmVhY2hlZCcsXG4gICAgICAgICAgICAgICAgICAnZGVsYXkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCByZXRyeUFmdGVyIHRpbWVzdGFtcCBub3QgeWV0IHJlYWNoZWQnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogZXJyLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBleGVjdXRpb24gZGV0YWlscycsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgc3RlcCBmdW5jdGlvbiBleGlzdHMgQUZURVIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgc3RlcCBmYWlsdXJlIGdyYWNlZnVsbHksXG4gICAgICAgICAgICAvLyBzaW1pbGFyIHRvIGhvdyBGYXRhbEVycm9yIGlzIGhhbmRsZWQuXG4gICAgICAgICAgICBpZiAoIXN0ZXBGbiB8fCB0eXBlb2Ygc3RlcEZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwIChub3QgcnVuKScsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBGYXRhbEVycm9yIHBhdHRlcm4gLSBmYWlsIHRoZSBzdGVwIGFuZCByZS1xdWV1ZSB3b3JrZmxvd1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gYSB0ZXJtaW5hbCBzdGF0ZSDigJQgZHVwbGljYXRlXG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvciBjb25jdXJyZW50IGNhbmNlbGxhdGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAgZm9yIG1pc3NpbmcgZnVuY3Rpb24sIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCByZXNvbHZlZE5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXMgPz8gREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgICAgICAgICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZClcbiAgICAgICAgICAgIC8vIHN0ZXAuYXR0ZW1wdCB0cmFja3MgaG93IG1hbnkgdGltZXMgc3RlcF9zdGFydGVkIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAvLyBVc2UgPiBoZXJlIChub3QgPj0pIGJlY2F1c2UgdGhpcyBndWFyZHMgYWdhaW5zdCByZS1pbnZvY2F0aW9uIEFGVEVSIGFsbCBhdHRlbXB0cyBhcmUgdXNlZC5cbiAgICAgICAgICAgIC8vIFRoZSBwb3N0LWZhaWx1cmUgY2hlY2sgdXNlcyA+PSB0byBkZWNpZGUgd2hldGhlciB0byByZXRyeSBhZnRlciBhIGZhaWx1cmUuXG4gICAgICAgICAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgIC8vIFBlcnNpc3RlZCBtZXNzYWdlIOKAlCBrZXB0IHNob3J0LCBubyBtYWNoaW5lIGBzdGVwTmFtZWAsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIG9ic2VydmFiaWxpdHkgYWxyZWFkeSBhdHRyaWJ1dGVzIHRoZSBldmVudCB0byBhXG4gICAgICAgICAgICAgIC8vIHNwZWNpZmljIHN0ZXAuXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWA7XG4gICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFN0ZXAgJHtmb3JtYXRTdGVwTmFtZShzdGVwTmFtZSl9IGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBwcmlvciBhdHRlbXB0J3Mgc2VyaWFsaXplZCBlcnJvciBhcyB0aGUgY2F1c2Ugc29cbiAgICAgICAgICAgICAgLy8gdGhlIHVuZGVybHlpbmcgZmFpbHVyZSBpcyByZWNvdmVyYWJsZSBmcm9tIGBzdGVwLmVycm9yLmNhdXNlYFxuICAgICAgICAgICAgICAvLyBhZnRlciBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGVcbiAgICAgICAgICAgICAgLy8gc3RlcF9yZXRyeWluZyBldmVudCBoaXN0b3J5LiBNaXJyb3JzIHRoZSBwb3N0LWZhaWx1cmUgcGF0aFxuICAgICAgICAgICAgICAvLyBiZWxvdyB0aGF0IHdyYXBzIHRoZSBsaXZlIGBlcnJgIGFzIGNhdXNlLlxuICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICh3cmFwcGVkRXJyb3IgYXMgRXJyb3IpLmNhdXNlID0gYXdhaXQgaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gSWdub3JlOiBiZXN0LWVmZm9ydCBjYXVzZSBhdHRhY2htZW50LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgICAgICAgIC8vIEZhdGFsRXJyb3Igc3RhY2svbWVzc2FnZSBzdGlsbCBzdXJmYWNlIHRoZSBmYWlsdXJlLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byBhIHRlcm1pbmFsIHN0YXRlIOKAlCBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9yIGNvbmN1cnJlbnQgY29tcGxldGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHN0ZXAgaW5wdXQgLS0tXG4gICAgICAgICAgICAvLyBOZXR3b3JrL3NlcnZlciBlcnJvcnMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeS5cbiAgICAgICAgICAgIC8vIFdvcmtmbG93UnVudGltZUVycm9yIChkYXRhIGludGVncml0eSBpc3N1ZXMpIGFyZSBmYXRhbCDigJQgcmV0cnlpbmdcbiAgICAgICAgICAgIC8vIHdvbid0IGZpeCB0aGVtLCBzbyB3ZSByZS1xdWV1ZSB0aGUgd29ya2Zsb3cgdG8gc3VyZmFjZSB0aGUgZXJyb3IuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHN0ZXAgaXMgaW4gdmFsaWQgc3RhdGUgKHBlbmRpbmcvcnVubmluZylcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm5lZCB0aGUgdXBkYXRlZCBzdGVwIGVudGl0eSB3aXRoIGluY3JlbWVudGVkIGF0dGVtcHRcblxuICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IGlzIG5vdyB0aGUgY3VycmVudCBhdHRlbXB0IG51bWJlciAoYWZ0ZXIgaW5jcmVtZW50KVxuICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcElkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGA7XG4gICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKCdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyBzdGVwIHNldHVwJywge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmUtcXVldWUgdGhlIHdvcmtmbG93IHNvIGl0IGNhbiBwcm9jZXNzIHRoZSBzdGVwIGZhaWx1cmVcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhcHR1cmUgc3RhcnRlZEF0IGZvciB1c2UgaW4gYXN5bmMgY2FsbGJhY2sgKFR5cGVTY3JpcHQgbmFycm93aW5nIGRvZXNuJ3QgcGVyc2lzdClcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBTdGFydGVkQXQgPSBzdGVwLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgbm93IHRoYXQgd2UncmUgY29tbWl0dGVkIHRvIHJ1bm5pbmdcbiAgICAgICAgICAgIC8vIHVzZXIgY29kZTogaW5wdXQgaHlkcmF0aW9uIG5lZWRzIGl0LCBhbmQgYGNvbnRleHRTdG9yYWdlYCAoYW5kXG4gICAgICAgICAgICAvLyBhbnkgdXNlci1jb2RlIHBhdGhzIHRoYXQgcnVuIGluc2lkZSBpdCkgY2FwdHVyZSB0aGUgcmVzb2x2ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLiBUcmlnZ2VycyB0aGUgdW5kZXJseWluZyB3b3JsZCAvIEtNUyBmZXRjaCBvbmNlLCB3aXRoXG4gICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGRlaHlkcmF0ZSBwYXRocyByZXVzaW5nIHRoZSBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRoZSBzdGVwIGlucHV0IGFyZ3VtZW50cywgY2xvc3VyZSB2YXJpYWJsZXMsIGFuZCB0aGlzVmFsXG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNhcHR1cmVzIG9ubHkgdGhlIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgaHlkcmF0aW9uLiBBbnkgYXN5bmNcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbnMgKGUuZy4sIHN0cmVhbSBsb2FkaW5nKSBhcmUgYWRkZWQgdG8gYG9wc2AgYW5kIGV4ZWN1dGVkIGxhdGVyXG4gICAgICAgICAgICAvLyB2aWEgUHJvbWlzZS5hbGwob3BzKSAtIHRoZWlyIHRpbWluZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBjb25zdCBoeWRyYXRlZElucHV0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICdzdGVwLmh5ZHJhdGUnLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgYXN5bmMgKGh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEFyZ3VtZW50c0NvdW50KHJlc3VsdC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuXG4gICAgICAgICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgICAgICAgIC8vIE9ubHkgZXJyb3JzIGZyb20gc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzaG91bGQgcHJvZHVjZVxuICAgICAgICAgICAgLy8gc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZy4gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIChuZXR3b3JrLCBzZXJ2ZXIpXG4gICAgICAgICAgICAvLyBtdXN0IHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgYXV0b21hdGljIHJldHJ5LlxuICAgICAgICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICAgICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmV4ZWN1dGUnLCB7fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0U3RvcmFnZS5ydW4oXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwU3RhcnRlZEF0OiBuZXcgRGF0ZSgrc3RlcFN0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgRGF0ZSgrd29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoZXJlIHNob3VsZCBiZSBhIGdldFVybCBtZXRob2Qgb24gdGhlIHdvcmxkIGludGVyZmFjZSBpdHNlbGYuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzb2x1dGlvbiBvbmx5IHdvcmtzIGZvciB2ZXJjZWwgKyBsb2NhbCB3b3JsZHMuXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiBpc1ZlcmNlbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnQgPz8gMzAwMH1gLFxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQsXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVZhcnM6IGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgKCkgPT4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRXhlY3V0aW9uVGltZU1zKGV4ZWN1dGlvblRpbWVNcyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gLS0tIERlaHlkcmF0ZSAoc2VyaWFsaXplKSB0aGUgc3RlcCdzIHJldHVybiB2YWx1ZSAtLS1cbiAgICAgICAgICAgIC8vIEEgbm9uLXNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUgaXMgYSB1c2VyLWNvZGUgYnVnLCBub3QgYW5cbiAgICAgICAgICAgIC8vIGluZnJhc3RydWN0dXJlIGZhaWx1cmUuIFJvdXRlIGl0IHRocm91Z2ggdGhlIHNhbWUgc3RlcC1mYWlsdXJlXG4gICAgICAgICAgICAvLyBwYXRoIGFzIGEgdGhyb3duIGVycm9yIHNvIFNlcmlhbGl6YXRpb25FcnJvciAod2hpY2ggaXMgbWFya2VkXG4gICAgICAgICAgICAvLyBgZmF0YWw6IHRydWVgKSBzaG9ydC1jaXJjdWl0cyB0aGUgcmV0cnkgbG9vcCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAvLyBidWJibGluZyBhcyBhbiBIVFRQIDUwMCBhbmQgYnVybmluZyB0aHJvdWdoIGFsbCA0IHF1ZXVlXG4gICAgICAgICAgICAvLyBkZWxpdmVyaWVzIG9uIGEgZ3VhcmFudGVlZC10by1mYWlsIG1lc3NhZ2UuXG4gICAgICAgICAgICBpZiAoIXVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICAgICAnc3RlcC5kZWh5ZHJhdGUnLFxuICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICBhc3luYyAoZGVoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIHJldHVybiB2YWx1ZXMgYXJlIGNvbnN1bWVkIGJ5IHRoZSB3b3JrZmxvdyBWTVxuICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nIG9uIHRoaXMgc2FtZSBkZXBsb3ltZW50ICh2ZXJzaW9uIHNrZXdcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBlbnN1cmVzIGl0KS4gQnl0ZS1zdHJlYW0gZnJhbWluZyBpc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgYWx3YXlzIHNhZmUgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVoeWRyYXRlZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25Gb3JTdGVwKClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZVNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIGRlaHlkcmF0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlaHlkcmF0ZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEhhbmRsZSB1c2VyIGNvZGUgZXJyb3JzIC0tLVxuICAgICAgICAgICAgaWYgKHVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IHVzZXJDb2RlRXJyb3I7XG5cbiAgICAgICAgICAgICAgLy8gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIHRoYXQgc29tZWhvdyBzdXJmYWNlZCB0aHJvdWdoIHVzZXIgY29kZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeSwgbm90IGNvbnN1bWVcbiAgICAgICAgICAgICAgLy8gc3RlcCBhdHRlbXB0cy5cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkLCBzbyBuby1vcFxuICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgZXJyLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBBYm9ydCBmYWlsdXJlcyBjYW4gY3Jvc3MgVk0vc2VyaWFsaXphdGlvbiByZWFsbXMsIHdoZXJlXG4gICAgICAgICAgICAgIC8vIGBpbnN0YW5jZW9mIEVycm9yYCBpcyBub3QgcmVsaWFibGUuXG4gICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUVyciA9IHByb21vdGVBYm9ydEVycm9yVG9GYXRhbChlcnIpO1xuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IoZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YWNrID1cbiAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayhlZmZlY3RpdmVFcnIpIHx8ICcnO1xuXG4gICAgICAgICAgICAgIC8vIFJlY29yZCBleGNlcHRpb24gZm9yIE9URUwgZXJyb3IgdHJhY2tpbmdcbiAgICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4oZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIERldGVybWluZSBlcnJvciBjYXRlZ29yeSBhbmQgcmV0cnlhYmlsaXR5XG4gICAgICAgICAgICAgIGNvbnN0IGlzRmF0YWwgPSBGYXRhbEVycm9yLmlzKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gUmV0cnlhYmxlRXJyb3IuaXMoZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JDYXRlZ29yeSA9IGlzRmF0YWxcbiAgICAgICAgICAgICAgICA/ICdmYXRhbCdcbiAgICAgICAgICAgICAgICA6IGlzUmV0cnlhYmxlXG4gICAgICAgICAgICAgICAgICA/ICdyZXRyeWFibGUnXG4gICAgICAgICAgICAgICAgICA6ICd0cmFuc2llbnQnO1xuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRXJyb3JOYW1lKGdldEVycm9yTmFtZShlZmZlY3RpdmVFcnIpKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTWVzc2FnZShub3JtYWxpemVkRXJyb3IubWVzc2FnZSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShnZXRFcnJvck5hbWUoZWZmZWN0aXZlRXJyKSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yQ2F0ZWdvcnkoZXJyb3JDYXRlZ29yeSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yUmV0cnlhYmxlKCFpc0ZhdGFsKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzRmF0YWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcmllbmRseVN0ZXAgPSBmb3JtYXRTdGVwTmFtZShzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJhbWluZyA9XG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgICAgICAgICAgICAgPyBgU3RlcCAke2ZyaWVuZGx5U3RlcH0gZmFpbGVkIHdpdGggYSBGYXRhbEVycm9yIGZyb20gdGhlIFNESyBydW50aW1lIOKAlCBidWJibGluZyB1cCB0byBwYXJlbnQgd29ya2Zsb3dgXG4gICAgICAgICAgICAgICAgICAgIDogYFN0ZXAgJHtmcmllbmRseVN0ZXB9IHRocmV3IGEgRmF0YWxFcnJvciDigJQgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93YDtcbiAgICAgICAgICAgICAgICAvLyBNaXJyb3IgdGhlIHdvcmtmbG93LWxldmVsIGxvZyBmb3JtYXR0aW5nOiBwdXQgdGhlIGZyYW1pbmcgK1xuICAgICAgICAgICAgICAgIC8vIHN0YWNrIGludG8gdGhlIG1lc3NhZ2Ugc28gY29uc29sZS5lcnJvciByZW5kZXJzIHRoZSBzdGFja1xuICAgICAgICAgICAgICAgIC8vIGlubGluZSwgYW5kIGtlZXAgdGhlIG1ldGFkYXRhIG9iamVjdCBzbWFsbCB3aXRoIG9ubHkgdGhlXG4gICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlZCBmaWVsZHMgdGhhdCBsb2cgZHJhaW5zIHdhbnQgdG8gaW5kZXguXG4gICAgICAgICAgICAgICAgLy8gTm8gYGhpbnRgIGZpZWxkIGhlcmUg4oCUIGFjdGlvbmFibGUgaGludCB0ZXh0IGxpdmVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UgaXRzZWxmIChzbyBpdCBzdXJ2aXZlcyBzZXJpYWxpemF0aW9uIOKGklxuICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZyDihpIgb2JzZXJ2YWJpbGl0eSByZWh5ZHJhdGUpLCBhbmQgYWRkaW5nIGl0XG4gICAgICAgICAgICAgICAgLy8gYWdhaW4gaGVyZSBqdXN0IGR1cGxpY2F0ZXMgaXQgb24gc3RkZXJyLlxuICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBgJHtmcmFtaW5nfVxcbiR7bm9ybWFsaXplZFN0YWNrIHx8IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IGRlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IG5vcm1hbGl6ZWRFcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgc3RlcCB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKS5cbiAgICAgICAgICAgICAgICAvLyBQZXJzaXN0IHRoZSBwcm9tb3RlZCBGYXRhbEVycm9yIGZvciBhYm9ydHMgc28gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBkaXN0aW5ndWlzaCBjYW5jZWxsYXRpb24gZnJvbSByZXRyeSBleGhhdXN0aW9uLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgIHN0ZXBGbi5tYXhSZXRyaWVzID8/IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcbiAgICAgICAgICAgICAgICAvLyBzdGVwLmF0dGVtcHQgd2FzIGluY3JlbWVudGVkIGJ5IHN0ZXBfc3RhcnRlZCwgdXNlIGl0IGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50QXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBdHRlbXB0KGN1cnJlbnRBdHRlbXB0KSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNYXggcmV0cmllcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXRyeUNvdW50ID0gc3RlcC5hdHRlbXB0IC0gMTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZnJpZW5kbHlTdGVwID0gZm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZnJhbWluZyA9XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmF0dHJpYnV0aW9uID09PSAnc2RrJ1xuICAgICAgICAgICAgICAgICAgICAgID8gYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGhpdCBtYXggcmV0cmllcyBvbiBhbiBTREsgcnVudGltZSBlcnJvciDigJQgYnViYmxpbmcgdG8gcGFyZW50IHdvcmtmbG93YFxuICAgICAgICAgICAgICAgICAgICAgIDogYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGhpdCBtYXggcmV0cmllcyDigJQgYnViYmxpbmcgZXJyb3IgdGhyb3duIGJ5IHlvdXIgc3RlcCB0byB0aGUgcGFyZW50IHdvcmtmbG93YDtcbiAgICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGAke2ZyYW1pbmd9XFxuJHtub3JtYWxpemVkU3RhY2sgfHwgbm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBzdGVwLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IG5vcm1hbGl6ZWRFcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbm9ybWFsaXplZEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIHRoZSBtYWNoaW5lIHN0ZXAgbmFtZSBpbiB0aGUgcGVyc2lzdGVkXG4gICAgICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIOKAlCBvYnNlcnZhYmlsaXR5IGFscmVhZHkgc2hvd3Mgd2hpY2ggc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjZWQgdGhlIGV2ZW50LCBhbmQgYHN0ZXBOYW1lOiAnc3RlcC8vLi8uLi4vZm9vJ2BcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0aXRsZSBpcyBqdXN0IG5vaXNlLiBUaGUgQ0xJIGxvZ2dlciByZW5kZXJzXG4gICAgICAgICAgICAgICAgICAvLyBgU3RlcCBmb28gKC4vLi4uKSBoaXQgbWF4IHJldHJpZXNgIHNlcGFyYXRlbHkuXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIG1heFJldHJpZXMpfTogJHtub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgc3RlcCB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKS5cbiAgICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIG9yaWdpbmFsIGVycm9yIHdpdGggYSBGYXRhbEVycm9yIHRoYXQgcHJlc2VydmVzXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgd3JhcHBlZCBtZXNzYWdlIHBsdXMgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBhc1xuICAgICAgICAgICAgICAgICAgLy8gYGNhdXNlYCBzbyBpdCdzIHJlY292ZXJhYmxlIGFmdGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkU3RhY2spIHdyYXBwZWRFcnJvci5zdGFjayA9IG5vcm1hbGl6ZWRTdGFjaztcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeUV4aGF1c3RlZCh0cnVlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBOb3QgYXQgbWF4IHJldHJpZXMgeWV0IC0gbG9nIGFzIGEgcmV0cnlhYmxlIGVycm9yXG4gICAgICAgICAgICAgICAgICBpZiAoUmV0cnlhYmxlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuY291bnRlcmVkIFJldHJ5YWJsZUVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ0VuY291bnRlcmVkIEVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBTZXQgc3RlcCB0byBwZW5kaW5nIGZvciByZXRyeSB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgICAgICAgICAgICAgLy8gc3RlcF9yZXRyeWluZyByZWNvcmRzIHRoZSBlcnJvciBhbmQgc2V0cyBzdGF0dXMgdG8gcGVuZGluZy5cbiAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsIHR5cGUgaWRlbnRpdHlcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25Gb3JTdGVwKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKFJldHJ5YWJsZUVycm9yLmlzKGVycikgJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IGVyci5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIHJldHJ5aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3RlcFJldHJ5RXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcFJldHJ5RXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcFJldHJ5RXJyO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICBSZXRyeWFibGVFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgOiAxXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzKHRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVdpbGxSZXRyeSh0cnVlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAvLyBBZGQgc3BhbiBldmVudCBmb3IgcmV0cnkgc2NoZWR1bGluZ1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/LigncmV0cnkuc2NoZWR1bGVkJywge1xuICAgICAgICAgICAgICAgICAgICAncmV0cnkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS5hdHRlbXB0JzogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS5tYXhfcmV0cmllcyc6IG1heFJldHJpZXMsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIHJldHJ5YWJsZSBlcnJvciAtIHNvIGhhdmUgdGhlIHF1ZXVlIGtlZXAgdGhlIG1lc3NhZ2UgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBnZXRzIHJldHJpZWQuXG4gICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQvcmV0cnlpbmcgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCByZXNvbHZlZE5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gSW5mcmFzdHJ1Y3R1cmU6IGNvbXBsZXRlIHRoZSBzdGVwIC0tLVxuICAgICAgICAgICAgLy8gRXJyb3JzIGhlcmUgKG5ldHdvcmsgZmFpbHVyZXMsIHNlcnZlciBlcnJvcnMpIHByb3BhZ2F0ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIHF1ZXVlIGhhbmRsZXIgZm9yIGF1dG9tYXRpYyByZXRyeS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOT1RFOiBOb25lIG9mIHRoZSBjb2RlIGZyb20gdGhpcyBwb2ludCBpcyBndWFyYW50ZWVkIHRvIHJ1bi5cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBzdGVwIG1pZ2h0IGZhaWwgb3IgY2F1c2UgYSBmdW5jdGlvbiB0aW1lb3V0IGFuZCB0aGVcbiAgICAgICAgICAgIC8vIHByb2Nlc3MgbWlnaHQgYmUgU0lHS0lMTCdkLCB0aGUgd29ya2Zsb3cgcnVudGltZSBtdXN0IGJlXG4gICAgICAgICAgICAvLyByZXNpbGllbnQgdG8gdGhlIGJlbG93IGNvZGUgbm90IGV4ZWN1dGluZyBvbiBhIGZhaWxlZCBzdGVwLlxuICAgICAgICAgICAgLy8gKERlaHlkcmF0aW9uIGFscmVhZHkgaGFwcGVuZWQgYWJvdmUgYW5kIGlzIGFjY291bnRlZCBmb3IgaW4gdGhlXG4gICAgICAgICAgICAvLyB1c2VyQ29kZUZhaWxlZCBwYXRoLilcbiAgICAgICAgICAgIC8vIFRoZXNlIHN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZSBwcm9taXNlXG4gICAgICAgICAgICAvLyBoYW5kZWQgdG8gd2FpdFVudGlsIG11c3QgbmV2ZXIgcmVqZWN0IChhbiB1bmNvbnN1bWVkIHdhaXRVbnRpbFxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSwgc29cbiAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgZmx1c2ggb2Ygc3RlcCBzdHJlYW0gb3BzIGZhaWxlZCcsXG4gICAgICAgICAgICAgICAgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBSdW4gc3RlcF9jb21wbGV0ZWQgYW5kIHRyYWNlIHNlcmlhbGl6YXRpb24gY29uY3VycmVudGx5O1xuICAgICAgICAgICAgLy8gdGhlIHRyYWNlIGNhcnJpZXIgaXMgdXNlZCBpbiB0aGUgZmluYWwgcXVldWVNZXNzYWdlIGNhbGwgYmVsb3dcbiAgICAgICAgICAgIGxldCBzdGVwQ29tcGxldGVkNDA5ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBbLCB0cmFjZUNhcnJpZXJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICB3b3JsZC5ldmVudHNcbiAgICAgICAgICAgICAgICAuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RlcENvbXBsZXRlZDQwOSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGlmIChzdGVwQ29tcGxldGVkNDA5KSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiByZXN1bHQpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFF1ZXVlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb24gd2l0aCB0aGUgY29uY3VycmVudGx5LXJlc29sdmVkIHRyYWNlIGNhcnJpZXJcbiAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5jb25zdCBzdGVwSGFuZGxlciA9IGNyZWF0ZVN0ZXBIYW5kbGVyKCk7XG5cbi8qKlxuICogQSBzaW5nbGUgcm91dGUgdGhhdCBoYW5kbGVzIGFueSBzdGVwIGV4ZWN1dGlvbiByZXF1ZXN0IGFuZCByb3V0ZXMgdG8gdGhlXG4gKiBhcHByb3ByaWF0ZSBzdGVwIGZ1bmN0aW9uLiBXZSBtYXkgZXZlbnR1YWxseSB3YW50IHRvIGNyZWF0ZSBkaWZmZXJlbnQgYnVuZGxlc1xuICogZm9yIGVhY2ggc3RlcCwgdGhpcyBpcyB0ZW1wb3JhcnkuXG4gKi9cbmxldCBjYWNoZWRTdGVwSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBjb25zdCBzdGVwRW50cnlwb2ludDogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4gPVxuICAvKiBAX19QVVJFX18gKi8gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpZiAoIWNhY2hlZFN0ZXBIYW5kbGVyKSB7XG4gICAgICBjYWNoZWRTdGVwSGFuZGxlciA9IHN0ZXBIYW5kbGVyKGF3YWl0IGdldFdvcmxkSGFuZGxlcnMoKSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRTdGVwSGFuZGxlcihyZXEpO1xuICB9KTtcbiJdfQ==