@workflow/core 5.0.0-beta.50 → 5.0.0-beta.52

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/README.md +5 -0
  2. package/dist/events-consumer.d.ts +26 -0
  3. package/dist/events-consumer.d.ts.map +1 -1
  4. package/dist/events-consumer.js +28 -1
  5. package/dist/flushable-stream.d.ts +41 -0
  6. package/dist/flushable-stream.d.ts.map +1 -1
  7. package/dist/flushable-stream.js +169 -1
  8. package/dist/log-format.d.ts +3 -0
  9. package/dist/log-format.d.ts.map +1 -1
  10. package/dist/log-format.js +45 -10
  11. package/dist/replay-divergence.d.ts +25 -0
  12. package/dist/replay-divergence.d.ts.map +1 -0
  13. package/dist/replay-divergence.js +61 -0
  14. package/dist/runtime/helpers.d.ts +75 -1
  15. package/dist/runtime/helpers.d.ts.map +1 -1
  16. package/dist/runtime/helpers.js +134 -5
  17. package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
  18. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-entrypoint.js +209 -32
  20. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  21. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-log-view.js +229 -0
  23. package/dist/runtime/step-executor.d.ts +2 -21
  24. package/dist/runtime/step-executor.d.ts.map +1 -1
  25. package/dist/runtime/step-executor.js +85 -80
  26. package/dist/runtime/suspension-handler.d.ts +0 -22
  27. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  28. package/dist/runtime/suspension-handler.js +126 -75
  29. package/dist/runtime.d.ts.map +1 -1
  30. package/dist/runtime.js +262 -91
  31. package/dist/serialization.d.ts +2 -2
  32. package/dist/serialization.d.ts.map +1 -1
  33. package/dist/serialization.js +16 -13
  34. package/dist/step/context-storage.d.ts +2 -0
  35. package/dist/step/context-storage.d.ts.map +1 -1
  36. package/dist/step/context-storage.js +1 -1
  37. package/dist/step/writable-stream.d.ts.map +1 -1
  38. package/dist/step/writable-stream.js +14 -10
  39. package/dist/telemetry/semantic-conventions.d.ts +36 -0
  40. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  41. package/dist/telemetry/semantic-conventions.js +23 -1
  42. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  43. package/dist/test-support/orchestrator-context.js +8 -2
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +2 -2
  46. package/dist/workflow.d.ts.map +1 -1
  47. package/dist/workflow.js +8 -3
  48. package/docs/foundations/streaming.mdx +1 -1
  49. package/docs/how-it-works/event-sourcing.mdx +27 -0
  50. package/package.json +6 -6
@@ -24,7 +24,8 @@ import * as Attribute from '../telemetry/semantic-conventions.js';
24
24
  import { serializeTraceCarrier } from '../telemetry.js';
25
25
  import { getInlineOwnershipLeaseSeconds, getMaxInlineSteps, isResilientStepDispatchEnabled, MAX_RESILIENT_STEP_INPUT_BYTES, } from './constants.js';
26
26
  import { getPortLazy } from './get-port-lazy.js';
27
- import { getWorkflowQueueName, queueMessage, stepDispatchIdempotencyKey, } from './helpers.js';
27
+ import { getWorkflowQueueName, queueMessage, runDispatchContext, stepDispatchIdempotencyKey, } from './helpers.js';
28
+ import { QuickJSLogView } from './quickjs-log-view.js';
28
29
  import { BASELINE_BUNDLE_FILENAME, startQuickJSWorkflow, } from './quickjs-runtime.js';
29
30
  import { ReplayBudget } from './replay-budget.js';
30
31
  import { executeStep } from './step-executor.js';
@@ -75,6 +76,9 @@ async function queueStepMessage(params) {
75
76
  traceCarrier,
76
77
  requestedAt: new Date(),
77
78
  ...(stepInput !== undefined ? { stepInput: { input: stepInput } } : {}),
79
+ // Immutable run identity so the consumer can start the step without a
80
+ // blocking runs.get — see RunDispatchContextSchema.
81
+ runContext: runDispatchContext(workflowRun),
78
82
  }, {
79
83
  // The 'dispatch' key is step-identity-scoped (correlationId + hashed
80
84
  // step name), shared with the node engine's dispatch of the same step
@@ -114,7 +118,7 @@ async function queueStepMessage(params) {
114
118
  * caller queues the rest itself.
115
119
  */
116
120
  async function dispatchPendingOps(params) {
117
- const { world, runId, workflowRun, encryptionKey, pendingOperations, namespace, nextTraceCarrier, } = params;
121
+ const { world, runId, workflowRun, encryptionKey, pendingOperations, namespace, nextTraceCarrier, createEvent, } = params;
118
122
  const skipStepCreation = params.skipStepCreation;
119
123
  const queueStepCids = params.queueStepCids;
120
124
  const wfdiag = params.wfdiag;
@@ -151,6 +155,8 @@ async function dispatchPendingOps(params) {
151
155
  // same pattern as an elapsed wait.
152
156
  let createdAttributeEvent = false;
153
157
  const opsPromises = [];
158
+ const hooksNeedingCreation = pendingOperations.filter((op) => op.type === 'hook' && !op.hasCreatedEvent).length;
159
+ const hookDeltaCursor = hooksNeedingCreation === 1 ? params.deltaCursor : undefined;
154
160
  const processHookOp = async (hook) => {
155
161
  runtimeLogger.debug('QuickJS runtime: processing hook op', {
156
162
  workflowRunId: runId,
@@ -178,7 +184,7 @@ async function dispatchPendingOps(params) {
178
184
  const encryptedMetadata = typeof hook.metadata === 'undefined'
179
185
  ? undefined
180
186
  : await encryptSerializedData(hook.metadata, encryptionKey);
181
- const result = await world.events.create(runId, {
187
+ const result = await createEvent({
182
188
  eventType: 'hook_created',
183
189
  specVersion: SPEC_VERSION_CURRENT,
184
190
  correlationId: hook.correlationId,
@@ -196,7 +202,9 @@ async function dispatchPendingOps(params) {
196
202
  // token namespace conflict checks.
197
203
  ...(hook.isSystem ? { isSystem: true } : {}),
198
204
  },
199
- });
205
+ }, hookDeltaCursor !== undefined
206
+ ? { sinceCursor: hookDeltaCursor }
207
+ : undefined);
200
208
  // If storage detected a real token conflict with another
201
209
  // workflow's hook, re-queue so the workflow handler can
202
210
  // process the conflict event and fail gracefully.
@@ -228,7 +236,7 @@ async function dispatchPendingOps(params) {
228
236
  ? (await encryptSerializedData(hook.abortPayload, encryptionKey))
229
237
  : undefined;
230
238
  try {
231
- await world.events.create(runId, {
239
+ await createEvent({
232
240
  eventType: 'hook_received',
233
241
  specVersion: SPEC_VERSION_CURRENT,
234
242
  correlationId: hook.correlationId,
@@ -267,7 +275,7 @@ async function dispatchPendingOps(params) {
267
275
  };
268
276
  const processHookDisposeOp = async (op) => {
269
277
  try {
270
- await world.events.create(runId, {
278
+ await createEvent({
271
279
  eventType: 'hook_disposed',
272
280
  specVersion: SPEC_VERSION_CURRENT,
273
281
  correlationId: op.correlationId,
@@ -363,7 +371,7 @@ async function dispatchPendingOps(params) {
363
371
  error: step.serializationError.message,
364
372
  });
365
373
  try {
366
- await world.events.create(runId, {
374
+ await createEvent({
367
375
  eventType: 'step_created',
368
376
  specVersion: SPEC_VERSION_CURRENT,
369
377
  correlationId: step.correlationId,
@@ -383,7 +391,7 @@ async function dispatchPendingOps(params) {
383
391
  throw err;
384
392
  }
385
393
  try {
386
- await world.events.create(runId, {
394
+ await createEvent({
387
395
  eventType: 'step_failed',
388
396
  specVersion: SPEC_VERSION_CURRENT,
389
397
  correlationId: step.correlationId,
@@ -428,7 +436,7 @@ async function dispatchPendingOps(params) {
428
436
  encryptedInput instanceof Uint8Array &&
429
437
  encryptedInput.byteLength <= MAX_RESILIENT_STEP_INPUT_BYTES) {
430
438
  const [createResult, queueResult] = await Promise.allSettled([
431
- world.events.create(runId, {
439
+ createEvent({
432
440
  eventType: 'step_created',
433
441
  specVersion: SPEC_VERSION_CURRENT,
434
442
  correlationId: step.correlationId,
@@ -492,7 +500,7 @@ async function dispatchPendingOps(params) {
492
500
  return;
493
501
  }
494
502
  try {
495
- await world.events.create(runId, {
503
+ await createEvent({
496
504
  eventType: 'step_created',
497
505
  specVersion: SPEC_VERSION_CURRENT,
498
506
  correlationId: step.correlationId,
@@ -517,7 +525,7 @@ async function dispatchPendingOps(params) {
517
525
  const attr = op;
518
526
  opsPromises.push((async () => {
519
527
  try {
520
- await world.events.create(runId, {
528
+ await createEvent({
521
529
  eventType: 'attr_set',
522
530
  specVersion: SPEC_VERSION_CURRENT,
523
531
  correlationId: attr.correlationId,
@@ -546,7 +554,7 @@ async function dispatchPendingOps(params) {
546
554
  const wait = op;
547
555
  opsPromises.push((async () => {
548
556
  try {
549
- await world.events.create(runId, {
557
+ await createEvent({
550
558
  eventType: 'wait_created',
551
559
  specVersion: SPEC_VERSION_CURRENT,
552
560
  correlationId: wait.correlationId,
@@ -578,17 +586,32 @@ async function dispatchPendingOps(params) {
578
586
  * This replaces the `node:vm` replay path (runWorkflow + EventsConsumer)
579
587
  * with a QuickJS VM invocation that performs the same full event replay.
580
588
  *
581
- * KNOWN GAP (slot snapshot): unlike the node:vm path, no event write in
582
- * this file carries {@link CreateEventParams.eventCount}, so a World never
583
- * learns which events the writer had not seen and never reports them back.
584
- * The engine currently relies on per-(runId, correlationId) event
585
- * uniqueness (EntityConflictError dedup) alone. This is a deliberate
586
- * simplification while the engine is experimental: wiring the snapshot is
587
- * tracked follow-up work; anyone adding new write paths here should not
588
- * assume parity with the node engine on this axis.
589
+ * Log position on writes. This engine follows the same rule as the node:vm
590
+ * replay loop for which writes tell the World where the writer stood (see the
591
+ * "Who names a position" table above `slotSnapshotParams` in `helpers.ts`):
592
+ *
593
+ * - Writes made from this invocation's view of the log (`step_created`,
594
+ * `wait_created`, `hook_created`, `hook_disposed`, `attr_set`, the abort
595
+ * `hook_received`, `wait_completed`, and the `step_created` + `step_failed`
596
+ * pair for an unserializable input) carry `eventCount`, and the page a
597
+ * World hands back is queued for the live VM through {@link QuickJSLogView}.
598
+ * - A single inline step's terminal write asks for the inline delta
599
+ * (`sinceCursor`) through `executeStep`, and so does a lone `hook_created`
600
+ * (see `dispatchPendingOps.deltaCursor`); the delta is queued the same
601
+ * way. The step executor's other writes carry nothing: it holds no log.
602
+ * - Run-terminal writes (`run_completed`, `run_failed`) and the terminal drain
603
+ * of pending ops carry nothing: nothing reads the log afterwards.
604
+ *
605
+ * What differs from the node engine is what "merge into the log" means. The
606
+ * node engine merges a returned page into the array it replays from. This
607
+ * engine holds a live VM that consumes events exactly once, in position
608
+ * order, so a returned page is queued and delivered ahead of the next
609
+ * `events.list`, which then only runs when the queue cannot account for the
610
+ * next position. Both engines fall back to a list for anything a page did
611
+ * not carry.
589
612
  */
590
613
  export async function runWorkflowWithQuickJS(params) {
591
- const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, requestId, namespace, waitContinuation, } = params;
614
+ const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, preloadedCursor, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, requestId, namespace, waitContinuation, } = params;
592
615
  /**
593
616
  * Attempt number for the continuation this invocation is about to arm for
594
617
  * `correlationId`. One higher than the incoming continuation's when this
@@ -658,12 +681,17 @@ export async function runWorkflowWithQuickJS(params) {
658
681
  // preload (lazy hook fast path) is trusted the same way.
659
682
  let events;
660
683
  let eventsFetchedPages = 0;
684
+ // Where the log was read to: the cursor after the last page below, or the
685
+ // one the caller read the preload to. Seeds the incremental reads and the
686
+ // inline-delta requests that follow.
687
+ let loadedCursor = null;
661
688
  const usePreloaded = (preloadedEventsComplete === true &&
662
689
  Array.isArray(preloadedEvents) &&
663
690
  preloadedEvents.length > 0) ||
664
691
  isFirstInvocation(preloadedEvents);
665
692
  if (usePreloaded && preloadedEvents) {
666
693
  events = preloadedEvents;
694
+ loadedCursor = preloadedCursor ?? null;
667
695
  }
668
696
  else {
669
697
  const allEvents = [];
@@ -689,7 +717,61 @@ export async function runWorkflowWithQuickJS(params) {
689
717
  hasMore = response.data.length > 0 && response.cursor != null;
690
718
  }
691
719
  events = allEvents;
720
+ loadedCursor = cursor;
692
721
  }
722
+ // This invocation's view of the log, and the queue of events a World has
723
+ // handed back on a write that the VM has not been given yet. Every write
724
+ // made from this view goes through `createEvent` below so it names the
725
+ // position it was decided against and its response is queued here.
726
+ const logView = new QuickJSLogView(events, loadedCursor);
727
+ const createEvent = async (data, eventParams) => {
728
+ const result = await world.events.create(runId, data, {
729
+ ...eventParams,
730
+ ...logView.snapshotParams(),
731
+ });
732
+ if (typeof eventParams?.sinceCursor === 'string' &&
733
+ result.events !== undefined) {
734
+ // The write asked for the inline delta and got one: everything after
735
+ // the cursor, this write included, read with refs resolved. Taken
736
+ // through the delta path so the cursor moves with it when that is
737
+ // safe; the created event's position is noted either way.
738
+ logView.absorb({ event: result.event });
739
+ const advanced = logView.absorbDelta(eventParams.sinceCursor, {
740
+ events: result.events,
741
+ cursor: result.cursor ?? null,
742
+ hasMore: result.hasMore ?? false,
743
+ });
744
+ wfdiag('inline_delta_absorbed', {
745
+ eventType: data.eventType,
746
+ events: result.events.length,
747
+ hasMore: result.hasMore ?? false,
748
+ cursorAdvanced: advanced,
749
+ });
750
+ return result;
751
+ }
752
+ // The created event is delivered off the response only when it carries
753
+ // no payload a VM reads; every other type waits for a page or a listing,
754
+ // which return it with its refs resolved. See QuickJSLogView.
755
+ const absorbed = logView.absorb(result, {
756
+ deliverEvent: data.eventType === 'wait_completed',
757
+ });
758
+ if (absorbed.truncated) {
759
+ runtimeLogger.debug('QuickJS runtime: dropped a truncated skipped-slot report', {
760
+ workflowRunId: runId,
761
+ eventType: data.eventType,
762
+ eventId: result.event?.eventId,
763
+ offered: result.events?.length ?? 0,
764
+ });
765
+ }
766
+ return result;
767
+ };
768
+ /**
769
+ * The create for writes that end the run (`run_completed`, `run_failed`,
770
+ * and the terminal drain of leftover ops): no position named and no page
771
+ * asked for, because nothing replays a finished run's log. The node
772
+ * engine's `deltaRequestCursor` makes the same exclusion for `sinceCursor`.
773
+ */
774
+ const terminalCreateEvent = (data, eventParams) => world.events.create(runId, data, eventParams);
693
775
  // Event-limit guard: fail a runaway run once its log reaches the
694
776
  // server-supplied ceiling, the same enforcement point as the node:vm
695
777
  // engine's replay loop.
@@ -725,13 +807,16 @@ export async function runWorkflowWithQuickJS(params) {
725
807
  const resumeAt = eventData?.resumeAt;
726
808
  if (resumeAt && now >= new Date(resumeAt).getTime()) {
727
809
  try {
728
- const result = await world.events.create(runId, {
810
+ const result = await createEvent({
729
811
  eventType: 'wait_completed',
730
812
  specVersion: SPEC_VERSION_CURRENT,
731
813
  correlationId: event.correlationId,
732
814
  });
733
- if (result.event)
815
+ if (!logView.tracking && result.event) {
816
+ // No positions to order by (see QuickJSLogView), so the event
817
+ // joins the initial log directly, as it always has.
734
818
  events.push(result.event);
819
+ }
735
820
  }
736
821
  catch (err) {
737
822
  if (EntityConflictError.is(err))
@@ -741,6 +826,10 @@ export async function runWorkflowWithQuickJS(params) {
741
826
  }
742
827
  }
743
828
  }
829
+ // The VM has not started, so whatever those writes handed back (each
830
+ // wait_completed, plus anything another writer appended that they skipped
831
+ // over) joins the initial log instead of waiting for a feed.
832
+ events.push(...logView.takeContiguous());
744
833
  // Resolve the workflow server port so `getWorkflowMetadata().url` inside
745
834
  // the VM matches what the step-side handler reports. Skipped on Vercel:
746
835
  // the VM reads VERCEL_URL directly in that environment.
@@ -888,10 +977,17 @@ export async function runWorkflowWithQuickJS(params) {
888
977
  // exiting awaiting_external with the unblocking event already written
889
978
  // and nothing scheduled to read it.
890
979
  let pendingRequeueSignal = false;
891
- /** Fetch all events not yet processed by the live VM (log order). */
980
+ /**
981
+ * Fetch all events not yet processed by the live VM (log order), reading
982
+ * from where the log was last read to. A World's cursor never passes a
983
+ * position whose writer is still in flight, so reading forward from it
984
+ * cannot skip an event; the id set is what makes a re-read of the same
985
+ * span (after a queued page or a delta moved the view ahead of the cursor)
986
+ * harmless.
987
+ */
892
988
  const fetchUnseenEvents = async () => {
893
989
  const unseen = [];
894
- let cursor = null;
990
+ let cursor = logView.logCursor;
895
991
  let hasMore = true;
896
992
  while (hasMore) {
897
993
  const response = await world.events.list({
@@ -913,9 +1009,29 @@ export async function runWorkflowWithQuickJS(params) {
913
1009
  cursor = response.cursor;
914
1010
  hasMore = response.data.length > 0 && response.cursor != null;
915
1011
  }
1012
+ logView.advanceCursor(cursor);
1013
+ logView.markFed(unseen);
916
1014
  observeEventsForOwnership(unseen);
917
1015
  return unseen;
918
1016
  };
1017
+ /**
1018
+ * Events a World handed back on this invocation's writes that the VM can
1019
+ * take now: the contiguous run above what it has (see
1020
+ * `QuickJSLogView.takeContiguous`). Delivered ahead of `fetchUnseenEvents`
1021
+ * so a write's response, not a listing, is what usually carries the log
1022
+ * forward, which is the round-trip the page exists to save. Empty when
1023
+ * nothing is queued or the next position is not in hand, and the caller
1024
+ * lists.
1025
+ */
1026
+ const takeQueuedEvents = () => {
1027
+ const queued = logView.takeContiguous();
1028
+ for (const e of queued) {
1029
+ if (e.eventId)
1030
+ seenEventIds.add(e.eventId);
1031
+ }
1032
+ observeEventsForOwnership(queued);
1033
+ return queued;
1034
+ };
919
1035
  try {
920
1036
  let iteration = 0;
921
1037
  while (result.suspended && !runGone && !budget.isExhausted()) {
@@ -984,6 +1100,10 @@ export async function runWorkflowWithQuickJS(params) {
984
1100
  encryptionKey,
985
1101
  namespace,
986
1102
  nextTraceCarrier,
1103
+ createEvent,
1104
+ ...(logView.tracking && typeof logView.logCursor === 'string'
1105
+ ? { deltaCursor: logView.logCursor }
1106
+ : {}),
987
1107
  pendingOperations: opsToDispatch,
988
1108
  skipStepCreation: inlineClaimCids,
989
1109
  queueStepCids: new Set(overflowSteps.map((s) => s.correlationId)),
@@ -1039,7 +1159,7 @@ export async function runWorkflowWithQuickJS(params) {
1039
1159
  completedWaitIds2.add(wait.correlationId);
1040
1160
  waitCompletePromises.push((async () => {
1041
1161
  try {
1042
- await world.events.create(runId, {
1162
+ await createEvent({
1043
1163
  eventType: 'wait_completed',
1044
1164
  specVersion: SPEC_VERSION_CURRENT,
1045
1165
  correlationId: wait.correlationId,
@@ -1056,9 +1176,18 @@ export async function runWorkflowWithQuickJS(params) {
1056
1176
  await Promise.all(waitCompletePromises);
1057
1177
  }
1058
1178
  // 2. Cheap progress first: feed newly recorded events into the live
1059
- // VM before blocking on step bodies.
1179
+ // VM before blocking on step bodies. What the writes above handed back
1180
+ // is delivered first, and a listing runs when the queue does not reach
1181
+ // the next position. A report changes what is fed first, not whether
1182
+ // this listing happens: after a queued page is fed, this branch
1183
+ // `continue`s, and the next iteration finds the queue empty and lists
1184
+ // from a cursor a report does not advance (re-reading the reported
1185
+ // span, deduped on `seenEventIds`). Only the inline delta below, which
1186
+ // does advance the cursor, saves a listing outright. Same shape as the
1187
+ // node engine.
1060
1188
  {
1061
- const newEvents = await fetchUnseenEvents();
1189
+ const queued = takeQueuedEvents();
1190
+ const newEvents = queued.length > 0 ? queued : await fetchUnseenEvents();
1062
1191
  if (newEvents.length > 0) {
1063
1192
  // The listing caught up with this invocation's writes, so any
1064
1193
  // attr_set / getConflict hook_created has been (or is being)
@@ -1069,6 +1198,7 @@ export async function runWorkflowWithQuickJS(params) {
1069
1198
  iteration,
1070
1199
  phase: 'feed',
1071
1200
  fedEvents: newEvents.length,
1201
+ fedFrom: queued.length > 0 ? 'write-response' : 'list',
1072
1202
  outcome: result.completed
1073
1203
  ? 'completed'
1074
1204
  : result.failed
@@ -1222,6 +1352,33 @@ export async function runWorkflowWithQuickJS(params) {
1222
1352
  // own, matching the node:vm engine, where a long sequential
1223
1353
  // workflow likewise runs step-by-step until the platform reclaims
1224
1354
  // the invocation and a redelivery resumes from the log.
1355
+ // Inline delta: a single inline step's terminal write asks the World
1356
+ // for everything after the cursor this view holds, so the step's own
1357
+ // events (and anything interleaved) arrive on the write's response and
1358
+ // the feed below needs no listing. Same gate as the node engine's
1359
+ // `requestInlineDelta` (runtime.ts), translated to this loop's terms:
1360
+ //
1361
+ // - This step is the only step outstanding: no overflow sibling queued
1362
+ // this iteration, no unserializable sibling, no step from an earlier
1363
+ // invocation handed to the queue above. Several writers each diffing
1364
+ // against the same cursor would produce deltas of which only the
1365
+ // first could be taken.
1366
+ // - No wait is pending. A `wait_completed` is a resolution the
1367
+ // workflow is waiting on rather than an event it can observe one
1368
+ // iteration late, so a delta that predates it would settle the
1369
+ // sleep from a view that does not hold its completion; the listing
1370
+ // after the step is what reads it in order.
1371
+ // - The log has a cursor to name (tracking on, something read).
1372
+ const hasPendingWait = pendingOperations.some((op) => op.type === 'wait' &&
1373
+ !completedWaitIds2.has(op.correlationId));
1374
+ const inlineDeltaSinceCursor = stepOps.length === 1 &&
1375
+ freshSteps.length === 1 &&
1376
+ inlineCandidates.length === 1 &&
1377
+ !hasPendingWait &&
1378
+ logView.tracking &&
1379
+ typeof logView.logCursor === 'string'
1380
+ ? logView.logCursor
1381
+ : undefined;
1225
1382
  budget.pause();
1226
1383
  let outcomes;
1227
1384
  try {
@@ -1251,6 +1408,9 @@ export async function runWorkflowWithQuickJS(params) {
1251
1408
  // A lazy step is brand-new by construction: first
1252
1409
  // attempt.
1253
1410
  authoritativeAttempt: 1,
1411
+ ...(inlineDeltaSinceCursor !== undefined
1412
+ ? { inlineDeltaSinceCursor }
1413
+ : {}),
1254
1414
  }))())));
1255
1415
  }
1256
1416
  finally {
@@ -1261,6 +1421,18 @@ export async function runWorkflowWithQuickJS(params) {
1261
1421
  const step = inlineCandidates[i];
1262
1422
  const outcome = outcomes[i];
1263
1423
  executedStepIds.add(step.correlationId);
1424
+ if (outcome.type === 'completed' &&
1425
+ outcome.inlineDelta !== undefined &&
1426
+ inlineDeltaSinceCursor !== undefined) {
1427
+ const advanced = logView.absorbDelta(inlineDeltaSinceCursor, outcome.inlineDelta);
1428
+ wfdiag('inline_delta_absorbed', {
1429
+ iteration,
1430
+ correlationId: step.correlationId,
1431
+ events: outcome.inlineDelta.events.length,
1432
+ hasMore: outcome.inlineDelta.hasMore,
1433
+ cursorAdvanced: advanced,
1434
+ });
1435
+ }
1264
1436
  if (outcome.type === 'retry' || outcome.type === 'throttled') {
1265
1437
  // Hand the step to the queue with the requested backoff:
1266
1438
  // background delivery drives the retry from here.
@@ -1306,7 +1478,8 @@ export async function runWorkflowWithQuickJS(params) {
1306
1478
  // body; 'gone', retry/throttled: a queue message exists) don't
1307
1479
  // need it, but signaling on them too only costs a no-op invocation
1308
1480
  // in an already-rare lag window.
1309
- const newEvents = await fetchUnseenEvents();
1481
+ const queued = takeQueuedEvents();
1482
+ const newEvents = queued.length > 0 ? queued : await fetchUnseenEvents();
1310
1483
  if (newEvents.length === 0) {
1311
1484
  pendingRequeueSignal = true;
1312
1485
  break;
@@ -1353,6 +1526,9 @@ export async function runWorkflowWithQuickJS(params) {
1353
1526
  encryptionKey,
1354
1527
  namespace,
1355
1528
  nextTraceCarrier,
1529
+ // Plain create: the run is ending, nothing replays its log, so a
1530
+ // page handed back here would be read by no one.
1531
+ createEvent: terminalCreateEvent,
1356
1532
  pendingOperations: result.completed.drainOperations,
1357
1533
  wfdiag,
1358
1534
  });
@@ -1371,7 +1547,7 @@ export async function runWorkflowWithQuickJS(params) {
1371
1547
  // events have the same `encr`-prefixed payload shape that the node:vm
1372
1548
  // engine's `dehydrateWorkflowReturnValue` produces.
1373
1549
  try {
1374
- await world.events.create(runId, {
1550
+ await terminalCreateEvent({
1375
1551
  eventType: 'run_completed',
1376
1552
  specVersion: SPEC_VERSION_CURRENT,
1377
1553
  eventData: {
@@ -1567,6 +1743,7 @@ export async function runWorkflowWithQuickJS(params) {
1567
1743
  encryptionKey,
1568
1744
  namespace,
1569
1745
  nextTraceCarrier,
1746
+ createEvent: terminalCreateEvent,
1570
1747
  pendingOperations: result.failed.drainOperations,
1571
1748
  wfdiag,
1572
1749
  });
@@ -1657,7 +1834,7 @@ export async function runWorkflowWithQuickJS(params) {
1657
1834
  }
1658
1835
  }
1659
1836
  try {
1660
- await world.events.create(runId, {
1837
+ await terminalCreateEvent({
1661
1838
  eventType: 'run_failed',
1662
1839
  specVersion: SPEC_VERSION_CURRENT,
1663
1840
  eventData: {
@@ -1683,4 +1860,4 @@ export async function runWorkflowWithQuickJS(params) {
1683
1860
  wfdiag('exit_failed', { result: 'run_failed_written' });
1684
1861
  }
1685
1862
  }
1686
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxFQUMxQyxpQ0FBaUMsR0FFbEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsT0FBTyxJQUFJLHFCQUFxQixHQUVqQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLDhCQUE4QixHQUMvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFB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RUFBRTtnQkFDL0IsU0FBUyxFQUFFLFlBQVk7Z0JBQ3ZCLFdBQVcsRUFBRSxvQkFBb0I7Z0JBQ2pDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUUsZUFBZTtvQkFDdEIsU0FBUztpQkFDVjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxhQUFhLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO29CQUNuRSxhQUFhLEVBQUUsS0FBSztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsU0FBUyxFQUFHLEdBQWEsRUFBRSxJQUFJO2dCQUMvQixZQUFZLEVBQUcsR0FBYSxFQUFFLE9BQU87YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1aWNrSlMgV2ViQXNzZW1ibHkgKFdBU00pIFZNIGludGVncmF0aW9uIHdpdGggdGhlIFdvcmtmbG93IERldktpdC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJ1bm5pbmcgd29ya2Zsb3dzIGluIHRoZVxuICogUXVpY2tKUyBWTSBlbmdpbmUgaW5zdGVhZCBvZiB0aGUgYG5vZGU6dm1gIGVuZ2luZS4gQm90aCBlbmdpbmVzXG4gKiBpbXBsZW1lbnQgdGhlIHNhbWUgZXZlbnQtcmVwbGF5IGV4ZWN1dGlvbiBtb2RlbCwgd2hlcmUgZXZlcnkgaW52b2NhdGlvbjpcbiAqXG4gKiAxLiBMb2FkcyB0aGUgZnVsbCBldmVudCBsb2cgZm9yIHRoZSBydW5cbiAqIDIuIFJ1bnMgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGZyb20gdGhlIHRvcCBpbiBhIGZyZXNoIFF1aWNrSlMgVk0sXG4gKiAgICByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyB0byByZXNvbHZlIGF3YWl0ZWQgcHJpbWl0aXZlc1xuICogMy4gT24gc3VzcGVuc2lvbjogY3JlYXRlcyBldmVudHMgKyBxdWV1ZXMgc3RlcHMgZm9yIG5ldyBwZW5kaW5nIG9wc1xuICogNC4gT24gY29tcGxldGlvbjogY3JlYXRlcyBydW5fY29tcGxldGVkXG4gKiA1LiBPbiBmYWlsdXJlOiBjcmVhdGVzIHJ1bl9mYWlsZWRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGNsYXNzaWZ5UnVuRXJyb3IsIGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdFNlcmlhbGl6ZWREYXRhLFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlUnVuRXJyb3IsXG4gIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBtYXliZUVuY3J5cHQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrLCBzdHJpcElubGluZVNvdXJjZU1hcCB9IGZyb20gJy4uL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzLFxuICBnZXRNYXhJbmxpbmVTdGVwcyxcbiAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkLFxuICBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgdW5zZXJpYWxpemFibGVTdGVwSW5wdXRQbGFjZWhvbGRlciB9IGZyb20gJy4vdW5zZXJpYWxpemFibGUtc3RlcC5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkIH0gZnJvbSAnLi93b3JsZC5qcyc7XG5cbi8qKiBUaW55IG1zIHRpbWVyIHVzaW5nIHBlcmZvcm1hbmNlLm5vdygpLCBhbHJlYWR5IG1vbm90b25pYyBvbiBOb2RlLiAqL1xuZnVuY3Rpb24gdGljaygpOiBudW1iZXIge1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHN1cHBsaWVkIHByZWxvYWRlZCBldmVudHMgaW5kaWNhdGUgdGhpcyBpcyB0aGVcbiAqIGZpcnN0IHdvcmtmbG93IGhhbmRsZXIgaW52b2NhdGlvbiBmb3IgdGhlIHJ1biwgaS5lLiB0aGUgbG9nIGNvbnRhaW5zXG4gKiBub3RoaW5nIGJleW9uZCBgcnVuX2NyZWF0ZWRgIC8gYHJ1bl9zdGFydGVkYC4gSW4gdGhhdCBjYXNlIHRoZVxuICogcHJlbG9hZGVkIGV2ZW50cyBBUkUgdGhlIGNvbXBsZXRlIGV2ZW50IGxvZyBhbmQgdGhlIGBldmVudHMubGlzdGBcbiAqIHJvdW5kLXRyaXBzIGNhbiBiZSBza2lwcGVkIGVudGlyZWx5LlxuICpcbiAqIENydWNpYWxseSwgaWYgdGhlIHdvcmxkIGJhY2tmaWxsZWQgYSBtaXNzaW5nIGBydW5fY3JlYXRlZGAgdmlhIHRoZVxuICogcmVzaWxpZW50IHN0YXJ0IHBhdGgsIGBwcmVsb2FkZWRFdmVudHNgIGNvbnRhaW5zIGl0IGV2ZW4gd2hlbiBhIGZyZXNoXG4gKiBgZXZlbnRzLmxpc3RgIG1pZ2h0IG5vdCAoZXZlbnR1YWwgY29uc2lzdGVuY3kpLCBzbyBwcmVmZXJyaW5nIHRoZVxuICogcHJlbG9hZGVkIGV2ZW50cyBvbiBmaXJzdCBpbnZvY2F0aW9uIGlzIGFsc28gdGhlIG1vcmUgY29ycmVjdCBjaG9pY2UuXG4gKlxuICogUmV0dXJucyBmYWxzZSB3aGVuIGBwcmVsb2FkZWRFdmVudHNgIGlzIG1pc3NpbmcvZW1wdHkgc28gdGhlIGNhbGxlclxuICogZmFsbHMgYmFjayB0byB0aGUgbm9ybWFsIGZldGNoIHBhdGguXG4gKlxuICogRXhwb3J0ZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmlyc3RJbnZvY2F0aW9uKFxuICBwcmVsb2FkZWRFdmVudHM6IHJlYWRvbmx5IEV2ZW50W10gfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSB8fCBwcmVsb2FkZWRFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBwcmVsb2FkZWRFdmVudHMuZXZlcnkoXG4gICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8IGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnXG4gICk7XG59XG5cbi8qKlxuICogUXVldWUgYSBzdGVwIGZvciBiYWNrZ3JvdW5kIGV4ZWN1dGlvbiB2aWEgdGhlIHVuaWZpZWQgd29ya2Zsb3cgcXVldWVcbiAqIChWMiBhcmNoaXRlY3R1cmUpLiBUaGUgY29tYmluZWQgaGFuZGxlciBpbiBydW50aW1lLnRzIGRpc3BhdGNoZXNcbiAqIG1lc3NhZ2VzIHdpdGggYHN0ZXBJZGAgdG8gZXhlY3V0ZVN0ZXAsIHdoaWNoIHdvcmtzIGZvciBib3RoIFZNIGVuZ2luZXMuXG4gKiBgZGVsYXlTZWNvbmRzYCBzdXBwb3J0cyByZXRyeS90aHJvdHRsZSBiYWNrb2ZmLlxuICovXG5hc3luYyBmdW5jdGlvbiBxdWV1ZVN0ZXBNZXNzYWdlKHBhcmFtczoge1xuICB3b3JsZDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBnZXRXb3JsZD4+O1xuICBydW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIHN0ZXA6IFBlbmRpbmdTdGVwO1xuICBkZWxheVNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBRdWV1ZSBuYW1lc3BhY2UgZm9yIHRoZSBwdWJsaXNoIChzZWUgcnVudGltZS50cykuICovXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogUnVuLW9yaWdpbiB0cmFjZSBjYXJyaWVyIGFjY2Vzc29yIChzZWUgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUykuICovXG4gIG5leHRUcmFjZUNhcnJpZXI6ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIC8qKlxuICAgKiBQdWJsaXNoIHB1cnBvc2UsIHVzZWQgdG8gYnVja2V0IHRoZSBpZGVtcG90ZW5jeSBrZXkuIFdvcmxkcyByZXRpcmVcbiAgICogdXNlZCBrZXlzIChWUVMgcmV0ZW50aW9uIFRUTCwgd29ybGQtcG9zdGdyZXMgY29tcGxldGVkLWtleXMgY2FjaGUpLFxuICAgKiBzbyBhIGtleSBzaGFyZWQgYWNyb3NzIHB1cnBvc2VzIHNpbGVudGx5IHN3YWxsb3dzIHRoZSBzZWNvbmRcbiAgICogcHVibGlzaC4gU2VlIHdhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgc2FtZSBoYXphcmQgb24gd2FpdFxuICAgKiBrZXlzLiBgZGlzcGF0Y2hgIGlzIHRoZSBwbGFpbiBiYWNrZ3JvdW5kIGhhbmRvZmYgKG92ZXJmbG93IC8gY3Jhc2hcbiAgICogcmVjb3ZlcnkpIGFuZCB1c2VzIHRoZSBzdGVwLWlkZW50aXR5LXNjb3BlZCBkaXNwYXRjaCBrZXlcbiAgICogKHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KSBzbyBpdCBzdGF5cyBtdXR1YWxseVxuICAgKiBleGNsdXNpdmUgd2l0aCB0aGUgbm9kZSBlbmdpbmUncyBkaXNwYXRjaCBvZiB0aGUgc2FtZSBzdGVwO1xuICAgKiBgYmFja3N0b3A6PGVwb2NoPmAgY292ZXJzIGRlbGF5ZWQgY3Jhc2ggYmFja3N0b3BzLCBzY29wZWQgdG8gdGhlXG4gICAqIG93bmVyc2hpcCBlcG9jaCBzbyBhIHJlZnJlc2hlZCBsZWFzZSByZS1hcm1zIGEgTkVXIGJhY2tzdG9wIGluc3RlYWRcbiAgICogb2YgYmVpbmcgYWJzb3JiZWQgYnkgdGhlIGluLWZsaWdodCBvbmU7IGByZXRyeTo8bj5gIGNvdmVycyBkZWxheWVkXG4gICAqIHJldHJ5L3Rocm90dGxlIHJlLWVucXVldWVzLCBzY29wZWQgdG8gdGhlIGF0dGVtcHQgc28gZWFjaCBiYWNrb2ZmXG4gICAqIGhvcCBpcyBlbnF1ZXVlYWJsZS5cbiAgICovXG4gIHB1cnBvc2U6ICdkaXNwYXRjaCcgfCBgYmFja3N0b3A6JHtzdHJpbmd9YCB8IGByZXRyeToke251bWJlcn1gO1xuICAvKipcbiAgICogUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IHRoZSBzZXJpYWxpemVkIChwb3NzaWJseSBlbmNyeXB0ZWQpIHN0ZXAgaW5wdXRcbiAgICogdG8gY2Fycnkgb24gdGhlIG1lc3NhZ2UgYXMgYHN0ZXBJbnB1dGAsIHNvIHRoZSBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5XG4gICAqIHJlLWVuc3VyZSB0aGUgYHN0ZXBfY3JlYXRlZGAgZXZlbnQgaWYgdGhlIHByb2R1Y2VyJ3MgcGFyYWxsZWwgZGlyZWN0XG4gICAqIHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseS4gT25seSBzZXQgb24gYGRpc3BhdGNoYCBwdWJsaXNoZXMgdGhhdFxuICAgKiBkaXNwYXRjaFBlbmRpbmdPcHMgcGFyYWxsZWxpemVzIHdpdGggdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZS5cbiAgICovXG4gIHN0ZXBJbnB1dD86IFVpbnQ4QXJyYXk7XG4gIHdmZGlhZzogKGNoZWNrcG9pbnQ6IHN0cmluZywgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHJ1bklkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIHN0ZXAsXG4gICAgZGVsYXlTZWNvbmRzLFxuICAgIG5hbWVzcGFjZSxcbiAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgIHB1cnBvc2UsXG4gICAgc3RlcElucHV0LFxuICAgIHdmZGlhZyxcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgd29ybGQsXG4gICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgIHtcbiAgICAgIHJ1bklkLFxuICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIC4uLihzdGVwSW5wdXQgIT09IHVuZGVmaW5lZCA/IHsgc3RlcElucHV0OiB7IGlucHV0OiBzdGVwSW5wdXQgfSB9IDoge30pLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlICdkaXNwYXRjaCcga2V5IGlzIHN0ZXAtaWRlbnRpdHktc2NvcGVkIChjb3JyZWxhdGlvbklkICsgaGFzaGVkXG4gICAgICAvLyBzdGVwIG5hbWUpLCBzaGFyZWQgd2l0aCB0aGUgbm9kZSBlbmdpbmUncyBkaXNwYXRjaCBvZiB0aGUgc2FtZSBzdGVwXG4gICAgICAvLyBzbyB0aGUgdHdvIHN0YXkgbXV0dWFsbHkgZXhjbHVzaXZlLCB3aXRob3V0IGEgcmV2b2tlZCByZXNpbGllbnRcbiAgICAgIC8vIG1lc3NhZ2UgYWJzb3JiaW5nIGEgcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCdzIGxlZ2l0aW1hdGUgZGlzcGF0Y2guXG4gICAgICAvLyBTZWUgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkuXG4gICAgICBpZGVtcG90ZW5jeUtleTpcbiAgICAgICAgcHVycG9zZSA9PT0gJ2Rpc3BhdGNoJ1xuICAgICAgICAgID8gc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkoc3RlcC5jb3JyZWxhdGlvbklkLCBzdGVwLnN0ZXBJZClcbiAgICAgICAgICA6IGAke3N0ZXAuY29ycmVsYXRpb25JZH06JHtwdXJwb3NlfWAsXG4gICAgICAuLi4oZGVsYXlTZWNvbmRzICYmIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDoge30pLFxuICAgIH1cbiAgKTtcbiAgd2ZkaWFnKCdzdGVwX3F1ZXVlZCcsIHtcbiAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICBwdXJwb3NlLFxuICAgIGRlbGF5U2Vjb25kczogZGVsYXlTZWNvbmRzID8/IDAsXG4gICAgLi4uKHN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkID8geyByZXNpbGllbnQ6IHRydWUgfSA6IHt9KSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggZHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIGEgc2V0IG9mIHBlbmRpbmcgVk0gb3BlcmF0aW9uczpcbiAqIHN0ZXBfY3JlYXRlZCAoKyBvcHRpb25hbCBxdWV1ZWluZyksIGhvb2tfY3JlYXRlZCAvIGhvb2tfcmVjZWl2ZWQgKGFib3J0cyksXG4gKiBhdHRyX3NldCwgaG9va19kaXNwb3NlZCwgYW5kIHdhaXRfY3JlYXRlZCBldmVudHMuXG4gKlxuICogU3RlcHMgYXJlIGNyZWF0ZWQgYnV0ICh1c3VhbGx5KSBub3QgcXVldWVkIGhlcmU6IHF1ZXVlaW5nIChvciBpbmxpbmVcbiAqIGV4ZWN1dGlvbikgaXMgdGhlIGNhbGxlcidzIGRlY2lzaW9uLiBVc2VkIGJvdGggZm9yIHN1c3BlbnNpb25cbiAqIHByb2Nlc3NpbmcgKHRoZSBpbmxpbmUgbG9vcCkgYW5kIGZvciB0aGUgdGVybWluYWwgZHJhaW4gKGZsdXNoaW5nXG4gKiBsZWZ0b3ZlciBzaWRlIGVmZmVjdHMgd2hlbiB0aGUgd29ya2Zsb3cgY29tcGxldGVkIG9yIGZhaWxlZCwgbWlycm9yaW5nXG4gKiB0aGUgbm9kZTp2bSBlbmdpbmUncyBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKS5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyByZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZm9yIHN0ZXAgY2lkcyBuYW1lZCBpblxuICogYHF1ZXVlU3RlcENpZHNgICh0aGUgY2FsbGVyJ3Mgb3ZlcmZsb3cgc3RlcHMpIHRoYXQgcGFzcyB0aGUgZWxpZ2liaWxpdHlcbiAqIGdhdGVzLCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGlzIHBhcmFsbGVsaXplZCB3aXRoIHRoZSBzdGVwJ3MgcXVldWVcbiAqIHB1Ymxpc2g6IHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlIHNlcmlhbGl6ZWQgaW5wdXQgKGBzdGVwSW5wdXRgKSBzbyB0aGVcbiAqIGNvbnN1bWVyIGNhbiBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZFxuICogdHJhbnNpZW50bHkuIFN0ZXBzIHF1ZXVlZCB0aGlzIHdheSBhcmUgcmVwb3J0ZWQgaW4gYHF1ZXVlZFN0ZXBDaWRzYDsgdGhlXG4gKiBjYWxsZXIgcXVldWVzIHRoZSByZXN0IGl0c2VsZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2hQZW5kaW5nT3BzKHBhcmFtczoge1xuICB3b3JsZDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBnZXRXb3JsZD4+O1xuICBydW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIGVuY3J5cHRpb25LZXk6IFJ1blBheWxvYWRLZXlzIHwgdW5kZWZpbmVkO1xuICBwZW5kaW5nT3BlcmF0aW9uczogUGVuZGluZ09wZXJhdGlvbltdO1xuICAvKipcbiAgICogU3RlcCBjaWRzIHdob3NlIGBzdGVwX2NyZWF0ZWRgIG11c3QgTk9UIGJlIHdyaXR0ZW4gaGVyZTogdGhlIGlubGluZVxuICAgKiBsb29wIGNsYWltcyB0aGVzZSBhdG9taWNhbGx5IHZpYSBhIGxhenkgYHN0ZXBfc3RhcnRlZGAgKGNhcnJ5aW5nIHRoZVxuICAgKiBpbnB1dCksIHNvIGEgY29uY3VycmVudCBjbGFpbWFudCBsb3NlcyB3aXRoIEVudGl0eUNvbmZsaWN0RXJyb3JcbiAgICogaW5zdGVhZCBvZiBib3RoIGludm9jYXRpb25zIGJhcmUtc3RhcnRpbmcgdGhlIHNhbWUgc3RlcC5cbiAgICovXG4gIHNraXBTdGVwQ3JlYXRpb24/OiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIFN0ZXAgY2lkcyB0aGUgY2FsbGVyIGludGVuZHMgdG8gaGFuZCB0byB0aGUgcXVldWUgdGhpcyB0dXJuIChvdmVyZmxvd1xuICAgKiBzdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXApLiBFbGlnaWJsZSBvbmVzIGFyZSBwdWJsaXNoZWQgaGVyZSwgaW5cbiAgICogcGFyYWxsZWwgd2l0aCB0aGVpciBzdGVwX2NyZWF0ZWQgd3JpdGUgKHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoKSwgYW5kXG4gICAqIHJlcG9ydGVkIGJhY2sgaW4gYHF1ZXVlZFN0ZXBDaWRzYC5cbiAgICovXG4gIHF1ZXVlU3RlcENpZHM/OiBTZXQ8c3RyaW5nPjtcbiAgLyoqIFF1ZXVlIG5hbWVzcGFjZSBmb3IgYWxsIG1lc3NhZ2UgcHVibGlzaGVzIChzZWUgcnVudGltZS50cykuICovXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUnVuLW9yaWdpbiB0cmFjZSBjYXJyaWVyIGFjY2Vzc29yIGZyb20gcnVudGltZS50cy4gSW4gdGhlIGRlZmF1bHRcbiAgICogYGxpbmtlZGAgdHJhY2UgbW9kZSB0aGlzIHJldHVybnMgdGhlIGNhcnJpZXIgb2YgdGhlIHJ1bidzIE9SSUdJTlxuICAgKiBjb250ZXh0ICh3b3JrZmxvdy5zdGFydCksIHNvIGV2ZXJ5IGludm9jYXRpb24gbGlua3MgYmFjayB0byB0aGVcbiAgICogc3RhcnQgaW4gYSBzdGFyLiBDYXB0dXJpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBoZXJlIGluc3RlYWQgd291bGRcbiAgICogY2hhaW4gaW52b2NhdGlvbnMgdG8gZWFjaCBvdGhlciBhbmQgZnJhZ21lbnQgdGhlIHJ1biB2aWV3IG9uIGFzeW5jXG4gICAqIHF1ZXVlcy5cbiAgICovXG4gIG5leHRUcmFjZUNhcnJpZXI6ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKHRoZSBpbmxpbmUgbG9vcCksIGEgc3RlcCBjYXJyeWluZyBgc2VyaWFsaXphdGlvbkVycm9yYCBpc1xuICAgKiBmaW5hbGl6ZWQgYXMgc3RlcF9jcmVhdGVkIChwbGFjZWhvbGRlciBpbnB1dCkgKyBzdGVwX2ZhaWxlZCBzbyB0aGVcbiAgICogbGl2ZS1WTSBmZWVkIHJlamVjdHMgdGhlIHN0ZXAncyBwcm9taXNlIGFuZCB3b3JrZmxvdyBjb2RlIGNhbiBjYXRjaFxuICAgKiBpdCwgbWlycm9yaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwLiBXaGVuXG4gICAqIGZhbHNlICh0aGUgdGVybWluYWwgZHJhaW4pLCBzdWNoIHN0ZXBzIGFyZSBza2lwcGVkIGVudGlyZWx5OiB0aGUgcnVuXG4gICAqIGlzIGFscmVhZHkgY29tcGxldGluZy9mYWlsaW5nLCBubyByZXBsYXkgZm9sbG93cyB0aGUgZHJhaW4gdG8gb2JzZXJ2ZVxuICAgKiB0aGUgZmFpbHVyZSwgYW5kIGEgY29tcGxldGVkIHJ1biBjYXJyeWluZyBhIGZhaWxlZCBzdGVwIHdvdWxkIHJlYWQgYXNcbiAgICogYSBidWcgZnJvbSB0aGUgZGFzaGJvYXJkLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBkcmFpbidzIGJlaGF2aW9yLlxuICAgKi9cbiAgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzPzogYm9vbGVhbjtcbiAgd2ZkaWFnOiAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufSk6IFByb21pc2U8e1xuICBjcmVhdGVkQXR0cmlidXRlRXZlbnQ6IGJvb2xlYW47XG4gIGNyZWF0ZWRHZXRDb25mbGljdEhvb2s6IGJvb2xlYW47XG4gIC8qKiBTdGVwIGNpZHMgYWxyZWFkeSBwdWJsaXNoZWQgdmlhIHJlc2lsaWVudCBkaXNwYXRjaC4gU2VlIGFib3ZlLiAqL1xuICBxdWV1ZWRTdGVwQ2lkczogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgZmluYWxpemVkIGFzIGZhaWxlZCBiZWNhdXNlIHRoZWlyIGlucHV0IHJlZnVzZWQgdG9cbiAgICogc2VyaWFsaXplIChzZWUgYGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwc2ApLiBObyBleGVjdXRpb24gbWVzc2FnZVxuICAgKiBleGlzdHMgZm9yIHRoZXNlOyB0aGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoZSBydW4gb2JzZXJ2ZXMgdGhlXG4gICAqIHRlcm1pbmFsIGV2ZW50ICh0aGUgaW5saW5lIGxvb3AncyBmZWVkLCBvciB0aGUgcmVxdWV1ZSBzaWduYWwpLlxuICAgKi9cbiAgZmFpbGVkU2VyaWFsaXphdGlvblN0ZXBDaWRzOiBTZXQ8c3RyaW5nPjtcbn0+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHJ1bklkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcGVuZGluZ09wZXJhdGlvbnMsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNraXBTdGVwQ3JlYXRpb24gPSBwYXJhbXMuc2tpcFN0ZXBDcmVhdGlvbjtcbiAgY29uc3QgcXVldWVTdGVwQ2lkcyA9IHBhcmFtcy5xdWV1ZVN0ZXBDaWRzO1xuICBjb25zdCB3ZmRpYWcgPSBwYXJhbXMud2ZkaWFnO1xuICAvLyBTdGVwIGNpZHMgcHVibGlzaGVkIHZpYSByZXNpbGllbnQgZGlzcGF0Y2ggYmVsb3cgKGNyZWF0ZSArIHF1ZXVlIGluXG4gIC8vIHBhcmFsbGVsLCBtZXNzYWdlIGNhcnJ5aW5nIGBzdGVwSW5wdXRgKS4gUmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBzbyBpdFxuICAvLyBza2lwcyB0aGVtIGluIGl0cyBvd24gcXVldWVpbmcgcGFzcy5cbiAgY29uc3QgcXVldWVkU3RlcENpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gU3RlcCBjaWRzIGZpbmFsaXplZCBhcyBzdGVwX2NyZWF0ZWQgKyBzdGVwX2ZhaWxlZCBiZWNhdXNlIHRoZWlyIGlucHV0XG4gIC8vIHJlZnVzZWQgdG8gc2VyaWFsaXplLiBTZWUgdGhlIGBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcHNgIHBhcmFtLlxuICBjb25zdCBmYWlsZWRTZXJpYWxpemF0aW9uU3RlcENpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApOiBmZWF0dXJlIGVuYWJsZWQgYW5kXG4gIC8vIGEgYmluYXJ5LXNhZmUgKENCT1IpIHF1ZXVlIHRyYW5zcG9ydCBmb3IgdGhlIHJ1bi5cbiAgLy9cbiAgLy8gVW5saWtlIHRoZSBub2RlOnZtIHN1c3BlbnNpb24gaGFuZGxlcidzIGdhdGUgKHNlZVxuICAvLyBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2gpLCB0aGVyZSBpcyBOTyBwcmVjb25kaXRpb24tZ3VhcmRcbiAgLy8gZ2F0ZSBoZXJlOiB0aGlzIGVuZ2luZSdzIHN0ZXBfY3JlYXRlZCB3cml0ZXMgYXJlIHVuZ3VhcmRlZCAobm8gc25hcHNob3RcbiAgLy8gaXMgYXR0YWNoZWQpLCBzbyBhIGd1YXJkLWVuZm9yY2luZyBXb3JsZCBjYW4gbmV2ZXIgNDEyLXJlamVjdCB0aGVtOlxuICAvLyB0aGUgY29uc3VtZXIncyByZS1lbnN1cmUgdGhlcmVmb3JlIGNhbm5vdCBtYXRlcmlhbGl6ZSBhIHN0ZXAgdGhlIGd1YXJkXG4gIC8vIHJlamVjdGVkLiBJZiB0aGlzIGVuZ2luZSBldmVyIGFkb3B0cyBndWFyZGVkIHN1c3BlbnNpb24gd3JpdGVzLCB0aGVcbiAgLy8gY2FwYWJpbGl0eSBnYXRlIGZyb20gdGhlIG5vZGU6dm0gaGFuZGxlciBtdXN0IGJlIGFkZGVkIGhlcmUgdG9vLlxuICBjb25zdCByZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlID1cbiAgICBxdWV1ZVN0ZXBDaWRzICE9PSB1bmRlZmluZWQgJiZcbiAgICBxdWV1ZVN0ZXBDaWRzLnNpemUgPiAwICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcbiAgLy8gU2V0IHdoZW4gYSBob29rIHdpdGggYSBwYXJrZWQgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyIGhhZCBpdHNcbiAgLy8gaG9va19jcmVhdGVkIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGUgd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkXG4gIC8vIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgbGV0IGNyZWF0ZWRHZXRDb25mbGljdEhvb2sgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gYSBuZXcgYXR0cl9zZXQgZXZlbnQgaXMgd3JpdHRlbiB0aGlzIGludm9jYXRpb24uIFRoZVxuICAvLyB3b3JrZmxvdyBtdXN0IGJlIHJlLWludm9rZWQgdG8gY29uc3VtZSBpdCAocmVzb2x2aW5nIHRoZSBwZW5kaW5nXG4gIC8vIHNldEF0dHJpYnV0ZXMoKSBwcm9taXNlKSwgc28gdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHksXG4gIC8vIHNhbWUgcGF0dGVybiBhcyBhbiBlbGFwc2VkIHdhaXQuXG4gIGxldCBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSBmYWxzZTtcbiAgY29uc3Qgb3BzUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rT3AgPSBhc3luYyAoaG9vazogUGVuZGluZ0hvb2spOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHByb2Nlc3NpbmcgaG9vayBvcCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICB0b2tlblR5cGU6IHR5cGVvZiBob29rLnRva2VuLFxuICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgIGlzU3lzdGVtOiBob29rLmlzU3lzdGVtLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBob29rLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIGFib3J0UmVxdWVzdGVkOiBob29rLmFib3J0UmVxdWVzdGVkLFxuICAgIH0pO1xuXG4gICAgaWYgKCFob29rLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgLy8gYGhvb2subWV0YWRhdGFgIGlzIHRoZSBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlc1xuICAgICAgLy8gcHJvZHVjZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldXG4gICAgICAvLyAob3B0aW9ucy5tZXRhZGF0YSlgIGluc2lkZSB0aGUgVk0uIEVuY3J5cHQgb24gdGhlIGhvc3RcbiAgICAgIC8vIHNpZGUgYmVmb3JlIHdyaXRpbmcsIHdoaWNoIG1hdGNoZXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIE5vIHByZS1jaGVjayB2aWEgaG9va3MubGlzdDogd2l0aCBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzXG4gICAgICAvLyAoc2FtZSBWTSBzZWVkIGFjcm9zcyByZXBsYXlzKSBhbmQgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZClcbiAgICAgIC8vIHVuaXF1ZW5lc3MgaW4gd29ybGRzLCB0aGUgc3RvcmFnZSBsYXllciByZWplY3RzIGR1cGxpY2F0ZXMgYXNcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IsIHdoaWNoIHdlIHN3YWxsb3cgYmVsb3cuIFRoaXMgZHJvcHMgb25lXG4gICAgICAvLyBuZXR3b3JrIHJvdW5kLXRyaXAgcGVyIHBlbmRpbmcgaG9vay5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZE1ldGFkYXRhID1cbiAgICAgICAgICB0eXBlb2YgaG9vay5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShob29rLm1ldGFkYXRhLCBlbmNyeXB0aW9uS2V5KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDpcbiAgICAgICAgICAgICAgaG9vay50b2tlblJldGVudGlvblVudGlsID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoaG9vay50b2tlblJldGVudGlvblVudGlsKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBlbmNyeXB0ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIGlzV2ViaG9vayBleHBsaWNpdGx5LiBXb3JsZHMgZGVmYXVsdCBpdCB0b1xuICAgICAgICAgICAgLy8gYHRydWVgIHdoZW4gYWJzZW50LCB3aGljaCB3b3VsZCBicmVhayB0aGUgcHVibGljIHdlYmhvb2tcbiAgICAgICAgICAgIC8vIGVuZHBvaW50J3MgNDA0IGd1YXJkIGZvciBob29rcyBjcmVhdGVkIHZpYSBjcmVhdGVIb29rKCkuXG4gICAgICAgICAgICBpc1dlYmhvb2s6IGhvb2suaXNXZWJob29rLFxuICAgICAgICAgICAgLy8gU3lzdGVtIGhvb2tzIChBYm9ydENvbnRyb2xsZXIpIGFyZSBleGVtcHQgZnJvbSB1c2VyXG4gICAgICAgICAgICAvLyB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgICAgICAgICAgLi4uKGhvb2suaXNTeXN0ZW0gPyB7IGlzU3lzdGVtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHN0b3JhZ2UgZGV0ZWN0ZWQgYSByZWFsIHRva2VuIGNvbmZsaWN0IHdpdGggYW5vdGhlclxuICAgICAgICAvLyB3b3JrZmxvdydzIGhvb2ssIHJlLXF1ZXVlIHNvIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGNhblxuICAgICAgICAvLyBwcm9jZXNzIHRoZSBjb25mbGljdCBldmVudCBhbmQgZmFpbCBncmFjZWZ1bGx5LlxuICAgICAgICBpZiAocmVzdWx0LmV2ZW50Py5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGBob29rX2NvbmZsaWN0XyR7aG9vay5jb3JyZWxhdGlvbklkfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBbHJlYWR5IGNyZWF0ZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24sIHNvIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyB0byBhYm9ydCBwcm9jZXNzaW5nIGJlbG93IChpZiBhbnkpIGluc3RlYWQgb2YgYmFpbGluZy5cbiAgICAgICAgaWYgKCFFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChob29rLmhhc0dldENvbmZsaWN0QXdhaXRlcikge1xuICAgICAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9vay5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgLy8gUmVjb3JkIHRoZSBhYm9ydCBkdXJhYmx5OiBhIGhvb2tfcmVjZWl2ZWQgZXZlbnQgY2FycnlpbmdcbiAgICAgIC8vIHRoZSBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkLFxuICAgICAgLy8gcGx1cyBhIGJlc3QtZWZmb3J0IHN0cmVhbSBwYWNrZXQgZm9yIHJlYWwtdGltZSBzdGVwXG4gICAgICAvLyBwcm9wYWdhdGlvbi4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBzdXNwZW5zaW9uXG4gICAgICAvLyBoYW5kbGVyIChob29rc05lZWRpbmdBYm9ydCkuXG4gICAgICBjb25zdCBhYm9ydFBheWxvYWQgPVxuICAgICAgICBob29rLmFib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICA/ICgoYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICBob29rLmFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKSkgYXMgVWludDhBcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICAgICAgICBwYXlsb2FkOiBhYm9ydFBheWxvYWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyBzdHJlYW1OYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUgYWJvcnQgaG9vayB0b2tlblxuICAgICAgLy8gKGBhYnJ0X3tpZH1gIOKGkiBgc3RybV97aWR9X3N5c3RlbV9hYm9ydGApLlxuICAgICAgaWYgKGhvb2sudG9rZW4uc3RhcnRzV2l0aCgnYWJydF8nKSAmJiBhYm9ydFBheWxvYWQpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGBzdHJtXyR7aG9vay50b2tlbi5zbGljZSgnYWJydF8nLmxlbmd0aCl9X3N5c3RlbV9hYm9ydGA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgc3RyZWFtTmFtZSwgYWJvcnRQYXlsb2FkKTtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IHRoZSBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlXG4gICAgICAgICAgLy8gZmFsbGJhY2suXG4gICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byB3cml0ZSBhYm9ydCBzdHJlYW0gcGFja2V0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2Fib3J0X3JlY29yZGVkJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rRGlzcG9zZU9wID0gYXN5bmMgKFxuICAgIG9wOiBQZW5kaW5nSG9va0Rpc3Bvc2VcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogb3AuY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gVGhlIGhvb2sncyB0b2tlbiwgd2hpY2ggdGhlIG5vZGU6dm0gZW5naW5lIGhhcyBhbHdheXMgc2VudC4gQSB3b3JsZFxuICAgICAgICAvLyB0aGF0IGtleXMgYSBob29rJ3MgdG9rZW4gY2xhaW0gc2VwYXJhdGVseSBmcm9tIHRoZSBob29rIGl0c2VsZiBuZWVkc1xuICAgICAgICAvLyBpdCB0byByZWxlYXNlIGJvdGgsIGFuZCB0aGUgb25seSBhbHRlcm5hdGl2ZSBpcyBmb3IgaXQgdG8gbG9vayB0aGVcbiAgICAgICAgLy8gdG9rZW4gdXAgZmlyc3QuIE9taXR0ZWQgcmF0aGVyIHRoYW4gc2VudCBhcyB1bmRlZmluZWQgd2hlbiB0aGUgb3BcbiAgICAgICAgLy8gY2FycmllcyBub25lLCBzbyBhIHdvcmxkIHRoYXQgcmVhZHMgaXQgY2Fubm90IHRlbGwgdGhlIGRpZmZlcmVuY2VcbiAgICAgICAgLy8gYmV0d2VlbiB0aGlzIGVuZ2luZSBhbmQgYSBjbGllbnQgdG9vIG9sZCB0byBzZW5kIG9uZS5cbiAgICAgICAgLi4uKG9wLnRva2VuID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnREYXRhOiB7IHRva2VuOiBvcC50b2tlbiB9IH0pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICAvLyBEaXNwb3NpbmcgYSBob29rIHdob3NlIGVudGl0eSBubyBsb25nZXIgKG9yIG5ldmVyKSBleGlzdHMgaXMgYW5cbiAgICAgIC8vIGlkZW1wb3RlbnQgbm8tb3A6IHRoZSBlbnRpdHkgbWF5IGhhdmUgYmVlbiB0b3JuIGRvd24gYnkgYVxuICAgICAgLy8gY29uY3VycmVudCBydW4gY2FuY2VsbGF0aW9uLCBvciB0aGUgaG9vayBtYXkgaGF2ZSBsb3N0IGl0c1xuICAgICAgLy8gdG9rZW4gY2xhaW0gdG8gYSBjb25mbGljdC4gVGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlbGVhc2UuXG4gICAgICBpZiAoSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfTtcblxuICAvLyBIb29rIG9wZXJhdGlvbnMgYXJlIGdyb3VwZWQgYnkgdG9rZW4gYW5kIHByb2Nlc3NlZCBTRVFVRU5USUFMTFkgaW5cbiAgLy8gY29kZSBvcmRlciB3aXRoaW4gZWFjaCBncm91cCwgbWlycm9yaW5nIHRoZSBub2RlOnZtIHN1c3BlbnNpb25cbiAgLy8gaGFuZGxlciAoaG9va0l0ZW1zQnlUb2tlbik6IGEgZGlzcG9zZSgpIG9mIGFuIGVhcmxpZXIgaG9vayBtdXN0XG4gIC8vIHJlbGVhc2UgdGhlIHRva2VuIGJlZm9yZSBhIGxhdGVyIHNhbWUtdG9rZW4gaG9vaydzIGNyZWF0aW9uIGlzXG4gIC8vIHZhbGlkYXRlZCBieSB0aGUgd29ybGQ6IHBhcmFsbGVsIGRpc3BhdGNoIHdvdWxkIG90aGVyd2lzZSByZWNvcmQgYVxuICAvLyBzcHVyaW91cyBob29rX2NvbmZsaWN0IGFnYWluc3QgdGhlIHJ1bidzIG93biBkaXNwb3NlZCBob29rIChlLmcuIGFcbiAgLy8gZGlzcG9zZeKGknJlY3JlYXRlIGxvb3AgcmV1c2luZyBvbmUgdG9rZW4pLiBEaWZmZXJlbnQgdG9rZW5zIGhhdmUgbm9cbiAgLy8gY2xhaW0gaW50ZXJhY3Rpb24sIHNvIHRva2VuIGdyb3VwcyBydW4gaW4gcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyXG4gIC8vIGFuZCB3aXRoIHRoZSBub24taG9vayBvcHMgYmVsb3cuXG4gIGNvbnN0IGhvb2tPcHNCeVRva2VuID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgKFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlKVtdXG4gID4oKTtcbiAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICBvcC50eXBlID09PSAnaG9vaycgJiZcbiAgICAgICghb3AuaGFzQ3JlYXRlZEV2ZW50IHx8IChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQpXG4gICAgKSB7XG4gICAgICBrZXkgPSAob3AgYXMgUGVuZGluZ0hvb2spLnRva2VuO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2hvb2tfZGlzcG9zZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgLy8gUGVyLW9wIGZhbGxiYWNrIGdyb3VwIHdoZW4gdGhlIHRva2VuIGlzIHVua25vd246IG5vIG9yZGVyaW5nXG4gICAgICAvLyBndWFyYW50ZWVzLCBtYXRjaGluZyB0aGUgcHJldmlvdXMgcGFyYWxsZWwgYmVoYXZpb3IuXG4gICAgICBrZXkgPSAob3AgYXMgUGVuZGluZ0hvb2tEaXNwb3NlKS50b2tlbiA/PyBgX19jaWQ6JHtvcC5jb3JyZWxhdGlvbklkfWA7XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgZ3JvdXAgPSBob29rT3BzQnlUb2tlbi5nZXQoa2V5KTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIGdyb3VwLnB1c2gob3AgYXMgUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rT3BzQnlUb2tlbi5zZXQoa2V5LCBbb3AgYXMgUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2VdKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBncm91cCBvZiBob29rT3BzQnlUb2tlbi52YWx1ZXMoKSkge1xuICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG9wIG9mIGdyb3VwKSB7XG4gICAgICAgICAgaWYgKG9wLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0hvb2tPcChvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NIb29rRGlzcG9zZU9wKG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKClcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgIGlmIChcbiAgICAgIG9wLnR5cGUgPT09ICdzdGVwJyAmJlxuICAgICAgIW9wLmhhc0NyZWF0ZWRFdmVudCAmJlxuICAgICAgIXNraXBTdGVwQ3JlYXRpb24/LmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3Qgc3RlcCA9IG9wIGFzIFBlbmRpbmdTdGVwO1xuICAgICAgb3BzUHJvbWlzZXMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCdzIGlucHV0IHJlZnVzZWQgdG8gc2VyaWFsaXplIHdoaWxlIGR1bXBpbmcgdGhlIFZNJ3NcbiAgICAgICAgICAvLyBwZW5kaW5nIG9wcyAoc2VlIFBlbmRpbmdTdGVwLnNlcmlhbGl6YXRpb25FcnJvcikuIEZpbmFsaXplIGl0XG4gICAgICAgICAgLy8gYXMgc3RlcF9jcmVhdGVkIChwbGFjZWhvbGRlciBpbnB1dCwgc2luY2UgdGhlIHdvcmxkIHJlcXVpcmVzIHRoZVxuICAgICAgICAgIC8vIHN0ZXAgZW50aXR5IGJlZm9yZSBhIHRlcm1pbmFsIGV2ZW50KSArIHN0ZXBfZmFpbGVkIGNhcnJ5aW5nXG4gICAgICAgICAgLy8gdGhlIFNlcmlhbGl6YXRpb25FcnJvciwgc28gdGhlIGxpdmUtVk0gZmVlZCByZWplY3RzIHRoZVxuICAgICAgICAgIC8vIHN0ZXAncyBwcm9taXNlIGFuZCB3b3JrZmxvdyBjb2RlIGNhbiBjYXRjaCBpdC4gTmV2ZXIgcXVldWUgYW5cbiAgICAgICAgICAvLyBleGVjdXRpb24gbWVzc2FnZSBmb3IgaXQuIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgICAgICAvLyBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcC4gSW4gdGhlIHRlcm1pbmFsIGRyYWluXG4gICAgICAgICAgLy8gKGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwcyB1bnNldCksIHNraXAgZW50aXJlbHk6IHNlZSB0aGVcbiAgICAgICAgICAvLyBwYXJhbSBkb2NzLlxuICAgICAgICAgIGlmIChzdGVwLnNlcmlhbGl6YXRpb25FcnJvcikge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgJ1N0ZXAgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemU7IGZhaWxpbmcgdGhlIHN0ZXAgc28gJyArXG4gICAgICAgICAgICAgICAgJ3RoZSB3b3JrZmxvdyBjYW4gb2JzZXJ2ZSB0aGUgZXJyb3InLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogc3RlcC5zZXJpYWxpemF0aW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlU3RlcElucHV0UGxhY2Vob2xkZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICkpIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gQ29uY3VycmVudCBpbnZvY2F0aW9uIGhpdCB0aGUgc2FtZSBkZXRlcm1pbmlzdGljIGZhaWx1cmVcbiAgICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZWQgaXQgZmlyc3QsIG9yIHRoZSBydW4gYWxyZWFkeSBmaW5pc2hlZC5cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICAgICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLnNlcmlhbGl6YXRpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRlcm1pbmFsIG9yIHJ1biBhbHJlYWR5IGZpbmlzaGVkLlxuICAgICAgICAgICAgICBpZiAoIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSAmJiAhUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIHdmZGlhZygnc3RlcF9zZXJpYWxpemF0aW9uX2ZhaWxlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIHN0ZXBfY3JlYXRlZCBldmVudC4gYHN0ZXAuaW5wdXRgIGlzIHRoZVxuICAgICAgICAgIC8vIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzIChcImRldmxcIiArIGRldmFsdWUpIHByb2R1Y2VkXG4gICAgICAgICAgLy8gYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKHthcmdzLFxuICAgICAgICAgIC8vIGNsb3N1cmVWYXJzLCB0aGlzVmFsfSlgIGluc2lkZSB0aGUgVk0uIFRoZSBWTSBoYXMgbm9cbiAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhlIENyeXB0b0tleSwgc28gZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmVcbiAgICAgICAgICAvLyBvbiB0aGUgaG9zdCBzaWRlLCBtYXRjaGluZyB3aGF0XG4gICAgICAgICAgLy8gYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGRvZXMgaW4gdGhlIG5vZGU6dm0gZW5naW5lLlxuICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZElucHV0ID0gYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZpcmUgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggaW4gcGFyYWxsZWw6IHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlXG4gICAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkXG4gICAgICAgICAgLy8gdHJhbnNpZW50bHkuIE1pcnJvcnMgdGhlIG5vZGU6dm0gc3VzcGVuc2lvbiBoYW5kbGVyIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNpbGllbnQgc3RhcnQgLyByZXNpbGllbnQgaG9vayByZXN1bWUgcGF0dGVybnMuIE9ubHkgZm9yXG4gICAgICAgICAgLy8gY2FsbGVyLWRlc2lnbmF0ZWQgb3ZlcmZsb3cgc3RlcHMgd2l0aCBpbnB1dHMgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICAgICAgICAgIHF1ZXVlU3RlcENpZHM/LmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICBlbmNyeXB0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICAgIGVuY3J5cHRlZElucHV0LmJ5dGVMZW5ndGggPD0gTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZElucHV0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICAgICAgc3RlcElucHV0OiBlbmNyeXB0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCBmb3IgdGhpcyBkaXNwYXRjaCBwYXNzOlxuICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgbWVzc2FnZSB0aGUgc3RlcCB3b3VsZCByZWx5IG9uIHRoZSBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFsb25lLCBhbmQgaWYgdGhlIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBub1xuICAgICAgICAgICAgLy8gZHVyYWJsZSByZWNvcmQgYXQgYWxsLiBQcm9wYWdhdGluZyByZWRlbGl2ZXJzIHRoZVxuICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGFuZCByZS1kaXNwYXRjaGVzLlxuICAgICAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWRTdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGludm9jYXRpb24gd3JvdGUgaXQgZmlyc3Q6IHRoZSBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvdXQ7IGl0cyBkdXBsaWNhdGUgcHVibGlzaCBkZWR1cGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudDogdGhlIHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseSAoNDI5IC8gNXh4IC9cbiAgICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQpIGJ1dCB0aGUgc3RlcCBtZXNzYWdlIChjYXJyeWluZyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmVzIHRoZSBzdGVwX2NyZWF0ZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nLlxuICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICdTdGVwIGNyZWF0aW9uIGV2ZW50IHdyaXRlIGZhaWxlZCwgYnV0IHRoZSBzdGVwIHdhcyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BhdGNoZWQgdmlhIHRoZSBxdWV1ZS4gVGhlIHN0ZXBfY3JlYXRlZCBldmVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgd2ZkaWFnKCdzdGVwX3Jlc2lsaWVudF9kaXNwYXRjaF9yZWNvdmVyZWQnLCB7XG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkSW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIG90aGVyd2lzZSB0aGUgY2FsbGVyJ3MgZGVjaXNpb246IHRoZVxuICAgICAgICAgIC8vIGlubGluZSBsb29wIGV4ZWN1dGVzIGZyZXNoIHN0ZXBzIGluIHRoZSBsaXZlIFZNIGFuZCBvbmx5XG4gICAgICAgICAgLy8gcXVldWVzIHRoZSBvdmVyZmxvdyAvIHJldHJ5IC8gYmFja3N0b3AgY2FzZXMgKHNlZVxuICAgICAgICAgIC8vIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSwgYnV0IHRoZVxuICAgICAgICAgICAgICAvLyByZXBsYXkgc3RpbGwgbmVlZHMgdG8gY29uc3VtZSBpdCwgc28gcmVxdWV1ZS5cbiAgICAgICAgICAgICAgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICd3YWl0JyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICByZXN1bWVBdDogbmV3IERhdGUod2FpdC5yZXN1bWVBdCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gUGVyLW9wIGRpc3BhdGNoIHJ1bnMgaW4gcGFyYWxsZWwuXG4gIGF3YWl0IFByb21pc2UuYWxsKG9wc1Byb21pc2VzKTtcblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCxcbiAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rLFxuICAgIHF1ZXVlZFN0ZXBDaWRzLFxuICAgIGZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3b3JrZmxvdyB1c2luZyB0aGUgUXVpY2tKUyBXQVNNIFZNIGVuZ2luZS5cbiAqXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBgbm9kZTp2bWAgcmVwbGF5IHBhdGggKHJ1bldvcmtmbG93ICsgRXZlbnRzQ29uc3VtZXIpXG4gKiB3aXRoIGEgUXVpY2tKUyBWTSBpbnZvY2F0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXkuXG4gKlxuICogS05PV04gR0FQIChzbG90IHNuYXBzaG90KTogdW5saWtlIHRoZSBub2RlOnZtIHBhdGgsIG5vIGV2ZW50IHdyaXRlIGluXG4gKiB0aGlzIGZpbGUgY2FycmllcyB7QGxpbmsgQ3JlYXRlRXZlbnRQYXJhbXMuZXZlbnRDb3VudH0sIHNvIGEgV29ybGQgbmV2ZXJcbiAqIGxlYXJucyB3aGljaCBldmVudHMgdGhlIHdyaXRlciBoYWQgbm90IHNlZW4gYW5kIG5ldmVyIHJlcG9ydHMgdGhlbSBiYWNrLlxuICogVGhlIGVuZ2luZSBjdXJyZW50bHkgcmVsaWVzIG9uIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIGV2ZW50XG4gKiB1bmlxdWVuZXNzIChFbnRpdHlDb25mbGljdEVycm9yIGRlZHVwKSBhbG9uZS4gVGhpcyBpcyBhIGRlbGliZXJhdGVcbiAqIHNpbXBsaWZpY2F0aW9uIHdoaWxlIHRoZSBlbmdpbmUgaXMgZXhwZXJpbWVudGFsOiB3aXJpbmcgdGhlIHNuYXBzaG90IGlzXG4gKiB0cmFja2VkIGZvbGxvdy11cCB3b3JrOyBhbnlvbmUgYWRkaW5nIG5ldyB3cml0ZSBwYXRocyBoZXJlIHNob3VsZCBub3RcbiAqIGFzc3VtZSBwYXJpdHkgd2l0aCB0aGUgbm9kZSBlbmdpbmUgb24gdGhpcyBheGlzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyhwYXJhbXM6IHtcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIC8qKlxuICAgKiBFdmVudHMgcmV0dXJuZWQgaW5saW5lIGJ5IGBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcsIC4uLilgIG9yIGJ5XG4gICAqIHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQuIFdoZW4gdGhleSBpbmRpY2F0ZVxuICAgKiBhIGZpcnN0IGludm9jYXRpb24sIG9yIHdoZW4gYHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlYCBhdHRlc3RzIHRoZXlcbiAgICogYXJlIHRoZSBjb21wbGV0ZSBsb2csIHRoZXkgYXJlIHVzZWQgYXMgdGhlIGV2ZW50IGxvZyBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIHZpYSBgZXZlbnRzLmxpc3RgLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBmYXN0IHBhdGguXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHM/OiBFdmVudFtdO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBjYWxsZXIgaGFzIHZhbGlkYXRlZCB0aGF0IGBwcmVsb2FkZWRFdmVudHNgIGlzIHRoZSBydW4nc1xuICAgKiBDT01QTEVURSBldmVudCBsb2cgKGUuZy4gdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBoYXNNb3JlLWZhbHNlXG4gICAqIHJlcGxheSBwcmVsb2FkKS4gVGhlIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljIGJlbG93IG9ubHkgcmVjb2duaXplc1xuICAgKiBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZC1vbmx5IHByZWxvYWRzLCBzbyB3aXRob3V0IHRoaXMgYXR0ZXN0YXRpb24gYVxuICAgKiBob29rLXJlc3VtZSBwcmVsb2FkIHdvdWxkIGJlIGRpc2NhcmRlZCBhbmQgcmVmZXRjaGVkLlxuICAgKi9cbiAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUnVuIGlucHV0IGNhcnJpZWQgdGhyb3VnaCB0aGUgcXVldWUgbWVzc2FnZSBvbiBmaXJzdCBkZWxpdmVyeS4gVXNlZFxuICAgKiBhcyBhIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGZvciBgcnVuX2NyZWF0ZWQuZXZlbnREYXRhLmlucHV0YCB3aGVuXG4gICAqIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIHJ1bklucHV0PzogUnVuSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IE9UZWwgc3BhbiAodGhlIG91dGVyIGBXT1JLRkxPVyB7d29ya2Zsb3dOYW1lfWAgc3BhbiBmcm9tXG4gICAqIGBydW50aW1lLnRzYCkuIFdoZW4gc3VwcGxpZWQsIFZNIGxpZmVjeWNsZSBhdHRyaWJ1dGVzIGFyZSBhdHRhY2hlZFxuICAgKiB0byBpdCBmb3IgZW5kLXRvLWVuZCB2aXNpYmlsaXR5LlxuICAgKi9cbiAgcGFyZW50U3Bhbj86IFNwYW47XG4gIC8qKlxuICAgKiBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlXG4gICAqICh1bmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50KS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBndWFyZDpcbiAgICogYSBydW5hd2F5IHJ1biBpcyBmYWlsZWQgb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlIGNlaWxpbmcuIFRoZSB0aHJvd1xuICAgKiBwcm9wYWdhdGVzIHRvIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMgKHRoZSBRdWlja0pTXG4gICAqIGRpc3BhdGNoIHJ1bnMgaW5zaWRlIHRoYXQgbG9vcCdzIHRyeSksIHdoaWNoIGNsYXNzaWZpZXMgaXQgYW5kXG4gICAqIHJlY29yZHMgcnVuX2ZhaWxlZCB3aXRoIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAqL1xuICBtYXhFdmVudHNMaW1pdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHQgb2YgdGhlIG1lc3NhZ2UgZHJpdmluZyB0aGlzIGludm9jYXRpb24gKGZyb21cbiAgICogdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhZGF0YTsgMSA9IGZpcnN0IGRlbGl2ZXJ5KS4gU3VyZmFjZWQgaW5cbiAgICogZGlhZ25vc3RpY3M7IGNyYXNoIHJlY292ZXJ5IGl0c2VsZiBpcyBkcml2ZW4gYnkgdGhlIG93bmVyc2hpcC1sZWFzZVxuICAgKiBkZWNpc2lvbiB0YWJsZSBpbiB0aGUgbG9vcCwgbm90IGJ5IHRoZSBhdHRlbXB0IGNvdW50LlxuICAgKi9cbiAgZGVsaXZlcnlBdHRlbXB0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgbWVzc2FnZSBJRCBvZiB0aGUgZGVsaXZlcnkgZHJpdmluZyB0aGlzIGludm9jYXRpb24sIHN0YW1wZWQgYXNcbiAgICogYG93bmVyTWVzc2FnZUlkYCBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXMgZGVmZXIgdG9cbiAgICogdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2YgcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKiogUmVxdWVzdCBJRCBvZiB0aGUgcXVldWUgaW52b2NhdGlvbiwgd2hlbiB0aGUgcXVldWUgcHJvdmlkZXMgb25lLiAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2UgcmVzb2x2ZWQgYXQgcm91dGUgcmVnaXN0cmF0aW9uIChydW50aW1lLnRzKS4gTXVzdCBiZVxuICAgKiB0aHJlYWRlZCBpbnRvIGV2ZXJ5IG1lc3NhZ2UgcHVibGlzaDogdGhlIGJ1aWxkZXJzIGJha2UgdGhlIG5hbWVzcGFjZVxuICAgKiBpbnRvIGdlbmVyYXRlZCByb3V0ZXMsIHNvIGNvbnN1bWVycyBsaXN0ZW4gb24gYF9fPG5zPl93a2Zfd29ya2Zsb3dfKmAuXG4gICAqIEEgcHVibGlzaCB3aXRob3V0IGl0IGxhbmRzIG9uIGBfX3drZl93b3JrZmxvd18qYCBhbmQgaXMgbmV2ZXJcbiAgICogcGlja2VkIHVwLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogUnVuLW9yaWdpbiB0cmFjZSBjYXJyaWVyIGFjY2Vzc29yIGZyb20gcnVudGltZS50c1xuICAgKiAoZ2V0TmV4dFRyYWNlQ2FycmllcikuIEluIHRoZSBkZWZhdWx0IGBsaW5rZWRgIHRyYWNlIG1vZGUgZXZlcnlcbiAgICogaW52b2NhdGlvbiBtdXN0IGxpbmsgYmFjayB0byB0aGUgcnVuJ3Mgb3JpZ2luICh3b3JrZmxvdy5zdGFydCkgaW4gYVxuICAgKiBzdGFyOyBjYXB0dXJpbmcgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0IGluc3RlYWQgd291bGQgY2hhaW5cbiAgICogaW52b2NhdGlvbnMgdG8gZWFjaCBvdGhlciBhbmQgZnJhZ21lbnQgdGhlIHJ1biB2aWV3IG9uIGFzeW5jIHF1ZXVlcy5cbiAgICovXG4gIG5leHRUcmFjZUNhcnJpZXI/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogVGhlIHdhaXQgdGhpcyBpbnZvY2F0aW9uIGlzIHRoZSBkZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IsIGlmIGl0IGlzIG9uZVxuICAgKiAoYFdvcmtmbG93SW52b2tlUGF5bG9hZC53YWl0Q29udGludWF0aW9uYCkuIFJlYWQgb25seSB0byBkZWNpZGUgdGhlIG5leHRcbiAgICogY29udGludWF0aW9uJ3MgaWRlbXBvdGVuY3kga2V5OiBhIGNvbnRpbnVhdGlvbiB0aGF0IGZpbmRzIGl0cyBvd24gd2FpdFxuICAgKiBzdGlsbCBwZW5kaW5nIGhhcyBzcGVudCBpdHMga2V5LCBzbyB0aGUgcmUtYXJtIGhhcyB0byBhZHZhbmNlIHRoZSBhdHRlbXB0XG4gICAqIG9yIHRoZSB3b3JsZCdzIGRlZHVwZSB3aW5kb3cgZHJvcHMgaXQgYW5kIHRoZSB3YWl0IGxvc2VzIGl0cyBvbmx5IHRpbWVyLlxuICAgKi9cbiAgd2FpdENvbnRpbnVhdGlvbj86IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBhdHRlbXB0OiBudW1iZXIgfTtcbn0pOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM/OiBudW1iZXIgfSB8IHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlLFxuICAgIHJ1bklucHV0LFxuICAgIHBhcmVudFNwYW4sXG4gICAgbWF4RXZlbnRzTGltaXQsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIG93bmVyTWVzc2FnZUlkLFxuICAgIHJlcXVlc3RJZCxcbiAgICBuYW1lc3BhY2UsXG4gICAgd2FpdENvbnRpbnVhdGlvbixcbiAgfSA9IHBhcmFtcztcblxuICAvKipcbiAgICogQXR0ZW1wdCBudW1iZXIgZm9yIHRoZSBjb250aW51YXRpb24gdGhpcyBpbnZvY2F0aW9uIGlzIGFib3V0IHRvIGFybSBmb3JcbiAgICogYGNvcnJlbGF0aW9uSWRgLiBPbmUgaGlnaGVyIHRoYW4gdGhlIGluY29taW5nIGNvbnRpbnVhdGlvbidzIHdoZW4gdGhpc1xuICAgKiBpbnZvY2F0aW9uIElTIHRoYXQgY29udGludWF0aW9uIGFuZCB0aGUgd2FpdCBpcyBzdGlsbCBwZW5kaW5nIOKAlCB0aGUgb25seVxuICAgKiBzaXR1YXRpb24gaW4gd2hpY2ggdGhlIHByZXZpb3VzIGtleSBpcyBzcGVudC4gRXZlcnkgb3RoZXIgY2FsbGVyLCBhbmRcbiAgICogZXZlcnkgb3RoZXIgd2FpdCwgc3RhcnRzIGF0IDAgYW5kIGtleXMgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIGF0dGVtcHRzXG4gICAqIGV4aXN0ZWQuXG4gICAqL1xuICBjb25zdCBuZXh0V2FpdENvbnRpbnVhdGlvbkF0dGVtcHQgPSAoY29ycmVsYXRpb25JZDogc3RyaW5nKTogbnVtYmVyID0+XG4gICAgd2FpdENvbnRpbnVhdGlvbj8uY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZFxuICAgICAgPyB3YWl0Q29udGludWF0aW9uLmF0dGVtcHQgKyAxXG4gICAgICA6IDA7XG4gIC8vIFN0YW5kYWxvbmUtY2FsbGVyIGZhbGxiYWNrICh0ZXN0cyk6IHdpdGhvdXQgYSBydW50aW1lLnRzIGNhcnJpZXJcbiAgLy8gYWNjZXNzb3IsIGZhbGwgYmFjayB0byB0aGUgY3VycmVudCBpbnZvY2F0aW9uIGNvbnRleHQuXG4gIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPVxuICAgIHBhcmFtcy5uZXh0VHJhY2VDYXJyaWVyID8/ICgoKSA9PiBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSk7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgY29uc3QgcnVuSWQgPSB3b3JrZmxvd1J1bi5ydW5JZDtcbiAgY29uc3QgaW52b2NhdGlvblN0YXJ0ID0gdGljaygpO1xuXG4gIC8vIFN0cmlwIHRoZSBpbmxpbmUgc291cmNlIG1hcCBjb21tZW50IGJlZm9yZSBldmFsdWF0aW5nIHRoZSBidW5kbGUgaW5cbiAgLy8gdGhlIFF1aWNrSlMgVk0uIFRoZSBtYXAgaXMgcHVyZWx5IGhvc3Qtc2lkZSBtZXRhZGF0YSBmb3JcbiAgLy8gYHJlbWFwRXJyb3JTdGFja2AgKGNhbGxlZCBiZWxvdyBvbiB3b3JrZmxvdyBmYWlsdXJlcywgYWdhaW5zdCB0aGVcbiAgLy8gT1JJR0lOQUwgYHdvcmtmbG93Q29kZWApLiBRdWlja0pTIHJldGFpbnMgc291cmNlIHRleHQgZm9yXG4gIC8vIHN0YWNrLXRyYWNlIGxpbmUgbG9va3Vwcywgc28gdGhlIGZldy1NQiBiYXNlNjQgY29tbWVudCB3b3VsZCBibG9hdFxuICAvLyB0aGUgVk0gaGVhcCBmb3Igbm8gYmVuZWZpdC5cbiAgY29uc3Qgd29ya2Zsb3dDb2RlRm9yVk0gPSBzdHJpcElubGluZVNvdXJjZU1hcCh3b3JrZmxvd0NvZGUpO1xuXG4gIC8vIFBlci1pbnZvY2F0aW9uIGRpYWdub3N0aWMgaWQgc28gZGVidWcgbG9ncyBjYW4gYmUgY29ycmVsYXRlZCBldmVuIGlmXG4gIC8vIHRoZSBzYW1lIHJ1bklkIGlzIHByb2Nlc3NlZCBieSBvdmVybGFwcGluZyBpbnZvY2F0aW9ucyBvbiBkaWZmZXJlbnRcbiAgLy8gZnVuY3Rpb24gaW5zdGFuY2VzLlxuICBjb25zdCBpbnZvY2F0aW9uSWQgPSBgaW52XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWA7XG5cbiAgLy8gU3RydWN0dXJlZCBwZXItY2hlY2twb2ludCBkaWFnbm9zdGljIGhlbHBlciwgZ3JlcC1mcmllbmRseSBieSBydW5JZC5cbiAgY29uc3Qgd2ZkaWFnID0gKGNoZWNrcG9pbnQ6IHN0cmluZywgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1FVSUNLSlNfVk1fRElBRycsIHtcbiAgICAgIGNoZWNrcG9pbnQsXG4gICAgICBydW5JZCxcbiAgICAgIGludm9jYXRpb25JZCxcbiAgICAgIHRFbGFwc2VkTXM6IE1hdGgucm91bmQodGljaygpIC0gaW52b2NhdGlvblN0YXJ0KSxcbiAgICAgIC4uLmZpZWxkcyxcbiAgICB9KTtcbiAgfTtcblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dWbSgncXVpY2tqcycpLFxuICB9KTtcblxuICB3ZmRpYWcoJ2VudGVyJywge1xuICAgIHdvcmtmbG93TmFtZSxcbiAgICBkZWxpdmVyeUF0dGVtcHQsXG4gICAgaGFzUHJlbG9hZGVkRXZlbnRzOlxuICAgICAgQXJyYXkuaXNBcnJheShwcmVsb2FkZWRFdmVudHMpICYmIHByZWxvYWRlZEV2ZW50cy5sZW5ndGggPiAwLFxuICAgIHByZWxvYWRlZEV2ZW50Q291bnQ6IHByZWxvYWRlZEV2ZW50cz8ubGVuZ3RoID8/IDAsXG4gICAgaGFzUnVuSW5wdXQ6ICEhcnVuSW5wdXQsXG4gIH0pO1xuXG4gIC8vIFRoZSB3b3JrZmxvd05hbWUgZnJvbSB0aGUgcXVldWUgdG9waWMgaXMgYWxyZWFkeSB0aGUgZnVsbCB3b3JrZmxvdyBJRFxuICAvLyAoZS5nLiBcIndvcmtmbG93Ly8uL3dvcmtmbG93cy8xX3NpbXBsZS8vc2ltcGxlXCIpXG4gIGNvbnN0IHdvcmtmbG93SWQgPSB3b3JrZmxvd05hbWU7XG5cbiAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgdXAgZnJvbnQ6IG5lZWRlZCB0byBkZWNyeXB0IGV2ZW50XG4gIC8vIHBheWxvYWRzIGluc2lkZSB0aGUgVk0gYW5kIHRvIGVuY3J5cHQgZXZlbnQgcGF5bG9hZHMgd3JpdHRlbiBiZWxvdy5cbiAgLy8gUmVzb2x2ZSB0aGUgRlVMTCBjYXBhYmlsaXR5IChzeW1tZXRyaWMgQUVTIGtleSArIFgyNTUxOSBrZXlwYWlyKSwgbm90XG4gIC8vIGp1c3QgYGltcG9ydEtleShyYXdLZXkpYDogYSBydW4gcmVhZGluZyBpdHMgb3duIGV2ZW50IGxvZyBjYW4gZW5jb3VudGVyXG4gIC8vIHNlYWxlZCAoYGVuY3BgKSBob29rIHBheWxvYWRzIHRoYXQgYSBjcm9zcy1kZXBsb3ltZW50IGByZXN1bWVIb29rKClgXG4gIC8vIHdyb3RlIHRvIGl0IChzZWFsaW5nIGlzIHByZXNlbmNlLWdhdGVkIG9uIHRoZSBydW4ncyBwdWJsaXNoZWRcbiAgLy8gZW5jcnlwdGlvblB1YmxpY0tleSwgd2hpY2ggdGhlIHNoYXJlZCBzdGFydCgpIHBhdGggc3RhbXBzIHJlZ2FyZGxlc3Mgb2ZcbiAgLy8gZW5naW5lKS4gQSBiYXJlIHN5bW1ldHJpYyBrZXkgY2Fubm90IG9wZW4gdGhvc2UgYW5kIHdvdWxkIHdlZGdlIHRoZSBydW5cbiAgLy8gcmlnaHQgYWZ0ZXIgaG9va19yZWNlaXZlZC4gVGhlIG5vZGU6dm0gZW5naW5lIHJlc29sdmVzIHRoZSBzYW1lIGZ1bGxcbiAgLy8gY2FwYWJpbGl0eSB2aWEgbWVtb2l6ZUVuY3J5cHRpb25LZXkuXG4gIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/Lih3b3JrZmxvd1J1bik7XG4gIGNvbnN0IGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gIC8vIExvYWQgdGhlIEZVTEwgZXZlbnQgbG9nIGZvciB0aGUgcnVuLiBPbiBmaXJzdCBpbnZvY2F0aW9uIHRoZVxuICAvLyBwcmVsb2FkZWQgZXZlbnRzIGZyb20gdGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlIGFyZSB0aGUgY29tcGxldGUgbG9nXG4gIC8vIGFuZCBzYXZlIHRoZSBldmVudHMubGlzdCByb3VuZC10cmlwczsgYSBjYWxsZXItYXR0ZXN0ZWQgY29tcGxldGVcbiAgLy8gcHJlbG9hZCAobGF6eSBob29rIGZhc3QgcGF0aCkgaXMgdHJ1c3RlZCB0aGUgc2FtZSB3YXkuXG4gIGxldCBldmVudHM6IEV2ZW50W107XG4gIGxldCBldmVudHNGZXRjaGVkUGFnZXMgPSAwO1xuICBjb25zdCB1c2VQcmVsb2FkZWQgPVxuICAgIChwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSA9PT0gdHJ1ZSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShwcmVsb2FkZWRFdmVudHMpICYmXG4gICAgICBwcmVsb2FkZWRFdmVudHMubGVuZ3RoID4gMCkgfHxcbiAgICBpc0ZpcnN0SW52b2NhdGlvbihwcmVsb2FkZWRFdmVudHMpO1xuICBpZiAodXNlUHJlbG9hZGVkICYmIHByZWxvYWRlZEV2ZW50cykge1xuICAgIGV2ZW50cyA9IHByZWxvYWRlZEV2ZW50cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhbGxFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG5cbiAgICB3aGlsZSAoaGFzTW9yZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICBjdXJzb3I6IGN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGV2ZW50c0ZldGNoZWRQYWdlcysrO1xuICAgICAgYWxsRXZlbnRzLnB1c2goLi4ucmVzcG9uc2UuZGF0YSk7XG4gICAgICAvLyBVcGRhdGUgdGhlIGN1cnNvciB0byB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBwYWdlJ3MgY3Vyc29yLlxuICAgICAgLy8gT25seSB1cGRhdGUgd2hlbiB3ZSBnb3QgcmVzdWx0czogdGhlIGZpbmFsIGVtcHR5LXBhZ2UgcmVzcG9uc2VcbiAgICAgIC8vIHJldHVybnMgY3Vyc29yPW51bGwgd2hpY2ggd2UgbXVzdCBOT1QgdXNlIChpdCB3b3VsZCByZXNldCB0aGUgY3Vyc29yKS5cbiAgICAgIGlmIChyZXNwb25zZS5jdXJzb3IpIHtcbiAgICAgICAgY3Vyc29yID0gcmVzcG9uc2UuY3Vyc29yO1xuICAgICAgfVxuICAgICAgaGFzTW9yZSA9IHJlc3BvbnNlLmRhdGEubGVuZ3RoID4gMCAmJiByZXNwb25zZS5jdXJzb3IgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBldmVudHMgPSBhbGxFdmVudHM7XG4gIH1cblxuICAvLyBFdmVudC1saW1pdCBndWFyZDogZmFpbCBhIHJ1bmF3YXkgcnVuIG9uY2UgaXRzIGxvZyByZWFjaGVzIHRoZVxuICAvLyBzZXJ2ZXItc3VwcGxpZWQgY2VpbGluZywgdGhlIHNhbWUgZW5mb3JjZW1lbnQgcG9pbnQgYXMgdGhlIG5vZGU6dm1cbiAgLy8gZW5naW5lJ3MgcmVwbGF5IGxvb3AuXG4gIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihldmVudHMubGVuZ3RoLCBtYXhFdmVudHNMaW1pdCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c1ByZWxvYWRlZCh1c2VQcmVsb2FkZWQpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZENvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZFBhZ2VzKGV2ZW50c0ZldGNoZWRQYWdlcyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZXZlbnRzX2ZldGNoZWQnLCB7XG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICBldmVudHNGZXRjaGVkUGFnZXMsXG4gICAgdXNlUHJlbG9hZGVkLFxuICAgIGV2ZW50VHlwZXM6IGV2ZW50cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKGFjYywgZSkgPT4ge1xuICAgICAgYWNjW2UuZXZlbnRUeXBlXSA9IChhY2NbZS5ldmVudFR5cGVdID8/IDApICsgMTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pLFxuICB9KTtcblxuICAvLyBDaGVjayBmb3IgZWxhcHNlZCB3YWl0c1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICBldmVudHNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICApO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3QgZXZlbnREYXRhID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnRcbiAgICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bWVBdCA9IGV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICBpZiAocmVzdW1lQXQgJiYgbm93ID49IG5ldyBEYXRlKHJlc3VtZUF0IGFzIHN0cmluZykuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LmV2ZW50KSBldmVudHMucHVzaChyZXN1bHQuZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSBjb250aW51ZTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSB3b3JrZmxvdyBzZXJ2ZXIgcG9ydCBzbyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpLnVybGAgaW5zaWRlXG4gIC8vIHRoZSBWTSBtYXRjaGVzIHdoYXQgdGhlIHN0ZXAtc2lkZSBoYW5kbGVyIHJlcG9ydHMuIFNraXBwZWQgb24gVmVyY2VsOlxuICAvLyB0aGUgVk0gcmVhZHMgVkVSQ0VMX1VSTCBkaXJlY3RseSBpbiB0aGF0IGVudmlyb25tZW50LlxuICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9ydCA9IGlzVmVyY2VsID8gdW5kZWZpbmVkIDogYXdhaXQgZ2V0UG9ydExhenkoKTtcblxuICAvLyBSdW4gdGhlIHdvcmtmbG93IGluIHRoZSBRdWlja0pTIFZNXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogaW52b2tpbmcgVk0nLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dJZCxcbiAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICB9KTtcblxuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3coe1xuICAgIC8vIFBhc3MgdGhlIFNUUklQUEVEIGJ1bmRsZSB0byB0aGUgVk0gc28gdGhlIGlubGluZSBzb3VyY2UgbWFwXG4gICAgLy8gZG9lc24ndCBlbmQgdXAgaW4gdGhlIFF1aWNrSlMgaGVhcC4gVGhlIG9yaWdpbmFsICh1bnN0cmlwcGVkKVxuICAgIC8vIGB3b3JrZmxvd0NvZGVgIGlzIHN0aWxsIGtlcHQgaW4gdGhpcyBob3N0LXNpZGUgc2NvcGUgYW5kIGlzIHVzZWRcbiAgICAvLyBieSBgcmVtYXBFcnJvclN0YWNrYCBvbiB3b3JrZmxvdyBmYWlsdXJlcyBiZWxvdy5cbiAgICB3b3JrZmxvd0NvZGU6IHdvcmtmbG93Q29kZUZvclZNLFxuICAgIHdvcmtmbG93SWQsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICBwb3J0LFxuICAgIHJ1bklucHV0LFxuICB9KTtcbiAgbGV0IHJlc3VsdCA9IHNlc3Npb24ucmVzdWx0O1xuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogVk0gcmV0dXJuZWQnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgY29tcGxldGVkOiAhIXJlc3VsdC5jb21wbGV0ZWQsXG4gICAgc3VzcGVuZGVkOiAhIXJlc3VsdC5zdXNwZW5kZWQsXG4gICAgZmFpbGVkOiAhIXJlc3VsdC5mYWlsZWQsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoLFxuICB9KTtcblxuICB3ZmRpYWcoJ3ZtX3JldHVybmVkJywge1xuICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgIDogcmVzdWx0LnN1c3BlbmRlZFxuICAgICAgICA/ICdzdXNwZW5kZWQnXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICA6ICd1bmtub3duJyxcbiAgICBwZW5kaW5nT3BzQ291bnQ6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5sZW5ndGggPz8gMCxcbiAgICBwZW5kaW5nT3BTdW1tYXJ5OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubWFwKChwKSA9PiAoe1xuICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgY29ycmVsYXRpb25JZDogcC5jb3JyZWxhdGlvbklkLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgfSkpLFxuICAgIGZhaWx1cmVNZXNzYWdlOiByZXN1bHQuZmFpbGVkPy5tZXNzYWdlLFxuICAgIGZhaWx1cmVOYW1lOiByZXN1bHQuZmFpbGVkPy5uYW1lLFxuICB9KTtcblxuICAvLyAtLS0tIElubGluZSBjb250aW51YXRpb24gbG9vcCAtLS0tXG4gIC8vXG4gIC8vIFdoaWxlIHRoZSB3b3JrZmxvdyBpcyBzdXNwZW5kZWQsIHRoaXMgbG9vcCBrZWVwcyB0aGUgVk0gYWxpdmUgYW5kXG4gIC8vIG1ha2VzIGFzIG11Y2ggZm9yd2FyZCBwcm9ncmVzcyBhcyBwb3NzaWJsZSB3aXRoaW4gb25lIGludm9jYXRpb246XG4gIC8vXG4gIC8vICAgMS4gRGlzcGF0Y2ggZHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoZSBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHNcbiAgLy8gICAgICAoc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gYXR0cl9zZXQgLyB3YWl0X2NyZWF0ZWQgL1xuICAvLyAgICAgIGhvb2tfcmVjZWl2ZWQgZm9yIGFib3J0cykgYW5kIGNvbXBsZXRlIGVsYXBzZWQgd2FpdHMuXG4gIC8vICAgMi4gRmVlZCBhbGwgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIChhdHRyX3NldCwgaG9va19jcmVhdGVkLCBlbGFwc2VkXG4gIC8vICAgICAgd2FpdF9jb21wbGV0ZWQsIHRlcm1pbmFscyB3cml0dGVuIGJ5IGNvbmN1cnJlbnQgaW52b2NhdGlvbnMsIC4uLilcbiAgLy8gICAgICBpbnRvIHRoZSBMSVZFIFZNIHZpYSBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cywgcmVzdW1pbmdcbiAgLy8gICAgICBleGVjdXRpb24gZXhhY3RseSB3aGVyZSBpdCBsZWZ0IG9mZiwgbm8gZnJlc2gtVk0gcmUtcmVwbGF5LlxuICAvLyAgICAgIENoZWFwIHByb2dyZXNzIGlzIGZlZCBCRUZPUkUgcnVubmluZyBzdGVwIGJvZGllcyBzbyBwcm9taXNlXG4gIC8vICAgICAgY2hhaW5zIHRoYXQgYXJlIG5vdCBnYXRlZCBvbiBzdGVwcyAoaG9vay5nZXRDb25mbGljdCgpLFxuICAvLyAgICAgIHNldEF0dHJpYnV0ZXMoKSwgcmFjaW5nIHNsZWVwcykgYWR2YW5jZSBmaXJzdCBhbmQgY2FuIHN1cmZhY2VcbiAgLy8gICAgICBhZGRpdGlvbmFsIHBlbmRpbmcgc3RlcHMgZm9yIHRoZSBzYW1lIGlubGluZSBiYXRjaC5cbiAgLy8gICAzLiBPbmNlIG5vIGNoZWFwIHByb2dyZXNzIHJlbWFpbnMsIGV4ZWN1dGUgdXAgdG9cbiAgLy8gICAgICBnZXRNYXhJbmxpbmVTdGVwcygpIHN0ZXBzIGNyZWF0ZWQgYnkgVEhJUyBpbnZvY2F0aW9uIGlubGluZSAobm9cbiAgLy8gICAgICBxdWV1ZSByb3VuZC10cmlwKSwgaW4gcGFyYWxsZWwsIHdpdGggdGhlIHJlcGxheSBidWRnZXQgcGF1c2VkXG4gIC8vICAgICAgZHVyaW5nIHN0ZXAgYm9kaWVzLCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgaW5saW5lXG4gIC8vICAgICAgcmVwbGF5IGxvb3AuIE92ZXJmbG93IGFuZCByZXRyeS90aHJvdHRsZWQgc3RlcHMgYXJlIHF1ZXVlZCBmb3JcbiAgLy8gICAgICBiYWNrZ3JvdW5kIGV4ZWN1dGlvbi4gQSBkZWxheWVkIHdhaXQtY29udGludWF0aW9uIG1lc3NhZ2UgaXNcbiAgLy8gICAgICBlbnF1ZXVlZCBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IGZpcnN0LCBzbyByYWNpbmcgdGltZXJzXG4gIC8vICAgICAgZmlyZSBvbiB0aW1lIChpbiBhIHNlcGFyYXRlIGludm9jYXRpb24pIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrXG4gIC8vICAgICAgdGhpcyBvbmUuXG4gIC8vXG4gIC8vIFRoZSBsb29wIGV4aXRzIHdoZW4gdGhlIHdvcmtmbG93IHNldHRsZXMsIG5vIGZvcndhcmQgcHJvZ3Jlc3MgaXNcbiAgLy8gcG9zc2libGUgaW4tcHJvY2VzcywgdGhlIHJlcGxheSBidWRnZXQgaXMgZXhoYXVzdGVkLCBvciB0aGUgcnVuIGlzXG4gIC8vIGdvbmUuXG4gIGNvbnN0IHNlZW5FdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRJZCkgc2VlbkV2ZW50SWRzLmFkZChlLmV2ZW50SWQpO1xuICB9XG4gIC8vIFN0ZXAgY2lkcyBhbHJlYWR5IGV4ZWN1dGVkIGlubGluZSBieSB0aGlzIGludm9jYXRpb24uXG4gIGNvbnN0IGV4ZWN1dGVkU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBTdGVwcyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgc2VudCBhIHF1ZXVlIG1lc3NhZ2UuXG4gIGNvbnN0IHF1ZXVlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gQWJvcnRzIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHJlY29yZGVkIChob29rX3JlY2VpdmVkIHdyaXR0ZW4pLlxuICAvLyBHdWFyZHMgYWdhaW5zdCByZS1yZWNvcmRpbmcgd2hlbiB0aGUgVk0tc2lkZSBmbGFnIGhhcyBub3QgYmVlblxuICAvLyBjbGVhcmVkIHlldCB3aXRoaW4gdGhlIHNhbWUgaXRlcmF0aW9uLlxuICBjb25zdCByZWNvcmRlZEFib3J0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFdhaXRzIGZvciB3aGljaCBUSElTIGludm9jYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQvc2NoZWR1bGVkIHdvcmsuXG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIElubGluZS1vd25lcnNoaXAgc3RhdGUgcGVyIHN0ZXAgY29ycmVsYXRpb25JZCwgZGVyaXZlZCBmcm9tIGV2ZXJ5XG4gIC8vIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBvYnNlcnZlcyAoaW5pdGlhbCBsb2cgKyBldmVyeSBmZWVkKTogdGhlXG4gIC8vIHF1aWNranMgYW5hbG9nIG9mIHRoZSByZXBsYXktZGVyaXZlZCBvd25lcnNoaXAgb24gdGhlIG5vZGUgZW5naW5lJ3NcbiAgLy8gU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gKHNlZSBzdGVwLW93bmVyc2hpcC50cykuIExhdGVzdC13aW5zOlxuICAvLyBldmVudHMgYXJyaXZlIGluIGxvZyBvcmRlciwgc28gYSBsYXRlciBzdGVwX3N0YXJ0ZWQgb3ZlcndyaXRlcyB0aGVcbiAgLy8gc3RhbXA7IGEgc3RlcF9yZXRyeWluZyBsYXBzZXMgb3duZXJzaGlwIHBlcm1hbmVudGx5IGZvciB0aGUgaWQuXG4gIGNvbnN0IHN0ZXBPd25lcnNoaXAgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IG93bmVyPzogc3RyaW5nOyBzdGFydGVkQXRNcz86IG51bWJlcjsgc2F3UmV0cnlpbmc6IGJvb2xlYW4gfVxuICA+KCk7XG4gIGNvbnN0IG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAgPSAob2JzZXJ2ZWQ6IEV2ZW50W10pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb2JzZXJ2ZWQpIHtcbiAgICAgIGlmIChlLmNvcnJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBlICYmXG4gICAgICAgICAgZS5ldmVudERhdGEgJiZcbiAgICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHByaW9yID0gc3RlcE93bmVyc2hpcC5nZXQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgc3RlcE93bmVyc2hpcC5zZXQoZS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgc3RhcnRlZEF0TXM6IGUuY3JlYXRlZEF0ID8gK25ldyBEYXRlKGUuY3JlYXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzYXdSZXRyeWluZzogcHJpb3I/LnNhd1JldHJ5aW5nID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJykge1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIC4uLihwcmlvciA/PyB7fSksXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcChldmVudHMpO1xuICBjb25zdCBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhJbmxpbmVTdGVwcyA9IGdldE1heElubGluZVN0ZXBzKCk7XG4gIGNvbnN0IGJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcbiAgY29uc3Qgd29ya2Zsb3dTdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA/ICt3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA6IERhdGUubm93KCk7XG4gIGNvbnN0IHJvb3RSdW5JZCA9XG4gICAgKHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LltcbiAgICAgIFJPT1RfUlVOX0lEX0FUVFJJQlVURVxuICAgIF0gPz8gcnVuSWQ7XG4gIGxldCBpbmxpbmVTdGVwc0V4ZWN1dGVkID0gMDtcbiAgbGV0IHJ1bkdvbmUgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gdGhpcyBpbnZvY2F0aW9uIHdyb3RlIGFuIGV2ZW50IHRoZSB3b3JrZmxvdyBtdXN0IGNvbnN1bWUgdG9cbiAgLy8gbWFrZSBwcm9ncmVzcyAoYXR0cl9zZXQsIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkKSBhbmQgdGhlXG4gIC8vIGxvb3AgaGFzIG5vdCB5ZXQgcmVhZCBpdCBiYWNrLCBzaW5jZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZ3MgY2FuXG4gIC8vIHJldHVybiAwIG5ldyBldmVudHMgcmlnaHQgYWZ0ZXIgYSB3cml0ZS4gSWYgaXQgaXMgc3RpbGwgc2V0IHdoZW4gdGhlXG4gIC8vIGxvb3AgZXhpdHMgc3VzcGVuZGVkLCB0aGUgZW50cnlwb2ludCByZXF1ZXVlcyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gIC8vIGV4aXRpbmcgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCB0aGUgdW5ibG9ja2luZyBldmVudCBhbHJlYWR5IHdyaXR0ZW5cbiAgLy8gYW5kIG5vdGhpbmcgc2NoZWR1bGVkIHRvIHJlYWQgaXQuXG4gIGxldCBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IGZhbHNlO1xuXG4gIC8qKiBGZXRjaCBhbGwgZXZlbnRzIG5vdCB5ZXQgcHJvY2Vzc2VkIGJ5IHRoZSBsaXZlIFZNIChsb2cgb3JkZXIpLiAqL1xuICBjb25zdCBmZXRjaFVuc2VlbkV2ZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEV2ZW50W10+ID0+IHtcbiAgICBjb25zdCB1bnNlZW46IEV2ZW50W10gPSBbXTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGUgb2YgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBpZiAoZS5ldmVudElkICYmIHNlZW5FdmVudElkcy5oYXMoZS5ldmVudElkKSkgY29udGludWU7XG4gICAgICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgdW5zZWVuLnB1c2goZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cbiAgICBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwKHVuc2Vlbik7XG4gICAgcmV0dXJuIHVuc2VlbjtcbiAgfTtcblxuICB0cnkge1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgIHdoaWxlIChyZXN1bHQuc3VzcGVuZGVkICYmICFydW5Hb25lICYmICFidWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgaXRlcmF0aW9uKys7XG4gICAgICAvLyBSZS1jaGVjayB0aGUgZXZlbnQgY2VpbGluZyBldmVyeSB0dXJuOiB0aGUgbG9vcCBhcHBlbmRzIGV2ZW50cyBvblxuICAgICAgLy8gZWFjaCBjb250aW51ZVdpdGhFdmVudHMsIHNvIGEgc2luZ2xlIGludm9jYXRpb24gY2FuIG90aGVyd2lzZSBncm93XG4gICAgICAvLyB0aGUgbG9nIGFyYml0cmFyaWx5IGZhciBwYXN0IHRoZSBvcGVyYXRvcidzIGxpbWl0ICh0aGUgbm9kZSBlbmdpbmVcbiAgICAgIC8vIHJlLWNoZWNrcyBwZXIgcmVwbGF5IGZvciB0aGUgc2FtZSByZWFzb24pLiBgc2VlbkV2ZW50SWRzYCBjb3VudHNcbiAgICAgIC8vIGV2ZXJ5IGV2ZW50IHRoaXMgaW52b2NhdGlvbiBoYXMgb2JzZXJ2ZWQ6IGluaXRpYWwgbG9nICsgYWxsXG4gICAgICAvLyBmZWVkcy5cbiAgICAgIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIHNlZW5FdmVudElkcy5zaXplID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKHNlZW5FdmVudElkcy5zaXplLCBtYXhFdmVudHNMaW1pdCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwZW5kaW5nT3BlcmF0aW9ucyA9IHJlc3VsdC5zdXNwZW5kZWQucGVuZGluZ09wZXJhdGlvbnM7XG5cbiAgICAgIC8vIFNlbGVjdCB0aGlzIHR1cm4ncyBpbmxpbmUgY2FuZGlkYXRlcyBCRUZPUkUgZGlzcGF0Y2g6IGZyZXNoIHN0ZXBzXG4gICAgICAvLyAobm8gc3RlcF9jcmVhdGVkIHlldCkgdGhhdCB0aGlzIGludm9jYXRpb24gaGFzbid0IGFscmVhZHkgaGFuZGxlZC5cbiAgICAgIC8vIFRoZWlyIHN0ZXBfY3JlYXRlZCBpcyBkZWxpYmVyYXRlbHkgTk9UIHdyaXR0ZW4gYnkgZGlzcGF0Y2g6IHRoZVxuICAgICAgLy8gaW5saW5lIGNsYWltIGJlbG93IGlzIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmcgdGhlIGlucHV0LFxuICAgICAgLy8gd2hpY2ggdGhlIHdvcmxkIGFwcGxpZXMgYXMgYW4gYXRvbWljIGNyZWF0ZS1jbGFpbS4gQSBjb25jdXJyZW50XG4gICAgICAvLyBpbnZvY2F0aW9uIHJhY2luZyBvbiB0aGUgc2FtZSBmcmVzaCBzdGVwIGxvc2VzIHRoYXQgY2xhaW0gd2l0aFxuICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciBhbmQgc2tpcHMsIHNvIHN0ZXAgYm9kaWVzIGNhbm5vdCBkb3VibGUtcnVuXG4gICAgICAvLyAocHJldmlvdXNseSBib3RoIGludm9jYXRpb25zIGJhcmUtc3RhcnRlZCB0aGUgc3RlcCBhZnRlciBvbmUgbG9zdFxuICAgICAgLy8gdGhlIHN3YWxsb3dlZCBzdGVwX2NyZWF0ZWQgcmFjZSkuXG4gICAgICBjb25zdCBmcmVzaFN0ZXBzID0gcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3ApOiBvcCBpcyBQZW5kaW5nU3RlcCA9PlxuICAgICAgICAgIG9wLnR5cGUgPT09ICdzdGVwJyAmJlxuICAgICAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICAgICAhZXhlY3V0ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICFxdWV1ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcbiAgICAgIC8vIFN0ZXBzIHdob3NlIGlucHV0IHJlZnVzZWQgdG8gc2VyaWFsaXplIChzZWVcbiAgICAgIC8vIFBlbmRpbmdTdGVwLnNlcmlhbGl6YXRpb25FcnJvcikgbmV2ZXIgZXhlY3V0ZTogdGhleSBtdXN0IG5vdCBiZVxuICAgICAgLy8gaW5saW5lLWNsYWltZWQgKGEgbGF6eSBzdGVwX3N0YXJ0ZWQgd291bGQgbmVlZCB0aGUgaW5wdXQgdGhhdFxuICAgICAgLy8gZmFpbGVkKSBub3IgcXVldWVkLiBEaXNwYXRjaCBiZWxvdyBmaW5hbGl6ZXMgdGhlbSBhcyBzdGVwX2NyZWF0ZWRcbiAgICAgIC8vICsgc3RlcF9mYWlsZWQgaW5zdGVhZDsgb25seSBoZWFsdGh5IHN0ZXBzIGNvbXBldGUgZm9yIGlubGluZVxuICAgICAgLy8gc2xvdHMgYW5kIG92ZXJmbG93LlxuICAgICAgY29uc3QgaGVhbHRoeVN0ZXBzID0gZnJlc2hTdGVwcy5maWx0ZXIoXG4gICAgICAgIChzdGVwKSA9PiAhc3RlcC5zZXJpYWxpemF0aW9uRXJyb3JcbiAgICAgICk7XG4gICAgICBjb25zdCBpbmxpbmVDYW5kaWRhdGVzID1cbiAgICAgICAgbWF4SW5saW5lU3RlcHMgPD0gMCA/IFtdIDogaGVhbHRoeVN0ZXBzLnNsaWNlKDAsIG1heElubGluZVN0ZXBzKTtcbiAgICAgIGNvbnN0IGlubGluZUNsYWltQ2lkcyA9IG5ldyBTZXQoXG4gICAgICAgIGlubGluZUNhbmRpZGF0ZXMubWFwKChzdGVwKSA9PiBzdGVwLmNvcnJlbGF0aW9uSWQpXG4gICAgICApO1xuXG4gICAgICAvLyAxLiBEdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHMuXG4gICAgICBjb25zdCBvcHNUb0Rpc3BhdGNoID0gcGVuZGluZ09wZXJhdGlvbnMubWFwKChvcCkgPT5cbiAgICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAgIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQgJiZcbiAgICAgICAgcmVjb3JkZWRBYm9ydElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICAgICA/ICh7IC4uLm9wLCBhYm9ydFJlcXVlc3RlZDogZmFsc2UgfSBhcyBQZW5kaW5nT3BlcmF0aW9uKVxuICAgICAgICAgIDogb3BcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycgJiYgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICAgIHJlY29yZGVkQWJvcnRJZHMuYWRkKG9wLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgYXJlIGhhbmRlZCB0byB0aGUgcXVldWUgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIGlzIHdyaXR0ZW4uIFdoZXJlIGVsaWdpYmxlLCB0aGUgZGlzcGF0Y2hcbiAgICAgIC8vIGJlbG93IHBhcmFsbGVsaXplcyBlYWNoIG92ZXJmbG93IHN0ZXAncyBzdGVwX2NyZWF0ZWQgd3JpdGUgd2l0aFxuICAgICAgLy8gaXRzIHF1ZXVlIHB1Ymxpc2ggKHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgbWVzc2FnZSBjYXJyaWVzXG4gICAgICAvLyBgc3RlcElucHV0YCBzbyB0aGUgY29uc3VtZXIgY2FuIHJlLWVuc3VyZSB0aGUgZXZlbnQpOyB0aGUgcmVzdFxuICAgICAgLy8gYXJlIHF1ZXVlZCByaWdodCBhZnRlciwgaW4gcGFyYWxsZWwuIFRoaXMgbXVzdCBhbGwgaGFwcGVuIEJFRk9SRVxuICAgICAgLy8gdGhlIGV2ZW50IGZlZWQgYmVsb3c6IHRoZSBmZWVkIGFsd2F5cyBvYnNlcnZlcyB0aG9zZVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIHdyaXRlcyBhcyB1bnNlZW4gZXZlbnRzIGFuZCBgY29udGludWVgcywgc28gYVxuICAgICAgLy8gaGFuZG9mZiBwbGFjZWQgYWZ0ZXIgaXQgaXMgdW5yZWFjaGFibGUgb24gdGhlIG9ubHkgaXRlcmF0aW9uXG4gICAgICAvLyB0aGF0IHN0aWxsIGNsYXNzaWZpZXMgdGhlc2Ugc3RlcHMgYXMgZnJlc2g6IG5leHQgdHVybiB0aGV5IGNhcnJ5XG4gICAgICAvLyBoYXNDcmVhdGVkRXZlbnQgYW5kIHdvdWxkIG5ldmVyIGJlIHF1ZXVlZCBhdCBhbGwgKHRoZSB3ZWRnZSBiZWhpbmRcbiAgICAgIC8vIHByb21pc2VSYWNlU3RyZXNzVGVzdFdvcmtmbG93IGhhbmdpbmcgaW4gdGhlIHF1aWNranMgQ0kgbGVncykuIFRoZVxuICAgICAgLy8gc3RlcC1pZGVudGl0eS1zY29wZWQgaWRlbXBvdGVuY3kga2V5IG1ha2VzIHJlcGVhdHMgaGFybWxlc3MuXG4gICAgICBjb25zdCBvdmVyZmxvd1N0ZXBzID0gaGVhbHRoeVN0ZXBzLnNsaWNlKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZWQgPSBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICB3b3JsZCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiBvcHNUb0Rpc3BhdGNoLFxuICAgICAgICBza2lwU3RlcENyZWF0aW9uOiBpbmxpbmVDbGFpbUNpZHMsXG4gICAgICAgIHF1ZXVlU3RlcENpZHM6IG5ldyBTZXQob3ZlcmZsb3dTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZCkpLFxuICAgICAgICBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcHM6IHRydWUsXG4gICAgICAgIHdmZGlhZyxcbiAgICAgIH0pO1xuICAgICAgaWYgKFxuICAgICAgICBkaXNwYXRjaGVkLmNyZWF0ZWRBdHRyaWJ1dGVFdmVudCB8fFxuICAgICAgICBkaXNwYXRjaGVkLmNyZWF0ZWRHZXRDb25mbGljdEhvb2tcbiAgICAgICkge1xuICAgICAgICBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBBIGZpbmFsaXplZCB1bnNlcmlhbGl6YWJsZSBzdGVwIGhhcyB0ZXJtaW5hbCBldmVudHMgZHVyYWJseVxuICAgICAgLy8gd3JpdHRlbiBidXQgbm8gZXhlY3V0aW9uIG1lc3NhZ2UgYW55d2hlcmU6IGlmIHRoZSBmZWVkIGJlbG93XG4gICAgICAvLyBkb2Vzbid0IHN1cmZhY2UgdGhlbSAoZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcpIGFuZCB0aGUgbG9vcFxuICAgICAgLy8gZXhpdHMsIG5vdGhpbmcgd291bGQgZXZlciByZS1pbnZva2UgdGhlIHJ1biB0byBvYnNlcnZlIHRoZVxuICAgICAgLy8gZmFpbHVyZS4gUmFpc2UgdGhlIHJlcXVldWUgc2lnbmFsIChzYW1lIG1lY2hhbmlzbSBhcyBpbmxpbmVcbiAgICAgIC8vIHRlcm1pbmFscykgYW5kIG1hcmsgdGhlIHN0ZXBzIGhhbmRsZWQgc28gbGF0ZXIgdHVybnMgZG9uJ3RcbiAgICAgIC8vIHJlLWZpbmFsaXplIG9yIGJhY2tzdG9wLXF1ZXVlIHRoZW0uXG4gICAgICBpZiAoZGlzcGF0Y2hlZC5mYWlsZWRTZXJpYWxpemF0aW9uU3RlcENpZHMuc2l6ZSA+IDApIHtcbiAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IGNpZCBvZiBkaXNwYXRjaGVkLmZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcykge1xuICAgICAgICAgIGV4ZWN1dGVkU3RlcElkcy5hZGQoY2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBvZiBkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzKSB7XG4gICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKGNpZCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3ZlcmZsb3dTdGVwc1xuICAgICAgICAgIC5maWx0ZXIoKHN0ZXApID0+ICFkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKVxuICAgICAgICAgIC5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgcHVycG9zZTogJ2Rpc3BhdGNoJyxcbiAgICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzLCBzbyBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQsIHNvIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cyksXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgLy8gICAgIG9yaWdpbmFsIGhhbmRvZmYuXG4gICAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcE9wcykge1xuICAgICAgICBpZiAoIXN0ZXAuaGFzQ3JlYXRlZEV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChxdWV1ZWRTdGVwSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwID0gc3RlcE93bmVyc2hpcC5nZXQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICBvd25lcnNoaXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIG93bmVyc2hpcC5vd25lciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgIW93bmVyc2hpcC5zYXdSZXRyeWluZztcbiAgICAgICAgbGV0IGxlYXNlUmVtYWluaW5nU2Vjb25kcyA9IDA7XG4gICAgICAgIGlmIChvd25lcnNoaXBBY3RpdmUgJiYgb3duZXJzaGlwLnN0YXJ0ZWRBdE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBsZWFzZVNlY29uZHMgPSBnZXRJbmxpbmVPd25lcnNoaXBMZWFzZVNlY29uZHMoKTtcbiAgICAgICAgICBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGxlYXNlU2Vjb25kcyxcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgKG93bmVyc2hpcC5zdGFydGVkQXRNcyArIGxlYXNlU2Vjb25kcyAqIDEwMDAgLSBub3dNcykgLyAxMDAwXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IG93bmVyTWVzc2FnZUlkICYmXG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbGVhc2VSZW1haW5pbmdTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6IGBiYWNrc3RvcDoke293bmVyc2hpcC5zdGFydGVkQXRNc31gLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIGluLXByb2Nlc3MgcHJvZ3Jlc3MgcG9zc2libGU6IHRoZSBydW4gYXdhaXRzIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIHN0aW11bHVzIChob29rIHBheWxvYWQsIHF1ZXVlZCBzdGVwLCB3YWl0IHRpbWVyKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIFJhY2luZyB0aW1lcnMgbXVzdCBmaXJlIG9uIHRpbWUgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2sgdGhpc1xuICAgICAgLy8gaW52b2NhdGlvbjogZW5xdWV1ZSBhIGRlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdFxuICAgICAgLy8gcGVuZGluZyB3YWl0IChhIHNlcGFyYXRlIGludm9jYXRpb24gd3JpdGVzIGl0cyB3YWl0X2NvbXBsZXRlZCBhdFxuICAgICAgLy8gdGhlIHJpZ2h0IGxvZyBwb3NpdGlvbiwgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyB3YWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaCkuXG4gICAgICBsZXQgc29vbmVzdFdhaXQ6IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBzZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgLy8gV2FpdHMgd2hvc2Ugd2FpdF9jb21wbGV0ZWQgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgd3JvdGUgKHRoZVxuICAgICAgICAvLyBlbGFwc2VkLXdhaXQgcGFzcyBhYm92ZSkgYXJlIGRvbmU6IHRoZSBldmVudCBqdXN0IGhhc24ndCBmZWRcbiAgICAgICAgLy8gYmFjayBpbnRvIHRoZSBWTSB5ZXQuIE5vIGNvbnRpbnVhdGlvbiBuZWVkZWQuXG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQW4gYWxyZWFkeS1lbGFwc2VkIHdhaXQgTVVTVCBzdGlsbCBnZXQgYSBjb250aW51YXRpb24gKGNsYW1wZWRcbiAgICAgICAgLy8gdG8gdGhlIDFzIG1pbmltdW0sIGV4YWN0bHkgbGlrZSB0aGUgbm9kZSBlbmdpbmUnc1xuICAgICAgICAvLyBgTWF0aC5tYXgoMTAwMCwgcmVzdW1lQXRNcyAtIG5vdylgKSwgbm90IGJlIHNraXBwZWQ6IGEgd2FpdFxuICAgICAgICAvLyB3aG9zZSBkZWFkbGluZSBmYWxscyBiZXR3ZWVuIHRoaXMgaXRlcmF0aW9uJ3MgZWxhcHNlZC13YWl0XG4gICAgICAgIC8vIHBhc3MgKHdoaWNoIHNhdyBpdCBhcyBzdGlsbCBwZW5kaW5nIGFuZCB3cm90ZSBub3RoaW5nKSBhbmRcbiAgICAgICAgLy8gdGhpcyBzd2VlcCB3b3VsZCBvdGhlcndpc2UgZ2V0IE5FSVRIRVIgYSB3YWl0X2NvbXBsZXRlZCBOT1IgYVxuICAgICAgICAvLyBjb250aW51YXRpb24sIGFuZCB0aGUgaW5saW5lIGJhdGNoIGJlbG93IHRoZW4gYmxvY2tzIHRoaXNcbiAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiB3aXRoIG5vIHdha2UgYXJtZWRcbiAgICAgICAgLy8gYW55d2hlcmUuIEZvciBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgdGhhdCBzaWxlbnRseSBoYW5kc1xuICAgICAgICAvLyB0aGUgcmFjZSB0byB0aGUgc3RlcDogdGhlIHNsZWVwJ3Mgd2FpdF9jb21wbGV0ZWQgaXMgbmV2ZXJcbiAgICAgICAgLy8gd3JpdHRlbiBhbmQgdGhlIHJ1biBjb21wbGV0ZXMgd2l0aCB0aGUgd3Jvbmcgd2lubmVyLiBUaGVcbiAgICAgICAgLy8gd2luZG93IGJldHdlZW4gdGhlIHR3byBjaGVja3Mgc3BhbnMgdGhpcyBpdGVyYXRpb24ncyBkaXNwYXRjaFxuICAgICAgICAvLyArIGZlZWQgcm91bmQtdHJpcHMsIHNvIG9uIG5ldHdvcmstYmFja2VkIHdvcmxkcyAod29ybGQtdmVyY2VsKVxuICAgICAgICAvLyBhIHNob3J0IHNsZWVwIGxhbmRzIGluIGl0IHJvdXRpbmVseSwgb2JzZXJ2ZWQgYXMgYSB+NTAlXG4gICAgICAgIC8vIHNsZWVwV2luc1JhY2VXb3JrZmxvdyBmYWlsdXJlIHJhdGUgaW4gdGhlIFZlcmNlbCBlMmUgbGVncyxcbiAgICAgICAgLy8gd2hpbGUgd29ybGQtbG9jYWwncyBzdWItbXMgcm91bmQtdHJpcHMgbWFza2VkIGl0IGxvY2FsbHkuIFRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gaW52b2NhdGlvbidzIHByZS1WTSBlbGFwc2VkIGNoZWNrIHdyaXRlcyB0aGVcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQgfjFzIGxhdGVyLlxuICAgICAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7IGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCwgc2Vjb25kcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gbmV4dFdhaXRDb250aW51YXRpb25BdHRlbXB0KHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHdhaXRDb250aW51YXRpb246IHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICAgICAgc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIERhdGUubm93KCksXG4gICAgICAgICAgICBhdHRlbXB0XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ3dhaXRfY29udGludWF0aW9uX3NjaGVkdWxlZCcsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGRlbGF5U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIGJhdGNoIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5IGJ1ZGdldCBpc1xuICAgICAgLy8gcGF1c2VkIHdoaWxlIHN0ZXAgYm9kaWVzIHJ1bjogc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZVxuICAgICAgLy8gcGxhdGZvcm0gZnVuY3Rpb24gZHVyYXRpb24sIG5vdCB0aGUgcmVwbGF5IHRpbWVvdXQuIE5PVEUgKGJ5XG4gICAgICAvLyBkZXNpZ24pOiB3aXRoIHRoZSBidWRnZXQgcGFya2VkIHBlciBiYXRjaCwgdGhlIG9ubHkgYm91bmQgb24gaG93XG4gICAgICAvLyBtYW55IGlubGluZSBzdGVwcyBvbmUgaW52b2NhdGlvbiBjYW4gY2hhaW4gaXMgdGhlIHBsYXRmb3JtJ3NcbiAgICAgIC8vIGZ1bmN0aW9uIHRpbWVvdXQ6IHRoZSBTREsgZGVsaWJlcmF0ZWx5IGltcG9zZXMgbm8gY2FwIG9mIGl0c1xuICAgICAgLy8gb3duLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoZXJlIGEgbG9uZyBzZXF1ZW50aWFsXG4gICAgICAvLyB3b3JrZmxvdyBsaWtld2lzZSBydW5zIHN0ZXAtYnktc3RlcCB1bnRpbCB0aGUgcGxhdGZvcm0gcmVjbGFpbXNcbiAgICAgIC8vIHRoZSBpbnZvY2F0aW9uIGFuZCBhIHJlZGVsaXZlcnkgcmVzdW1lcyBmcm9tIHRoZSBsb2cuXG4gICAgICBidWRnZXQucGF1c2UoKTtcbiAgICAgIGxldCBvdXRjb21lczogU3RlcEV4ZWN1dGlvblJlc3VsdFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3V0Y29tZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT5cbiAgICAgICAgICAgIHJ1blN0ZXBTaW5nbGVGbGlnaHQocnVuSWQsIHN0ZXAuY29ycmVsYXRpb25JZCwgKCkgPT5cbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkLFxuICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgY2xhaW06IHN0ZXBfY3JlYXRlZCBpcyBkZWZlcnJlZCAoZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgaXQpIGFuZCB0aGlzIHN0ZXBfc3RhcnRlZCBjYXJyaWVzIHRoZSBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIGF0b21pY2FsbHk6XG4gICAgICAgICAgICAgICAgICAvLyBleGFjdGx5LW9uZS1vd25lci4gQSBjb25jdXJyZW50IGNsYWltYW50IGdldHNcbiAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHsgdHlwZTogJ3NraXBwZWQnIH0gYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSBib2R5LiBNaXJyb3JzIHRoZSBub2RlIGVuZ2luZSdzIGlubGluZSBwYXRoLlxuICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHN0YW1wOiB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5IGFzIGluXG4gICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgaW4gdGhpcyBpbnZvY2F0aW9uIGFuZCBhcm0gYSBkZWxheWVkIGJhY2tzdG9wXG4gICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgdGhlIHN0ZXAuXG4gICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb246IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0LlxuICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgfSkpKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidWRnZXQucmVzdW1lKCk7XG4gICAgICB9XG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkICs9IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGlubGluZUNhbmRpZGF0ZXNbaV07XG4gICAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lc1tpXTtcbiAgICAgICAgZXhlY3V0ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBpZiAob3V0Y29tZS50eXBlID09PSAncmV0cnknIHx8IG91dGNvbWUudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAvLyBIYW5kIHRoZSBzdGVwIHRvIHRoZSBxdWV1ZSB3aXRoIHRoZSByZXF1ZXN0ZWQgYmFja29mZjpcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kIGRlbGl2ZXJ5IGRyaXZlcyB0aGUgcmV0cnkgZnJvbSBoZXJlLlxuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBvdXRjb21lLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVkIGtleTogdGhpcyBzdGVwIHdhcyBpbmxpbmUtY2xhaW1lZCwgc28gbm8gZGlzcGF0Y2hcbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggZXhpc3RzIHVuZGVyIHRoZSBkaXNwYXRjaCBrZXksIGJ1dCBzdWZmaXhpbmdcbiAgICAgICAgICAgIC8vIGtlZXBzIHRoZSByZXRyeSBlbnF1ZXVlYWJsZSBldmVuIGlmIGEgd29ybGQgcmV0aXJlZCBhXG4gICAgICAgICAgICAvLyBoaXN0b3JpY2FsIGtleSBmb3IgdGhpcyBzdGVwIChzZWUgdGhlIHB1cnBvc2UgZG9jcyBhYm92ZSkuXG4gICAgICAgICAgICBwdXJwb3NlOiAncmV0cnk6MScsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZS50eXBlID09PSAnZ29uZScpIHtcbiAgICAgICAgICBydW5Hb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAnc2tpcHBlZCc6IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdvbiB0aGUgbGF6eSBjcmVhdGUtY2xhaW0gYW5kXG4gICAgICAgIC8vIG93bnMgdGhlIGJvZHkuIE1hcmtlZCBleGVjdXRlZCBhYm92ZSBzbyB0aGlzIGludm9jYXRpb24gbmV2ZXJcbiAgICAgICAgLy8gcmUtY2xhaW1zIGl0OyB0aGUgd2lubmVyJ3MgdGVybWluYWwgZXZlbnRzIGFycml2ZSB2aWEgdGhlIGZlZWRcbiAgICAgICAgLy8gKG9yIGRyaXZlIGEgc2VwYXJhdGUgaW52b2NhdGlvbikuXG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2lubGluZV9zdGVwc19leGVjdXRlZCcsIHtcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBjb3VudDogaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWVzOiBvdXRjb21lcy5tYXAoKG8pID0+IG8udHlwZSksXG4gICAgICB9KTtcblxuICAgICAgLy8gRmVlZCB0aGUgaW5saW5lIGJhdGNoJ3MgdGVybWluYWwgZXZlbnRzIGludG8gdGhlIGxpdmUgVk0uIFdoZW5cbiAgICAgIC8vIHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBoYXMgbm90IHN1cmZhY2VkIHRoZW0geWV0LFxuICAgICAgLy8gZXhpdGluZyBtdXN0IE5PVCBhY2sgc2lsZW50bHk6IHRoZSB0ZXJtaW5hbHMgdGhpcyBpbnZvY2F0aW9uIGp1c3RcbiAgICAgIC8vIGNhdXNlZCBhcmUgZHVyYWJseSB3cml0dGVuIHdpdGggbm8gcXVldWUgbWVzc2FnZSBsZWZ0IHRvIGNvbnN1bWVcbiAgICAgIC8vIHRoZW0gKGlubGluZSBzdGVwcyBoYXZlIG5vbmUpLCBzbyBhbiBhd2FpdGluZ19leHRlcm5hbCBleGl0IHdvdWxkXG4gICAgICAvLyBwYXJrIHRoZSBydW4gJ3J1bm5pbmcnIHdpdGggYWxsIGl0cyBzdGVwcyBjb21wbGV0ZS4gUmFpc2UgdGhlXG4gICAgICAvLyByZXF1ZXVlIHNpZ25hbCBzbyB0aGUgc3VzcGVuZGVkIGV4aXQgc2NoZWR1bGVzIGEgZnJlc2ggaW1tZWRpYXRlXG4gICAgICAvLyBpbnZvY2F0aW9uIHdob3NlIGZyZXNoIHJlYWQgcGlja3MgdGhlIHRlcm1pbmFscyB1cC4gT3V0Y29tZXMgdGhhdFxuICAgICAgLy8gd3JvdGUgbm8gdGVybWluYWwgKCdza2lwcGVkJzogYSBjb25jdXJyZW50IGNsYWltYW50IG93bnMgdGhlXG4gICAgICAvLyBib2R5OyAnZ29uZScsIHJldHJ5L3Rocm90dGxlZDogYSBxdWV1ZSBtZXNzYWdlIGV4aXN0cykgZG9uJ3RcbiAgICAgIC8vIG5lZWQgaXQsIGJ1dCBzaWduYWxpbmcgb24gdGhlbSB0b28gb25seSBjb3N0cyBhIG5vLW9wIGludm9jYXRpb25cbiAgICAgIC8vIGluIGFuIGFscmVhZHktcmFyZSBsYWcgd2luZG93LlxuICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgIGlmIChuZXdFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyhuZXdFdmVudHMpO1xuXG4gICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgcGhhc2U6ICdzdGVwcycsXG4gICAgICAgIGZlZEV2ZW50czogbmV3RXZlbnRzLmxlbmd0aCxcbiAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogJ3N1c3BlbmRlZCcsXG4gICAgICAgIGJ1ZGdldEV4aGF1c3RlZDogYnVkZ2V0LmlzRXhoYXVzdGVkKCksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2Vzc2lvbi5kaXNwb3NlKCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0lubGluZVN0ZXBzKGlubGluZVN0ZXBzRXhlY3V0ZWQpLFxuICB9KTtcblxuICBpZiAocmVzdWx0LmNvbXBsZXRlZCkge1xuICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBjb21wbGV0ZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnY29tcGxldGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyAoYWJvcnQgcmVjb3JkaW5ncywgc3lzdGVtLWhvb2tcbiAgICAvLyBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldCBhdHRyaWJ1dGUvaG9vayBldmVudHMpIEJFRk9SRSB3cml0aW5nXG4gICAgLy8gcnVuX2NvbXBsZXRlZC4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zLlxuICAgIC8vIERyYWluIGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQ6IHRoZSB3b3JrZmxvdydzIG93biBvdXRjb21lIGlzIHRoZVxuICAgIC8vIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGlzcGF0Y2hQZW5kaW5nT3BzKHtcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiByZXN1bHQuY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucyxcbiAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignUXVpY2tKUyBydW50aW1lOiB0ZXJtaW5hbCBkcmFpbiBmYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgbWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBydW5fY29tcGxldGVkIGV2ZW50LlxuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIHRoZSB3b3JrZmxvdyByZXN1bHQgYXMgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAvLyAoXCJkZXZsXCIgKyBkZXZhbHVlKSB3aXRoIG5vIGVuY3J5cHRpb24gKHRoZSBWTSBoYXMgbm8gYWNjZXNzIHRvIHRoZVxuICAgIC8vIENyeXB0b0tleSkuIEhvc3Qtc2lkZSBlbmNyeXB0aW9uIGlzIGFwcGxpZWQgaGVyZSBzbyB0aGF0IGBydW5fY29tcGxldGVkYFxuICAgIC8vIGV2ZW50cyBoYXZlIHRoZSBzYW1lIGBlbmNyYC1wcmVmaXhlZCBwYXlsb2FkIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm1cbiAgICAvLyBlbmdpbmUncyBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAgcHJvZHVjZXMuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgb3V0cHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoXG4gICAgICAgICAgICByZXN1bHQuY29tcGxldGVkLnJlc3VsdCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdydW5fY29tcGxldGVkX3dyaXR0ZW4nIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyZXN1bHQuc3VzcGVuZGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgc3RpbGwgc3VzcGVuZGVkIGFmdGVyIHRoZSBpbmxpbmUgbG9vcC4gQWxsIGR1cmFibGUgc2lkZVxuICAgIC8vIGVmZmVjdHMgZm9yIHRoZSBmaW5hbCBzdXNwZW5zaW9uIHN0YXRlIHdlcmUgYWxyZWFkeSBkaXNwYXRjaGVkIGJ5XG4gICAgLy8gdGhlIGxvb3A7IHdoYXQgcmVtYWlucyBpcyBkZWNpZGluZyBob3cgdGhlIHJ1biBnZXRzIHJlLWludm9rZWQuXG4gICAgY29uc3QgeyBwZW5kaW5nT3BlcmF0aW9ucyB9ID0gcmVzdWx0LnN1c3BlbmRlZDtcblxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGlubGluZVN0ZXBzRXhlY3V0ZWQsXG4gICAgICBwZW5kaW5nU3RlcHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnc3RlcCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdXYWl0czogcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09ICd3YWl0JykubGVuZ3RoLFxuICAgICAgcGVuZGluZ09wczogcGVuZGluZ09wZXJhdGlvbnMubWFwKChwKSA9PiAoe1xuICAgICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgICAgLi4uKHAudHlwZSA9PT0gJ3N0ZXAnID8geyBzdGVwSWQ6IChwIGFzIFBlbmRpbmdTdGVwKS5zdGVwSWQgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdzdXNwZW5kZWQnKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTUGVuZGluZ09wc0NvdW50KHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBpZiAocnVuR29uZSkge1xuICAgICAgLy8gVGhlIHJ1biBubyBsb25nZXIgZXhpc3RzIChleHBpcmVkIC8gZGVsZXRlZCksIHNvIG5vdGhpbmcgdG8gZHJpdmUuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdydW5fZ29uZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCByZXF1ZXVlcyBhcmUgRlJFU0ggbWVzc2FnZXMsIG5ldmVyIGEgYHsgdGltZW91dFNlY29uZHMgfWBcbiAgICAvLyB2aXNpYmlsaXR5LXJlZGVsaXZlcnkgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4gUmVkZWxpdmVyaW5nIHRoZVxuICAgIC8vIENVUlJFTlQgbWVzc2FnZSBpcyBhIHRyYXA6IGEgaG9vay1yZXN1bWUgZGVsaXZlcnkgY2Fycmllc1xuICAgIC8vIGBob29rSW5wdXRgLCBhbmQgaXRzIHJlZGVsaXZlcnkgcmUtcnVucyB0aGUgbGF6eS1yZXN1bWUgcmUtZW5zdXJlXG4gICAgLy8gaW4gdGhlIGhhbmRsZXIgcHJvbG9ndWU6IGlmIHRoZSB3b3JrZmxvdyBkaXNwb3NlZCB0aGF0IGhvb2tcbiAgICAvLyBkdXJpbmcgdGhpcyBpbnZvY2F0aW9uIChkaXNwb3NlIOKGkiBzbGVlcCksIGEgd29ybGQgdGhhdCByZWplY3RzXG4gICAgLy8gdGhlIHJlLWVuc3VyZSB3b3VsZCBhY2sgdGhlIG1lc3NhZ2UgYXMgXCJub3RoaW5nIGxlZnQgdG8gcmVzdW1lXCJcbiAgICAvLyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBpdCBjYXJyaWVkIGlzIHNpbGVudGx5IGxvc3QuIEEgZnJlc2ggbWVzc2FnZVxuICAgIC8vIGNhcnJpZXMgb25seSBgcnVuSWRgLCBzbyBpdHMgZGVsaXZlcnkgYWx3YXlzIHJlYWNoZXMgcmVwbGF5IChhbmRcbiAgICAvLyB1bmRlciB0dXJibyBhIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIGFnYWluc3QgYSBzdGFsZVxuICAgIC8vIHByZWxvYWRlZCBsb2c6IHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzIGluIHJ1bnRpbWUudHMpLlxuICAgIGNvbnN0IHJlcXVldWVJbW1lZGlhdGVseSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAoYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIC8vIFRoZSBsb29wIHN0b3BwZWQgb24gdGhlIHJlcGxheSBidWRnZXQgd2l0aCBwcm9ncmVzcyBzdGlsbFxuICAgICAgLy8gcG9zc2libGUsIHNvIGNvbnRpbnVlIGluIGEgZnJlc2ggaW52b2NhdGlvbi5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ2J1ZGdldF9leGhhdXN0ZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGl0IHdhaXQgc3dlZXAuIEEgd2FpdCB0aGF0IGVsYXBzZWQgaW4gdGhlIHdpbmRvdyBzaW5jZSB0aGVcbiAgICAvLyBsb29wJ3MgbGFzdCBjaGVjayByZXF1ZXVlcyBpbW1lZGlhdGVseSAoaXRzIHdhaXRfY29tcGxldGVkIGlzXG4gICAgLy8gd3JpdHRlbiBieSB0aGUgbmV4dCBpbnZvY2F0aW9uJ3MgZWxhcHNlZC13YWl0IHBhc3MpOyBwZW5kaW5nIHdhaXRzXG4gICAgLy8gd2hvc2UgY29udGludWF0aW9uIHRoZSBsb29wIGFscmVhZHkgZW5xdWV1ZWQgYXJlIHNraXBwZWQuXG4gICAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGhhc0VsYXBzZWRXYWl0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICBjb25zdCByZXN1bWVNcyA9IG5ldyBEYXRlKHdhaXQucmVzdW1lQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG4gICAgICBpZiAocmVzdW1lTXMgPD0gMCkge1xuICAgICAgICBoYXNFbGFwc2VkV2FpdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChyZXN1bWVNcyAvIDEwMDApKTtcbiAgICAgICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRWxhcHNlZFdhaXQpIHtcbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3dhaXRfZWxhcHNlZF9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nUmVxdWV1ZVNpZ25hbCkge1xuICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIHdyb3RlIGV2ZW50cyB0aGUgd29ya2Zsb3cgbmVlZHMgdG8gY29uc3VtZVxuICAgICAgLy8gKGF0dHJfc2V0IC8gZ2V0Q29uZmxpY3QtYXdhaXRlZCBob29rX2NyZWF0ZWQgLyBpbmxpbmUgc3RlcFxuICAgICAgLy8gdGVybWluYWxzKSBidXQgdGhlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5nIG5ldmVyIHJldHVybmVkXG4gICAgICAvLyB0aGVtIGJlZm9yZSB0aGUgbG9vcCBleGl0ZWQuIFdpdGhvdXQgYSByZXF1ZXVlIHRoZSBydW4gd291bGRcbiAgICAgIC8vIHBhcmsgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCBpdHMgdW5ibG9ja2luZyBldmVudHMgYWxyZWFkeVxuICAgICAgLy8gZHVyYWJseSB3cml0dGVuIGFuZCBubyBmdXR1cmUgaW52b2NhdGlvbiBjb21pbmcsIHNvIHJlcXVldWVcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIGEgZnJlc2ggcmVhZCBwaWNrcyB0aGVtIHVwLiBJbiB0aGUgY29tbW9uIGNhc2VcbiAgICAgIC8vIHRoZSBsb29wJ3Mgb3duIGZlZWQgb2JzZXJ2ZXMgdGhlIHdyaXRlcyBhbmQgY2xlYXJzIHRoaXMgZmxhZywgc29cbiAgICAgIC8vIHRoaXMgb25seSBmaXJlcyB3aGVuIHRoZSByZWFkIGFjdHVhbGx5IGxhZ2dlZC5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3VucmVhZF9zZWxmX3dyaXRlX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNvb25lc3RXYWl0KSB7XG4gICAgICAvLyBEZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IHRoZSBsb29wIGhhc1xuICAgICAgLy8gbm90IGFscmVhZHkgc2NoZWR1bGVkLiBUaGUgZGlzcGF0Y2ggaGVscGVyIGhhbmRsZXMgZGVsYXlcbiAgICAgIC8vIGNsYW1waW5nIChsb25nIHdhaXRzIGNoYWluIGFjcm9zcyBob3BzKSBhbmQgaWRlbXBvdGVuY3kta2V5XG4gICAgICAvLyBkZWR1cCBvZiByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0LiBTZWVcbiAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywge1xuICAgICAgICBhY3Rpb246ICdzY2hlZHVsZV93YWl0X3RpbWVvdXQnLFxuICAgICAgICB0aW1lb3V0U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgd2FpdENvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmFkZChzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IGF0dGVtcHQgPSBuZXh0V2FpdENvbnRpbnVhdGlvbkF0dGVtcHQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB3YWl0Q29udGludWF0aW9uOiB7XG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIERhdGUubm93KCksXG4gICAgICAgICAgYXR0ZW1wdFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7XG4gICAgICBhY3Rpb246ICdhd2FpdGluZ19leHRlcm5hbCcsXG4gICAgICBwZW5kaW5nT3BzQ291bnQ6IHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQuZmFpbGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgZmFpbGVkLCBzbyByZW1hcCBzdGFjayB0cmFjZSB1c2luZyBpbmxpbmUgc291cmNlIG1hcHMuXG4gICAgLy8gRnJhbWVzIGNhcnJ5IHRoZSBydW4ncyB3b3JrZmxvd0lkIGFzIHRoZWlyIGZpbGVuYW1lIG9uIHRoZSBmcmVzaFxuICAgIC8vIHBhdGgsIGJ1dCB0aGUgd29ya2Zsb3ctaW5kZXBlbmRlbnQgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FIG9uIHRoZVxuICAgIC8vIHNuYXBzaG90IHBhdGggKHRoZSBuYW1lIGlzIGJha2VkIGludG8gdGhlIHNoYXJlZCBiYXNlbGluZSdzXG4gICAgLy8gY29tcGlsZWQgY29kZSBhdCBoeWRyYXRlKSwgc28gcmVtYXAgYWdhaW5zdCBib3RoLiByZW1hcEVycm9yU3RhY2tcbiAgICAvLyBlYXJseS1leGl0cyBvbiBhIGNoZWFwIGluY2x1ZGVzKCkgd2hlbiBhIGZpbGVuYW1lIGhhcyBubyBmcmFtZXMuXG4gICAgbGV0IGVycm9yU3RhY2sgPSByZXN1bHQuZmFpbGVkLnN0YWNrO1xuICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soZXJyb3JTdGFjaywgZmlsZW5hbWUsIHdvcmtmbG93Q29kZSk7XG4gICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3Igc28gY29uc3VtZXJzIChgcnVuLnJldHVyblZhbHVlYCwgb2JzZXJ2YWJpbGl0eSlcbiAgICAvLyBnZXQgYFVTRVJfRVJST1JgIC8gYFJVTlRJTUVfRVJST1JgIG9uIGBlcnJvci5jYXVzZS5jb2RlYCwgbWF0Y2hpbmdcbiAgICAvLyB3aGF0IHRoZSBub2RlOnZtIGVuZ2luZSBhbHJlYWR5IGRvZXMgaW4gcnVudGltZS50cy5cbiAgICAvL1xuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIGVycm9ycyBhcyBgeyBuYW1lLCBtZXNzYWdlLCBzdGFjayB9YCwgc28gd2VcbiAgICAvLyByZWNvbnN0cnVjdCBhIGhvc3Qtc2lkZSBFcnJvciBvZiB0aGUgY29ycmVjdCBjbGFzcyBiYXNlZCBvbiB0aGVcbiAgICAvLyBWTS1zaWRlIGBuYW1lYDogc3BlY2lmaWMgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3NlcyBuZWVkXG4gICAgLy8gdG8gYmUgcHJlc2VydmVkIHNvIGNsYXNzaWZ5UnVuRXJyb3IoKSB0YWdzIHRoZW0gYXMgUlVOVElNRV9FUlJPUi5cbiAgICBjb25zdCByZWNvbnN0cnVjdGVkOiBFcnJvciA9XG4gICAgICByZXN1bHQuZmFpbGVkLm5hbWUgPT09ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcidcbiAgICAgICAgPyBuZXcgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3Iod29ya2Zsb3dOYW1lKVxuICAgICAgICA6IHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICAgID8gbmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSlcbiAgICAgICAgICA6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihyZWNvbnN0cnVjdGVkKTtcblxuICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgZmFpbGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBlcnJvck5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0LmZhaWxlZC5tZXNzYWdlLFxuICAgICAgZXJyb3JTdGFjayxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnZmFpbGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyBiZWZvcmUgd3JpdGluZyBydW5fZmFpbGVkLFxuICAgIC8vIHNhbWUgZHJhaW4gc2VtYW50aWNzIGFzIHRoZSBjb21wbGV0ZWQgYnJhbmNoLlxuICAgIGlmIChyZXN1bHQuZmFpbGVkLmRyYWluT3BlcmF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdRdWlja0pTIHJ1bnRpbWU6IHRlcm1pbmFsIGRyYWluIGZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBtZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJ1bl9mYWlsZWQgZXZlbnQuIFNlcmlhbGl6ZSB0aGUgZXJyb3IgdGhyb3VnaCB0aGVcbiAgICAvLyBmaXJzdC1jbGFzcyBkZWh5ZHJhdGlvbiBwaXBlbGluZSBzbyBjb25zdW1lcnMgKENMSSwgb2JzZXJ2YWJpbGl0eSxcbiAgICAvLyBydW4ucmV0dXJuVmFsdWUpIGdldCB0aGUgc2FtZSBoeWRyYXRlZCB2YWx1ZSBzaGFwZSBhcyB0aGUgbm9kZTp2bVxuICAgIC8vIGVuZ2luZSBlbWl0cy4gVHdvIHBhdGhzOlxuICAgIC8vICAgKiBNb2Rlcm4gKHZhbHVlQnl0ZXMgcHJlc2VudCk6IHRoZSBWTS1zaWRlIHJlamVjdGlvbiBoYW5kbGVyXG4gICAgLy8gICAgIHNlcmlhbGl6ZWQgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSAoRXJyb3Igc3ViY2xhc3Mgd2l0aFxuICAgIC8vICAgICBjYXVzZSBjaGFpbiwgcGxhaW4gb2JqZWN0LCBwcmltaXRpdmUsIGV0Yy4pIHVzaW5nIHRoZSBWTSdzXG4gICAgLy8gICAgIHdvcmtmbG93LXNlcmlhbGl6ZS4gUGFzcyB0aG9zZSBieXRlcyB0aHJvdWdoIGRpcmVjdGx5IHNvXG4gICAgLy8gICAgIHR5cGUgaWRlbnRpdHksIGNhdXNlIGNoYWlucywgYW5kIG5vbi1FcnJvciB0aHJvd3Mgc3Vydml2ZS5cbiAgICAvLyAgICAgQXBwbHkgZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkICh0aGUgVk0nc1xuICAgIC8vICAgICBzZXJpYWxpemVyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVuY3J5cHRpb24ga2V5KS5cbiAgICAvLyAgICogTGVnYWN5IGZhbGxiYWNrOiByZWNvbnN0cnVjdCBhbiBFcnJvciBmcm9tIHRoZSBob3N0LXZpc2libGVcbiAgICAvLyAgICAge25hbWUsIG1lc3NhZ2UsIHN0YWNrfSBmaWVsZHMgYW5kIHJ1biBpdCB0aHJvdWdoXG4gICAgLy8gICAgIGBkZWh5ZHJhdGVSdW5FcnJvcmAuIFVzZWQgd2hlbiB2YWx1ZUJ5dGVzIGlzIGFic2VudCAoZS5nLlxuICAgIC8vICAgICBleHRyYWN0RXJyb3IgcHNldWRvLWZhaWx1cmVzIGZyb20gVk0gYm9vdHN0cmFwKS5cbiAgICBsZXQgZGVoeWRyYXRlZEVycm9yOiBVaW50OEFycmF5O1xuICAgIGlmIChyZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMpIHtcbiAgICAgIC8vIEh5ZHJhdGUgdGhlIFZNLXNpZGUgYnl0ZXMsIHJlbWFwIHRoZSBlcnJvciBzdGFjayB3aXRoIHRoZVxuICAgICAgLy8gaG9zdC1zaWRlIHNvdXJjZSBtYXAgKHRoZSBWTSBjYW4ndCBkbyB0aGlzOiBpdCBsYWNrcyBib3RoIHRoZVxuICAgICAgLy8gc291cmNlIG1hcCBhbmQgYHJlbWFwRXJyb3JTdGFja2ApLCBhbmQgcmUtZGVoeWRyYXRlLiBUaGlzXG4gICAgICAvLyBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHZhbHVlJ3MgdHlwZSBpZGVudGl0eSAvIGNhdXNlIGNoYWluXG4gICAgICAvLyB3aGlsZSBmaXhpbmcgdXAgZnJhbWVzIHRvIHBvaW50IGF0IHRoZSB1c2VyJ3Mgc291cmNlIGZpbGVzLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHVuZGVmaW5lZCAvLyBWTSBieXRlcyBhcmUgdW5lbmNyeXB0ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGh5ZHJhdGVkICYmXG4gICAgICAgICAgdHlwZW9mIGh5ZHJhdGVkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICdzdGFjaycgaW4gKGh5ZHJhdGVkIGFzIG9iamVjdCkgJiZcbiAgICAgICAgICB0eXBlb2YgKGh5ZHJhdGVkIGFzIHsgc3RhY2s/OiB1bmtub3duIH0pLnN0YWNrID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgLy8gQm90aCBmaWxlbmFtZSBzcGFjZXMuIFNlZSB0aGUgZmFpbGVkLWJyYW5jaCBjb21tZW50IGFib3ZlLlxuICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAoaHlkcmF0ZWQgYXMgeyBzdGFjazogc3RyaW5nIH0pLnN0YWNrLFxuICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWxrIHRoZSBjYXVzZSBjaGFpbiBhbmQgcmVtYXAgbmVzdGVkIHN0YWNrcyB0b28uXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICAgIGxldCBub2RlID0gKGh5ZHJhdGVkIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pPy5jYXVzZTtcbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyhub2RlIGFzIG9iamVjdCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChub2RlIGFzIG9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVN0YWNrID0gKG5vZGUgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2s7XG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlU3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgIC8vIEJvdGggZmlsZW5hbWUgc3BhY2VzLiBTZWUgdGhlIGZhaWxlZC1icmFuY2ggY29tbWVudCBhYm92ZS5cbiAgICAgICAgICAgIChub2RlIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIHJlbWFwRXJyb3JTdGFjayhub2RlU3RhY2ssIGZpbGVuYW1lLCB3b3JrZmxvd0NvZGUpLFxuICAgICAgICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IChub2RlIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlO1xuICAgICAgICB9XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIGh5ZHJhdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHJlaHlkcmF0ZUVycikge1xuICAgICAgICAvLyBJZiBoeWRyYXRpb24gLyByZS1kZWh5ZHJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwgZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luYWwgVk0gYnl0ZXMgKGFwcGx5aW5nXG4gICAgICAgIC8vIGVuY3J5cHRpb24gaWYgY29uZmlndXJlZCkuIEJldHRlciB0byBsb3NlIHNvdXJjZS1tYXBwZWRcbiAgICAgICAgLy8gZnJhbWVzIHRoYW4gdG8gbG9zZSB0aGUgZXJyb3IgZW50aXJlbHkuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gcmVtYXAgd29ya2Zsb3cgZXJyb3Igc3RhY2ssIHBhc3NpbmcgVk0gYnl0ZXMgdGhyb3VnaCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiAocmVoeWRyYXRlRXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKSkgYXMgVWludDhBcnJheTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgcmVjb25zdHJ1Y3RlZC5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICByZWNvbnN0cnVjdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHNlckVycikge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBtaW5pbWFsIHBheWxvYWQgc28gdGhlIHJ1biBzdGlsbCB0ZXJtaW5hdGVzXG4gICAgICAgIC8vIGV2ZW4gd2hlbiB0aGUgZXJyb3IgaXRzZWxmIGNvbnRhaW5zIHVuc2VyaWFsaXphYmxlIHZhbHVlcy5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byBkZWh5ZHJhdGUgcnVuIGVycm9yLCBmYWxsaW5nIGJhY2sgdG8gYmFyZSBFcnJvcicsXG4gICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogKHNlckVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfVxuICAgICAgICApO1xuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihyZXN1bHQuZmFpbGVkLm1lc3NhZ2UpLCB7XG4gICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogZGVoeWRyYXRlZEVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9mYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIH0pO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2ZhaWxlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkJywgeyByZXN1bHQ6ICdydW5fZmFpbGVkX3dyaXR0ZW4nIH0pO1xuICB9XG59XG4iXX0=
1863
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFLTCxxQkFBcUIsRUFFckIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxFQUMxQyxpQ0FBaUMsR0FFbEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsT0FBTyxJQUFJLHFCQUFxQixHQUVqQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLDhCQUE4QixHQUMvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFB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TzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVpY2tKUyBXZWJBc3NlbWJseSAoV0FTTSkgVk0gaW50ZWdyYXRpb24gd2l0aCB0aGUgV29ya2Zsb3cgRGV2S2l0LlxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbnRyeSBwb2ludCBmb3IgcnVubmluZyB3b3JrZmxvd3MgaW4gdGhlXG4gKiBRdWlja0pTIFZNIGVuZ2luZSBpbnN0ZWFkIG9mIHRoZSBgbm9kZTp2bWAgZW5naW5lLiBCb3RoIGVuZ2luZXNcbiAqIGltcGxlbWVudCB0aGUgc2FtZSBldmVudC1yZXBsYXkgZXhlY3V0aW9uIG1vZGVsLCB3aGVyZSBldmVyeSBpbnZvY2F0aW9uOlxuICpcbiAqIDEuIExvYWRzIHRoZSBmdWxsIGV2ZW50IGxvZyBmb3IgdGhlIHJ1blxuICogMi4gUnVucyB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gZnJvbSB0aGUgdG9wIGluIGEgZnJlc2ggUXVpY2tKUyBWTSxcbiAqICAgIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIHRvIHJlc29sdmUgYXdhaXRlZCBwcmltaXRpdmVzXG4gKiAzLiBPbiBzdXNwZW5zaW9uOiBjcmVhdGVzIGV2ZW50cyArIHF1ZXVlcyBzdGVwcyBmb3IgbmV3IHBlbmRpbmcgb3BzXG4gKiA0LiBPbiBjb21wbGV0aW9uOiBjcmVhdGVzIHJ1bl9jb21wbGV0ZWRcbiAqIDUuIE9uIGZhaWx1cmU6IGNyZWF0ZXMgcnVuX2ZhaWxlZFxuICovXG5cbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7XG4gIHR5cGUgQ3JlYXRlRXZlbnRQYXJhbXMsXG4gIHR5cGUgQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICB0eXBlIEV2ZW50LFxuICB0eXBlIEV2ZW50UmVzdWx0LFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGNsYXNzaWZ5UnVuRXJyb3IsIGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdFNlcmlhbGl6ZWREYXRhLFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlUnVuRXJyb3IsXG4gIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBtYXliZUVuY3J5cHQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrLCBzdHJpcElubGluZVNvdXJjZU1hcCB9IGZyb20gJy4uL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzLFxuICBnZXRNYXhJbmxpbmVTdGVwcyxcbiAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkLFxuICBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHJ1bkRpc3BhdGNoQ29udGV4dCxcbiAgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXksXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBRdWlja0pTTG9nVmlldyB9IGZyb20gJy4vcXVpY2tqcy1sb2ctdmlldy5qcyc7XG5pbXBvcnQge1xuICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gIHR5cGUgUGVuZGluZ0F0dHJpYnV0ZSxcbiAgdHlwZSBQZW5kaW5nSG9vayxcbiAgdHlwZSBQZW5kaW5nSG9va0Rpc3Bvc2UsXG4gIHR5cGUgUGVuZGluZ09wZXJhdGlvbixcbiAgdHlwZSBQZW5kaW5nU3RlcCxcbiAgdHlwZSBQZW5kaW5nV2FpdCxcbiAgc3RhcnRRdWlja0pTV29ya2Zsb3csXG59IGZyb20gJy4vcXVpY2tqcy1ydW50aW1lLmpzJztcbmltcG9ydCB7IFJlcGxheUJ1ZGdldCB9IGZyb20gJy4vcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBleGVjdXRlU3RlcCwgdHlwZSBTdGVwRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSAnLi9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IHJ1blN0ZXBTaW5nbGVGbGlnaHQgfSBmcm9tICcuL3N0ZXAtc2luZ2xlLWZsaWdodC5qcyc7XG5pbXBvcnQgeyB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyIH0gZnJvbSAnLi91bnNlcmlhbGl6YWJsZS1zdGVwLmpzJztcbmltcG9ydCB7IGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB9IGZyb20gJy4vd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3dvcmxkLmpzJztcblxuLyoqIEFuIGBldmVudHMuY3JlYXRlYCBib3VuZCB0byB0aGUgcnVuOyBzZWUgYGRpc3BhdGNoUGVuZGluZ09wcy5jcmVhdGVFdmVudGAuICovXG50eXBlIEV2ZW50Q3JlYXRvciA9IChcbiAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuKSA9PiBQcm9taXNlPEV2ZW50UmVzdWx0PjtcblxuLyoqIFRpbnkgbXMgdGltZXIgdXNpbmcgcGVyZm9ybWFuY2Uubm93KCksIGFscmVhZHkgbW9ub3RvbmljIG9uIE5vZGUuICovXG5mdW5jdGlvbiB0aWNrKCk6IG51bWJlciB7XG4gIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgc3VwcGxpZWQgcHJlbG9hZGVkIGV2ZW50cyBpbmRpY2F0ZSB0aGlzIGlzIHRoZVxuICogZmlyc3Qgd29ya2Zsb3cgaGFuZGxlciBpbnZvY2F0aW9uIGZvciB0aGUgcnVuLCBpLmUuIHRoZSBsb2cgY29udGFpbnNcbiAqIG5vdGhpbmcgYmV5b25kIGBydW5fY3JlYXRlZGAgLyBgcnVuX3N0YXJ0ZWRgLiBJbiB0aGF0IGNhc2UgdGhlXG4gKiBwcmVsb2FkZWQgZXZlbnRzIEFSRSB0aGUgY29tcGxldGUgZXZlbnQgbG9nIGFuZCB0aGUgYGV2ZW50cy5saXN0YFxuICogcm91bmQtdHJpcHMgY2FuIGJlIHNraXBwZWQgZW50aXJlbHkuXG4gKlxuICogQ3J1Y2lhbGx5LCBpZiB0aGUgd29ybGQgYmFja2ZpbGxlZCBhIG1pc3NpbmcgYHJ1bl9jcmVhdGVkYCB2aWEgdGhlXG4gKiByZXNpbGllbnQgc3RhcnQgcGF0aCwgYHByZWxvYWRlZEV2ZW50c2AgY29udGFpbnMgaXQgZXZlbiB3aGVuIGEgZnJlc2hcbiAqIGBldmVudHMubGlzdGAgbWlnaHQgbm90IChldmVudHVhbCBjb25zaXN0ZW5jeSksIHNvIHByZWZlcnJpbmcgdGhlXG4gKiBwcmVsb2FkZWQgZXZlbnRzIG9uIGZpcnN0IGludm9jYXRpb24gaXMgYWxzbyB0aGUgbW9yZSBjb3JyZWN0IGNob2ljZS5cbiAqXG4gKiBSZXR1cm5zIGZhbHNlIHdoZW4gYHByZWxvYWRlZEV2ZW50c2AgaXMgbWlzc2luZy9lbXB0eSBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgZmV0Y2ggcGF0aC5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdW5pdCB0ZXN0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGaXJzdEludm9jYXRpb24oXG4gIHByZWxvYWRlZEV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwcmVsb2FkZWRFdmVudHMpIHx8IHByZWxvYWRlZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHByZWxvYWRlZEV2ZW50cy5ldmVyeShcbiAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHwgZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBRdWV1ZSBhIHN0ZXAgZm9yIGJhY2tncm91bmQgZXhlY3V0aW9uIHZpYSB0aGUgdW5pZmllZCB3b3JrZmxvdyBxdWV1ZVxuICogKFYyIGFyY2hpdGVjdHVyZSkuIFRoZSBjb21iaW5lZCBoYW5kbGVyIGluIHJ1bnRpbWUudHMgZGlzcGF0Y2hlc1xuICogbWVzc2FnZXMgd2l0aCBgc3RlcElkYCB0byBleGVjdXRlU3RlcCwgd2hpY2ggd29ya3MgZm9yIGJvdGggVk0gZW5naW5lcy5cbiAqIGBkZWxheVNlY29uZHNgIHN1cHBvcnRzIHJldHJ5L3Rocm90dGxlIGJhY2tvZmYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHF1ZXVlU3RlcE1lc3NhZ2UocGFyYW1zOiB7XG4gIHdvcmxkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmxkPj47XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgc3RlcDogUGVuZGluZ1N0ZXA7XG4gIGRlbGF5U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIFF1ZXVlIG5hbWVzcGFjZSBmb3IgdGhlIHB1Ymxpc2ggKHNlZSBydW50aW1lLnRzKS4gKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgKHNlZSBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKS4gKi9cbiAgbmV4dFRyYWNlQ2FycmllcjogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgLyoqXG4gICAqIFB1Ymxpc2ggcHVycG9zZSwgdXNlZCB0byBidWNrZXQgdGhlIGlkZW1wb3RlbmN5IGtleS4gV29ybGRzIHJldGlyZVxuICAgKiB1c2VkIGtleXMgKFZRUyByZXRlbnRpb24gVFRMLCB3b3JsZC1wb3N0Z3JlcyBjb21wbGV0ZWQta2V5cyBjYWNoZSksXG4gICAqIHNvIGEga2V5IHNoYXJlZCBhY3Jvc3MgcHVycG9zZXMgc2lsZW50bHkgc3dhbGxvd3MgdGhlIHNlY29uZFxuICAgKiBwdWJsaXNoLiBTZWUgd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBzYW1lIGhhemFyZCBvbiB3YWl0XG4gICAqIGtleXMuIGBkaXNwYXRjaGAgaXMgdGhlIHBsYWluIGJhY2tncm91bmQgaGFuZG9mZiAob3ZlcmZsb3cgLyBjcmFzaFxuICAgKiByZWNvdmVyeSkgYW5kIHVzZXMgdGhlIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGRpc3BhdGNoIGtleVxuICAgKiAoc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkpIHNvIGl0IHN0YXlzIG11dHVhbGx5XG4gICAqIGV4Y2x1c2l2ZSB3aXRoIHRoZSBub2RlIGVuZ2luZSdzIGRpc3BhdGNoIG9mIHRoZSBzYW1lIHN0ZXA7XG4gICAqIGBiYWNrc3RvcDo8ZXBvY2g+YCBjb3ZlcnMgZGVsYXllZCBjcmFzaCBiYWNrc3RvcHMsIHNjb3BlZCB0byB0aGVcbiAgICogb3duZXJzaGlwIGVwb2NoIHNvIGEgcmVmcmVzaGVkIGxlYXNlIHJlLWFybXMgYSBORVcgYmFja3N0b3AgaW5zdGVhZFxuICAgKiBvZiBiZWluZyBhYnNvcmJlZCBieSB0aGUgaW4tZmxpZ2h0IG9uZTsgYHJldHJ5OjxuPmAgY292ZXJzIGRlbGF5ZWRcbiAgICogcmV0cnkvdGhyb3R0bGUgcmUtZW5xdWV1ZXMsIHNjb3BlZCB0byB0aGUgYXR0ZW1wdCBzbyBlYWNoIGJhY2tvZmZcbiAgICogaG9wIGlzIGVucXVldWVhYmxlLlxuICAgKi9cbiAgcHVycG9zZTogJ2Rpc3BhdGNoJyB8IGBiYWNrc3RvcDoke3N0cmluZ31gIHwgYHJldHJ5OiR7bnVtYmVyfWA7XG4gIC8qKlxuICAgKiBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogdGhlIHNlcmlhbGl6ZWQgKHBvc3NpYmx5IGVuY3J5cHRlZCkgc3RlcCBpbnB1dFxuICAgKiB0byBjYXJyeSBvbiB0aGUgbWVzc2FnZSBhcyBgc3RlcElucHV0YCwgc28gdGhlIGNvbnN1bWVyIGNhbiBpZGVtcG90ZW50bHlcbiAgICogcmUtZW5zdXJlIHRoZSBgc3RlcF9jcmVhdGVkYCBldmVudCBpZiB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCBkaXJlY3RcbiAgICogd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5LiBPbmx5IHNldCBvbiBgZGlzcGF0Y2hgIHB1Ymxpc2hlcyB0aGF0XG4gICAqIGRpc3BhdGNoUGVuZGluZ09wcyBwYXJhbGxlbGl6ZXMgd2l0aCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlLlxuICAgKi9cbiAgc3RlcElucHV0PzogVWludDhBcnJheTtcbiAgd2ZkaWFnOiAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgd29ybGQsXG4gICAgcnVuSWQsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgc3RlcCxcbiAgICBkZWxheVNlY29uZHMsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgcHVycG9zZSxcbiAgICBzdGVwSW5wdXQsXG4gICAgd2ZkaWFnLFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICB3b3JsZCxcbiAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAge1xuICAgICAgcnVuSWQsXG4gICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgLi4uKHN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkID8geyBzdGVwSW5wdXQ6IHsgaW5wdXQ6IHN0ZXBJbnB1dCB9IH0gOiB7fSksXG4gICAgICAvLyBJbW11dGFibGUgcnVuIGlkZW50aXR5IHNvIHRoZSBjb25zdW1lciBjYW4gc3RhcnQgdGhlIHN0ZXAgd2l0aG91dCBhXG4gICAgICAvLyBibG9ja2luZyBydW5zLmdldCDigJQgc2VlIFJ1bkRpc3BhdGNoQ29udGV4dFNjaGVtYS5cbiAgICAgIHJ1bkNvbnRleHQ6IHJ1bkRpc3BhdGNoQ29udGV4dCh3b3JrZmxvd1J1biksXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgJ2Rpc3BhdGNoJyBrZXkgaXMgc3RlcC1pZGVudGl0eS1zY29wZWQgKGNvcnJlbGF0aW9uSWQgKyBoYXNoZWRcbiAgICAgIC8vIHN0ZXAgbmFtZSksIHNoYXJlZCB3aXRoIHRoZSBub2RlIGVuZ2luZSdzIGRpc3BhdGNoIG9mIHRoZSBzYW1lIHN0ZXBcbiAgICAgIC8vIHNvIHRoZSB0d28gc3RheSBtdXR1YWxseSBleGNsdXNpdmUsIHdpdGhvdXQgYSByZXZva2VkIHJlc2lsaWVudFxuICAgICAgLy8gbWVzc2FnZSBhYnNvcmJpbmcgYSByZWFzc2lnbmVkIGNvcnJlbGF0aW9uIGlkJ3MgbGVnaXRpbWF0ZSBkaXNwYXRjaC5cbiAgICAgIC8vIFNlZSBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleS5cbiAgICAgIGlkZW1wb3RlbmN5S2V5OlxuICAgICAgICBwdXJwb3NlID09PSAnZGlzcGF0Y2gnXG4gICAgICAgICAgPyBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShzdGVwLmNvcnJlbGF0aW9uSWQsIHN0ZXAuc3RlcElkKVxuICAgICAgICAgIDogYCR7c3RlcC5jb3JyZWxhdGlvbklkfToke3B1cnBvc2V9YCxcbiAgICAgIC4uLihkZWxheVNlY29uZHMgJiYgZGVsYXlTZWNvbmRzID4gMCA/IHsgZGVsYXlTZWNvbmRzIH0gOiB7fSksXG4gICAgfVxuICApO1xuICB3ZmRpYWcoJ3N0ZXBfcXVldWVkJywge1xuICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgIHB1cnBvc2UsXG4gICAgZGVsYXlTZWNvbmRzOiBkZWxheVNlY29uZHMgPz8gMCxcbiAgICAuLi4oc3RlcElucHV0ICE9PSB1bmRlZmluZWQgPyB7IHJlc2lsaWVudDogdHJ1ZSB9IDoge30pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBkdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgYSBzZXQgb2YgcGVuZGluZyBWTSBvcGVyYXRpb25zOlxuICogc3RlcF9jcmVhdGVkICgrIG9wdGlvbmFsIHF1ZXVlaW5nKSwgaG9va19jcmVhdGVkIC8gaG9va19yZWNlaXZlZCAoYWJvcnRzKSxcbiAqIGF0dHJfc2V0LCBob29rX2Rpc3Bvc2VkLCBhbmQgd2FpdF9jcmVhdGVkIGV2ZW50cy5cbiAqXG4gKiBTdGVwcyBhcmUgY3JlYXRlZCBidXQgKHVzdWFsbHkpIG5vdCBxdWV1ZWQgaGVyZTogcXVldWVpbmcgKG9yIGlubGluZVxuICogZXhlY3V0aW9uKSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24uIFVzZWQgYm90aCBmb3Igc3VzcGVuc2lvblxuICogcHJvY2Vzc2luZyAodGhlIGlubGluZSBsb29wKSBhbmQgZm9yIHRoZSB0ZXJtaW5hbCBkcmFpbiAoZmx1c2hpbmdcbiAqIGxlZnRvdmVyIHNpZGUgZWZmZWN0cyB3aGVuIHRoZSB3b3JrZmxvdyBjb21wbGV0ZWQgb3IgZmFpbGVkLCBtaXJyb3JpbmdcbiAqIHRoZSBub2RlOnZtIGVuZ2luZSdzIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMpLlxuICpcbiAqIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiBmb3Igc3RlcCBjaWRzIG5hbWVkIGluXG4gKiBgcXVldWVTdGVwQ2lkc2AgKHRoZSBjYWxsZXIncyBvdmVyZmxvdyBzdGVwcykgdGhhdCBwYXNzIHRoZSBlbGlnaWJpbGl0eVxuICogZ2F0ZXMsIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgaXMgcGFyYWxsZWxpemVkIHdpdGggdGhlIHN0ZXAncyBxdWV1ZVxuICogcHVibGlzaDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGUgc2VyaWFsaXplZCBpbnB1dCAoYHN0ZXBJbnB1dGApIHNvIHRoZVxuICogY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkXG4gKiB0cmFuc2llbnRseS4gU3RlcHMgcXVldWVkIHRoaXMgd2F5IGFyZSByZXBvcnRlZCBpbiBgcXVldWVkU3RlcENpZHNgOyB0aGVcbiAqIGNhbGxlciBxdWV1ZXMgdGhlIHJlc3QgaXRzZWxmLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNwYXRjaFBlbmRpbmdPcHMocGFyYW1zOiB7XG4gIHdvcmxkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmxkPj47XG4gIHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2VhbSBldmVyeSBldmVudCB3cml0ZSBpbiB0aGlzIHBhc3MgZ29lcyB0aHJvdWdoLiBUaGUgaW5saW5lIGxvb3BcbiAgICogcGFzc2VzIGEgY3JlYXRlIHRoYXQgbmFtZXMgdGhlIGxvZyBwb3NpdGlvbiB0aGlzIGludm9jYXRpb24gaG9sZHNcbiAgICogKGBldmVudENvdW50YCkgYW5kIHF1ZXVlcyB3aGF0IHRoZSBXb3JsZCBoYW5kcyBiYWNrIGZvciB0aGUgbGl2ZSBWTTsgc2VlXG4gICAqIHtAbGluayBRdWlja0pTTG9nVmlld30uIFRoZSB0ZXJtaW5hbCBkcmFpbiBwYXNzZXMgYSBwbGFpbiBjcmVhdGUsIHNpbmNlXG4gICAqIHRoZSBydW4gaXMgZW5kaW5nIGFuZCBub3RoaW5nIHJlYWRzIGl0cyBsb2cgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIGNyZWF0ZUV2ZW50OiBFdmVudENyZWF0b3I7XG4gIC8qKlxuICAgKiBUaGUgY3Vyc29yIHRoaXMgaW52b2NhdGlvbidzIGxvZyB3YXMgcmVhZCB0bywgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIGEgbG9uZVxuICAgKiBgaG9va19jcmVhdGVkYCB0byBhc2sgZm9yIHRoZSBpbmxpbmUgZGVsdGEgYWdhaW5zdCBpdCAoYHNpbmNlQ3Vyc29yYCkuXG4gICAqIFRoZSBob29rJ3MgYXdhaXRlcnMgYXJlIHNldHRsZWQgYnkgdGhlIGV2ZW50IHRoYXQgd3JpdGUgY29tbWl0cyBhbmQgYnlcbiAgICogbm90aGluZyBlbHNlIChhIGBob29rX2NyZWF0ZWRgLCBvciB0aGUgYGhvb2tfY29uZmxpY3RgIGEgY2xhaW1lZCB0b2tlblxuICAgKiBjb21taXRzIGluc3RlYWQpLCBzbyB0aGUgZGVsdGEgaGFuZHMgdGhlIFZNIHRoYXQgZXZlbnQsIHBsdXMgYW55dGhpbmdcbiAgICogYW5vdGhlciB3cml0ZXIgbGFuZGVkIG1lYW53aGlsZSwgd2l0aG91dCBhIGxpc3RpbmcuIFNhbWUgZ2F0ZSBhcyB0aGUgbm9kZVxuICAgKiBlbmdpbmUncyBgaG9va0RlbHRhQ3Vyc29yYDogYXNrZWQgZm9yIG9ubHkgd2hlbiBleGFjdGx5IG9uZSBob29rIG5lZWRzXG4gICAqIGNyZWF0aW5nLCBzaW5jZSB0d28gY3JlYXRlcyBkaWZmaW5nIGFnYWluc3Qgb25lIGN1cnNvciB3b3VsZCBwcm9kdWNlIHR3b1xuICAgKiBkZWx0YXMgb2Ygd2hpY2ggb25seSB0aGUgZmlyc3QgY291bGQgYmUgdGFrZW4uIE9taXR0ZWQgYnkgdGhlIHRlcm1pbmFsXG4gICAqIGRyYWluLlxuICAgKi9cbiAgZGVsdGFDdXJzb3I/OiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgZW5jcnlwdGlvbktleTogUnVuUGF5bG9hZEtleXMgfCB1bmRlZmluZWQ7XG4gIHBlbmRpbmdPcGVyYXRpb25zOiBQZW5kaW5nT3BlcmF0aW9uW107XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgbXVzdCBOT1QgYmUgd3JpdHRlbiBoZXJlOiB0aGUgaW5saW5lXG4gICAqIGxvb3AgY2xhaW1zIHRoZXNlIGF0b21pY2FsbHkgdmlhIGEgbGF6eSBgc3RlcF9zdGFydGVkYCAoY2FycnlpbmcgdGhlXG4gICAqIGlucHV0KSwgc28gYSBjb25jdXJyZW50IGNsYWltYW50IGxvc2VzIHdpdGggRW50aXR5Q29uZmxpY3RFcnJvclxuICAgKiBpbnN0ZWFkIG9mIGJvdGggaW52b2NhdGlvbnMgYmFyZS1zdGFydGluZyB0aGUgc2FtZSBzdGVwLlxuICAgKi9cbiAgc2tpcFN0ZXBDcmVhdGlvbj86IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogU3RlcCBjaWRzIHRoZSBjYWxsZXIgaW50ZW5kcyB0byBoYW5kIHRvIHRoZSBxdWV1ZSB0aGlzIHR1cm4gKG92ZXJmbG93XG4gICAqIHN0ZXBzIGJleW9uZCB0aGUgaW5saW5lIGNhcCkuIEVsaWdpYmxlIG9uZXMgYXJlIHB1Ymxpc2hlZCBoZXJlLCBpblxuICAgKiBwYXJhbGxlbCB3aXRoIHRoZWlyIHN0ZXBfY3JlYXRlZCB3cml0ZSAocmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2gpLCBhbmRcbiAgICogcmVwb3J0ZWQgYmFjayBpbiBgcXVldWVkU3RlcENpZHNgLlxuICAgKi9cbiAgcXVldWVTdGVwQ2lkcz86IFNldDxzdHJpbmc+O1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciBhbGwgbWVzc2FnZSBwdWJsaXNoZXMgKHNlZSBydW50aW1lLnRzKS4gKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzLiBJbiB0aGUgZGVmYXVsdFxuICAgKiBgbGlua2VkYCB0cmFjZSBtb2RlIHRoaXMgcmV0dXJucyB0aGUgY2FycmllciBvZiB0aGUgcnVuJ3MgT1JJR0lOXG4gICAqIGNvbnRleHQgKHdvcmtmbG93LnN0YXJ0KSwgc28gZXZlcnkgaW52b2NhdGlvbiBsaW5rcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFydCBpbiBhIHN0YXIuIENhcHR1cmluZyB0aGUgY3VycmVudCBjb250ZXh0IGhlcmUgaW5zdGVhZCB3b3VsZFxuICAgKiBjaGFpbiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmNcbiAgICogcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2FycmllcjogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAodGhlIGlubGluZSBsb29wKSwgYSBzdGVwIGNhcnJ5aW5nIGBzZXJpYWxpemF0aW9uRXJyb3JgIGlzXG4gICAqIGZpbmFsaXplZCBhcyBzdGVwX2NyZWF0ZWQgKHBsYWNlaG9sZGVyIGlucHV0KSArIHN0ZXBfZmFpbGVkIHNvIHRoZVxuICAgKiBsaXZlLVZNIGZlZWQgcmVqZWN0cyB0aGUgc3RlcCdzIHByb21pc2UgYW5kIHdvcmtmbG93IGNvZGUgY2FuIGNhdGNoXG4gICAqIGl0LCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXAuIFdoZW5cbiAgICogZmFsc2UgKHRoZSB0ZXJtaW5hbCBkcmFpbiksIHN1Y2ggc3RlcHMgYXJlIHNraXBwZWQgZW50aXJlbHk6IHRoZSBydW5cbiAgICogaXMgYWxyZWFkeSBjb21wbGV0aW5nL2ZhaWxpbmcsIG5vIHJlcGxheSBmb2xsb3dzIHRoZSBkcmFpbiB0byBvYnNlcnZlXG4gICAqIHRoZSBmYWlsdXJlLCBhbmQgYSBjb21wbGV0ZWQgcnVuIGNhcnJ5aW5nIGEgZmFpbGVkIHN0ZXAgd291bGQgcmVhZCBhc1xuICAgKiBhIGJ1ZyBmcm9tIHRoZSBkYXNoYm9hcmQsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGRyYWluJ3MgYmVoYXZpb3IuXG4gICAqL1xuICBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcHM/OiBib29sZWFuO1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx7XG4gIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudDogYm9vbGVhbjtcbiAgY3JlYXRlZEdldENvbmZsaWN0SG9vazogYm9vbGVhbjtcbiAgLyoqIFN0ZXAgY2lkcyBhbHJlYWR5IHB1Ymxpc2hlZCB2aWEgcmVzaWxpZW50IGRpc3BhdGNoLiBTZWUgYWJvdmUuICovXG4gIHF1ZXVlZFN0ZXBDaWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIFN0ZXAgY2lkcyBmaW5hbGl6ZWQgYXMgZmFpbGVkIGJlY2F1c2UgdGhlaXIgaW5wdXQgcmVmdXNlZCB0b1xuICAgKiBzZXJpYWxpemUgKHNlZSBgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzYCkuIE5vIGV4ZWN1dGlvbiBtZXNzYWdlXG4gICAqIGV4aXN0cyBmb3IgdGhlc2U7IHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhlIHJ1biBvYnNlcnZlcyB0aGVcbiAgICogdGVybWluYWwgZXZlbnQgKHRoZSBpbmxpbmUgbG9vcCdzIGZlZWQsIG9yIHRoZSByZXF1ZXVlIHNpZ25hbCkuXG4gICAqL1xuICBmYWlsZWRTZXJpYWxpemF0aW9uU3RlcENpZHM6IFNldDxzdHJpbmc+O1xufT4ge1xuICBjb25zdCB7XG4gICAgd29ybGQsXG4gICAgcnVuSWQsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICBwZW5kaW5nT3BlcmF0aW9ucyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBjcmVhdGVFdmVudCxcbiAgfSA9IHBhcmFtcztcbiAgY29uc3Qgc2tpcFN0ZXBDcmVhdGlvbiA9IHBhcmFtcy5za2lwU3RlcENyZWF0aW9uO1xuICBjb25zdCBxdWV1ZVN0ZXBDaWRzID0gcGFyYW1zLnF1ZXVlU3RlcENpZHM7XG4gIGNvbnN0IHdmZGlhZyA9IHBhcmFtcy53ZmRpYWc7XG4gIC8vIFN0ZXAgY2lkcyBwdWJsaXNoZWQgdmlhIHJlc2lsaWVudCBkaXNwYXRjaCBiZWxvdyAoY3JlYXRlICsgcXVldWUgaW5cbiAgLy8gcGFyYWxsZWwsIG1lc3NhZ2UgY2FycnlpbmcgYHN0ZXBJbnB1dGApLiBSZXBvcnRlZCB0byB0aGUgY2FsbGVyIHNvIGl0XG4gIC8vIHNraXBzIHRoZW0gaW4gaXRzIG93biBxdWV1ZWluZyBwYXNzLlxuICBjb25zdCBxdWV1ZWRTdGVwQ2lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBTdGVwIGNpZHMgZmluYWxpemVkIGFzIHN0ZXBfY3JlYXRlZCArIHN0ZXBfZmFpbGVkIGJlY2F1c2UgdGhlaXIgaW5wdXRcbiAgLy8gcmVmdXNlZCB0byBzZXJpYWxpemUuIFNlZSB0aGUgYGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwc2AgcGFyYW0uXG4gIGNvbnN0IGZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaCBlbGlnaWJpbGl0eSwgc2hhcmVkIGJ5IGV2ZXJ5IHN0ZXAgb3AgYmVsb3cgKHRoZVxuICAvLyBwZXItc3RlcCBpbnB1dC1zaXplIGNoZWNrIGlzIGFwcGxpZWQgaW5zaWRlIHRoZSBvcCk6IGZlYXR1cmUgZW5hYmxlZCBhbmRcbiAgLy8gYSBiaW5hcnktc2FmZSAoQ0JPUikgcXVldWUgdHJhbnNwb3J0IGZvciB0aGUgcnVuLlxuICAvL1xuICAvLyBVbmxpa2UgdGhlIG5vZGU6dm0gc3VzcGVuc2lvbiBoYW5kbGVyJ3MgZ2F0ZSAoc2VlXG4gIC8vIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zLnN0ZXBEaXNwYXRjaCksIHRoZXJlIGlzIE5PIHByZWNvbmRpdGlvbi1ndWFyZFxuICAvLyBnYXRlIGhlcmU6IHRoaXMgZW5naW5lJ3Mgc3RlcF9jcmVhdGVkIHdyaXRlcyBhcmUgdW5ndWFyZGVkIChubyBzbmFwc2hvdFxuICAvLyBpcyBhdHRhY2hlZCksIHNvIGEgZ3VhcmQtZW5mb3JjaW5nIFdvcmxkIGNhbiBuZXZlciA0MTItcmVqZWN0IHRoZW06XG4gIC8vIHRoZSBjb25zdW1lcidzIHJlLWVuc3VyZSB0aGVyZWZvcmUgY2Fubm90IG1hdGVyaWFsaXplIGEgc3RlcCB0aGUgZ3VhcmRcbiAgLy8gcmVqZWN0ZWQuIElmIHRoaXMgZW5naW5lIGV2ZXIgYWRvcHRzIGd1YXJkZWQgc3VzcGVuc2lvbiB3cml0ZXMsIHRoZVxuICAvLyBjYXBhYmlsaXR5IGdhdGUgZnJvbSB0aGUgbm9kZTp2bSBoYW5kbGVyIG11c3QgYmUgYWRkZWQgaGVyZSB0b28uXG4gIGNvbnN0IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgPVxuICAgIHF1ZXVlU3RlcENpZHMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHF1ZXVlU3RlcENpZHMuc2l6ZSA+IDAgJiZcbiAgICBpc1Jlc2lsaWVudFN0ZXBEaXNwYXRjaEVuYWJsZWQoKSAmJlxuICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUO1xuICAvLyBTZXQgd2hlbiBhIGhvb2sgd2l0aCBhIHBhcmtlZCBnZXRDb25mbGljdCgpIGF3YWl0ZXIgaGFkIGl0c1xuICAvLyBob29rX2NyZWF0ZWQgd3JpdHRlbiB0aGlzIGludm9jYXRpb24uIFRoZSB3b3JrZmxvdyBtdXN0IGJlIHJlLWludm9rZWRcbiAgLy8gc28gcmVwbGF5IGNhbiBjb25maXJtIGNyZWF0aW9uIGFuZCByZXNvbHZlIHRoZSBhd2FpdGVyLlxuICBsZXQgY3JlYXRlZEdldENvbmZsaWN0SG9vayA9IGZhbHNlO1xuICAvLyBTZXQgd2hlbiBhIG5ldyBhdHRyX3NldCBldmVudCBpcyB3cml0dGVuIHRoaXMgaW52b2NhdGlvbi4gVGhlXG4gIC8vIHdvcmtmbG93IG11c3QgYmUgcmUtaW52b2tlZCB0byBjb25zdW1lIGl0IChyZXNvbHZpbmcgdGhlIHBlbmRpbmdcbiAgLy8gc2V0QXR0cmlidXRlcygpIHByb21pc2UpLCBzbyB0aGUgZW50cnlwb2ludCByZXF1ZXVlcyBpbW1lZGlhdGVseSxcbiAgLy8gc2FtZSBwYXR0ZXJuIGFzIGFuIGVsYXBzZWQgd2FpdC5cbiAgbGV0IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCA9IGZhbHNlO1xuICBjb25zdCBvcHNQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IGhvb2tzTmVlZGluZ0NyZWF0aW9uID0gcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKFxuICAgIChvcCkgPT4gb3AudHlwZSA9PT0gJ2hvb2snICYmICFvcC5oYXNDcmVhdGVkRXZlbnRcbiAgKS5sZW5ndGg7XG4gIGNvbnN0IGhvb2tEZWx0YUN1cnNvciA9XG4gICAgaG9va3NOZWVkaW5nQ3JlYXRpb24gPT09IDEgPyBwYXJhbXMuZGVsdGFDdXJzb3IgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcHJvY2Vzc0hvb2tPcCA9IGFzeW5jIChob29rOiBQZW5kaW5nSG9vayk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogcHJvY2Vzc2luZyBob29rIG9wJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgIHRva2VuVHlwZTogdHlwZW9mIGhvb2sudG9rZW4sXG4gICAgICBpc1dlYmhvb2s6IGhvb2suaXNXZWJob29rLFxuICAgICAgaXNTeXN0ZW06IGhvb2suaXNTeXN0ZW0sXG4gICAgICBoYXNDcmVhdGVkRXZlbnQ6IGhvb2suaGFzQ3JlYXRlZEV2ZW50LFxuICAgICAgYWJvcnRSZXF1ZXN0ZWQ6IGhvb2suYWJvcnRSZXF1ZXN0ZWQsXG4gICAgfSk7XG5cbiAgICBpZiAoIWhvb2suaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAvLyBgaG9vay5tZXRhZGF0YWAgaXMgdGhlIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzXG4gICAgICAvLyBwcm9kdWNlZCBieSBgZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV1cbiAgICAgIC8vIChvcHRpb25zLm1ldGFkYXRhKWAgaW5zaWRlIHRoZSBWTS4gRW5jcnlwdCBvbiB0aGUgaG9zdFxuICAgICAgLy8gc2lkZSBiZWZvcmUgd3JpdGluZywgd2hpY2ggbWF0Y2hlcyB0aGUgbm9kZTp2bSBlbmdpbmUnc1xuICAgICAgLy8gYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gTm8gcHJlLWNoZWNrIHZpYSBob29rcy5saXN0OiB3aXRoIGRldGVybWluaXN0aWMgY29ycmVsYXRpb25JZHNcbiAgICAgIC8vIChzYW1lIFZNIHNlZWQgYWNyb3NzIHJlcGxheXMpIGFuZCBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKVxuICAgICAgLy8gdW5pcXVlbmVzcyBpbiB3b3JsZHMsIHRoZSBzdG9yYWdlIGxheWVyIHJlamVjdHMgZHVwbGljYXRlcyBhc1xuICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciwgd2hpY2ggd2Ugc3dhbGxvdyBiZWxvdy4gVGhpcyBkcm9wcyBvbmVcbiAgICAgIC8vIG5ldHdvcmsgcm91bmQtdHJpcCBwZXIgcGVuZGluZyBob29rLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkTWV0YWRhdGEgPVxuICAgICAgICAgIHR5cGVvZiBob29rLm1ldGFkYXRhID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKGhvb2subWV0YWRhdGEsIGVuY3J5cHRpb25LZXkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgICB0b2tlblJldGVudGlvblVudGlsOlxuICAgICAgICAgICAgICAgIGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZShob29rLnRva2VuUmV0ZW50aW9uVW50aWwpLFxuICAgICAgICAgICAgICBtZXRhZGF0YTogZW5jcnlwdGVkTWV0YWRhdGEsXG4gICAgICAgICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIGlzV2ViaG9vayBleHBsaWNpdGx5LiBXb3JsZHMgZGVmYXVsdCBpdCB0b1xuICAgICAgICAgICAgICAvLyBgdHJ1ZWAgd2hlbiBhYnNlbnQsIHdoaWNoIHdvdWxkIGJyZWFrIHRoZSBwdWJsaWMgd2ViaG9va1xuICAgICAgICAgICAgICAvLyBlbmRwb2ludCdzIDQwNCBndWFyZCBmb3IgaG9va3MgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpLlxuICAgICAgICAgICAgICBpc1dlYmhvb2s6IGhvb2suaXNXZWJob29rLFxuICAgICAgICAgICAgICAvLyBTeXN0ZW0gaG9va3MgKEFib3J0Q29udHJvbGxlcikgYXJlIGV4ZW1wdCBmcm9tIHVzZXJcbiAgICAgICAgICAgICAgLy8gdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0IGNoZWNrcy5cbiAgICAgICAgICAgICAgLi4uKGhvb2suaXNTeXN0ZW0gPyB7IGlzU3lzdGVtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvb2tEZWx0YUN1cnNvciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgc2luY2VDdXJzb3I6IGhvb2tEZWx0YUN1cnNvciB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIHN0b3JhZ2UgZGV0ZWN0ZWQgYSByZWFsIHRva2VuIGNvbmZsaWN0IHdpdGggYW5vdGhlclxuICAgICAgICAvLyB3b3JrZmxvdydzIGhvb2ssIHJlLXF1ZXVlIHNvIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGNhblxuICAgICAgICAvLyBwcm9jZXNzIHRoZSBjb25mbGljdCBldmVudCBhbmQgZmFpbCBncmFjZWZ1bGx5LlxuICAgICAgICBpZiAocmVzdWx0LmV2ZW50Py5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGBob29rX2NvbmZsaWN0XyR7aG9vay5jb3JyZWxhdGlvbklkfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBbHJlYWR5IGNyZWF0ZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24sIHNvIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyB0byBhYm9ydCBwcm9jZXNzaW5nIGJlbG93IChpZiBhbnkpIGluc3RlYWQgb2YgYmFpbGluZy5cbiAgICAgICAgaWYgKCFFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChob29rLmhhc0dldENvbmZsaWN0QXdhaXRlcikge1xuICAgICAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9vay5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgLy8gUmVjb3JkIHRoZSBhYm9ydCBkdXJhYmx5OiBhIGhvb2tfcmVjZWl2ZWQgZXZlbnQgY2FycnlpbmdcbiAgICAgIC8vIHRoZSBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkLFxuICAgICAgLy8gcGx1cyBhIGJlc3QtZWZmb3J0IHN0cmVhbSBwYWNrZXQgZm9yIHJlYWwtdGltZSBzdGVwXG4gICAgICAvLyBwcm9wYWdhdGlvbi4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBzdXNwZW5zaW9uXG4gICAgICAvLyBoYW5kbGVyIChob29rc05lZWRpbmdBYm9ydCkuXG4gICAgICBjb25zdCBhYm9ydFBheWxvYWQgPVxuICAgICAgICBob29rLmFib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICA/ICgoYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICBob29rLmFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKSkgYXMgVWludDhBcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICAgICAgICBwYXlsb2FkOiBhYm9ydFBheWxvYWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyBzdHJlYW1OYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUgYWJvcnQgaG9vayB0b2tlblxuICAgICAgLy8gKGBhYnJ0X3tpZH1gIOKGkiBgc3RybV97aWR9X3N5c3RlbV9hYm9ydGApLlxuICAgICAgaWYgKGhvb2sudG9rZW4uc3RhcnRzV2l0aCgnYWJydF8nKSAmJiBhYm9ydFBheWxvYWQpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGBzdHJtXyR7aG9vay50b2tlbi5zbGljZSgnYWJydF8nLmxlbmd0aCl9X3N5c3RlbV9hYm9ydGA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgc3RyZWFtTmFtZSwgYWJvcnRQYXlsb2FkKTtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IHRoZSBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlXG4gICAgICAgICAgLy8gZmFsbGJhY2suXG4gICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byB3cml0ZSBhYm9ydCBzdHJlYW0gcGFja2V0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2Fib3J0X3JlY29yZGVkJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rRGlzcG9zZU9wID0gYXN5bmMgKFxuICAgIG9wOiBQZW5kaW5nSG9va0Rpc3Bvc2VcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogb3AuY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gVGhlIGhvb2sncyB0b2tlbiwgd2hpY2ggdGhlIG5vZGU6dm0gZW5naW5lIGhhcyBhbHdheXMgc2VudC4gQSB3b3JsZFxuICAgICAgICAvLyB0aGF0IGtleXMgYSBob29rJ3MgdG9rZW4gY2xhaW0gc2VwYXJhdGVseSBmcm9tIHRoZSBob29rIGl0c2VsZiBuZWVkc1xuICAgICAgICAvLyBpdCB0byByZWxlYXNlIGJvdGgsIGFuZCB0aGUgb25seSBhbHRlcm5hdGl2ZSBpcyBmb3IgaXQgdG8gbG9vayB0aGVcbiAgICAgICAgLy8gdG9rZW4gdXAgZmlyc3QuIE9taXR0ZWQgcmF0aGVyIHRoYW4gc2VudCBhcyB1bmRlZmluZWQgd2hlbiB0aGUgb3BcbiAgICAgICAgLy8gY2FycmllcyBub25lLCBzbyBhIHdvcmxkIHRoYXQgcmVhZHMgaXQgY2Fubm90IHRlbGwgdGhlIGRpZmZlcmVuY2VcbiAgICAgICAgLy8gYmV0d2VlbiB0aGlzIGVuZ2luZSBhbmQgYSBjbGllbnQgdG9vIG9sZCB0byBzZW5kIG9uZS5cbiAgICAgICAgLi4uKG9wLnRva2VuID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnREYXRhOiB7IHRva2VuOiBvcC50b2tlbiB9IH0pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICAvLyBEaXNwb3NpbmcgYSBob29rIHdob3NlIGVudGl0eSBubyBsb25nZXIgKG9yIG5ldmVyKSBleGlzdHMgaXMgYW5cbiAgICAgIC8vIGlkZW1wb3RlbnQgbm8tb3A6IHRoZSBlbnRpdHkgbWF5IGhhdmUgYmVlbiB0b3JuIGRvd24gYnkgYVxuICAgICAgLy8gY29uY3VycmVudCBydW4gY2FuY2VsbGF0aW9uLCBvciB0aGUgaG9vayBtYXkgaGF2ZSBsb3N0IGl0c1xuICAgICAgLy8gdG9rZW4gY2xhaW0gdG8gYSBjb25mbGljdC4gVGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlbGVhc2UuXG4gICAgICBpZiAoSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfTtcblxuICAvLyBIb29rIG9wZXJhdGlvbnMgYXJlIGdyb3VwZWQgYnkgdG9rZW4gYW5kIHByb2Nlc3NlZCBTRVFVRU5USUFMTFkgaW5cbiAgLy8gY29kZSBvcmRlciB3aXRoaW4gZWFjaCBncm91cCwgbWlycm9yaW5nIHRoZSBub2RlOnZtIHN1c3BlbnNpb25cbiAgLy8gaGFuZGxlciAoaG9va0l0ZW1zQnlUb2tlbik6IGEgZGlzcG9zZSgpIG9mIGFuIGVhcmxpZXIgaG9vayBtdXN0XG4gIC8vIHJlbGVhc2UgdGhlIHRva2VuIGJlZm9yZSBhIGxhdGVyIHNhbWUtdG9rZW4gaG9vaydzIGNyZWF0aW9uIGlzXG4gIC8vIHZhbGlkYXRlZCBieSB0aGUgd29ybGQ6IHBhcmFsbGVsIGRpc3BhdGNoIHdvdWxkIG90aGVyd2lzZSByZWNvcmQgYVxuICAvLyBzcHVyaW91cyBob29rX2NvbmZsaWN0IGFnYWluc3QgdGhlIHJ1bidzIG93biBkaXNwb3NlZCBob29rIChlLmcuIGFcbiAgLy8gZGlzcG9zZeKGknJlY3JlYXRlIGxvb3AgcmV1c2luZyBvbmUgdG9rZW4pLiBEaWZmZXJlbnQgdG9rZW5zIGhhdmUgbm9cbiAgLy8gY2xhaW0gaW50ZXJhY3Rpb24sIHNvIHRva2VuIGdyb3VwcyBydW4gaW4gcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyXG4gIC8vIGFuZCB3aXRoIHRoZSBub24taG9vayBvcHMgYmVsb3cuXG4gIGNvbnN0IGhvb2tPcHNCeVRva2VuID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgKFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlKVtdXG4gID4oKTtcbiAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICBvcC50eXBlID09PSAnaG9vaycgJiZcbiAgICAgICghb3AuaGFzQ3JlYXRlZEV2ZW50IHx8IChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQpXG4gICAgKSB7XG4gICAgICBrZXkgPSAob3AgYXMgUGVuZGluZ0hvb2spLnRva2VuO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2hvb2tfZGlzcG9zZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgLy8gUGVyLW9wIGZhbGxiYWNrIGdyb3VwIHdoZW4gdGhlIHRva2VuIGlzIHVua25vd246IG5vIG9yZGVyaW5nXG4gICAgICAvLyBndWFyYW50ZWVzLCBtYXRjaGluZyB0aGUgcHJldmlvdXMgcGFyYWxsZWwgYmVoYXZpb3IuXG4gICAgICBrZXkgPSAob3AgYXMgUGVuZGluZ0hvb2tEaXNwb3NlKS50b2tlbiA/PyBgX19jaWQ6JHtvcC5jb3JyZWxhdGlvbklkfWA7XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgZ3JvdXAgPSBob29rT3BzQnlUb2tlbi5nZXQoa2V5KTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIGdyb3VwLnB1c2gob3AgYXMgUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rT3BzQnlUb2tlbi5zZXQoa2V5LCBbb3AgYXMgUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2VdKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBncm91cCBvZiBob29rT3BzQnlUb2tlbi52YWx1ZXMoKSkge1xuICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG9wIG9mIGdyb3VwKSB7XG4gICAgICAgICAgaWYgKG9wLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0hvb2tPcChvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NIb29rRGlzcG9zZU9wKG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKClcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgIGlmIChcbiAgICAgIG9wLnR5cGUgPT09ICdzdGVwJyAmJlxuICAgICAgIW9wLmhhc0NyZWF0ZWRFdmVudCAmJlxuICAgICAgIXNraXBTdGVwQ3JlYXRpb24/LmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3Qgc3RlcCA9IG9wIGFzIFBlbmRpbmdTdGVwO1xuICAgICAgb3BzUHJvbWlzZXMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCdzIGlucHV0IHJlZnVzZWQgdG8gc2VyaWFsaXplIHdoaWxlIGR1bXBpbmcgdGhlIFZNJ3NcbiAgICAgICAgICAvLyBwZW5kaW5nIG9wcyAoc2VlIFBlbmRpbmdTdGVwLnNlcmlhbGl6YXRpb25FcnJvcikuIEZpbmFsaXplIGl0XG4gICAgICAgICAgLy8gYXMgc3RlcF9jcmVhdGVkIChwbGFjZWhvbGRlciBpbnB1dCwgc2luY2UgdGhlIHdvcmxkIHJlcXVpcmVzIHRoZVxuICAgICAgICAgIC8vIHN0ZXAgZW50aXR5IGJlZm9yZSBhIHRlcm1pbmFsIGV2ZW50KSArIHN0ZXBfZmFpbGVkIGNhcnJ5aW5nXG4gICAgICAgICAgLy8gdGhlIFNlcmlhbGl6YXRpb25FcnJvciwgc28gdGhlIGxpdmUtVk0gZmVlZCByZWplY3RzIHRoZVxuICAgICAgICAgIC8vIHN0ZXAncyBwcm9taXNlIGFuZCB3b3JrZmxvdyBjb2RlIGNhbiBjYXRjaCBpdC4gTmV2ZXIgcXVldWUgYW5cbiAgICAgICAgICAvLyBleGVjdXRpb24gbWVzc2FnZSBmb3IgaXQuIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgICAgICAvLyBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcC4gSW4gdGhlIHRlcm1pbmFsIGRyYWluXG4gICAgICAgICAgLy8gKGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwcyB1bnNldCksIHNraXAgZW50aXJlbHk6IHNlZSB0aGVcbiAgICAgICAgICAvLyBwYXJhbSBkb2NzLlxuICAgICAgICAgIGlmIChzdGVwLnNlcmlhbGl6YXRpb25FcnJvcikge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgJ1N0ZXAgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemU7IGZhaWxpbmcgdGhlIHN0ZXAgc28gJyArXG4gICAgICAgICAgICAgICAgJ3RoZSB3b3JrZmxvdyBjYW4gb2JzZXJ2ZSB0aGUgZXJyb3InLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogc3RlcC5zZXJpYWxpemF0aW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlU3RlcElucHV0UGxhY2Vob2xkZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICkpIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gQ29uY3VycmVudCBpbnZvY2F0aW9uIGhpdCB0aGUgc2FtZSBkZXRlcm1pbmlzdGljIGZhaWx1cmVcbiAgICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZWQgaXQgZmlyc3QsIG9yIHRoZSBydW4gYWxyZWFkeSBmaW5pc2hlZC5cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICAgICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLnNlcmlhbGl6YXRpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRlcm1pbmFsIG9yIHJ1biBhbHJlYWR5IGZpbmlzaGVkLlxuICAgICAgICAgICAgICBpZiAoIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSAmJiAhUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIHdmZGlhZygnc3RlcF9zZXJpYWxpemF0aW9uX2ZhaWxlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIHN0ZXBfY3JlYXRlZCBldmVudC4gYHN0ZXAuaW5wdXRgIGlzIHRoZVxuICAgICAgICAgIC8vIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzIChcImRldmxcIiArIGRldmFsdWUpIHByb2R1Y2VkXG4gICAgICAgICAgLy8gYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKHthcmdzLFxuICAgICAgICAgIC8vIGNsb3N1cmVWYXJzLCB0aGlzVmFsfSlgIGluc2lkZSB0aGUgVk0uIFRoZSBWTSBoYXMgbm9cbiAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhlIENyeXB0b0tleSwgc28gZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmVcbiAgICAgICAgICAvLyBvbiB0aGUgaG9zdCBzaWRlLCBtYXRjaGluZyB3aGF0XG4gICAgICAgICAgLy8gYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGRvZXMgaW4gdGhlIG5vZGU6dm0gZW5naW5lLlxuICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZElucHV0ID0gYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZpcmUgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggaW4gcGFyYWxsZWw6IHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlXG4gICAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkXG4gICAgICAgICAgLy8gdHJhbnNpZW50bHkuIE1pcnJvcnMgdGhlIG5vZGU6dm0gc3VzcGVuc2lvbiBoYW5kbGVyIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNpbGllbnQgc3RhcnQgLyByZXNpbGllbnQgaG9vayByZXN1bWUgcGF0dGVybnMuIE9ubHkgZm9yXG4gICAgICAgICAgLy8gY2FsbGVyLWRlc2lnbmF0ZWQgb3ZlcmZsb3cgc3RlcHMgd2l0aCBpbnB1dHMgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICAgICAgICAgIHF1ZXVlU3RlcENpZHM/LmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICBlbmNyeXB0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICAgIGVuY3J5cHRlZElucHV0LmJ5dGVMZW5ndGggPD0gTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZElucHV0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICAgICAgc3RlcElucHV0OiBlbmNyeXB0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCBmb3IgdGhpcyBkaXNwYXRjaCBwYXNzOlxuICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgbWVzc2FnZSB0aGUgc3RlcCB3b3VsZCByZWx5IG9uIHRoZSBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFsb25lLCBhbmQgaWYgdGhlIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBub1xuICAgICAgICAgICAgLy8gZHVyYWJsZSByZWNvcmQgYXQgYWxsLiBQcm9wYWdhdGluZyByZWRlbGl2ZXJzIHRoZVxuICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGFuZCByZS1kaXNwYXRjaGVzLlxuICAgICAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWRTdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGludm9jYXRpb24gd3JvdGUgaXQgZmlyc3Q6IHRoZSBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvdXQ7IGl0cyBkdXBsaWNhdGUgcHVibGlzaCBkZWR1cGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudDogdGhlIHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseSAoNDI5IC8gNXh4IC9cbiAgICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQpIGJ1dCB0aGUgc3RlcCBtZXNzYWdlIChjYXJyeWluZyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmVzIHRoZSBzdGVwX2NyZWF0ZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nLlxuICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICdTdGVwIGNyZWF0aW9uIGV2ZW50IHdyaXRlIGZhaWxlZCwgYnV0IHRoZSBzdGVwIHdhcyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BhdGNoZWQgdmlhIHRoZSBxdWV1ZS4gVGhlIHN0ZXBfY3JlYXRlZCBldmVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgd2ZkaWFnKCdzdGVwX3Jlc2lsaWVudF9kaXNwYXRjaF9yZWNvdmVyZWQnLCB7XG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkSW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIG90aGVyd2lzZSB0aGUgY2FsbGVyJ3MgZGVjaXNpb246IHRoZVxuICAgICAgICAgIC8vIGlubGluZSBsb29wIGV4ZWN1dGVzIGZyZXNoIHN0ZXBzIGluIHRoZSBsaXZlIFZNIGFuZCBvbmx5XG4gICAgICAgICAgLy8gcXVldWVzIHRoZSBvdmVyZmxvdyAvIHJldHJ5IC8gYmFja3N0b3AgY2FzZXMgKHNlZVxuICAgICAgICAgIC8vIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSwgYnV0IHRoZVxuICAgICAgICAgICAgICAvLyByZXBsYXkgc3RpbGwgbmVlZHMgdG8gY29uc3VtZSBpdCwgc28gcmVxdWV1ZS5cbiAgICAgICAgICAgICAgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICd3YWl0JyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICByZXN1bWVBdDogbmV3IERhdGUod2FpdC5yZXN1bWVBdCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gUGVyLW9wIGRpc3BhdGNoIHJ1bnMgaW4gcGFyYWxsZWwuXG4gIGF3YWl0IFByb21pc2UuYWxsKG9wc1Byb21pc2VzKTtcblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCxcbiAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rLFxuICAgIHF1ZXVlZFN0ZXBDaWRzLFxuICAgIGZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3b3JrZmxvdyB1c2luZyB0aGUgUXVpY2tKUyBXQVNNIFZNIGVuZ2luZS5cbiAqXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBgbm9kZTp2bWAgcmVwbGF5IHBhdGggKHJ1bldvcmtmbG93ICsgRXZlbnRzQ29uc3VtZXIpXG4gKiB3aXRoIGEgUXVpY2tKUyBWTSBpbnZvY2F0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXkuXG4gKlxuICogTG9nIHBvc2l0aW9uIG9uIHdyaXRlcy4gVGhpcyBlbmdpbmUgZm9sbG93cyB0aGUgc2FtZSBydWxlIGFzIHRoZSBub2RlOnZtXG4gKiByZXBsYXkgbG9vcCBmb3Igd2hpY2ggd3JpdGVzIHRlbGwgdGhlIFdvcmxkIHdoZXJlIHRoZSB3cml0ZXIgc3Rvb2QgKHNlZSB0aGVcbiAqIFwiV2hvIG5hbWVzIGEgcG9zaXRpb25cIiB0YWJsZSBhYm92ZSBgc2xvdFNuYXBzaG90UGFyYW1zYCBpbiBgaGVscGVycy50c2ApOlxuICpcbiAqIC0gV3JpdGVzIG1hZGUgZnJvbSB0aGlzIGludm9jYXRpb24ncyB2aWV3IG9mIHRoZSBsb2cgKGBzdGVwX2NyZWF0ZWRgLFxuICogICBgd2FpdF9jcmVhdGVkYCwgYGhvb2tfY3JlYXRlZGAsIGBob29rX2Rpc3Bvc2VkYCwgYGF0dHJfc2V0YCwgdGhlIGFib3J0XG4gKiAgIGBob29rX3JlY2VpdmVkYCwgYHdhaXRfY29tcGxldGVkYCwgYW5kIHRoZSBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX2ZhaWxlZGBcbiAqICAgcGFpciBmb3IgYW4gdW5zZXJpYWxpemFibGUgaW5wdXQpIGNhcnJ5IGBldmVudENvdW50YCwgYW5kIHRoZSBwYWdlIGFcbiAqICAgV29ybGQgaGFuZHMgYmFjayBpcyBxdWV1ZWQgZm9yIHRoZSBsaXZlIFZNIHRocm91Z2gge0BsaW5rIFF1aWNrSlNMb2dWaWV3fS5cbiAqIC0gQSBzaW5nbGUgaW5saW5lIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSBhc2tzIGZvciB0aGUgaW5saW5lIGRlbHRhXG4gKiAgIChgc2luY2VDdXJzb3JgKSB0aHJvdWdoIGBleGVjdXRlU3RlcGAsIGFuZCBzbyBkb2VzIGEgbG9uZSBgaG9va19jcmVhdGVkYFxuICogICAoc2VlIGBkaXNwYXRjaFBlbmRpbmdPcHMuZGVsdGFDdXJzb3JgKTsgdGhlIGRlbHRhIGlzIHF1ZXVlZCB0aGUgc2FtZVxuICogICB3YXkuIFRoZSBzdGVwIGV4ZWN1dG9yJ3Mgb3RoZXIgd3JpdGVzIGNhcnJ5IG5vdGhpbmc6IGl0IGhvbGRzIG5vIGxvZy5cbiAqIC0gUnVuLXRlcm1pbmFsIHdyaXRlcyAoYHJ1bl9jb21wbGV0ZWRgLCBgcnVuX2ZhaWxlZGApIGFuZCB0aGUgdGVybWluYWwgZHJhaW5cbiAqICAgb2YgcGVuZGluZyBvcHMgY2Fycnkgbm90aGluZzogbm90aGluZyByZWFkcyB0aGUgbG9nIGFmdGVyd2FyZHMuXG4gKlxuICogV2hhdCBkaWZmZXJzIGZyb20gdGhlIG5vZGUgZW5naW5lIGlzIHdoYXQgXCJtZXJnZSBpbnRvIHRoZSBsb2dcIiBtZWFucy4gVGhlXG4gKiBub2RlIGVuZ2luZSBtZXJnZXMgYSByZXR1cm5lZCBwYWdlIGludG8gdGhlIGFycmF5IGl0IHJlcGxheXMgZnJvbS4gVGhpc1xuICogZW5naW5lIGhvbGRzIGEgbGl2ZSBWTSB0aGF0IGNvbnN1bWVzIGV2ZW50cyBleGFjdGx5IG9uY2UsIGluIHBvc2l0aW9uXG4gKiBvcmRlciwgc28gYSByZXR1cm5lZCBwYWdlIGlzIHF1ZXVlZCBhbmQgZGVsaXZlcmVkIGFoZWFkIG9mIHRoZSBuZXh0XG4gKiBgZXZlbnRzLmxpc3RgLCB3aGljaCB0aGVuIG9ubHkgcnVucyB3aGVuIHRoZSBxdWV1ZSBjYW5ub3QgYWNjb3VudCBmb3IgdGhlXG4gKiBuZXh0IHBvc2l0aW9uLiBCb3RoIGVuZ2luZXMgZmFsbCBiYWNrIHRvIGEgbGlzdCBmb3IgYW55dGhpbmcgYSBwYWdlIGRpZFxuICogbm90IGNhcnJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyhwYXJhbXM6IHtcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIC8qKlxuICAgKiBFdmVudHMgcmV0dXJuZWQgaW5saW5lIGJ5IGBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcsIC4uLilgIG9yIGJ5XG4gICAqIHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQuIFdoZW4gdGhleSBpbmRpY2F0ZVxuICAgKiBhIGZpcnN0IGludm9jYXRpb24sIG9yIHdoZW4gYHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlYCBhdHRlc3RzIHRoZXlcbiAgICogYXJlIHRoZSBjb21wbGV0ZSBsb2csIHRoZXkgYXJlIHVzZWQgYXMgdGhlIGV2ZW50IGxvZyBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIHZpYSBgZXZlbnRzLmxpc3RgLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBmYXN0IHBhdGguXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHM/OiBFdmVudFtdO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBjYWxsZXIgaGFzIHZhbGlkYXRlZCB0aGF0IGBwcmVsb2FkZWRFdmVudHNgIGlzIHRoZSBydW4nc1xuICAgKiBDT01QTEVURSBldmVudCBsb2cgKGUuZy4gdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBoYXNNb3JlLWZhbHNlXG4gICAqIHJlcGxheSBwcmVsb2FkKS4gVGhlIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljIGJlbG93IG9ubHkgcmVjb2duaXplc1xuICAgKiBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZC1vbmx5IHByZWxvYWRzLCBzbyB3aXRob3V0IHRoaXMgYXR0ZXN0YXRpb24gYVxuICAgKiBob29rLXJlc3VtZSBwcmVsb2FkIHdvdWxkIGJlIGRpc2NhcmRlZCBhbmQgcmVmZXRjaGVkLlxuICAgKi9cbiAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGBldmVudHMubGlzdGAgY3Vyc29yIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIGxhc3Qgb2YgYHByZWxvYWRlZEV2ZW50c2AsXG4gICAqIHdoZW4gdGhlIGNhbGxlciBoYXMgb25lLiBMZXRzIHRoaXMgaW52b2NhdGlvbiByZWFkIGluY3JlbWVudGFsbHkgZnJvbVxuICAgKiB3aGVyZSB0aGUgcHJlbG9hZCBlbmRlZCBhbmQgYXNrIGZvciBhbiBpbmxpbmUgZGVsdGEgYWdhaW5zdCBpdC4gV2l0aG91dFxuICAgKiBpdCB0aGUgZmlyc3QgcmVhZCBhZnRlciB0aGUgcHJlbG9hZCBzdGFydHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBsb2cuXG4gICAqL1xuICBwcmVsb2FkZWRDdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogUnVuIGlucHV0IGNhcnJpZWQgdGhyb3VnaCB0aGUgcXVldWUgbWVzc2FnZSBvbiBmaXJzdCBkZWxpdmVyeS4gVXNlZFxuICAgKiBhcyBhIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGZvciBgcnVuX2NyZWF0ZWQuZXZlbnREYXRhLmlucHV0YCB3aGVuXG4gICAqIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIHJ1bklucHV0PzogUnVuSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IE9UZWwgc3BhbiAodGhlIG91dGVyIGBXT1JLRkxPVyB7d29ya2Zsb3dOYW1lfWAgc3BhbiBmcm9tXG4gICAqIGBydW50aW1lLnRzYCkuIFdoZW4gc3VwcGxpZWQsIFZNIGxpZmVjeWNsZSBhdHRyaWJ1dGVzIGFyZSBhdHRhY2hlZFxuICAgKiB0byBpdCBmb3IgZW5kLXRvLWVuZCB2aXNpYmlsaXR5LlxuICAgKi9cbiAgcGFyZW50U3Bhbj86IFNwYW47XG4gIC8qKlxuICAgKiBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlXG4gICAqICh1bmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50KS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBndWFyZDpcbiAgICogYSBydW5hd2F5IHJ1biBpcyBmYWlsZWQgb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlIGNlaWxpbmcuIFRoZSB0aHJvd1xuICAgKiBwcm9wYWdhdGVzIHRvIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMgKHRoZSBRdWlja0pTXG4gICAqIGRpc3BhdGNoIHJ1bnMgaW5zaWRlIHRoYXQgbG9vcCdzIHRyeSksIHdoaWNoIGNsYXNzaWZpZXMgaXQgYW5kXG4gICAqIHJlY29yZHMgcnVuX2ZhaWxlZCB3aXRoIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAqL1xuICBtYXhFdmVudHNMaW1pdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHQgb2YgdGhlIG1lc3NhZ2UgZHJpdmluZyB0aGlzIGludm9jYXRpb24gKGZyb21cbiAgICogdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhZGF0YTsgMSA9IGZpcnN0IGRlbGl2ZXJ5KS4gU3VyZmFjZWQgaW5cbiAgICogZGlhZ25vc3RpY3M7IGNyYXNoIHJlY292ZXJ5IGl0c2VsZiBpcyBkcml2ZW4gYnkgdGhlIG93bmVyc2hpcC1sZWFzZVxuICAgKiBkZWNpc2lvbiB0YWJsZSBpbiB0aGUgbG9vcCwgbm90IGJ5IHRoZSBhdHRlbXB0IGNvdW50LlxuICAgKi9cbiAgZGVsaXZlcnlBdHRlbXB0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgbWVzc2FnZSBJRCBvZiB0aGUgZGVsaXZlcnkgZHJpdmluZyB0aGlzIGludm9jYXRpb24sIHN0YW1wZWQgYXNcbiAgICogYG93bmVyTWVzc2FnZUlkYCBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXMgZGVmZXIgdG9cbiAgICogdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2YgcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKiogUmVxdWVzdCBJRCBvZiB0aGUgcXVldWUgaW52b2NhdGlvbiwgd2hlbiB0aGUgcXVldWUgcHJvdmlkZXMgb25lLiAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2UgcmVzb2x2ZWQgYXQgcm91dGUgcmVnaXN0cmF0aW9uIChydW50aW1lLnRzKS4gTXVzdCBiZVxuICAgKiB0aHJlYWRlZCBpbnRvIGV2ZXJ5IG1lc3NhZ2UgcHVibGlzaDogdGhlIGJ1aWxkZXJzIGJha2UgdGhlIG5hbWVzcGFjZVxuICAgKiBpbnRvIGdlbmVyYXRlZCByb3V0ZXMsIHNvIGNvbnN1bWVycyBsaXN0ZW4gb24gYF9fPG5zPl93a2Zfd29ya2Zsb3dfKmAuXG4gICAqIEEgcHVibGlzaCB3aXRob3V0IGl0IGxhbmRzIG9uIGBfX3drZl93b3JrZmxvd18qYCBhbmQgaXMgbmV2ZXJcbiAgICogcGlja2VkIHVwLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogUnVuLW9yaWdpbiB0cmFjZSBjYXJyaWVyIGFjY2Vzc29yIGZyb20gcnVudGltZS50c1xuICAgKiAoZ2V0TmV4dFRyYWNlQ2FycmllcikuIEluIHRoZSBkZWZhdWx0IGBsaW5rZWRgIHRyYWNlIG1vZGUgZXZlcnlcbiAgICogaW52b2NhdGlvbiBtdXN0IGxpbmsgYmFjayB0byB0aGUgcnVuJ3Mgb3JpZ2luICh3b3JrZmxvdy5zdGFydCkgaW4gYVxuICAgKiBzdGFyOyBjYXB0dXJpbmcgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0IGluc3RlYWQgd291bGQgY2hhaW5cbiAgICogaW52b2NhdGlvbnMgdG8gZWFjaCBvdGhlciBhbmQgZnJhZ21lbnQgdGhlIHJ1biB2aWV3IG9uIGFzeW5jIHF1ZXVlcy5cbiAgICovXG4gIG5leHRUcmFjZUNhcnJpZXI/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogVGhlIHdhaXQgdGhpcyBpbnZvY2F0aW9uIGlzIHRoZSBkZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IsIGlmIGl0IGlzIG9uZVxuICAgKiAoYFdvcmtmbG93SW52b2tlUGF5bG9hZC53YWl0Q29udGludWF0aW9uYCkuIFJlYWQgb25seSB0byBkZWNpZGUgdGhlIG5leHRcbiAgICogY29udGludWF0aW9uJ3MgaWRlbXBvdGVuY3kga2V5OiBhIGNvbnRpbnVhdGlvbiB0aGF0IGZpbmRzIGl0cyBvd24gd2FpdFxuICAgKiBzdGlsbCBwZW5kaW5nIGhhcyBzcGVudCBpdHMga2V5LCBzbyB0aGUgcmUtYXJtIGhhcyB0byBhZHZhbmNlIHRoZSBhdHRlbXB0XG4gICAqIG9yIHRoZSB3b3JsZCdzIGRlZHVwZSB3aW5kb3cgZHJvcHMgaXQgYW5kIHRoZSB3YWl0IGxvc2VzIGl0cyBvbmx5IHRpbWVyLlxuICAgKi9cbiAgd2FpdENvbnRpbnVhdGlvbj86IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBhdHRlbXB0OiBudW1iZXIgfTtcbn0pOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM/OiBudW1iZXIgfSB8IHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlLFxuICAgIHByZWxvYWRlZEN1cnNvcixcbiAgICBydW5JbnB1dCxcbiAgICBwYXJlbnRTcGFuLFxuICAgIG1heEV2ZW50c0xpbWl0LFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBvd25lck1lc3NhZ2VJZCxcbiAgICByZXF1ZXN0SWQsXG4gICAgbmFtZXNwYWNlLFxuICAgIHdhaXRDb250aW51YXRpb24sXG4gIH0gPSBwYXJhbXM7XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgbnVtYmVyIGZvciB0aGUgY29udGludWF0aW9uIHRoaXMgaW52b2NhdGlvbiBpcyBhYm91dCB0byBhcm0gZm9yXG4gICAqIGBjb3JyZWxhdGlvbklkYC4gT25lIGhpZ2hlciB0aGFuIHRoZSBpbmNvbWluZyBjb250aW51YXRpb24ncyB3aGVuIHRoaXNcbiAgICogaW52b2NhdGlvbiBJUyB0aGF0IGNvbnRpbnVhdGlvbiBhbmQgdGhlIHdhaXQgaXMgc3RpbGwgcGVuZGluZyDigJQgdGhlIG9ubHlcbiAgICogc2l0dWF0aW9uIGluIHdoaWNoIHRoZSBwcmV2aW91cyBrZXkgaXMgc3BlbnQuIEV2ZXJ5IG90aGVyIGNhbGxlciwgYW5kXG4gICAqIGV2ZXJ5IG90aGVyIHdhaXQsIHN0YXJ0cyBhdCAwIGFuZCBrZXlzIGV4YWN0bHkgYXMgaXQgZGlkIGJlZm9yZSBhdHRlbXB0c1xuICAgKiBleGlzdGVkLlxuICAgKi9cbiAgY29uc3QgbmV4dFdhaXRDb250aW51YXRpb25BdHRlbXB0ID0gKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IG51bWJlciA9PlxuICAgIHdhaXRDb250aW51YXRpb24/LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWRcbiAgICAgID8gd2FpdENvbnRpbnVhdGlvbi5hdHRlbXB0ICsgMVxuICAgICAgOiAwO1xuICAvLyBTdGFuZGFsb25lLWNhbGxlciBmYWxsYmFjayAodGVzdHMpOiB3aXRob3V0IGEgcnVudGltZS50cyBjYXJyaWVyXG4gIC8vIGFjY2Vzc29yLCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0LlxuICBjb25zdCBuZXh0VHJhY2VDYXJyaWVyID1cbiAgICBwYXJhbXMubmV4dFRyYWNlQ2FycmllciA/PyAoKCkgPT4gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkpO1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gIGNvbnN0IHJ1bklkID0gd29ya2Zsb3dSdW4ucnVuSWQ7XG4gIGNvbnN0IGludm9jYXRpb25TdGFydCA9IHRpY2soKTtcblxuICAvLyBTdHJpcCB0aGUgaW5saW5lIHNvdXJjZSBtYXAgY29tbWVudCBiZWZvcmUgZXZhbHVhdGluZyB0aGUgYnVuZGxlIGluXG4gIC8vIHRoZSBRdWlja0pTIFZNLiBUaGUgbWFwIGlzIHB1cmVseSBob3N0LXNpZGUgbWV0YWRhdGEgZm9yXG4gIC8vIGByZW1hcEVycm9yU3RhY2tgIChjYWxsZWQgYmVsb3cgb24gd29ya2Zsb3cgZmFpbHVyZXMsIGFnYWluc3QgdGhlXG4gIC8vIE9SSUdJTkFMIGB3b3JrZmxvd0NvZGVgKS4gUXVpY2tKUyByZXRhaW5zIHNvdXJjZSB0ZXh0IGZvclxuICAvLyBzdGFjay10cmFjZSBsaW5lIGxvb2t1cHMsIHNvIHRoZSBmZXctTUIgYmFzZTY0IGNvbW1lbnQgd291bGQgYmxvYXRcbiAgLy8gdGhlIFZNIGhlYXAgZm9yIG5vIGJlbmVmaXQuXG4gIGNvbnN0IHdvcmtmbG93Q29kZUZvclZNID0gc3RyaXBJbmxpbmVTb3VyY2VNYXAod29ya2Zsb3dDb2RlKTtcblxuICAvLyBQZXItaW52b2NhdGlvbiBkaWFnbm9zdGljIGlkIHNvIGRlYnVnIGxvZ3MgY2FuIGJlIGNvcnJlbGF0ZWQgZXZlbiBpZlxuICAvLyB0aGUgc2FtZSBydW5JZCBpcyBwcm9jZXNzZWQgYnkgb3ZlcmxhcHBpbmcgaW52b2NhdGlvbnMgb24gZGlmZmVyZW50XG4gIC8vIGZ1bmN0aW9uIGluc3RhbmNlcy5cbiAgY29uc3QgaW52b2NhdGlvbklkID0gYGludl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gO1xuXG4gIC8vIFN0cnVjdHVyZWQgcGVyLWNoZWNrcG9pbnQgZGlhZ25vc3RpYyBoZWxwZXIsIGdyZXAtZnJpZW5kbHkgYnkgcnVuSWQuXG4gIGNvbnN0IHdmZGlhZyA9IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRVUlDS0pTX1ZNX0RJQUcnLCB7XG4gICAgICBjaGVja3BvaW50LFxuICAgICAgcnVuSWQsXG4gICAgICBpbnZvY2F0aW9uSWQsXG4gICAgICB0RWxhcHNlZE1zOiBNYXRoLnJvdW5kKHRpY2soKSAtIGludm9jYXRpb25TdGFydCksXG4gICAgICAuLi5maWVsZHMsXG4gICAgfSk7XG4gIH07XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93Vm0oJ3F1aWNranMnKSxcbiAgfSk7XG5cbiAgd2ZkaWFnKCdlbnRlcicsIHtcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIGhhc1ByZWxvYWRlZEV2ZW50czpcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJiBwcmVsb2FkZWRFdmVudHMubGVuZ3RoID4gMCxcbiAgICBwcmVsb2FkZWRFdmVudENvdW50OiBwcmVsb2FkZWRFdmVudHM/Lmxlbmd0aCA/PyAwLFxuICAgIGhhc1J1bklucHV0OiAhIXJ1bklucHV0LFxuICB9KTtcblxuICAvLyBUaGUgd29ya2Zsb3dOYW1lIGZyb20gdGhlIHF1ZXVlIHRvcGljIGlzIGFscmVhZHkgdGhlIGZ1bGwgd29ya2Zsb3cgSURcbiAgLy8gKGUuZy4gXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvMV9zaW1wbGUvL3NpbXBsZVwiKVxuICBjb25zdCB3b3JrZmxvd0lkID0gd29ya2Zsb3dOYW1lO1xuXG4gIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IHVwIGZyb250OiBuZWVkZWQgdG8gZGVjcnlwdCBldmVudFxuICAvLyBwYXlsb2FkcyBpbnNpZGUgdGhlIFZNIGFuZCB0byBlbmNyeXB0IGV2ZW50IHBheWxvYWRzIHdyaXR0ZW4gYmVsb3cuXG4gIC8vIFJlc29sdmUgdGhlIEZVTEwgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgKyBYMjU1MTkga2V5cGFpciksIG5vdFxuICAvLyBqdXN0IGBpbXBvcnRLZXkocmF3S2V5KWA6IGEgcnVuIHJlYWRpbmcgaXRzIG93biBldmVudCBsb2cgY2FuIGVuY291bnRlclxuICAvLyBzZWFsZWQgKGBlbmNwYCkgaG9vayBwYXlsb2FkcyB0aGF0IGEgY3Jvc3MtZGVwbG95bWVudCBgcmVzdW1lSG9vaygpYFxuICAvLyB3cm90ZSB0byBpdCAoc2VhbGluZyBpcyBwcmVzZW5jZS1nYXRlZCBvbiB0aGUgcnVuJ3MgcHVibGlzaGVkXG4gIC8vIGVuY3J5cHRpb25QdWJsaWNLZXksIHdoaWNoIHRoZSBzaGFyZWQgc3RhcnQoKSBwYXRoIHN0YW1wcyByZWdhcmRsZXNzIG9mXG4gIC8vIGVuZ2luZSkuIEEgYmFyZSBzeW1tZXRyaWMga2V5IGNhbm5vdCBvcGVuIHRob3NlIGFuZCB3b3VsZCB3ZWRnZSB0aGUgcnVuXG4gIC8vIHJpZ2h0IGFmdGVyIGhvb2tfcmVjZWl2ZWQuIFRoZSBub2RlOnZtIGVuZ2luZSByZXNvbHZlcyB0aGUgc2FtZSBmdWxsXG4gIC8vIGNhcGFiaWxpdHkgdmlhIG1lbW9pemVFbmNyeXB0aW9uS2V5LlxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4od29ya2Zsb3dSdW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcblxuICAvLyBMb2FkIHRoZSBGVUxMIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gT24gZmlyc3QgaW52b2NhdGlvbiB0aGVcbiAgLy8gcHJlbG9hZGVkIGV2ZW50cyBmcm9tIHRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBhcmUgdGhlIGNvbXBsZXRlIGxvZ1xuICAvLyBhbmQgc2F2ZSB0aGUgZXZlbnRzLmxpc3Qgcm91bmQtdHJpcHM7IGEgY2FsbGVyLWF0dGVzdGVkIGNvbXBsZXRlXG4gIC8vIHByZWxvYWQgKGxhenkgaG9vayBmYXN0IHBhdGgpIGlzIHRydXN0ZWQgdGhlIHNhbWUgd2F5LlxuICBsZXQgZXZlbnRzOiBFdmVudFtdO1xuICBsZXQgZXZlbnRzRmV0Y2hlZFBhZ2VzID0gMDtcbiAgLy8gV2hlcmUgdGhlIGxvZyB3YXMgcmVhZCB0bzogdGhlIGN1cnNvciBhZnRlciB0aGUgbGFzdCBwYWdlIGJlbG93LCBvciB0aGVcbiAgLy8gb25lIHRoZSBjYWxsZXIgcmVhZCB0aGUgcHJlbG9hZCB0by4gU2VlZHMgdGhlIGluY3JlbWVudGFsIHJlYWRzIGFuZCB0aGVcbiAgLy8gaW5saW5lLWRlbHRhIHJlcXVlc3RzIHRoYXQgZm9sbG93LlxuICBsZXQgbG9hZGVkQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgdXNlUHJlbG9hZGVkID1cbiAgICAocHJlbG9hZGVkRXZlbnRzQ29tcGxldGUgPT09IHRydWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJlxuICAgICAgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgaXNGaXJzdEludm9jYXRpb24ocHJlbG9hZGVkRXZlbnRzKTtcbiAgaWYgKHVzZVByZWxvYWRlZCAmJiBwcmVsb2FkZWRFdmVudHMpIHtcbiAgICBldmVudHMgPSBwcmVsb2FkZWRFdmVudHM7XG4gICAgbG9hZGVkQ3Vyc29yID0gcHJlbG9hZGVkQ3Vyc29yID8/IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuXG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBldmVudHNGZXRjaGVkUGFnZXMrKztcbiAgICAgIGFsbEV2ZW50cy5wdXNoKC4uLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgLy8gVXBkYXRlIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGZldGNoZWQgcGFnZSdzIGN1cnNvci5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gd2UgZ290IHJlc3VsdHM6IHRoZSBmaW5hbCBlbXB0eS1wYWdlIHJlc3BvbnNlXG4gICAgICAvLyByZXR1cm5zIGN1cnNvcj1udWxsIHdoaWNoIHdlIG11c3QgTk9UIHVzZSAoaXQgd291bGQgcmVzZXQgdGhlIGN1cnNvcikuXG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSB7XG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvcjtcbiAgICAgIH1cbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5kYXRhLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2UuY3Vyc29yICE9IG51bGw7XG4gICAgfVxuXG4gICAgZXZlbnRzID0gYWxsRXZlbnRzO1xuICAgIGxvYWRlZEN1cnNvciA9IGN1cnNvcjtcbiAgfVxuXG4gIC8vIFRoaXMgaW52b2NhdGlvbidzIHZpZXcgb2YgdGhlIGxvZywgYW5kIHRoZSBxdWV1ZSBvZiBldmVudHMgYSBXb3JsZCBoYXNcbiAgLy8gaGFuZGVkIGJhY2sgb24gYSB3cml0ZSB0aGF0IHRoZSBWTSBoYXMgbm90IGJlZW4gZ2l2ZW4geWV0LiBFdmVyeSB3cml0ZVxuICAvLyBtYWRlIGZyb20gdGhpcyB2aWV3IGdvZXMgdGhyb3VnaCBgY3JlYXRlRXZlbnRgIGJlbG93IHNvIGl0IG5hbWVzIHRoZVxuICAvLyBwb3NpdGlvbiBpdCB3YXMgZGVjaWRlZCBhZ2FpbnN0IGFuZCBpdHMgcmVzcG9uc2UgaXMgcXVldWVkIGhlcmUuXG4gIGNvbnN0IGxvZ1ZpZXcgPSBuZXcgUXVpY2tKU0xvZ1ZpZXcoZXZlbnRzLCBsb2FkZWRDdXJzb3IpO1xuICBjb25zdCBjcmVhdGVFdmVudDogRXZlbnRDcmVhdG9yID0gYXN5bmMgKGRhdGEsIGV2ZW50UGFyYW1zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgZGF0YSwge1xuICAgICAgLi4uZXZlbnRQYXJhbXMsXG4gICAgICAuLi5sb2dWaWV3LnNuYXBzaG90UGFyYW1zKCksXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGV2ZW50UGFyYW1zPy5zaW5jZUN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgLy8gVGhlIHdyaXRlIGFza2VkIGZvciB0aGUgaW5saW5lIGRlbHRhIGFuZCBnb3Qgb25lOiBldmVyeXRoaW5nIGFmdGVyXG4gICAgICAvLyB0aGUgY3Vyc29yLCB0aGlzIHdyaXRlIGluY2x1ZGVkLCByZWFkIHdpdGggcmVmcyByZXNvbHZlZC4gVGFrZW5cbiAgICAgIC8vIHRocm91Z2ggdGhlIGRlbHRhIHBhdGggc28gdGhlIGN1cnNvciBtb3ZlcyB3aXRoIGl0IHdoZW4gdGhhdCBpc1xuICAgICAgLy8gc2FmZTsgdGhlIGNyZWF0ZWQgZXZlbnQncyBwb3NpdGlvbiBpcyBub3RlZCBlaXRoZXIgd2F5LlxuICAgICAgbG9nVmlldy5hYnNvcmIoeyBldmVudDogcmVzdWx0LmV2ZW50IH0pO1xuICAgICAgY29uc3QgYWR2YW5jZWQgPSBsb2dWaWV3LmFic29yYkRlbHRhKGV2ZW50UGFyYW1zLnNpbmNlQ3Vyc29yLCB7XG4gICAgICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yID8/IG51bGwsXG4gICAgICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlID8/IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB3ZmRpYWcoJ2lubGluZV9kZWx0YV9hYnNvcmJlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRzOiByZXN1bHQuZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgaGFzTW9yZTogcmVzdWx0Lmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICAgIGN1cnNvckFkdmFuY2VkOiBhZHZhbmNlZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gVGhlIGNyZWF0ZWQgZXZlbnQgaXMgZGVsaXZlcmVkIG9mZiB0aGUgcmVzcG9uc2Ugb25seSB3aGVuIGl0IGNhcnJpZXNcbiAgICAvLyBubyBwYXlsb2FkIGEgVk0gcmVhZHM7IGV2ZXJ5IG90aGVyIHR5cGUgd2FpdHMgZm9yIGEgcGFnZSBvciBhIGxpc3RpbmcsXG4gICAgLy8gd2hpY2ggcmV0dXJuIGl0IHdpdGggaXRzIHJlZnMgcmVzb2x2ZWQuIFNlZSBRdWlja0pTTG9nVmlldy5cbiAgICBjb25zdCBhYnNvcmJlZCA9IGxvZ1ZpZXcuYWJzb3JiKHJlc3VsdCwge1xuICAgICAgZGVsaXZlckV2ZW50OiBkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJyxcbiAgICB9KTtcbiAgICBpZiAoYWJzb3JiZWQudHJ1bmNhdGVkKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBkcm9wcGVkIGEgdHJ1bmNhdGVkIHNraXBwZWQtc2xvdCByZXBvcnQnLFxuICAgICAgICB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgICBldmVudElkOiByZXN1bHQuZXZlbnQ/LmV2ZW50SWQsXG4gICAgICAgICAgb2ZmZXJlZDogcmVzdWx0LmV2ZW50cz8ubGVuZ3RoID8/IDAsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgY3JlYXRlIGZvciB3cml0ZXMgdGhhdCBlbmQgdGhlIHJ1biAoYHJ1bl9jb21wbGV0ZWRgLCBgcnVuX2ZhaWxlZGAsXG4gICAqIGFuZCB0aGUgdGVybWluYWwgZHJhaW4gb2YgbGVmdG92ZXIgb3BzKTogbm8gcG9zaXRpb24gbmFtZWQgYW5kIG5vIHBhZ2VcbiAgICogYXNrZWQgZm9yLCBiZWNhdXNlIG5vdGhpbmcgcmVwbGF5cyBhIGZpbmlzaGVkIHJ1bidzIGxvZy4gVGhlIG5vZGVcbiAgICogZW5naW5lJ3MgYGRlbHRhUmVxdWVzdEN1cnNvcmAgbWFrZXMgdGhlIHNhbWUgZXhjbHVzaW9uIGZvciBgc2luY2VDdXJzb3JgLlxuICAgKi9cbiAgY29uc3QgdGVybWluYWxDcmVhdGVFdmVudDogRXZlbnRDcmVhdG9yID0gKGRhdGEsIGV2ZW50UGFyYW1zKSA9PlxuICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIGV2ZW50UGFyYW1zKTtcblxuICAvLyBFdmVudC1saW1pdCBndWFyZDogZmFpbCBhIHJ1bmF3YXkgcnVuIG9uY2UgaXRzIGxvZyByZWFjaGVzIHRoZVxuICAvLyBzZXJ2ZXItc3VwcGxpZWQgY2VpbGluZywgdGhlIHNhbWUgZW5mb3JjZW1lbnQgcG9pbnQgYXMgdGhlIG5vZGU6dm1cbiAgLy8gZW5naW5lJ3MgcmVwbGF5IGxvb3AuXG4gIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihldmVudHMubGVuZ3RoLCBtYXhFdmVudHNMaW1pdCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c1ByZWxvYWRlZCh1c2VQcmVsb2FkZWQpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZENvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZFBhZ2VzKGV2ZW50c0ZldGNoZWRQYWdlcyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZXZlbnRzX2ZldGNoZWQnLCB7XG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICBldmVudHNGZXRjaGVkUGFnZXMsXG4gICAgdXNlUHJlbG9hZGVkLFxuICAgIGV2ZW50VHlwZXM6IGV2ZW50cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKGFjYywgZSkgPT4ge1xuICAgICAgYWNjW2UuZXZlbnRUeXBlXSA9IChhY2NbZS5ldmVudFR5cGVdID8/IDApICsgMTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pLFxuICB9KTtcblxuICAvLyBDaGVjayBmb3IgZWxhcHNlZCB3YWl0c1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICBldmVudHNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICApO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3QgZXZlbnREYXRhID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnRcbiAgICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bWVBdCA9IGV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICBpZiAocmVzdW1lQXQgJiYgbm93ID49IG5ldyBEYXRlKHJlc3VtZUF0IGFzIHN0cmluZykuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWxvZ1ZpZXcudHJhY2tpbmcgJiYgcmVzdWx0LmV2ZW50KSB7XG4gICAgICAgICAgICAvLyBObyBwb3NpdGlvbnMgdG8gb3JkZXIgYnkgKHNlZSBRdWlja0pTTG9nVmlldyksIHNvIHRoZSBldmVudFxuICAgICAgICAgICAgLy8gam9pbnMgdGhlIGluaXRpYWwgbG9nIGRpcmVjdGx5LCBhcyBpdCBhbHdheXMgaGFzLlxuICAgICAgICAgICAgZXZlbnRzLnB1c2gocmVzdWx0LmV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIGNvbnRpbnVlO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBUaGUgVk0gaGFzIG5vdCBzdGFydGVkLCBzbyB3aGF0ZXZlciB0aG9zZSB3cml0ZXMgaGFuZGVkIGJhY2sgKGVhY2hcbiAgLy8gd2FpdF9jb21wbGV0ZWQsIHBsdXMgYW55dGhpbmcgYW5vdGhlciB3cml0ZXIgYXBwZW5kZWQgdGhhdCB0aGV5IHNraXBwZWRcbiAgLy8gb3Zlcikgam9pbnMgdGhlIGluaXRpYWwgbG9nIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYSBmZWVkLlxuICBldmVudHMucHVzaCguLi5sb2dWaWV3LnRha2VDb250aWd1b3VzKCkpO1xuXG4gIC8vIFJlc29sdmUgdGhlIHdvcmtmbG93IHNlcnZlciBwb3J0IHNvIGBnZXRXb3JrZmxvd01ldGFkYXRhKCkudXJsYCBpbnNpZGVcbiAgLy8gdGhlIFZNIG1hdGNoZXMgd2hhdCB0aGUgc3RlcC1zaWRlIGhhbmRsZXIgcmVwb3J0cy4gU2tpcHBlZCBvbiBWZXJjZWw6XG4gIC8vIHRoZSBWTSByZWFkcyBWRVJDRUxfVVJMIGRpcmVjdGx5IGluIHRoYXQgZW52aXJvbm1lbnQuXG4gIGNvbnN0IGlzVmVyY2VsID0gcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBwb3J0ID0gaXNWZXJjZWwgPyB1bmRlZmluZWQgOiBhd2FpdCBnZXRQb3J0TGF6eSgpO1xuXG4gIC8vIFJ1biB0aGUgd29ya2Zsb3cgaW4gdGhlIFF1aWNrSlMgVk1cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBpbnZva2luZyBWTScsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB3b3JrZmxvd0lkLFxuICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gIH0pO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzdGFydFF1aWNrSlNXb3JrZmxvdyh7XG4gICAgLy8gUGFzcyB0aGUgU1RSSVBQRUQgYnVuZGxlIHRvIHRoZSBWTSBzbyB0aGUgaW5saW5lIHNvdXJjZSBtYXBcbiAgICAvLyBkb2Vzbid0IGVuZCB1cCBpbiB0aGUgUXVpY2tKUyBoZWFwLiBUaGUgb3JpZ2luYWwgKHVuc3RyaXBwZWQpXG4gICAgLy8gYHdvcmtmbG93Q29kZWAgaXMgc3RpbGwga2VwdCBpbiB0aGlzIGhvc3Qtc2lkZSBzY29wZSBhbmQgaXMgdXNlZFxuICAgIC8vIGJ5IGByZW1hcEVycm9yU3RhY2tgIG9uIHdvcmtmbG93IGZhaWx1cmVzIGJlbG93LlxuICAgIHdvcmtmbG93Q29kZTogd29ya2Zsb3dDb2RlRm9yVk0sXG4gICAgd29ya2Zsb3dJZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBldmVudHMsXG4gICAgd29ybGRDYXBhYmlsaXRpZXM6IHdvcmxkLmNhcGFiaWxpdGllcyxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHBvcnQsXG4gICAgcnVuSW5wdXQsXG4gIH0pO1xuICBsZXQgcmVzdWx0ID0gc2Vzc2lvbi5yZXN1bHQ7XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBWTSByZXR1cm5lZCcsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBjb21wbGV0ZWQ6ICEhcmVzdWx0LmNvbXBsZXRlZCxcbiAgICBzdXNwZW5kZWQ6ICEhcmVzdWx0LnN1c3BlbmRlZCxcbiAgICBmYWlsZWQ6ICEhcmVzdWx0LmZhaWxlZCxcbiAgICBwZW5kaW5nT3BzQ291bnQ6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5sZW5ndGgsXG4gIH0pO1xuXG4gIHdmZGlhZygndm1fcmV0dXJuZWQnLCB7XG4gICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgOiByZXN1bHQuc3VzcGVuZGVkXG4gICAgICAgID8gJ3N1c3BlbmRlZCdcbiAgICAgICAgOiByZXN1bHQuZmFpbGVkXG4gICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgIDogJ3Vua25vd24nLFxuICAgIHBlbmRpbmdPcHNDb3VudDogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lmxlbmd0aCA/PyAwLFxuICAgIHBlbmRpbmdPcFN1bW1hcnk6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5tYXAoKHApID0+ICh7XG4gICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICBoYXNDcmVhdGVkRXZlbnQ6IHAuaGFzQ3JlYXRlZEV2ZW50LFxuICAgICAgLi4uKHAudHlwZSA9PT0gJ3N0ZXAnID8geyBzdGVwSWQ6IChwIGFzIFBlbmRpbmdTdGVwKS5zdGVwSWQgfSA6IHt9KSxcbiAgICB9KSksXG4gICAgZmFpbHVyZU1lc3NhZ2U6IHJlc3VsdC5mYWlsZWQ/Lm1lc3NhZ2UsXG4gICAgZmFpbHVyZU5hbWU6IHJlc3VsdC5mYWlsZWQ/Lm5hbWUsXG4gIH0pO1xuXG4gIC8vIC0tLS0gSW5saW5lIGNvbnRpbnVhdGlvbiBsb29wIC0tLS1cbiAgLy9cbiAgLy8gV2hpbGUgdGhlIHdvcmtmbG93IGlzIHN1c3BlbmRlZCwgdGhpcyBsb29wIGtlZXBzIHRoZSBWTSBhbGl2ZSBhbmRcbiAgLy8gbWFrZXMgYXMgbXVjaCBmb3J3YXJkIHByb2dyZXNzIGFzIHBvc3NpYmxlIHdpdGhpbiBvbmUgaW52b2NhdGlvbjpcbiAgLy9cbiAgLy8gICAxLiBEaXNwYXRjaCBkdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgdGhlIHN1c3BlbnNpb24ncyBwZW5kaW5nIG9wc1xuICAvLyAgICAgIChzdGVwX2NyZWF0ZWQgLyBob29rX2NyZWF0ZWQgLyBhdHRyX3NldCAvIHdhaXRfY3JlYXRlZCAvXG4gIC8vICAgICAgaG9va19yZWNlaXZlZCBmb3IgYWJvcnRzKSBhbmQgY29tcGxldGUgZWxhcHNlZCB3YWl0cy5cbiAgLy8gICAyLiBGZWVkIGFsbCBuZXdseSByZWNvcmRlZCBldmVudHMgKGF0dHJfc2V0LCBob29rX2NyZWF0ZWQsIGVsYXBzZWRcbiAgLy8gICAgICB3YWl0X2NvbXBsZXRlZCwgdGVybWluYWxzIHdyaXR0ZW4gYnkgY29uY3VycmVudCBpbnZvY2F0aW9ucywgLi4uKVxuICAvLyAgICAgIGludG8gdGhlIExJVkUgVk0gdmlhIHNlc3Npb24uY29udGludWVXaXRoRXZlbnRzLCByZXN1bWluZ1xuICAvLyAgICAgIGV4ZWN1dGlvbiBleGFjdGx5IHdoZXJlIGl0IGxlZnQgb2ZmLCBubyBmcmVzaC1WTSByZS1yZXBsYXkuXG4gIC8vICAgICAgQ2hlYXAgcHJvZ3Jlc3MgaXMgZmVkIEJFRk9SRSBydW5uaW5nIHN0ZXAgYm9kaWVzIHNvIHByb21pc2VcbiAgLy8gICAgICBjaGFpbnMgdGhhdCBhcmUgbm90IGdhdGVkIG9uIHN0ZXBzIChob29rLmdldENvbmZsaWN0KCksXG4gIC8vICAgICAgc2V0QXR0cmlidXRlcygpLCByYWNpbmcgc2xlZXBzKSBhZHZhbmNlIGZpcnN0IGFuZCBjYW4gc3VyZmFjZVxuICAvLyAgICAgIGFkZGl0aW9uYWwgcGVuZGluZyBzdGVwcyBmb3IgdGhlIHNhbWUgaW5saW5lIGJhdGNoLlxuICAvLyAgIDMuIE9uY2Ugbm8gY2hlYXAgcHJvZ3Jlc3MgcmVtYWlucywgZXhlY3V0ZSB1cCB0b1xuICAvLyAgICAgIGdldE1heElubGluZVN0ZXBzKCkgc3RlcHMgY3JlYXRlZCBieSBUSElTIGludm9jYXRpb24gaW5saW5lIChub1xuICAvLyAgICAgIHF1ZXVlIHJvdW5kLXRyaXApLCBpbiBwYXJhbGxlbCwgd2l0aCB0aGUgcmVwbGF5IGJ1ZGdldCBwYXVzZWRcbiAgLy8gICAgICBkdXJpbmcgc3RlcCBib2RpZXMsIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBpbmxpbmVcbiAgLy8gICAgICByZXBsYXkgbG9vcC4gT3ZlcmZsb3cgYW5kIHJldHJ5L3Rocm90dGxlZCBzdGVwcyBhcmUgcXVldWVkIGZvclxuICAvLyAgICAgIGJhY2tncm91bmQgZXhlY3V0aW9uLiBBIGRlbGF5ZWQgd2FpdC1jb250aW51YXRpb24gbWVzc2FnZSBpc1xuICAvLyAgICAgIGVucXVldWVkIGZvciB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgZmlyc3QsIHNvIHJhY2luZyB0aW1lcnNcbiAgLy8gICAgICBmaXJlIG9uIHRpbWUgKGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbikgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2tcbiAgLy8gICAgICB0aGlzIG9uZS5cbiAgLy9cbiAgLy8gVGhlIGxvb3AgZXhpdHMgd2hlbiB0aGUgd29ya2Zsb3cgc2V0dGxlcywgbm8gZm9yd2FyZCBwcm9ncmVzcyBpc1xuICAvLyBwb3NzaWJsZSBpbi1wcm9jZXNzLCB0aGUgcmVwbGF5IGJ1ZGdldCBpcyBleGhhdXN0ZWQsIG9yIHRoZSBydW4gaXNcbiAgLy8gZ29uZS5cbiAgY29uc3Qgc2VlbkV2ZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5ldmVudElkKSBzZWVuRXZlbnRJZHMuYWRkKGUuZXZlbnRJZCk7XG4gIH1cbiAgLy8gU3RlcCBjaWRzIGFscmVhZHkgZXhlY3V0ZWQgaW5saW5lIGJ5IHRoaXMgaW52b2NhdGlvbi5cbiAgY29uc3QgZXhlY3V0ZWRTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFN0ZXBzIGZvciB3aGljaCBUSElTIGludm9jYXRpb24gYWxyZWFkeSBzZW50IGEgcXVldWUgbWVzc2FnZS5cbiAgY29uc3QgcXVldWVkU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBBYm9ydHMgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgcmVjb3JkZWQgKGhvb2tfcmVjZWl2ZWQgd3JpdHRlbikuXG4gIC8vIEd1YXJkcyBhZ2FpbnN0IHJlLXJlY29yZGluZyB3aGVuIHRoZSBWTS1zaWRlIGZsYWcgaGFzIG5vdCBiZWVuXG4gIC8vIGNsZWFyZWQgeWV0IHdpdGhpbiB0aGUgc2FtZSBpdGVyYXRpb24uXG4gIGNvbnN0IHJlY29yZGVkQWJvcnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gV2FpdHMgZm9yIHdoaWNoIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC9zY2hlZHVsZWQgd29yay5cbiAgY29uc3QgY29tcGxldGVkV2FpdElkczIgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gSW5saW5lLW93bmVyc2hpcCBzdGF0ZSBwZXIgc3RlcCBjb3JyZWxhdGlvbklkLCBkZXJpdmVkIGZyb20gZXZlcnlcbiAgLy8gZXZlbnQgdGhpcyBpbnZvY2F0aW9uIG9ic2VydmVzIChpbml0aWFsIGxvZyArIGV2ZXJ5IGZlZWQpOiB0aGVcbiAgLy8gcXVpY2tqcyBhbmFsb2cgb2YgdGhlIHJlcGxheS1kZXJpdmVkIG93bmVyc2hpcCBvbiB0aGUgbm9kZSBlbmdpbmUnc1xuICAvLyBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSAoc2VlIHN0ZXAtb3duZXJzaGlwLnRzKS4gTGF0ZXN0LXdpbnM6XG4gIC8vIGV2ZW50cyBhcnJpdmUgaW4gbG9nIG9yZGVyLCBzbyBhIGxhdGVyIHN0ZXBfc3RhcnRlZCBvdmVyd3JpdGVzIHRoZVxuICAvLyBzdGFtcDsgYSBzdGVwX3JldHJ5aW5nIGxhcHNlcyBvd25lcnNoaXAgcGVybWFuZW50bHkgZm9yIHRoZSBpZC5cbiAgY29uc3Qgc3RlcE93bmVyc2hpcCA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgb3duZXI/OiBzdHJpbmc7IHN0YXJ0ZWRBdE1zPzogbnVtYmVyOyBzYXdSZXRyeWluZzogYm9vbGVhbiB9XG4gID4oKTtcbiAgY29uc3Qgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcCA9IChvYnNlcnZlZDogRXZlbnRbXSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgZSBvZiBvYnNlcnZlZCkge1xuICAgICAgaWYgKGUuY29ycmVsYXRpb25JZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGUgJiZcbiAgICAgICAgICBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAgICdvd25lck1lc3NhZ2VJZCcgaW4gZS5ldmVudERhdGEgJiZcbiAgICAgICAgICB0eXBlb2YgZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcHJpb3IgPSBzdGVwT3duZXJzaGlwLmdldChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBzdGVwT3duZXJzaGlwLnNldChlLmNvcnJlbGF0aW9uSWQsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICBzdGFydGVkQXRNczogZS5jcmVhdGVkQXQgPyArbmV3IERhdGUoZS5jcmVhdGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNhd1JldHJ5aW5nOiBwcmlvcj8uc2F3UmV0cnlpbmcgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gc3RlcE93bmVyc2hpcC5nZXQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgc3RlcE93bmVyc2hpcC5zZXQoZS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgLi4uKHByaW9yID8/IHt9KSxcbiAgICAgICAgICBzYXdSZXRyeWluZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwKGV2ZW50cyk7XG4gIGNvbnN0IHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG1heElubGluZVN0ZXBzID0gZ2V0TWF4SW5saW5lU3RlcHMoKTtcbiAgY29uc3QgYnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuICBjb25zdCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgID8gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgIDogRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm9vdFJ1bklkID1cbiAgICAod29ya2Zsb3dSdW4uYXR0cmlidXRlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uW1xuICAgICAgUk9PVF9SVU5fSURfQVRUUklCVVRFXG4gICAgXSA/PyBydW5JZDtcbiAgbGV0IGlubGluZVN0ZXBzRXhlY3V0ZWQgPSAwO1xuICBsZXQgcnVuR29uZSA9IGZhbHNlO1xuICAvLyBTZXQgd2hlbiB0aGlzIGludm9jYXRpb24gd3JvdGUgYW4gZXZlbnQgdGhlIHdvcmtmbG93IG11c3QgY29uc3VtZSB0b1xuICAvLyBtYWtlIHByb2dyZXNzIChhdHRyX3NldCwgZ2V0Q29uZmxpY3QtYXdhaXRlZCBob29rX2NyZWF0ZWQpIGFuZCB0aGVcbiAgLy8gbG9vcCBoYXMgbm90IHlldCByZWFkIGl0IGJhY2ssIHNpbmNlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5ncyBjYW5cbiAgLy8gcmV0dXJuIDAgbmV3IGV2ZW50cyByaWdodCBhZnRlciBhIHdyaXRlLiBJZiBpdCBpcyBzdGlsbCBzZXQgd2hlbiB0aGVcbiAgLy8gbG9vcCBleGl0cyBzdXNwZW5kZWQsIHRoZSBlbnRyeXBvaW50IHJlcXVldWVzIGltbWVkaWF0ZWx5IGluc3RlYWQgb2ZcbiAgLy8gZXhpdGluZyBhd2FpdGluZ19leHRlcm5hbCB3aXRoIHRoZSB1bmJsb2NraW5nIGV2ZW50IGFscmVhZHkgd3JpdHRlblxuICAvLyBhbmQgbm90aGluZyBzY2hlZHVsZWQgdG8gcmVhZCBpdC5cbiAgbGV0IHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEZldGNoIGFsbCBldmVudHMgbm90IHlldCBwcm9jZXNzZWQgYnkgdGhlIGxpdmUgVk0gKGxvZyBvcmRlciksIHJlYWRpbmdcbiAgICogZnJvbSB3aGVyZSB0aGUgbG9nIHdhcyBsYXN0IHJlYWQgdG8uIEEgV29ybGQncyBjdXJzb3IgbmV2ZXIgcGFzc2VzIGFcbiAgICogcG9zaXRpb24gd2hvc2Ugd3JpdGVyIGlzIHN0aWxsIGluIGZsaWdodCwgc28gcmVhZGluZyBmb3J3YXJkIGZyb20gaXRcbiAgICogY2Fubm90IHNraXAgYW4gZXZlbnQ7IHRoZSBpZCBzZXQgaXMgd2hhdCBtYWtlcyBhIHJlLXJlYWQgb2YgdGhlIHNhbWVcbiAgICogc3BhbiAoYWZ0ZXIgYSBxdWV1ZWQgcGFnZSBvciBhIGRlbHRhIG1vdmVkIHRoZSB2aWV3IGFoZWFkIG9mIHRoZSBjdXJzb3IpXG4gICAqIGhhcm1sZXNzLlxuICAgKi9cbiAgY29uc3QgZmV0Y2hVbnNlZW5FdmVudHMgPSBhc3luYyAoKTogUHJvbWlzZTxFdmVudFtdPiA9PiB7XG4gICAgY29uc3QgdW5zZWVuOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IGxvZ1ZpZXcubG9nQ3Vyc29yO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcbiAgICB3aGlsZSAoaGFzTW9yZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICBjdXJzb3I6IGN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGlmIChlLmV2ZW50SWQgJiYgc2VlbkV2ZW50SWRzLmhhcyhlLmV2ZW50SWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGUuZXZlbnRJZCkgc2VlbkV2ZW50SWRzLmFkZChlLmV2ZW50SWQpO1xuICAgICAgICB1bnNlZW4ucHVzaChlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5jdXJzb3IpIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvcjtcbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5kYXRhLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2UuY3Vyc29yICE9IG51bGw7XG4gICAgfVxuICAgIGxvZ1ZpZXcuYWR2YW5jZUN1cnNvcihjdXJzb3IpO1xuICAgIGxvZ1ZpZXcubWFya0ZlZCh1bnNlZW4pO1xuICAgIG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAodW5zZWVuKTtcbiAgICByZXR1cm4gdW5zZWVuO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFdmVudHMgYSBXb3JsZCBoYW5kZWQgYmFjayBvbiB0aGlzIGludm9jYXRpb24ncyB3cml0ZXMgdGhhdCB0aGUgVk0gY2FuXG4gICAqIHRha2Ugbm93OiB0aGUgY29udGlndW91cyBydW4gYWJvdmUgd2hhdCBpdCBoYXMgKHNlZVxuICAgKiBgUXVpY2tKU0xvZ1ZpZXcudGFrZUNvbnRpZ3VvdXNgKS4gRGVsaXZlcmVkIGFoZWFkIG9mIGBmZXRjaFVuc2VlbkV2ZW50c2BcbiAgICogc28gYSB3cml0ZSdzIHJlc3BvbnNlLCBub3QgYSBsaXN0aW5nLCBpcyB3aGF0IHVzdWFsbHkgY2FycmllcyB0aGUgbG9nXG4gICAqIGZvcndhcmQsIHdoaWNoIGlzIHRoZSByb3VuZC10cmlwIHRoZSBwYWdlIGV4aXN0cyB0byBzYXZlLiBFbXB0eSB3aGVuXG4gICAqIG5vdGhpbmcgaXMgcXVldWVkIG9yIHRoZSBuZXh0IHBvc2l0aW9uIGlzIG5vdCBpbiBoYW5kLCBhbmQgdGhlIGNhbGxlclxuICAgKiBsaXN0cy5cbiAgICovXG4gIGNvbnN0IHRha2VRdWV1ZWRFdmVudHMgPSAoKTogRXZlbnRbXSA9PiB7XG4gICAgY29uc3QgcXVldWVkID0gbG9nVmlldy50YWtlQ29udGlndW91cygpO1xuICAgIGZvciAoY29uc3QgZSBvZiBxdWV1ZWQpIHtcbiAgICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgICB9XG4gICAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcChxdWV1ZWQpO1xuICAgIHJldHVybiBxdWV1ZWQ7XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICB3aGlsZSAocmVzdWx0LnN1c3BlbmRlZCAmJiAhcnVuR29uZSAmJiAhYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIGl0ZXJhdGlvbisrO1xuICAgICAgLy8gUmUtY2hlY2sgdGhlIGV2ZW50IGNlaWxpbmcgZXZlcnkgdHVybjogdGhlIGxvb3AgYXBwZW5kcyBldmVudHMgb25cbiAgICAgIC8vIGVhY2ggY29udGludWVXaXRoRXZlbnRzLCBzbyBhIHNpbmdsZSBpbnZvY2F0aW9uIGNhbiBvdGhlcndpc2UgZ3Jvd1xuICAgICAgLy8gdGhlIGxvZyBhcmJpdHJhcmlseSBmYXIgcGFzdCB0aGUgb3BlcmF0b3IncyBsaW1pdCAodGhlIG5vZGUgZW5naW5lXG4gICAgICAvLyByZS1jaGVja3MgcGVyIHJlcGxheSBmb3IgdGhlIHNhbWUgcmVhc29uKS4gYHNlZW5FdmVudElkc2AgY291bnRzXG4gICAgICAvLyBldmVyeSBldmVudCB0aGlzIGludm9jYXRpb24gaGFzIG9ic2VydmVkOiBpbml0aWFsIGxvZyArIGFsbFxuICAgICAgLy8gZmVlZHMuXG4gICAgICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBzZWVuRXZlbnRJZHMuc2l6ZSA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihzZWVuRXZlbnRJZHMuc2l6ZSwgbWF4RXZlbnRzTGltaXQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGVuZGluZ09wZXJhdGlvbnMgPSByZXN1bHQuc3VzcGVuZGVkLnBlbmRpbmdPcGVyYXRpb25zO1xuXG4gICAgICAvLyBTZWxlY3QgdGhpcyB0dXJuJ3MgaW5saW5lIGNhbmRpZGF0ZXMgQkVGT1JFIGRpc3BhdGNoOiBmcmVzaCBzdGVwc1xuICAgICAgLy8gKG5vIHN0ZXBfY3JlYXRlZCB5ZXQpIHRoYXQgdGhpcyBpbnZvY2F0aW9uIGhhc24ndCBhbHJlYWR5IGhhbmRsZWQuXG4gICAgICAvLyBUaGVpciBzdGVwX2NyZWF0ZWQgaXMgZGVsaWJlcmF0ZWx5IE5PVCB3cml0dGVuIGJ5IGRpc3BhdGNoOiB0aGVcbiAgICAgIC8vIGlubGluZSBjbGFpbSBiZWxvdyBpcyBhIGxhenkgc3RlcF9zdGFydGVkIGNhcnJ5aW5nIHRoZSBpbnB1dCxcbiAgICAgIC8vIHdoaWNoIHRoZSB3b3JsZCBhcHBsaWVzIGFzIGFuIGF0b21pYyBjcmVhdGUtY2xhaW0uIEEgY29uY3VycmVudFxuICAgICAgLy8gaW52b2NhdGlvbiByYWNpbmcgb24gdGhlIHNhbWUgZnJlc2ggc3RlcCBsb3NlcyB0aGF0IGNsYWltIHdpdGhcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IgYW5kIHNraXBzLCBzbyBzdGVwIGJvZGllcyBjYW5ub3QgZG91YmxlLXJ1blxuICAgICAgLy8gKHByZXZpb3VzbHkgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0ZWQgdGhlIHN0ZXAgYWZ0ZXIgb25lIGxvc3RcbiAgICAgIC8vIHRoZSBzd2FsbG93ZWQgc3RlcF9jcmVhdGVkIHJhY2UpLlxuICAgICAgY29uc3QgZnJlc2hTdGVwcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT5cbiAgICAgICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAgICAgIWV4ZWN1dGVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAhcXVldWVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICk7XG4gICAgICAvLyBTdGVwcyB3aG9zZSBpbnB1dCByZWZ1c2VkIHRvIHNlcmlhbGl6ZSAoc2VlXG4gICAgICAvLyBQZW5kaW5nU3RlcC5zZXJpYWxpemF0aW9uRXJyb3IpIG5ldmVyIGV4ZWN1dGU6IHRoZXkgbXVzdCBub3QgYmVcbiAgICAgIC8vIGlubGluZS1jbGFpbWVkIChhIGxhenkgc3RlcF9zdGFydGVkIHdvdWxkIG5lZWQgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIGZhaWxlZCkgbm9yIHF1ZXVlZC4gRGlzcGF0Y2ggYmVsb3cgZmluYWxpemVzIHRoZW0gYXMgc3RlcF9jcmVhdGVkXG4gICAgICAvLyArIHN0ZXBfZmFpbGVkIGluc3RlYWQ7IG9ubHkgaGVhbHRoeSBzdGVwcyBjb21wZXRlIGZvciBpbmxpbmVcbiAgICAgIC8vIHNsb3RzIGFuZCBvdmVyZmxvdy5cbiAgICAgIGNvbnN0IGhlYWx0aHlTdGVwcyA9IGZyZXNoU3RlcHMuZmlsdGVyKFxuICAgICAgICAoc3RlcCkgPT4gIXN0ZXAuc2VyaWFsaXphdGlvbkVycm9yXG4gICAgICApO1xuICAgICAgY29uc3QgaW5saW5lQ2FuZGlkYXRlcyA9XG4gICAgICAgIG1heElubGluZVN0ZXBzIDw9IDAgPyBbXSA6IGhlYWx0aHlTdGVwcy5zbGljZSgwLCBtYXhJbmxpbmVTdGVwcyk7XG4gICAgICBjb25zdCBpbmxpbmVDbGFpbUNpZHMgPSBuZXcgU2V0KFxuICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT4gc3RlcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcblxuICAgICAgLy8gMS4gRHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoaXMgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzLlxuICAgICAgY29uc3Qgb3BzVG9EaXNwYXRjaCA9IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgob3ApID0+XG4gICAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgICAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkICYmXG4gICAgICAgIHJlY29yZGVkQWJvcnRJZHMuaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgPyAoeyAuLi5vcCwgYWJvcnRSZXF1ZXN0ZWQ6IGZhbHNlIH0gYXMgUGVuZGluZ09wZXJhdGlvbilcbiAgICAgICAgICA6IG9wXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snICYmIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICByZWNvcmRlZEFib3J0SWRzLmFkZChvcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU3RlcHMgYmV5b25kIHRoZSBpbmxpbmUgY2FwIGFyZSBoYW5kZWQgdG8gdGhlIHF1ZXVlIGluIHRoZSBzYW1lXG4gICAgICAvLyB0dXJuIHRoZWlyIHN0ZXBfY3JlYXRlZCBpcyB3cml0dGVuLiBXaGVyZSBlbGlnaWJsZSwgdGhlIGRpc3BhdGNoXG4gICAgICAvLyBiZWxvdyBwYXJhbGxlbGl6ZXMgZWFjaCBvdmVyZmxvdyBzdGVwJ3Mgc3RlcF9jcmVhdGVkIHdyaXRlIHdpdGhcbiAgICAgIC8vIGl0cyBxdWV1ZSBwdWJsaXNoIChyZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogdGhlIG1lc3NhZ2UgY2Fycmllc1xuICAgICAgLy8gYHN0ZXBJbnB1dGAgc28gdGhlIGNvbnN1bWVyIGNhbiByZS1lbnN1cmUgdGhlIGV2ZW50KTsgdGhlIHJlc3RcbiAgICAgIC8vIGFyZSBxdWV1ZWQgcmlnaHQgYWZ0ZXIsIGluIHBhcmFsbGVsLiBUaGlzIG11c3QgYWxsIGhhcHBlbiBCRUZPUkVcbiAgICAgIC8vIHRoZSBldmVudCBmZWVkIGJlbG93OiB0aGUgZmVlZCBhbHdheXMgb2JzZXJ2ZXMgdGhvc2VcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCB3cml0ZXMgYXMgdW5zZWVuIGV2ZW50cyBhbmQgYGNvbnRpbnVlYHMsIHNvIGFcbiAgICAgIC8vIGhhbmRvZmYgcGxhY2VkIGFmdGVyIGl0IGlzIHVucmVhY2hhYmxlIG9uIHRoZSBvbmx5IGl0ZXJhdGlvblxuICAgICAgLy8gdGhhdCBzdGlsbCBjbGFzc2lmaWVzIHRoZXNlIHN0ZXBzIGFzIGZyZXNoOiBuZXh0IHR1cm4gdGhleSBjYXJyeVxuICAgICAgLy8gaGFzQ3JlYXRlZEV2ZW50IGFuZCB3b3VsZCBuZXZlciBiZSBxdWV1ZWQgYXQgYWxsICh0aGUgd2VkZ2UgYmVoaW5kXG4gICAgICAvLyBwcm9taXNlUmFjZVN0cmVzc1Rlc3RXb3JrZmxvdyBoYW5naW5nIGluIHRoZSBxdWlja2pzIENJIGxlZ3MpLiBUaGVcbiAgICAgIC8vIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleSBtYWtlcyByZXBlYXRzIGhhcm1sZXNzLlxuICAgICAgY29uc3Qgb3ZlcmZsb3dTdGVwcyA9IGhlYWx0aHlTdGVwcy5zbGljZShpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aCk7XG4gICAgICBjb25zdCBkaXNwYXRjaGVkID0gYXdhaXQgZGlzcGF0Y2hQZW5kaW5nT3BzKHtcbiAgICAgICAgd29ybGQsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICBjcmVhdGVFdmVudCxcbiAgICAgICAgLi4uKGxvZ1ZpZXcudHJhY2tpbmcgJiYgdHlwZW9mIGxvZ1ZpZXcubG9nQ3Vyc29yID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8geyBkZWx0YUN1cnNvcjogbG9nVmlldy5sb2dDdXJzb3IgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogb3BzVG9EaXNwYXRjaCxcbiAgICAgICAgc2tpcFN0ZXBDcmVhdGlvbjogaW5saW5lQ2xhaW1DaWRzLFxuICAgICAgICBxdWV1ZVN0ZXBDaWRzOiBuZXcgU2V0KG92ZXJmbG93U3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpKSxcbiAgICAgICAgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzOiB0cnVlLFxuICAgICAgICB3ZmRpYWcsXG4gICAgICB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkQXR0cmlidXRlRXZlbnQgfHxcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkR2V0Q29uZmxpY3RIb29rXG4gICAgICApIHtcbiAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQSBmaW5hbGl6ZWQgdW5zZXJpYWxpemFibGUgc3RlcCBoYXMgdGVybWluYWwgZXZlbnRzIGR1cmFibHlcbiAgICAgIC8vIHdyaXR0ZW4gYnV0IG5vIGV4ZWN1dGlvbiBtZXNzYWdlIGFueXdoZXJlOiBpZiB0aGUgZmVlZCBiZWxvd1xuICAgICAgLy8gZG9lc24ndCBzdXJmYWNlIHRoZW0gKGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5nKSBhbmQgdGhlIGxvb3BcbiAgICAgIC8vIGV4aXRzLCBub3RoaW5nIHdvdWxkIGV2ZXIgcmUtaW52b2tlIHRoZSBydW4gdG8gb2JzZXJ2ZSB0aGVcbiAgICAgIC8vIGZhaWx1cmUuIFJhaXNlIHRoZSByZXF1ZXVlIHNpZ25hbCAoc2FtZSBtZWNoYW5pc20gYXMgaW5saW5lXG4gICAgICAvLyB0ZXJtaW5hbHMpIGFuZCBtYXJrIHRoZSBzdGVwcyBoYW5kbGVkIHNvIGxhdGVyIHR1cm5zIGRvbid0XG4gICAgICAvLyByZS1maW5hbGl6ZSBvciBiYWNrc3RvcC1xdWV1ZSB0aGVtLlxuICAgICAgaWYgKGRpc3BhdGNoZWQuZmFpbGVkU2VyaWFsaXphdGlvblN0ZXBDaWRzLnNpemUgPiAwKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBjaWQgb2YgZGlzcGF0Y2hlZC5mYWlsZWRTZXJpYWxpemF0aW9uU3RlcENpZHMpIHtcbiAgICAgICAgICBleGVjdXRlZFN0ZXBJZHMuYWRkKGNpZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjaWQgb2YgZGlzcGF0Y2hlZC5xdWV1ZWRTdGVwQ2lkcykge1xuICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChjaWQpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG92ZXJmbG93U3RlcHNcbiAgICAgICAgICAuZmlsdGVyKChzdGVwKSA9PiAhZGlzcGF0Y2hlZC5xdWV1ZWRTdGVwQ2lkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSlcbiAgICAgICAgICAubWFwKChzdGVwKSA9PiB7XG4gICAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBDb21wbGV0ZSBlbGFwc2VkIHdhaXRzIHNvIHRoZWlyIHdhaXRfY29tcGxldGVkIGV2ZW50cyBhcmUgcGlja2VkXG4gICAgICAvLyB1cCBieSB0aGUgZmVlZCBiZWxvdyAoaW5zdGVhZCBvZiBhIHF1ZXVlIHJlLWludm9jYXRpb24pLlxuICAgICAgY29uc3Qgd2FpdENvbXBsZXRlUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgICBpZiAoY29tcGxldGVkV2FpdElkczIuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSA+IDApIGNvbnRpbnVlO1xuICAgICAgICBjb21wbGV0ZWRXYWl0SWRzMi5hZGQod2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgd2FpdENvbXBsZXRlUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAod2FpdENvbXBsZXRlUHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Q29tcGxldGVQcm9taXNlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENoZWFwIHByb2dyZXNzIGZpcnN0OiBmZWVkIG5ld2x5IHJlY29yZGVkIGV2ZW50cyBpbnRvIHRoZSBsaXZlXG4gICAgICAvLyBWTSBiZWZvcmUgYmxvY2tpbmcgb24gc3RlcCBib2RpZXMuIFdoYXQgdGhlIHdyaXRlcyBhYm92ZSBoYW5kZWQgYmFja1xuICAgICAgLy8gaXMgZGVsaXZlcmVkIGZpcnN0LCBhbmQgYSBsaXN0aW5nIHJ1bnMgd2hlbiB0aGUgcXVldWUgZG9lcyBub3QgcmVhY2hcbiAgICAgIC8vIHRoZSBuZXh0IHBvc2l0aW9uLiBBIHJlcG9ydCBjaGFuZ2VzIHdoYXQgaXMgZmVkIGZpcnN0LCBub3Qgd2hldGhlclxuICAgICAgLy8gdGhpcyBsaXN0aW5nIGhhcHBlbnM6IGFmdGVyIGEgcXVldWVkIHBhZ2UgaXMgZmVkLCB0aGlzIGJyYW5jaFxuICAgICAgLy8gYGNvbnRpbnVlYHMsIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZmluZHMgdGhlIHF1ZXVlIGVtcHR5IGFuZCBsaXN0c1xuICAgICAgLy8gZnJvbSBhIGN1cnNvciBhIHJlcG9ydCBkb2VzIG5vdCBhZHZhbmNlIChyZS1yZWFkaW5nIHRoZSByZXBvcnRlZFxuICAgICAgLy8gc3BhbiwgZGVkdXBlZCBvbiBgc2VlbkV2ZW50SWRzYCkuIE9ubHkgdGhlIGlubGluZSBkZWx0YSBiZWxvdywgd2hpY2hcbiAgICAgIC8vIGRvZXMgYWR2YW5jZSB0aGUgY3Vyc29yLCBzYXZlcyBhIGxpc3Rpbmcgb3V0cmlnaHQuIFNhbWUgc2hhcGUgYXMgdGhlXG4gICAgICAvLyBub2RlIGVuZ2luZS5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgcXVldWVkID0gdGFrZVF1ZXVlZEV2ZW50cygpO1xuICAgICAgICBjb25zdCBuZXdFdmVudHMgPVxuICAgICAgICAgIHF1ZXVlZC5sZW5ndGggPiAwID8gcXVldWVkIDogYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzLCBzbyBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgZmVkRnJvbTogcXVldWVkLmxlbmd0aCA+IDAgPyAnd3JpdGUtcmVzcG9uc2UnIDogJ2xpc3QnLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQsIHNvIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cyksXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgLy8gICAgIG9yaWdpbmFsIGhhbmRvZmYuXG4gICAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcE9wcykge1xuICAgICAgICBpZiAoIXN0ZXAuaGFzQ3JlYXRlZEV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChxdWV1ZWRTdGVwSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwID0gc3RlcE93bmVyc2hpcC5nZXQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICBvd25lcnNoaXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIG93bmVyc2hpcC5vd25lciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgIW93bmVyc2hpcC5zYXdSZXRyeWluZztcbiAgICAgICAgbGV0IGxlYXNlUmVtYWluaW5nU2Vjb25kcyA9IDA7XG4gICAgICAgIGlmIChvd25lcnNoaXBBY3RpdmUgJiYgb3duZXJzaGlwLnN0YXJ0ZWRBdE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBsZWFzZVNlY29uZHMgPSBnZXRJbmxpbmVPd25lcnNoaXBMZWFzZVNlY29uZHMoKTtcbiAgICAgICAgICBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGxlYXNlU2Vjb25kcyxcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgKG93bmVyc2hpcC5zdGFydGVkQXRNcyArIGxlYXNlU2Vjb25kcyAqIDEwMDAgLSBub3dNcykgLyAxMDAwXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IG93bmVyTWVzc2FnZUlkICYmXG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbGVhc2VSZW1haW5pbmdTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6IGBiYWNrc3RvcDoke293bmVyc2hpcC5zdGFydGVkQXRNc31gLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIGluLXByb2Nlc3MgcHJvZ3Jlc3MgcG9zc2libGU6IHRoZSBydW4gYXdhaXRzIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIHN0aW11bHVzIChob29rIHBheWxvYWQsIHF1ZXVlZCBzdGVwLCB3YWl0IHRpbWVyKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIFJhY2luZyB0aW1lcnMgbXVzdCBmaXJlIG9uIHRpbWUgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2sgdGhpc1xuICAgICAgLy8gaW52b2NhdGlvbjogZW5xdWV1ZSBhIGRlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdFxuICAgICAgLy8gcGVuZGluZyB3YWl0IChhIHNlcGFyYXRlIGludm9jYXRpb24gd3JpdGVzIGl0cyB3YWl0X2NvbXBsZXRlZCBhdFxuICAgICAgLy8gdGhlIHJpZ2h0IGxvZyBwb3NpdGlvbiwgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyB3YWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaCkuXG4gICAgICBsZXQgc29vbmVzdFdhaXQ6IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBzZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgLy8gV2FpdHMgd2hvc2Ugd2FpdF9jb21wbGV0ZWQgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgd3JvdGUgKHRoZVxuICAgICAgICAvLyBlbGFwc2VkLXdhaXQgcGFzcyBhYm92ZSkgYXJlIGRvbmU6IHRoZSBldmVudCBqdXN0IGhhc24ndCBmZWRcbiAgICAgICAgLy8gYmFjayBpbnRvIHRoZSBWTSB5ZXQuIE5vIGNvbnRpbnVhdGlvbiBuZWVkZWQuXG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQW4gYWxyZWFkeS1lbGFwc2VkIHdhaXQgTVVTVCBzdGlsbCBnZXQgYSBjb250aW51YXRpb24gKGNsYW1wZWRcbiAgICAgICAgLy8gdG8gdGhlIDFzIG1pbmltdW0sIGV4YWN0bHkgbGlrZSB0aGUgbm9kZSBlbmdpbmUnc1xuICAgICAgICAvLyBgTWF0aC5tYXgoMTAwMCwgcmVzdW1lQXRNcyAtIG5vdylgKSwgbm90IGJlIHNraXBwZWQ6IGEgd2FpdFxuICAgICAgICAvLyB3aG9zZSBkZWFkbGluZSBmYWxscyBiZXR3ZWVuIHRoaXMgaXRlcmF0aW9uJ3MgZWxhcHNlZC13YWl0XG4gICAgICAgIC8vIHBhc3MgKHdoaWNoIHNhdyBpdCBhcyBzdGlsbCBwZW5kaW5nIGFuZCB3cm90ZSBub3RoaW5nKSBhbmRcbiAgICAgICAgLy8gdGhpcyBzd2VlcCB3b3VsZCBvdGhlcndpc2UgZ2V0IE5FSVRIRVIgYSB3YWl0X2NvbXBsZXRlZCBOT1IgYVxuICAgICAgICAvLyBjb250aW51YXRpb24sIGFuZCB0aGUgaW5saW5lIGJhdGNoIGJlbG93IHRoZW4gYmxvY2tzIHRoaXNcbiAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiB3aXRoIG5vIHdha2UgYXJtZWRcbiAgICAgICAgLy8gYW55d2hlcmUuIEZvciBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgdGhhdCBzaWxlbnRseSBoYW5kc1xuICAgICAgICAvLyB0aGUgcmFjZSB0byB0aGUgc3RlcDogdGhlIHNsZWVwJ3Mgd2FpdF9jb21wbGV0ZWQgaXMgbmV2ZXJcbiAgICAgICAgLy8gd3JpdHRlbiBhbmQgdGhlIHJ1biBjb21wbGV0ZXMgd2l0aCB0aGUgd3Jvbmcgd2lubmVyLiBUaGVcbiAgICAgICAgLy8gd2luZG93IGJldHdlZW4gdGhlIHR3byBjaGVja3Mgc3BhbnMgdGhpcyBpdGVyYXRpb24ncyBkaXNwYXRjaFxuICAgICAgICAvLyArIGZlZWQgcm91bmQtdHJpcHMsIHNvIG9uIG5ldHdvcmstYmFja2VkIHdvcmxkcyAod29ybGQtdmVyY2VsKVxuICAgICAgICAvLyBhIHNob3J0IHNsZWVwIGxhbmRzIGluIGl0IHJvdXRpbmVseSwgb2JzZXJ2ZWQgYXMgYSB+NTAlXG4gICAgICAgIC8vIHNsZWVwV2luc1JhY2VXb3JrZmxvdyBmYWlsdXJlIHJhdGUgaW4gdGhlIFZlcmNlbCBlMmUgbGVncyxcbiAgICAgICAgLy8gd2hpbGUgd29ybGQtbG9jYWwncyBzdWItbXMgcm91bmQtdHJpcHMgbWFza2VkIGl0IGxvY2FsbHkuIFRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gaW52b2NhdGlvbidzIHByZS1WTSBlbGFwc2VkIGNoZWNrIHdyaXRlcyB0aGVcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQgfjFzIGxhdGVyLlxuICAgICAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7IGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCwgc2Vjb25kcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gbmV4dFdhaXRDb250aW51YXRpb25BdHRlbXB0KHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHdhaXRDb250aW51YXRpb246IHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICAgICAgc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIERhdGUubm93KCksXG4gICAgICAgICAgICBhdHRlbXB0XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ3dhaXRfY29udGludWF0aW9uX3NjaGVkdWxlZCcsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGRlbGF5U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIGJhdGNoIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5IGJ1ZGdldCBpc1xuICAgICAgLy8gcGF1c2VkIHdoaWxlIHN0ZXAgYm9kaWVzIHJ1bjogc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZVxuICAgICAgLy8gcGxhdGZvcm0gZnVuY3Rpb24gZHVyYXRpb24sIG5vdCB0aGUgcmVwbGF5IHRpbWVvdXQuIE5PVEUgKGJ5XG4gICAgICAvLyBkZXNpZ24pOiB3aXRoIHRoZSBidWRnZXQgcGFya2VkIHBlciBiYXRjaCwgdGhlIG9ubHkgYm91bmQgb24gaG93XG4gICAgICAvLyBtYW55IGlubGluZSBzdGVwcyBvbmUgaW52b2NhdGlvbiBjYW4gY2hhaW4gaXMgdGhlIHBsYXRmb3JtJ3NcbiAgICAgIC8vIGZ1bmN0aW9uIHRpbWVvdXQ6IHRoZSBTREsgZGVsaWJlcmF0ZWx5IGltcG9zZXMgbm8gY2FwIG9mIGl0c1xuICAgICAgLy8gb3duLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoZXJlIGEgbG9uZyBzZXF1ZW50aWFsXG4gICAgICAvLyB3b3JrZmxvdyBsaWtld2lzZSBydW5zIHN0ZXAtYnktc3RlcCB1bnRpbCB0aGUgcGxhdGZvcm0gcmVjbGFpbXNcbiAgICAgIC8vIHRoZSBpbnZvY2F0aW9uIGFuZCBhIHJlZGVsaXZlcnkgcmVzdW1lcyBmcm9tIHRoZSBsb2cuXG4gICAgICAvLyBJbmxpbmUgZGVsdGE6IGEgc2luZ2xlIGlubGluZSBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYXNrcyB0aGUgV29ybGRcbiAgICAgIC8vIGZvciBldmVyeXRoaW5nIGFmdGVyIHRoZSBjdXJzb3IgdGhpcyB2aWV3IGhvbGRzLCBzbyB0aGUgc3RlcCdzIG93blxuICAgICAgLy8gZXZlbnRzIChhbmQgYW55dGhpbmcgaW50ZXJsZWF2ZWQpIGFycml2ZSBvbiB0aGUgd3JpdGUncyByZXNwb25zZSBhbmRcbiAgICAgIC8vIHRoZSBmZWVkIGJlbG93IG5lZWRzIG5vIGxpc3RpbmcuIFNhbWUgZ2F0ZSBhcyB0aGUgbm9kZSBlbmdpbmUnc1xuICAgICAgLy8gYHJlcXVlc3RJbmxpbmVEZWx0YWAgKHJ1bnRpbWUudHMpLCB0cmFuc2xhdGVkIHRvIHRoaXMgbG9vcCdzIHRlcm1zOlxuICAgICAgLy9cbiAgICAgIC8vIC0gVGhpcyBzdGVwIGlzIHRoZSBvbmx5IHN0ZXAgb3V0c3RhbmRpbmc6IG5vIG92ZXJmbG93IHNpYmxpbmcgcXVldWVkXG4gICAgICAvLyAgIHRoaXMgaXRlcmF0aW9uLCBubyB1bnNlcmlhbGl6YWJsZSBzaWJsaW5nLCBubyBzdGVwIGZyb20gYW4gZWFybGllclxuICAgICAgLy8gICBpbnZvY2F0aW9uIGhhbmRlZCB0byB0aGUgcXVldWUgYWJvdmUuIFNldmVyYWwgd3JpdGVycyBlYWNoIGRpZmZpbmdcbiAgICAgIC8vICAgYWdhaW5zdCB0aGUgc2FtZSBjdXJzb3Igd291bGQgcHJvZHVjZSBkZWx0YXMgb2Ygd2hpY2ggb25seSB0aGVcbiAgICAgIC8vICAgZmlyc3QgY291bGQgYmUgdGFrZW4uXG4gICAgICAvLyAtIE5vIHdhaXQgaXMgcGVuZGluZy4gQSBgd2FpdF9jb21wbGV0ZWRgIGlzIGEgcmVzb2x1dGlvbiB0aGVcbiAgICAgIC8vICAgd29ya2Zsb3cgaXMgd2FpdGluZyBvbiByYXRoZXIgdGhhbiBhbiBldmVudCBpdCBjYW4gb2JzZXJ2ZSBvbmVcbiAgICAgIC8vICAgaXRlcmF0aW9uIGxhdGUsIHNvIGEgZGVsdGEgdGhhdCBwcmVkYXRlcyBpdCB3b3VsZCBzZXR0bGUgdGhlXG4gICAgICAvLyAgIHNsZWVwIGZyb20gYSB2aWV3IHRoYXQgZG9lcyBub3QgaG9sZCBpdHMgY29tcGxldGlvbjsgdGhlIGxpc3RpbmdcbiAgICAgIC8vICAgYWZ0ZXIgdGhlIHN0ZXAgaXMgd2hhdCByZWFkcyBpdCBpbiBvcmRlci5cbiAgICAgIC8vIC0gVGhlIGxvZyBoYXMgYSBjdXJzb3IgdG8gbmFtZSAodHJhY2tpbmcgb24sIHNvbWV0aGluZyByZWFkKS5cbiAgICAgIGNvbnN0IGhhc1BlbmRpbmdXYWl0ID0gcGVuZGluZ09wZXJhdGlvbnMuc29tZShcbiAgICAgICAgKG9wKSA9PlxuICAgICAgICAgIG9wLnR5cGUgPT09ICd3YWl0JyAmJlxuICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzMi5oYXMoKG9wIGFzIFBlbmRpbmdXYWl0KS5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlubGluZURlbHRhU2luY2VDdXJzb3IgPVxuICAgICAgICBzdGVwT3BzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBmcmVzaFN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAhaGFzUGVuZGluZ1dhaXQgJiZcbiAgICAgICAgbG9nVmlldy50cmFja2luZyAmJlxuICAgICAgICB0eXBlb2YgbG9nVmlldy5sb2dDdXJzb3IgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBsb2dWaWV3LmxvZ0N1cnNvclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgYnVkZ2V0LnBhdXNlKCk7XG4gICAgICBsZXQgb3V0Y29tZXM6IFN0ZXBFeGVjdXRpb25SZXN1bHRbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dGNvbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaW5saW5lQ2FuZGlkYXRlcy5tYXAoKHN0ZXApID0+XG4gICAgICAgICAgICBydW5TdGVwU2luZ2xlRmxpZ2h0KHJ1bklkLCBzdGVwLmNvcnJlbGF0aW9uSWQsICgpID0+XG4gICAgICAgICAgICAgIChhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIGNsYWltOiBzdGVwX2NyZWF0ZWQgaXMgZGVmZXJyZWQgKGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGl0KSBhbmQgdGhpcyBzdGVwX3N0YXJ0ZWQgY2FycmllcyB0aGUgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCBhdG9taWNhbGx5OlxuICAgICAgICAgICAgICAgICAgLy8gZXhhY3RseS1vbmUtb3duZXIuIEEgY29uY3VycmVudCBjbGFpbWFudCBnZXRzXG4gICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIOKGkiB7IHR5cGU6ICdza2lwcGVkJyB9IGFuZCBuZXZlclxuICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgYm9keS4gTWlycm9ycyB0aGUgbm9kZSBlbmdpbmUncyBpbmxpbmUgcGF0aC5cbiAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCBzdGFtcDogd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keSBhcyBpblxuICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IGluIHRoaXMgaW52b2NhdGlvbiBhbmQgYXJtIGEgZGVsYXllZCBiYWNrc3RvcFxuICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uOiBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OiAxLFxuICAgICAgICAgICAgICAgICAgLi4uKGlubGluZURlbHRhU2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IHsgaW5saW5lRGVsdGFTaW5jZUN1cnNvciB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0pKSgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgfVxuICAgICAgaW5saW5lU3RlcHNFeGVjdXRlZCArPSBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBpbmxpbmVDYW5kaWRhdGVzW2ldO1xuICAgICAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZXNbaV07XG4gICAgICAgIGV4ZWN1dGVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG91dGNvbWUudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICBvdXRjb21lLmlubGluZURlbHRhICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgYWR2YW5jZWQgPSBsb2dWaWV3LmFic29yYkRlbHRhKFxuICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcixcbiAgICAgICAgICAgIG91dGNvbWUuaW5saW5lRGVsdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIHdmZGlhZygnaW5saW5lX2RlbHRhX2Fic29yYmVkJywge1xuICAgICAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgZXZlbnRzOiBvdXRjb21lLmlubGluZURlbHRhLmV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBoYXNNb3JlOiBvdXRjb21lLmlubGluZURlbHRhLmhhc01vcmUsXG4gICAgICAgICAgICBjdXJzb3JBZHZhbmNlZDogYWR2YW5jZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dGNvbWUudHlwZSA9PT0gJ3JldHJ5JyB8fCBvdXRjb21lLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgLy8gSGFuZCB0aGUgc3RlcCB0byB0aGUgcXVldWUgd2l0aCB0aGUgcmVxdWVzdGVkIGJhY2tvZmY6XG4gICAgICAgICAgLy8gYmFja2dyb3VuZCBkZWxpdmVyeSBkcml2ZXMgdGhlIHJldHJ5IGZyb20gaGVyZS5cbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogb3V0Y29tZS50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAvLyBTdWZmaXhlZCBrZXk6IHRoaXMgc3RlcCB3YXMgaW5saW5lLWNsYWltZWQsIHNvIG5vIGRpc3BhdGNoXG4gICAgICAgICAgICAvLyBwdWJsaXNoIGV4aXN0cyB1bmRlciB0aGUgZGlzcGF0Y2gga2V5LCBidXQgc3VmZml4aW5nXG4gICAgICAgICAgICAvLyBrZWVwcyB0aGUgcmV0cnkgZW5xdWV1ZWFibGUgZXZlbiBpZiBhIHdvcmxkIHJldGlyZWQgYVxuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBrZXkgZm9yIHRoaXMgc3RlcCAoc2VlIHRoZSBwdXJwb3NlIGRvY3MgYWJvdmUpLlxuICAgICAgICAgICAgcHVycG9zZTogJ3JldHJ5OjEnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG91dGNvbWUudHlwZSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgcnVuR29uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gJ3NraXBwZWQnOiBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3b24gdGhlIGxhenkgY3JlYXRlLWNsYWltIGFuZFxuICAgICAgICAvLyBvd25zIHRoZSBib2R5LiBNYXJrZWQgZXhlY3V0ZWQgYWJvdmUgc28gdGhpcyBpbnZvY2F0aW9uIG5ldmVyXG4gICAgICAgIC8vIHJlLWNsYWltcyBpdDsgdGhlIHdpbm5lcidzIHRlcm1pbmFsIGV2ZW50cyBhcnJpdmUgdmlhIHRoZSBmZWVkXG4gICAgICAgIC8vIChvciBkcml2ZSBhIHNlcGFyYXRlIGludm9jYXRpb24pLlxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdpbmxpbmVfc3RlcHNfZXhlY3V0ZWQnLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgY291bnQ6IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoLFxuICAgICAgICBvdXRjb21lczogb3V0Y29tZXMubWFwKChvKSA9PiBvLnR5cGUpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZlZWQgdGhlIGlubGluZSBiYXRjaCdzIHRlcm1pbmFsIGV2ZW50cyBpbnRvIHRoZSBsaXZlIFZNLiBXaGVuXG4gICAgICAvLyB0aGUgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcgaGFzIG5vdCBzdXJmYWNlZCB0aGVtIHlldCxcbiAgICAgIC8vIGV4aXRpbmcgbXVzdCBOT1QgYWNrIHNpbGVudGx5OiB0aGUgdGVybWluYWxzIHRoaXMgaW52b2NhdGlvbiBqdXN0XG4gICAgICAvLyBjYXVzZWQgYXJlIGR1cmFibHkgd3JpdHRlbiB3aXRoIG5vIHF1ZXVlIG1lc3NhZ2UgbGVmdCB0byBjb25zdW1lXG4gICAgICAvLyB0aGVtIChpbmxpbmUgc3RlcHMgaGF2ZSBub25lKSwgc28gYW4gYXdhaXRpbmdfZXh0ZXJuYWwgZXhpdCB3b3VsZFxuICAgICAgLy8gcGFyayB0aGUgcnVuICdydW5uaW5nJyB3aXRoIGFsbCBpdHMgc3RlcHMgY29tcGxldGUuIFJhaXNlIHRoZVxuICAgICAgLy8gcmVxdWV1ZSBzaWduYWwgc28gdGhlIHN1c3BlbmRlZCBleGl0IHNjaGVkdWxlcyBhIGZyZXNoIGltbWVkaWF0ZVxuICAgICAgLy8gaW52b2NhdGlvbiB3aG9zZSBmcmVzaCByZWFkIHBpY2tzIHRoZSB0ZXJtaW5hbHMgdXAuIE91dGNvbWVzIHRoYXRcbiAgICAgIC8vIHdyb3RlIG5vIHRlcm1pbmFsICgnc2tpcHBlZCc6IGEgY29uY3VycmVudCBjbGFpbWFudCBvd25zIHRoZVxuICAgICAgLy8gYm9keTsgJ2dvbmUnLCByZXRyeS90aHJvdHRsZWQ6IGEgcXVldWUgbWVzc2FnZSBleGlzdHMpIGRvbid0XG4gICAgICAvLyBuZWVkIGl0LCBidXQgc2lnbmFsaW5nIG9uIHRoZW0gdG9vIG9ubHkgY29zdHMgYSBuby1vcCBpbnZvY2F0aW9uXG4gICAgICAvLyBpbiBhbiBhbHJlYWR5LXJhcmUgbGFnIHdpbmRvdy5cbiAgICAgIGNvbnN0IHF1ZXVlZCA9IHRha2VRdWV1ZWRFdmVudHMoKTtcbiAgICAgIGNvbnN0IG5ld0V2ZW50cyA9IHF1ZXVlZC5sZW5ndGggPiAwID8gcXVldWVkIDogYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgIGlmIChuZXdFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyhuZXdFdmVudHMpO1xuXG4gICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgcGhhc2U6ICdzdGVwcycsXG4gICAgICAgIGZlZEV2ZW50czogbmV3RXZlbnRzLmxlbmd0aCxcbiAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogJ3N1c3BlbmRlZCcsXG4gICAgICAgIGJ1ZGdldEV4aGF1c3RlZDogYnVkZ2V0LmlzRXhoYXVzdGVkKCksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2Vzc2lvbi5kaXNwb3NlKCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0lubGluZVN0ZXBzKGlubGluZVN0ZXBzRXhlY3V0ZWQpLFxuICB9KTtcblxuICBpZiAocmVzdWx0LmNvbXBsZXRlZCkge1xuICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBjb21wbGV0ZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnY29tcGxldGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyAoYWJvcnQgcmVjb3JkaW5ncywgc3lzdGVtLWhvb2tcbiAgICAvLyBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldCBhdHRyaWJ1dGUvaG9vayBldmVudHMpIEJFRk9SRSB3cml0aW5nXG4gICAgLy8gcnVuX2NvbXBsZXRlZC4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zLlxuICAgIC8vIERyYWluIGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQ6IHRoZSB3b3JrZmxvdydzIG93biBvdXRjb21lIGlzIHRoZVxuICAgIC8vIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGlzcGF0Y2hQZW5kaW5nT3BzKHtcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgIC8vIFBsYWluIGNyZWF0ZTogdGhlIHJ1biBpcyBlbmRpbmcsIG5vdGhpbmcgcmVwbGF5cyBpdHMgbG9nLCBzbyBhXG4gICAgICAgICAgLy8gcGFnZSBoYW5kZWQgYmFjayBoZXJlIHdvdWxkIGJlIHJlYWQgYnkgbm8gb25lLlxuICAgICAgICAgIGNyZWF0ZUV2ZW50OiB0ZXJtaW5hbENyZWF0ZUV2ZW50LFxuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiByZXN1bHQuY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucyxcbiAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignUXVpY2tKUyBydW50aW1lOiB0ZXJtaW5hbCBkcmFpbiBmYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgbWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBydW5fY29tcGxldGVkIGV2ZW50LlxuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIHRoZSB3b3JrZmxvdyByZXN1bHQgYXMgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAvLyAoXCJkZXZsXCIgKyBkZXZhbHVlKSB3aXRoIG5vIGVuY3J5cHRpb24gKHRoZSBWTSBoYXMgbm8gYWNjZXNzIHRvIHRoZVxuICAgIC8vIENyeXB0b0tleSkuIEhvc3Qtc2lkZSBlbmNyeXB0aW9uIGlzIGFwcGxpZWQgaGVyZSBzbyB0aGF0IGBydW5fY29tcGxldGVkYFxuICAgIC8vIGV2ZW50cyBoYXZlIHRoZSBzYW1lIGBlbmNyYC1wcmVmaXhlZCBwYXlsb2FkIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm1cbiAgICAvLyBlbmdpbmUncyBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAgcHJvZHVjZXMuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRlcm1pbmFsQ3JlYXRlRXZlbnQoe1xuICAgICAgICBldmVudFR5cGU6ICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBvdXRwdXQ6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgIHJlc3VsdC5jb21wbGV0ZWQucmVzdWx0LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWQnLCB7IHJlc3VsdDogJ3J1bl9jb21wbGV0ZWRfd3JpdHRlbicgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHJlc3VsdC5zdXNwZW5kZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBzdGlsbCBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGlubGluZSBsb29wLiBBbGwgZHVyYWJsZSBzaWRlXG4gICAgLy8gZWZmZWN0cyBmb3IgdGhlIGZpbmFsIHN1c3BlbnNpb24gc3RhdGUgd2VyZSBhbHJlYWR5IGRpc3BhdGNoZWQgYnlcbiAgICAvLyB0aGUgbG9vcDsgd2hhdCByZW1haW5zIGlzIGRlY2lkaW5nIGhvdyB0aGUgcnVuIGdldHMgcmUtaW52b2tlZC5cbiAgICBjb25zdCB7IHBlbmRpbmdPcGVyYXRpb25zIH0gPSByZXN1bHQuc3VzcGVuZGVkO1xuXG4gICAgcnVudGltZUxvZ2dlci5pbmZvKCdRdWlja0pTIHJ1bnRpbWU6IHdvcmtmbG93IHN1c3BlbmRlZCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgaW5saW5lU3RlcHNFeGVjdXRlZCxcbiAgICAgIHBlbmRpbmdTdGVwczogcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09ICdzdGVwJykubGVuZ3RoLFxuICAgICAgcGVuZGluZ1dhaXRzOiBwZW5kaW5nT3BlcmF0aW9ucy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gJ3dhaXQnKS5sZW5ndGgsXG4gICAgICBwZW5kaW5nT3BzOiBwZW5kaW5nT3BlcmF0aW9ucy5tYXAoKHApID0+ICh7XG4gICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICBoYXNDcmVhdGVkRXZlbnQ6IHAuaGFzQ3JlYXRlZEV2ZW50LFxuICAgICAgICAuLi4ocC50eXBlID09PSAnc3RlcCcgPyB7IHN0ZXBJZDogKHAgYXMgUGVuZGluZ1N0ZXApLnN0ZXBJZCB9IDoge30pLFxuICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU091dGNvbWUoJ3N1c3BlbmRlZCcpLFxuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNQZW5kaW5nT3BzQ291bnQocGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoKSxcbiAgICB9KTtcblxuICAgIGlmIChydW5Hb25lKSB7XG4gICAgICAvLyBUaGUgcnVuIG5vIGxvbmdlciBleGlzdHMgKGV4cGlyZWQgLyBkZWxldGVkKSwgc28gbm90aGluZyB0byBkcml2ZS5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3J1bl9nb25lJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGl0IHJlcXVldWVzIGFyZSBGUkVTSCBtZXNzYWdlcywgbmV2ZXIgYSBgeyB0aW1lb3V0U2Vjb25kcyB9YFxuICAgIC8vIHZpc2liaWxpdHktcmVkZWxpdmVyeSBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiBSZWRlbGl2ZXJpbmcgdGhlXG4gICAgLy8gQ1VSUkVOVCBtZXNzYWdlIGlzIGEgdHJhcDogYSBob29rLXJlc3VtZSBkZWxpdmVyeSBjYXJyaWVzXG4gICAgLy8gYGhvb2tJbnB1dGAsIGFuZCBpdHMgcmVkZWxpdmVyeSByZS1ydW5zIHRoZSBsYXp5LXJlc3VtZSByZS1lbnN1cmVcbiAgICAvLyBpbiB0aGUgaGFuZGxlciBwcm9sb2d1ZTogaWYgdGhlIHdvcmtmbG93IGRpc3Bvc2VkIHRoYXQgaG9va1xuICAgIC8vIGR1cmluZyB0aGlzIGludm9jYXRpb24gKGRpc3Bvc2Ug4oaSIHNsZWVwKSwgYSB3b3JsZCB0aGF0IHJlamVjdHNcbiAgICAvLyB0aGUgcmUtZW5zdXJlIHdvdWxkIGFjayB0aGUgbWVzc2FnZSBhcyBcIm5vdGhpbmcgbGVmdCB0byByZXN1bWVcIlxuICAgIC8vIGFuZCB0aGUgY29udGludWF0aW9uIGl0IGNhcnJpZWQgaXMgc2lsZW50bHkgbG9zdC4gQSBmcmVzaCBtZXNzYWdlXG4gICAgLy8gY2FycmllcyBvbmx5IGBydW5JZGAsIHNvIGl0cyBkZWxpdmVyeSBhbHdheXMgcmVhY2hlcyByZXBsYXkgKGFuZFxuICAgIC8vIHVuZGVyIHR1cmJvIGEgcmVzY2hlZHVsZSB3b3VsZCByZS1lbmdhZ2UgdHVyYm8gYWdhaW5zdCBhIHN0YWxlXG4gICAgLy8gcHJlbG9hZGVkIGxvZzogc2VlIHRoZSByZWludm9rZSgpIGRvY3MgaW4gcnVudGltZS50cykuXG4gICAgY29uc3QgcmVxdWV1ZUltbWVkaWF0ZWx5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICB3b3JsZCxcbiAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfTtcblxuICAgIGlmIChidWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgLy8gVGhlIGxvb3Agc3RvcHBlZCBvbiB0aGUgcmVwbGF5IGJ1ZGdldCB3aXRoIHByb2dyZXNzIHN0aWxsXG4gICAgICAvLyBwb3NzaWJsZSwgc28gY29udGludWUgaW4gYSBmcmVzaCBpbnZvY2F0aW9uLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAnYnVkZ2V0X2V4aGF1c3RlZF9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4aXQgd2FpdCBzd2VlcC4gQSB3YWl0IHRoYXQgZWxhcHNlZCBpbiB0aGUgd2luZG93IHNpbmNlIHRoZVxuICAgIC8vIGxvb3AncyBsYXN0IGNoZWNrIHJlcXVldWVzIGltbWVkaWF0ZWx5IChpdHMgd2FpdF9jb21wbGV0ZWQgaXNcbiAgICAvLyB3cml0dGVuIGJ5IHRoZSBuZXh0IGludm9jYXRpb24ncyBlbGFwc2VkLXdhaXQgcGFzcyk7IHBlbmRpbmcgd2FpdHNcbiAgICAvLyB3aG9zZSBjb250aW51YXRpb24gdGhlIGxvb3AgYWxyZWFkeSBlbnF1ZXVlZCBhcmUgc2tpcHBlZC5cbiAgICBsZXQgc29vbmVzdFdhaXQ6IHsgc2Vjb25kczogbnVtYmVyOyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaGFzRWxhcHNlZFdhaXQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChyZXN1bWVNcyA8PSAwKSB7XG4gICAgICAgIGhhc0VsYXBzZWRXYWl0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHRpbWVvdXRTZWNvbmRzIDwgc29vbmVzdFdhaXQuc2Vjb25kcykge1xuICAgICAgICAgIHNvb25lc3RXYWl0ID0ge1xuICAgICAgICAgICAgc2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNFbGFwc2VkV2FpdCkge1xuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAnd2FpdF9lbGFwc2VkX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdSZXF1ZXVlU2lnbmFsKSB7XG4gICAgICAvLyBUaGlzIGludm9jYXRpb24gd3JvdGUgZXZlbnRzIHRoZSB3b3JrZmxvdyBuZWVkcyB0byBjb25zdW1lXG4gICAgICAvLyAoYXR0cl9zZXQgLyBnZXRDb25mbGljdC1hd2FpdGVkIGhvb2tfY3JlYXRlZCAvIGlubGluZSBzdGVwXG4gICAgICAvLyB0ZXJtaW5hbHMpIGJ1dCB0aGUgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcgbmV2ZXIgcmV0dXJuZWRcbiAgICAgIC8vIHRoZW0gYmVmb3JlIHRoZSBsb29wIGV4aXRlZC4gV2l0aG91dCBhIHJlcXVldWUgdGhlIHJ1biB3b3VsZFxuICAgICAgLy8gcGFyayBhd2FpdGluZ19leHRlcm5hbCB3aXRoIGl0cyB1bmJsb2NraW5nIGV2ZW50cyBhbHJlYWR5XG4gICAgICAvLyBkdXJhYmx5IHdyaXR0ZW4gYW5kIG5vIGZ1dHVyZSBpbnZvY2F0aW9uIGNvbWluZywgc28gcmVxdWV1ZVxuICAgICAgLy8gaW1tZWRpYXRlbHkgc28gYSBmcmVzaCByZWFkIHBpY2tzIHRoZW0gdXAuIEluIHRoZSBjb21tb24gY2FzZVxuICAgICAgLy8gdGhlIGxvb3AncyBvd24gZmVlZCBvYnNlcnZlcyB0aGUgd3JpdGVzIGFuZCBjbGVhcnMgdGhpcyBmbGFnLCBzb1xuICAgICAgLy8gdGhpcyBvbmx5IGZpcmVzIHdoZW4gdGhlIHJlYWQgYWN0dWFsbHkgbGFnZ2VkLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAndW5yZWFkX3NlbGZfd3JpdGVfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgIC8vIERlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgdGhlIGxvb3AgaGFzXG4gICAgICAvLyBub3QgYWxyZWFkeSBzY2hlZHVsZWQuIFRoZSBkaXNwYXRjaCBoZWxwZXIgaGFuZGxlcyBkZWxheVxuICAgICAgLy8gY2xhbXBpbmcgKGxvbmcgd2FpdHMgY2hhaW4gYWNyb3NzIGhvcHMpIGFuZCBpZGVtcG90ZW5jeS1rZXlcbiAgICAgIC8vIGRlZHVwIG9mIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQuIFNlZVxuICAgICAgLy8gcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cy5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7XG4gICAgICAgIGFjdGlvbjogJ3NjaGVkdWxlX3dhaXRfdGltZW91dCcsXG4gICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICB3YWl0Q29ycmVsYXRpb25JZDogc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgY29uc3QgYXR0ZW1wdCA9IG5leHRXYWl0Q29udGludWF0aW9uQXR0ZW1wdChzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHdhaXRDb250aW51YXRpb246IHtcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICAgIHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgRGF0ZS5ub3coKSxcbiAgICAgICAgICBhdHRlbXB0XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgIGFjdGlvbjogJ2F3YWl0aW5nX2V4dGVybmFsJyxcbiAgICAgIHBlbmRpbmdPcHNDb3VudDogcGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5mYWlsZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBmYWlsZWQsIHNvIHJlbWFwIHN0YWNrIHRyYWNlIHVzaW5nIGlubGluZSBzb3VyY2UgbWFwcy5cbiAgICAvLyBGcmFtZXMgY2FycnkgdGhlIHJ1bidzIHdvcmtmbG93SWQgYXMgdGhlaXIgZmlsZW5hbWUgb24gdGhlIGZyZXNoXG4gICAgLy8gcGF0aCwgYnV0IHRoZSB3b3JrZmxvdy1pbmRlcGVuZGVudCBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUgb24gdGhlXG4gICAgLy8gc25hcHNob3QgcGF0aCAodGhlIG5hbWUgaXMgYmFrZWQgaW50byB0aGUgc2hhcmVkIGJhc2VsaW5lJ3NcbiAgICAvLyBjb21waWxlZCBjb2RlIGF0IGh5ZHJhdGUpLCBzbyByZW1hcCBhZ2FpbnN0IGJvdGguIHJlbWFwRXJyb3JTdGFja1xuICAgIC8vIGVhcmx5LWV4aXRzIG9uIGEgY2hlYXAgaW5jbHVkZXMoKSB3aGVuIGEgZmlsZW5hbWUgaGFzIG5vIGZyYW1lcy5cbiAgICBsZXQgZXJyb3JTdGFjayA9IHJlc3VsdC5mYWlsZWQuc3RhY2s7XG4gICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhlcnJvclN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvciBzbyBjb25zdW1lcnMgKGBydW4ucmV0dXJuVmFsdWVgLCBvYnNlcnZhYmlsaXR5KVxuICAgIC8vIGdldCBgVVNFUl9FUlJPUmAgLyBgUlVOVElNRV9FUlJPUmAgb24gYGVycm9yLmNhdXNlLmNvZGVgLCBtYXRjaGluZ1xuICAgIC8vIHdoYXQgdGhlIG5vZGU6dm0gZW5naW5lIGFscmVhZHkgZG9lcyBpbiBydW50aW1lLnRzLlxuICAgIC8vXG4gICAgLy8gVGhlIFZNIHNlcmlhbGl6ZXMgZXJyb3JzIGFzIGB7IG5hbWUsIG1lc3NhZ2UsIHN0YWNrIH1gLCBzbyB3ZVxuICAgIC8vIHJlY29uc3RydWN0IGEgaG9zdC1zaWRlIEVycm9yIG9mIHRoZSBjb3JyZWN0IGNsYXNzIGJhc2VkIG9uIHRoZVxuICAgIC8vIFZNLXNpZGUgYG5hbWVgOiBzcGVjaWZpYyBXb3JrZmxvd1J1bnRpbWVFcnJvciBzdWJjbGFzc2VzIG5lZWRcbiAgICAvLyB0byBiZSBwcmVzZXJ2ZWQgc28gY2xhc3NpZnlSdW5FcnJvcigpIHRhZ3MgdGhlbSBhcyBSVU5USU1FX0VSUk9SLlxuICAgIGNvbnN0IHJlY29uc3RydWN0ZWQ6IEVycm9yID1cbiAgICAgIHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ1dvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yJ1xuICAgICAgICA/IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd05hbWUpXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZC5uYW1lID09PSAnRXJyb3InXG4gICAgICAgICAgPyBuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKSwge1xuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHJlY29uc3RydWN0ZWQpO1xuXG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBmYWlsZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGVycm9yTmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZmFpbGVkLm1lc3NhZ2UsXG4gICAgICBlcnJvclN0YWNrLFxuICAgICAgZXJyb3JDb2RlLFxuICAgIH0pO1xuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdmYWlsZWQnKSxcbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGxlZnRvdmVyIHBlbmRpbmcgc2lkZSBlZmZlY3RzIGJlZm9yZSB3cml0aW5nIHJ1bl9mYWlsZWQsXG4gICAgLy8gc2FtZSBkcmFpbiBzZW1hbnRpY3MgYXMgdGhlIGNvbXBsZXRlZCBicmFuY2guXG4gICAgaWYgKHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBjcmVhdGVFdmVudDogdGVybWluYWxDcmVhdGVFdmVudCxcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmZhaWxlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2ZhaWxlZCBldmVudC4gU2VyaWFsaXplIHRoZSBlcnJvciB0aHJvdWdoIHRoZVxuICAgIC8vIGZpcnN0LWNsYXNzIGRlaHlkcmF0aW9uIHBpcGVsaW5lIHNvIGNvbnN1bWVycyAoQ0xJLCBvYnNlcnZhYmlsaXR5LFxuICAgIC8vIHJ1bi5yZXR1cm5WYWx1ZSkgZ2V0IHRoZSBzYW1lIGh5ZHJhdGVkIHZhbHVlIHNoYXBlIGFzIHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lIGVtaXRzLiBUd28gcGF0aHM6XG4gICAgLy8gICAqIE1vZGVybiAodmFsdWVCeXRlcyBwcmVzZW50KTogdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXJcbiAgICAvLyAgICAgc2VyaWFsaXplZCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIChFcnJvciBzdWJjbGFzcyB3aXRoXG4gICAgLy8gICAgIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikgdXNpbmcgdGhlIFZNJ3NcbiAgICAvLyAgICAgd29ya2Zsb3ctc2VyaWFsaXplLiBQYXNzIHRob3NlIGJ5dGVzIHRocm91Z2ggZGlyZWN0bHkgc29cbiAgICAvLyAgICAgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW5zLCBhbmQgbm9uLUVycm9yIHRocm93cyBzdXJ2aXZlLlxuICAgIC8vICAgICBBcHBseSBlbmNyeXB0aW9uIGlmIGNvbmZpZ3VyZWQgKHRoZSBWTSdzXG4gICAgLy8gICAgIHNlcmlhbGl6ZXIgZG9lc24ndCBoYXZlIGFjY2VzcyB0byB0aGUgZW5jcnlwdGlvbiBrZXkpLlxuICAgIC8vICAgKiBMZWdhY3kgZmFsbGJhY2s6IHJlY29uc3RydWN0IGFuIEVycm9yIGZyb20gdGhlIGhvc3QtdmlzaWJsZVxuICAgIC8vICAgICB7bmFtZSwgbWVzc2FnZSwgc3RhY2t9IGZpZWxkcyBhbmQgcnVuIGl0IHRocm91Z2hcbiAgICAvLyAgICAgYGRlaHlkcmF0ZVJ1bkVycm9yYC4gVXNlZCB3aGVuIHZhbHVlQnl0ZXMgaXMgYWJzZW50IChlLmcuXG4gICAgLy8gICAgIGV4dHJhY3RFcnJvciBwc2V1ZG8tZmFpbHVyZXMgZnJvbSBWTSBib290c3RyYXApLlxuICAgIGxldCBkZWh5ZHJhdGVkRXJyb3I6IFVpbnQ4QXJyYXk7XG4gICAgaWYgKHJlc3VsdC5mYWlsZWQudmFsdWVCeXRlcykge1xuICAgICAgLy8gSHlkcmF0ZSB0aGUgVk0tc2lkZSBieXRlcywgcmVtYXAgdGhlIGVycm9yIHN0YWNrIHdpdGggdGhlXG4gICAgICAvLyBob3N0LXNpZGUgc291cmNlIG1hcCAodGhlIFZNIGNhbid0IGRvIHRoaXM6IGl0IGxhY2tzIGJvdGggdGhlXG4gICAgICAvLyBzb3VyY2UgbWFwIGFuZCBgcmVtYXBFcnJvclN0YWNrYCksIGFuZCByZS1kZWh5ZHJhdGUuIFRoaXNcbiAgICAgIC8vIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgdmFsdWUncyB0eXBlIGlkZW50aXR5IC8gY2F1c2UgY2hhaW5cbiAgICAgIC8vIHdoaWxlIGZpeGluZyB1cCBmcmFtZXMgdG8gcG9pbnQgYXQgdGhlIHVzZXIncyBzb3VyY2UgZmlsZXMuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoeWRyYXRlZCA9IGF3YWl0IGh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdW5kZWZpbmVkIC8vIFZNIGJ5dGVzIGFyZSB1bmVuY3J5cHRlZFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaHlkcmF0ZWQgJiZcbiAgICAgICAgICB0eXBlb2YgaHlkcmF0ZWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgJ3N0YWNrJyBpbiAoaHlkcmF0ZWQgYXMgb2JqZWN0KSAmJlxuICAgICAgICAgIHR5cGVvZiAoaHlkcmF0ZWQgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2sgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAvLyBCb3RoIGZpbGVuYW1lIHNwYWNlcy4gU2VlIHRoZSBmYWlsZWQtYnJhbmNoIGNvbW1lbnQgYWJvdmUuXG4gICAgICAgICAgKGh5ZHJhdGVkIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrOiBzdHJpbmcgfSkuc3RhY2ssXG4gICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhbGsgdGhlIGNhdXNlIGNoYWluIGFuZCByZW1hcCBuZXN0ZWQgc3RhY2tzIHRvby5cbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgICAgICAgbGV0IG5vZGUgPSAoaHlkcmF0ZWQgYXMgeyBjYXVzZT86IHVua25vd24gfSk/LmNhdXNlO1xuICAgICAgICB3aGlsZSAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKG5vZGUgYXMgb2JqZWN0KSkge1xuICAgICAgICAgIHNlZW4uYWRkKG5vZGUgYXMgb2JqZWN0KTtcbiAgICAgICAgICBjb25zdCBub2RlU3RhY2sgPSAobm9kZSBhcyB7IHN0YWNrPzogdW5rbm93biB9KS5zdGFjaztcbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGVTdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgLy8gQm90aCBmaWxlbmFtZSBzcGFjZXMuIFNlZSB0aGUgZmFpbGVkLWJyYW5jaCBjb21tZW50IGFib3ZlLlxuICAgICAgICAgICAgKG5vZGUgYXMgeyBzdGFjaz86IHN0cmluZyB9KS5zdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgcmVtYXBFcnJvclN0YWNrKG5vZGVTdGFjaywgZmlsZW5hbWUsIHdvcmtmbG93Q29kZSksXG4gICAgICAgICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gKG5vZGUgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gICAgICAgIH1cbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgaHlkcmF0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAocmVoeWRyYXRlRXJyKSB7XG4gICAgICAgIC8vIElmIGh5ZHJhdGlvbiAvIHJlLWRlaHlkcmF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBmYWxsXG4gICAgICAgIC8vIGJhY2sgdG8gcGFzc2luZyB0aHJvdWdoIHRoZSBvcmlnaW5hbCBWTSBieXRlcyAoYXBwbHlpbmdcbiAgICAgICAgLy8gZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkKS4gQmV0dGVyIHRvIGxvc2Ugc291cmNlLW1hcHBlZFxuICAgICAgICAvLyBmcmFtZXMgdGhhbiB0byBsb3NlIHRoZSBlcnJvciBlbnRpcmVseS5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byByZW1hcCB3b3JrZmxvdyBlcnJvciBzdGFjaywgcGFzc2luZyBWTSBieXRlcyB0aHJvdWdoJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChyZWh5ZHJhdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApKSBhcyBVaW50OEFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICByZWNvbnN0cnVjdGVkLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlY29uc3RydWN0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoc2VyRXJyKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIG1pbmltYWwgcGF5bG9hZCBzbyB0aGUgcnVuIHN0aWxsIHRlcm1pbmF0ZXNcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSBlcnJvciBpdHNlbGYgY29udGFpbnMgdW5zZXJpYWxpemFibGUgdmFsdWVzLlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIGRlaHlkcmF0ZSBydW4gZXJyb3IsIGZhbGxpbmcgYmFjayB0byBiYXJlIEVycm9yJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiAoc2VyRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0ZXJtaW5hbENyZWF0ZUV2ZW50KHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGRlaHlkcmF0ZWRFcnJvcixcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdXb3JrZmxvdyBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBydW5fZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICB9KTtcbiAgICAgICAgd2ZkaWFnKCdleGl0X2ZhaWxlZCcsIHsgcmVzdWx0OiAnYWxyZWFkeV9maW5pc2hlZCcgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdmZGlhZygnZXhpdF9mYWlsZWRfZXJyb3InLCB7XG4gICAgICAgIGVycm9yTmFtZTogKGVyciBhcyBFcnJvcik/Lm5hbWUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgd2ZkaWFnKCdleGl0X2ZhaWxlZCcsIHsgcmVzdWx0OiAncnVuX2ZhaWxlZF93cml0dGVuJyB9KTtcbiAgfVxufVxuIl19