footprintjs 9.35.0 → 9.37.0

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 (158) hide show
  1. package/CLAUDE.md +4 -4
  2. package/dist/advanced.js +2 -2
  3. package/dist/esm/advanced.d.ts +2 -2
  4. package/dist/esm/advanced.js +2 -2
  5. package/dist/esm/index.d.ts +2 -2
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +5 -34
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +236 -375
  9. package/dist/esm/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  10. package/dist/esm/lib/engine/graph/prefixNodeTree.js +40 -0
  11. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  12. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  13. package/dist/esm/lib/engine/handlers/ResumeEntry.js +11 -2
  14. package/dist/esm/lib/engine/handlers/StageRunner.js +17 -3
  15. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +3 -32
  16. package/dist/esm/lib/engine/index.d.ts +1 -1
  17. package/dist/esm/lib/engine/index.js +1 -1
  18. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  19. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  20. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  21. package/dist/esm/lib/engine/narrative/types.d.ts +26 -10
  22. package/dist/esm/lib/engine/narrative/types.js +1 -1
  23. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  24. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +68 -86
  25. package/dist/esm/lib/engine/traversalContext.d.ts +65 -0
  26. package/dist/esm/lib/engine/traversalContext.js +83 -0
  27. package/dist/esm/lib/engine/types.d.ts +1 -3
  28. package/dist/esm/lib/engine/types.js +1 -1
  29. package/dist/esm/lib/engine/walkSubflowSpec.js +3 -2
  30. package/dist/esm/lib/ids/branchSegment.js +119 -0
  31. package/dist/esm/lib/ids/runtimeStageId.d.ts +191 -0
  32. package/dist/esm/lib/ids/runtimeStageId.js +225 -0
  33. package/dist/esm/lib/memory/StageContext.d.ts +1 -17
  34. package/dist/esm/lib/memory/StageContext.js +2 -37
  35. package/dist/esm/lib/memory/commitLogUtils.js +1 -1
  36. package/dist/esm/lib/memory/logModel.js +1 -1
  37. package/dist/esm/lib/memory/runPolicy.d.ts +2 -3
  38. package/dist/esm/lib/memory/runPolicy.js +3 -4
  39. package/dist/esm/lib/memory/verbs.d.ts +2 -1
  40. package/dist/esm/lib/memory/verbs.js +1 -1
  41. package/dist/esm/lib/pause/index.d.ts +1 -1
  42. package/dist/esm/lib/pause/index.js +1 -1
  43. package/dist/esm/lib/pause/types.d.ts +48 -1
  44. package/dist/esm/lib/pause/types.js +52 -3
  45. package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
  46. package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
  47. package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
  48. package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
  49. package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
  50. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  51. package/dist/esm/lib/recorder/InOutRecorder.js +3 -2
  52. package/dist/esm/lib/recorder/hooks.d.ts +249 -0
  53. package/dist/esm/lib/recorder/hooks.js +132 -0
  54. package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
  55. package/dist/esm/lib/recorder/snapshot.js +26 -0
  56. package/dist/esm/lib/runner/DeferredObserverTier.js +15 -25
  57. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -18
  58. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -37
  59. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -8
  60. package/dist/esm/lib/runner/FlowChartExecutor.js +59 -32
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +6 -5
  62. package/dist/esm/lib/scope/ScopeFacade.d.ts +6 -1
  63. package/dist/esm/lib/scope/ScopeFacade.js +36 -61
  64. package/dist/esm/lib/scope/types.d.ts +3 -9
  65. package/dist/esm/lib/scope/types.js +1 -1
  66. package/dist/esm/lib/time-travel/chain.js +2 -2
  67. package/dist/esm/lib/time-travel/commitStops.js +4 -4
  68. package/dist/esm/lib/time-travel/index.d.ts +1 -1
  69. package/dist/esm/lib/time-travel/index.js +2 -2
  70. package/dist/esm/lib/time-travel/timeTravel.js +8 -9
  71. package/dist/esm/lib/time-travel/types.d.ts +1 -1
  72. package/dist/esm/lib/time-travel/types.js +2 -2
  73. package/dist/esm/trace.d.ts +3 -3
  74. package/dist/esm/trace.js +3 -3
  75. package/dist/index.js +1 -1
  76. package/dist/lib/builder/FlowChartBuilder.js +236 -375
  77. package/dist/lib/engine/graph/prefixNodeTree.js +44 -0
  78. package/dist/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  79. package/dist/lib/engine/handlers/ResumeEntry.js +10 -1
  80. package/dist/lib/engine/handlers/StageRunner.js +17 -3
  81. package/dist/lib/engine/handlers/SubflowExecutor.js +3 -32
  82. package/dist/lib/engine/index.js +1 -1
  83. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  84. package/dist/lib/engine/narrative/types.js +1 -1
  85. package/dist/lib/engine/traversal/FlowchartTraverser.js +68 -86
  86. package/dist/lib/engine/traversalContext.js +89 -0
  87. package/dist/lib/engine/types.js +1 -1
  88. package/dist/lib/engine/walkSubflowSpec.js +3 -2
  89. package/dist/lib/ids/branchSegment.js +127 -0
  90. package/dist/lib/ids/runtimeStageId.js +242 -0
  91. package/dist/lib/memory/StageContext.js +1 -36
  92. package/dist/lib/memory/commitLogUtils.js +1 -1
  93. package/dist/lib/memory/logModel.js +1 -1
  94. package/dist/lib/memory/runPolicy.js +3 -4
  95. package/dist/lib/memory/verbs.js +1 -1
  96. package/dist/lib/pause/index.js +1 -1
  97. package/dist/lib/pause/types.js +54 -4
  98. package/dist/lib/recorder/CombinedRecorder.js +11 -63
  99. package/dist/lib/recorder/CompositeRecorder.js +33 -97
  100. package/dist/lib/recorder/EmitRecorder.js +1 -1
  101. package/dist/lib/recorder/InOutRecorder.js +3 -2
  102. package/dist/lib/recorder/hooks.js +140 -0
  103. package/dist/lib/recorder/snapshot.js +30 -0
  104. package/dist/lib/runner/DeferredObserverTier.js +16 -26
  105. package/dist/lib/runner/ExecutionRuntime.js +1 -36
  106. package/dist/lib/runner/FlowChartExecutor.js +58 -31
  107. package/dist/lib/runner/getSubtreeSnapshot.js +6 -5
  108. package/dist/lib/scope/ScopeFacade.js +36 -61
  109. package/dist/lib/scope/types.js +1 -1
  110. package/dist/lib/time-travel/chain.js +2 -2
  111. package/dist/lib/time-travel/commitStops.js +4 -4
  112. package/dist/lib/time-travel/index.js +2 -2
  113. package/dist/lib/time-travel/timeTravel.js +8 -9
  114. package/dist/lib/time-travel/types.js +2 -2
  115. package/dist/trace.js +3 -3
  116. package/dist/types/advanced.d.ts +2 -2
  117. package/dist/types/index.d.ts +2 -2
  118. package/dist/types/lib/builder/FlowChartBuilder.d.ts +5 -34
  119. package/dist/types/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  120. package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  121. package/dist/types/lib/engine/index.d.ts +1 -1
  122. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  123. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  124. package/dist/types/lib/engine/narrative/types.d.ts +26 -10
  125. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  126. package/dist/types/lib/engine/traversalContext.d.ts +65 -0
  127. package/dist/types/lib/engine/types.d.ts +1 -3
  128. package/dist/types/lib/ids/runtimeStageId.d.ts +191 -0
  129. package/dist/types/lib/memory/StageContext.d.ts +1 -17
  130. package/dist/types/lib/memory/runPolicy.d.ts +2 -3
  131. package/dist/types/lib/memory/verbs.d.ts +2 -1
  132. package/dist/types/lib/pause/index.d.ts +1 -1
  133. package/dist/types/lib/pause/types.d.ts +48 -1
  134. package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
  135. package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
  136. package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
  137. package/dist/types/lib/recorder/hooks.d.ts +249 -0
  138. package/dist/types/lib/recorder/snapshot.d.ts +19 -0
  139. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -18
  140. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -8
  141. package/dist/types/lib/scope/ScopeFacade.d.ts +6 -1
  142. package/dist/types/lib/scope/types.d.ts +3 -9
  143. package/dist/types/lib/time-travel/index.d.ts +1 -1
  144. package/dist/types/lib/time-travel/types.d.ts +1 -1
  145. package/dist/types/trace.d.ts +3 -3
  146. package/package.json +1 -1
  147. package/dist/esm/lib/engine/branchSegment.js +0 -119
  148. package/dist/esm/lib/engine/runtimeStageId.d.ts +0 -103
  149. package/dist/esm/lib/engine/runtimeStageId.js +0 -119
  150. package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
  151. package/dist/esm/lib/recorder/invokeHook.js +0 -9
  152. package/dist/lib/engine/branchSegment.js +0 -127
  153. package/dist/lib/engine/runtimeStageId.js +0 -126
  154. package/dist/lib/recorder/invokeHook.js +0 -13
  155. package/dist/types/lib/engine/runtimeStageId.d.ts +0 -103
  156. package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
  157. /package/dist/esm/lib/{engine → ids}/branchSegment.d.ts +0 -0
  158. /package/dist/types/lib/{engine → ids}/branchSegment.d.ts +0 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * prefixNodeTree — the ONE subflow-id prefixer (F7, 9.37.0).
3
+ *
4
+ * A mounted subflow's node tree is re-addressed under its mount: every `name`,
5
+ * `id` and nested `subflowId` gains `<prefix>/`. The builder does it at MOUNT
6
+ * time (`FlowChartBuilder · _prefixNodeTree`); the traverser at RUN time (lazy
7
+ * subflows, and the generated branches of `addParallelForEach`). Both call
8
+ * this function, so a chart comes out identical either way — until 9.36.0 they
9
+ * were two byte-twin copies, pinned against drift by
10
+ * `test/lib/engine/branch-segment-prefixer-equivalence.test.ts`, which now
11
+ * guards the one implementation.
12
+ *
13
+ * Generated branch segments (`<stageId>~<index>`, see `ids/branchSegment.ts`)
14
+ * ride this exact path with no special case: a segment is just a prefix, so a
15
+ * branch's inner ids become `<segment>/<id>` and its stages address as
16
+ * `<segment>/<id>#<n>`.
17
+ *
18
+ * Never refuses: the ids it writes carry `/` on purpose. The refusal of
19
+ * reserved characters is the builder's, at its id doors (`refuseReservedId`).
20
+ *
21
+ * `branchId` is left UNPREFIXED — decider/selector matching reads
22
+ * `child.branchId ?? child.id`. The input is never mutated (each node is a
23
+ * shallow clone).
24
+ */
25
+ import type { StageNode } from './StageNode.js';
26
+ export declare function prefixNodeTree<N extends StageNode<any, any>>(node: N, prefix: string): N;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * prefixNodeTree — the ONE subflow-id prefixer (F7, 9.37.0).
3
+ *
4
+ * A mounted subflow's node tree is re-addressed under its mount: every `name`,
5
+ * `id` and nested `subflowId` gains `<prefix>/`. The builder does it at MOUNT
6
+ * time (`FlowChartBuilder · _prefixNodeTree`); the traverser at RUN time (lazy
7
+ * subflows, and the generated branches of `addParallelForEach`). Both call
8
+ * this function, so a chart comes out identical either way — until 9.36.0 they
9
+ * were two byte-twin copies, pinned against drift by
10
+ * `test/lib/engine/branch-segment-prefixer-equivalence.test.ts`, which now
11
+ * guards the one implementation.
12
+ *
13
+ * Generated branch segments (`<stageId>~<index>`, see `ids/branchSegment.ts`)
14
+ * ride this exact path with no special case: a segment is just a prefix, so a
15
+ * branch's inner ids become `<segment>/<id>` and its stages address as
16
+ * `<segment>/<id>#<n>`.
17
+ *
18
+ * Never refuses: the ids it writes carry `/` on purpose. The refusal of
19
+ * reserved characters is the builder's, at its id doors (`refuseReservedId`).
20
+ *
21
+ * `branchId` is left UNPREFIXED — decider/selector matching reads
22
+ * `child.branchId ?? child.id`. The input is never mutated (each node is a
23
+ * shallow clone).
24
+ */
25
+ import { joinPath } from '../../ids/runtimeStageId.js';
26
+ export function prefixNodeTree(node, prefix) {
27
+ if (!node)
28
+ return node;
29
+ const clone = { ...node };
30
+ clone.name = joinPath(prefix, node.name);
31
+ clone.id = joinPath(prefix, node.id);
32
+ if (clone.subflowId)
33
+ clone.subflowId = joinPath(prefix, clone.subflowId);
34
+ if (clone.next)
35
+ clone.next = prefixNodeTree(clone.next, prefix);
36
+ if (clone.children)
37
+ clone.children = clone.children.map((c) => prefixNodeTree(c, prefix));
38
+ return clone;
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZml4Tm9kZVRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHdkQsTUFBTSxVQUFVLGNBQWMsQ0FBZ0MsSUFBTyxFQUFFLE1BQWM7SUFDbkYsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLEtBQUssR0FBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDN0IsS0FBSyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxLQUFLLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLFNBQVM7UUFBRSxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pFLElBQUksS0FBSyxDQUFDLElBQUk7UUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLElBQUksS0FBSyxDQUFDLFFBQVE7UUFBRSxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDMUYsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwcmVmaXhOb2RlVHJlZSDigJQgdGhlIE9ORSBzdWJmbG93LWlkIHByZWZpeGVyIChGNywgOS4zNy4wKS5cbiAqXG4gKiBBIG1vdW50ZWQgc3ViZmxvdydzIG5vZGUgdHJlZSBpcyByZS1hZGRyZXNzZWQgdW5kZXIgaXRzIG1vdW50OiBldmVyeSBgbmFtZWAsXG4gKiBgaWRgIGFuZCBuZXN0ZWQgYHN1YmZsb3dJZGAgZ2FpbnMgYDxwcmVmaXg+L2AuIFRoZSBidWlsZGVyIGRvZXMgaXQgYXQgTU9VTlRcbiAqIHRpbWUgKGBGbG93Q2hhcnRCdWlsZGVyIMK3IF9wcmVmaXhOb2RlVHJlZWApOyB0aGUgdHJhdmVyc2VyIGF0IFJVTiB0aW1lIChsYXp5XG4gKiBzdWJmbG93cywgYW5kIHRoZSBnZW5lcmF0ZWQgYnJhbmNoZXMgb2YgYGFkZFBhcmFsbGVsRm9yRWFjaGApLiBCb3RoIGNhbGxcbiAqIHRoaXMgZnVuY3Rpb24sIHNvIGEgY2hhcnQgY29tZXMgb3V0IGlkZW50aWNhbCBlaXRoZXIgd2F5IOKAlCB1bnRpbCA5LjM2LjAgdGhleVxuICogd2VyZSB0d28gYnl0ZS10d2luIGNvcGllcywgcGlubmVkIGFnYWluc3QgZHJpZnQgYnlcbiAqIGB0ZXN0L2xpYi9lbmdpbmUvYnJhbmNoLXNlZ21lbnQtcHJlZml4ZXItZXF1aXZhbGVuY2UudGVzdC50c2AsIHdoaWNoIG5vd1xuICogZ3VhcmRzIHRoZSBvbmUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogR2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50cyAoYDxzdGFnZUlkPn48aW5kZXg+YCwgc2VlIGBpZHMvYnJhbmNoU2VnbWVudC50c2ApXG4gKiByaWRlIHRoaXMgZXhhY3QgcGF0aCB3aXRoIG5vIHNwZWNpYWwgY2FzZTogYSBzZWdtZW50IGlzIGp1c3QgYSBwcmVmaXgsIHNvIGFcbiAqIGJyYW5jaCdzIGlubmVyIGlkcyBiZWNvbWUgYDxzZWdtZW50Pi88aWQ+YCBhbmQgaXRzIHN0YWdlcyBhZGRyZXNzIGFzXG4gKiBgPHNlZ21lbnQ+LzxpZD4jPG4+YC5cbiAqXG4gKiBOZXZlciByZWZ1c2VzOiB0aGUgaWRzIGl0IHdyaXRlcyBjYXJyeSBgL2Agb24gcHVycG9zZS4gVGhlIHJlZnVzYWwgb2ZcbiAqIHJlc2VydmVkIGNoYXJhY3RlcnMgaXMgdGhlIGJ1aWxkZXIncywgYXQgaXRzIGlkIGRvb3JzIChgcmVmdXNlUmVzZXJ2ZWRJZGApLlxuICpcbiAqIGBicmFuY2hJZGAgaXMgbGVmdCBVTlBSRUZJWEVEIOKAlCBkZWNpZGVyL3NlbGVjdG9yIG1hdGNoaW5nIHJlYWRzXG4gKiBgY2hpbGQuYnJhbmNoSWQgPz8gY2hpbGQuaWRgLiBUaGUgaW5wdXQgaXMgbmV2ZXIgbXV0YXRlZCAoZWFjaCBub2RlIGlzIGFcbiAqIHNoYWxsb3cgY2xvbmUpLlxuICovXG5cbmltcG9ydCB7IGpvaW5QYXRoIH0gZnJvbSAnLi4vLi4vaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi9TdGFnZU5vZGUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4Tm9kZVRyZWU8TiBleHRlbmRzIFN0YWdlTm9kZTxhbnksIGFueT4+KG5vZGU6IE4sIHByZWZpeDogc3RyaW5nKTogTiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG4gIGNvbnN0IGNsb25lOiBOID0geyAuLi5ub2RlIH07XG4gIGNsb25lLm5hbWUgPSBqb2luUGF0aChwcmVmaXgsIG5vZGUubmFtZSk7XG4gIGNsb25lLmlkID0gam9pblBhdGgocHJlZml4LCBub2RlLmlkKTtcbiAgaWYgKGNsb25lLnN1YmZsb3dJZCkgY2xvbmUuc3ViZmxvd0lkID0gam9pblBhdGgocHJlZml4LCBjbG9uZS5zdWJmbG93SWQpO1xuICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHByZWZpeE5vZGVUcmVlKGNsb25lLm5leHQsIHByZWZpeCk7XG4gIGlmIChjbG9uZS5jaGlsZHJlbikgY2xvbmUuY2hpbGRyZW4gPSBjbG9uZS5jaGlsZHJlbi5tYXAoKGMpID0+IHByZWZpeE5vZGVUcmVlKGMsIHByZWZpeCkpO1xuICByZXR1cm4gY2xvbmU7XG59XG4iXX0=
@@ -10,7 +10,7 @@
10
10
  * Almost everything here is existing machinery, wired together:
11
11
  *
12
12
  * - **Each branch is a generated SUBFLOW.** Its path segment is
13
- * `<parentStageId>~<index>` (see `engine/branchSegment.ts`) — a subflowPath
13
+ * `<parentStageId>~<index>` (see `ids/branchSegment.ts`) — a subflowPath
14
14
  * segment in the grammar that already ships, NOT a new delimiter class. So a
15
15
  * branch gets, for free: a fresh isolated `ExecutionRuntime` (branches cannot
16
16
  * corrupt each other's in-flight state), the inputMapper seam for feeding the
@@ -10,7 +10,7 @@
10
10
  * Almost everything here is existing machinery, wired together:
11
11
  *
12
12
  * - **Each branch is a generated SUBFLOW.** Its path segment is
13
- * `<parentStageId>~<index>` (see `engine/branchSegment.ts`) — a subflowPath
13
+ * `<parentStageId>~<index>` (see `ids/branchSegment.ts`) — a subflowPath
14
14
  * segment in the grammar that already ships, NOT a new delimiter class. So a
15
15
  * branch gets, for free: a fresh isolated `ExecutionRuntime` (branches cannot
16
16
  * corrupt each other's in-flight state), the inputMapper seam for feeding the
@@ -50,10 +50,10 @@
50
50
  * follows its fan-out event — unavoidable and honest: the result is not
51
51
  * knowable until the branches settle.
52
52
  */
53
+ import { buildBranchSegment } from '../../ids/branchSegment.js';
53
54
  import { unwrapHandles } from '../../reactive/handles.js';
54
55
  import { IS_TYPED_SCOPE } from '../../reactive/types.js';
55
56
  import { createProtectedScope } from '../../scope/protection/createProtectedScope.js';
56
- import { buildBranchSegment } from '../branchSegment.js';
57
57
  export class ParallelForEachHandler {
58
58
  deps;
59
59
  childrenExecutor;
@@ -227,4 +227,4 @@ function notify(scope, method) {
227
227
  if (s && typeof s[method] === 'function')
228
228
  s[method]();
229
229
  }
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyYWxsZWxGb3JFYWNoSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUdILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFzQnpELE1BQU0sT0FBTyxzQkFBc0I7SUFFdkI7SUFDQTtJQUNBO0lBSFYsWUFDVSxJQUErQixFQUMvQixnQkFBZ0QsRUFDaEQsS0FBeUM7UUFGekMsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQztRQUNoRCxVQUFLLEdBQUwsS0FBSyxDQUFvQztJQUNoRCxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FDUCxJQUE2QixFQUM3QixPQUFxQixFQUNyQixVQUE4QixFQUM5QixnQkFBa0M7UUFFbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQXlELENBQUM7UUFFOUUsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSxxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7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QztnQkFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEIsU0FBUztZQUNYLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBcUIsRUFBRSxJQUFZLEVBQUUsT0FBa0I7UUFDNUYsTUFBTSxDQUFDLEdBQUcsUUFBOEMsQ0FBQztRQUN6RCxJQUFJLE9BQU8sQ0FBQyxFQUFFLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxDQUFDLENBQUMsU0FBbUQsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEUsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxFQUFFLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsUUFBa0QsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDckUsT0FBTztRQUNULENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBRUQsb0VBQW9FO0FBQ3BFLFNBQVMsTUFBTSxDQUFDLEtBQWMsRUFBRSxNQUE2QztJQUMzRSxNQUFNLENBQUMsR0FBRyxLQUE0QyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVU7UUFBRyxDQUFDLENBQUMsTUFBTSxDQUFnQixFQUFFLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyYWxsZWxGb3JFYWNoSGFuZGxlciDigJQgZHluYW1pYyBmYW4tb3V0OiBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggQ09VTlRcbiAqIGRlY2lkZWQgYXQgcnVudGltZSBmcm9tIHRoZSBwYXlsb2FkLlxuICpcbiAqIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQgKEQxICsgRDIpLiBSb3VuZCBCIGJ1aWxkcyBleGFjdGx5XG4gKiB0aGF0IGRvY3VtZW50LlxuICpcbiAqICMjIFdoYXQgdGhpcyBoYW5kbGVyIGRvZXMgTk9UIGludmVudFxuICpcbiAqIEFsbW9zdCBldmVyeXRoaW5nIGhlcmUgaXMgZXhpc3RpbmcgbWFjaGluZXJ5LCB3aXJlZCB0b2dldGhlcjpcbiAqXG4gKiAtICoqRWFjaCBicmFuY2ggaXMgYSBnZW5lcmF0ZWQgU1VCRkxPVy4qKiBJdHMgcGF0aCBzZWdtZW50IGlzXG4gKiAgIGA8cGFyZW50U3RhZ2VJZD5+PGluZGV4PmAgKHNlZSBgZW5naW5lL2JyYW5jaFNlZ21lbnQudHNgKSDigJQgYSBzdWJmbG93UGF0aFxuICogICBzZWdtZW50IGluIHRoZSBncmFtbWFyIHRoYXQgYWxyZWFkeSBzaGlwcywgTk9UIGEgbmV3IGRlbGltaXRlciBjbGFzcy4gU28gYVxuICogICBicmFuY2ggZ2V0cywgZm9yIGZyZWU6IGEgZnJlc2ggaXNvbGF0ZWQgYEV4ZWN1dGlvblJ1bnRpbWVgIChicmFuY2hlcyBjYW5ub3RcbiAqICAgY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0IHN0YXRlKSwgdGhlIGlucHV0TWFwcGVyIHNlYW0gZm9yIGZlZWRpbmcgdGhlXG4gKiAgIGl0ZW0gaW4sIGFuZCDigJQgdGhlIHBvaW50IG9mIHRoZSB3aG9sZSBkZXNpZ24g4oCUIGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCxcbiAqICAgYGNhdXNhbENoYWluYCwgYHNsaWNlRm9yS2V5YCBhbmQgYGZvcndhcmRTbGljZUZvcktleWAgcmVhZGluZyBicmFuY2hcbiAqICAgY29tbWl0cyB3aXRoIFpFUk8gY2hhbmdlcywgYmVjYXVzZSB0aGUgaWQgc2hhcGUgSVMgdGhlIHNoaXBwZWQgc2hhcGUuXG4gKiAtICoqVGhlIGZhbi1vdXQgaXRzZWxmIGlzIGBDaGlsZHJlbkV4ZWN1dG9yYC4qKiBUaGF0IGlzIHdoYXQgbWFrZXMgdGhlXG4gKiAgIGZhaWx1cmUgcG9saWN5IFwiUGFyYWxsZWwncyBleGlzdGluZyBmYWlsdXJlIHBvbGljeVwiIHJhdGhlciB0aGFuIGEgc2Vjb25kXG4gKiAgIG9uZTogYGZhaWxGYXN0YCDihpIgYFByb21pc2UuYWxsYCwgb3RoZXJ3aXNlIGJlc3QtZWZmb3J0IGBQcm9taXNlLmFsbFNldHRsZWRgLlxuICogICBJdCBhbHNvIGZpcmVzIGBvbkZvcmtgICsgYG9uU3RhZ2VFeGVjdXRlZCgnZm9yaycpYCBhbmQgYnViYmxlcyBhXG4gKiAgIGBQYXVzZVNpZ25hbGAgb3V0IG9mIGEgYnJhbmNoLCBhbGwgdW5jaGFuZ2VkLlxuICpcbiAqICMjIFRoZSBsYXdzIHRoaXMgaGFuZGxlciBvd25zXG4gKlxuICogKipPcmRlciBpcyBpdGVtcyBvcmRlci4qKiBSZXN1bHRzIGFyZSBhc3NlbWJsZWQgYnkgaW5kZXggZnJvbSB0aGUgZmFuLW91dCdzXG4gKiBrZXllZCByZXN1bHRzLCBuZXZlciBieSBjb21wbGV0aW9uIG9yZGVyLCBhbmQgbGFuZCBhcyBPTkUgYXJyYXkgd3JpdGUgb24gdGhlXG4gKiBwYXJlbnQg4oCUIHNvIGBpbnRvW2ldYCBpcyBhbHdheXMgYnJhbmNoIGBpYCdzIHJlc3VsdCBubyBtYXR0ZXIgd2hpY2ggYnJhbmNoXG4gKiBmaW5pc2hlZCBmaXJzdC4gQSBmYWlsZWQgYnJhbmNoIChiZXN0LWVmZm9ydCBtb2RlKSBsZWF2ZXMgYHVuZGVmaW5lZGAgaW4gaXRzXG4gKiBzbG90OyB3aGljaCBicmFuY2ggZmFpbGVkIGlzIG5vdCByZXBvcnRlZCBoZXJlLCBiZWNhdXNlIHRoYXQgZ2FwIGlzXG4gKiBwcmUtZXhpc3RpbmcgaW4gdGhlIHBhcmFsbGVsIGZhbi1vdXQgYW5kIG5vdCB0aGlzIGZlYXR1cmUncyB0byB3aWRlbi5cbiAqXG4gKiAqKm1heEJyYW5jaGVzIHRydW5jYXRlcywgYW5kIHNheXMgc28uKiogSXRlbXMgcGFzdCB0aGUgY2VpbGluZyBkbyBub3QgcnVuLlxuICogVGhlIHRydW5jYXRpb24gaXMgcmVjb3JkZWQgaW4gdGhlIHN0YWdlJ3Mgb3duIGNvbW1pdC12aXNpYmxlIGxvZyBhbmQgYXMgYVxuICogZmxvdyBtZXNzYWdlIOKAlCBib3VuZGVkIGV4ZWN1dGlvbiwgc3RhdGVkLCBuZXZlciBzaWxlbnQuXG4gKlxuICogKipCcmFuY2ggY2hhcnRzIGFyZSByZS1yZWdpc3RlcmVkIG9uIEVWRVJZIHZpc2l0LioqIFRoZSBnZW5lcmF0ZWQgc2VnbWVudHNcbiAqIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucywgYW5kIHN1YmZsb3cgcmVnaXN0cmF0aW9uIGlzIG5vcm1hbGx5XG4gKiBmaXJzdC13cml0ZS13aW5zIOKAlCB3aGljaCB3b3VsZCBtZWFuIGEgbG9vcGluZyBmYW4tb3V0IHNpbGVudGx5IHJlLWV4ZWN1dGluZ1xuICogaXRlcmF0aW9uIDEncyBicmFuY2ggY2hhcnRzIGZvcmV2ZXIsIGV2ZW4gd2hlbiB0aGUgZmFjdG9yeSByZXR1cm5zIGRpZmZlcmVudFxuICogY2hhcnRzLiBUaGlzIGhhbmRsZXIgb3ZlcndyaXRlcyBpbnN0ZWFkLiBQZXItaXRlcmF0aW9uIHJlc3VsdHMgc3RheVxuICogYWRkcmVzc2FibGUgdGhyb3VnaCB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhcyB0aGV5IGRvIGZvclxuICogYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAqXG4gKiAqKkV2ZW50IG9yZGVyLioqIGBvblN0YWdlU3RhcnRgIOKGkiB0aGUgYGl0ZW1zYCByZWFkIOKGkiBgb25Gb3JrYCDihpIgYnJhbmNoZXMg4oaSXG4gKiB0aGUgb3JkZXJlZC1hcnJheSB3cml0ZSDihpIgYG9uU3RhZ2VFbmRgIOKGkiBgb25Db21taXRgLiBUaGUgc3RhZ2UncyBvd24gY29tbWl0XG4gKiB0aGVyZWZvcmUgbGFuZHMgQUZURVIgaXRzIGBvbkZvcmtgLCB3aGljaCBpcyB0aGUgb25lIHBsYWNlIGEgc3RhZ2UncyBjb21taXRcbiAqIGZvbGxvd3MgaXRzIGZhbi1vdXQgZXZlbnQg4oCUIHVuYXZvaWRhYmxlIGFuZCBob25lc3Q6IHRoZSByZXN1bHQgaXMgbm90XG4gKiBrbm93YWJsZSB1bnRpbCB0aGUgYnJhbmNoZXMgc2V0dGxlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyB1bndyYXBIYW5kbGVzIH0gZnJvbSAnLi4vLi4vcmVhY3RpdmUvaGFuZGxlcy5qcyc7XG5pbXBvcnQgeyBJU19UWVBFRF9TQ09QRSB9IGZyb20gJy4uLy4uL3JlYWN0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgeyBidWlsZEJyYW5jaFNlZ21lbnQgfSBmcm9tICcuLi9icmFuY2hTZWdtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyYW5jaENoYXJ0LCBIYW5kbGVyRGVwcywgTm9kZVJlc3VsdFR5cGUsIFBhcmFsbGVsRm9yRWFjaENvbmZpZyB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4vQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5cbi8qKlxuICogVHJhdmVyc2VyLW93bmVkIG9wZXJhdGlvbnMgdGhlIGhhbmRsZXIgbmVlZHMuIFBhc3NlZCBhcyBmdW5jdGlvbnMgKG5vdCB0aGVcbiAqIHRyYXZlcnNlcikgc28gdGhlIGhhbmRsZXIga2VlcHMgdGhlIHNhbWUgbm8tYmFjay1yZWZlcmVuY2Ugc2hhcGUgYXMgZXZlcnlcbiAqIG90aGVyIGhhbmRsZXIgaW4gdGhpcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYWxsZWxGb3JFYWNoSG9va3M8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKiBUaGUgdHJhdmVyc2VyJ3MgYHByZWZpeE5vZGVUcmVlYCDigJQgYnl0ZS10d2luIG9mIHRoZSBidWlsZGVyJ3MgYF9wcmVmaXhOb2RlVHJlZWAuICovXG4gIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogUmVnaXN0ZXIgKE9WRVJXUklUSU5HKSBhIGdlbmVyYXRlZCBicmFuY2ggc3ViZmxvdyArIGl0cyBzdGFnZSBmdW5jdGlvbnMuICovXG4gIHJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhzdWJmbG93SWQ6IHN0cmluZywgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGNoYXJ0OiBCcmFuY2hDaGFydCk6IHZvaWQ7XG4gIC8qKiBSZWFkIGEgY29tcGxldGVkIGJyYW5jaCdzIGZpbmFsIHNoYXJlZCBzdGF0ZSwgZm9yIHRoZSBgc3ViZmxvd091dHB1dCA/PyBzdGF0ZWAgZmFsbGJhY2suICovXG4gIGJyYW5jaFNoYXJlZFN0YXRlKHN1YmZsb3dJZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIC8qKiBNaXJyb3IgdGhlIGdlbmVyYXRlZCBicmFuY2hlcyBpbnRvIHRoZSBydW50aW1lIHN0cnVjdHVyZSwgZm9yIHZpc3VhbGl6YXRpb24uICovXG4gIHJlY29yZEJyYW5jaFN0cnVjdHVyZShub2RlSWQ6IHN0cmluZywgYnJhbmNoZXM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUGFyYWxsZWxGb3JFYWNoSGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgaG9va3M6IFBhcmFsbGVsRm9yRWFjaEhvb2tzPFRPdXQsIFRTY29wZT4sXG4gICkge31cblxuICAvKipcbiAgICogUnVuIHRoZSBmYW4tb3V0IHRvIGNvbXBsZXRpb24gYW5kIGNvbW1pdCB0aGUgb3JkZXJlZCByZXN1bHRzLlxuICAgKiBSZXR1cm5zIHRoZSByZXN1bHRzIGFycmF5ICh0aGUgc3RhZ2UncyBvdXRwdXQpLlxuICAgKi9cbiAgYXN5bmMgcnVuKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dDogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTx1bmtub3duW10+IHtcbiAgICBjb25zdCBjb25maWcgPSBub2RlLnBhcmFsbGVsRm9yRWFjaCBhcyBQYXJhbGxlbEZvckVhY2hDb25maWc8dW5rbm93biwgVFNjb3BlPjtcblxuICAgIC8vIFNhbWUgc2NvcGUgY29uc3RydWN0aW9uIFN0YWdlUnVubmVyIHBlcmZvcm1zLCBwcm90ZWN0aW9uIGluY2x1ZGVkOiB0aGlzXG4gICAgLy8gc3RhZ2UgaGFzIG5vIHVzZXIgZnVuY3Rpb24sIGJ1dCBgaXRlbXMoc2NvcGUpYCBJUyB1c2VyIGNvZGUsIHNvIGl0cyByZWFkc1xuICAgIC8vIGFyZSB0cmFja2VkIGFuZCBhIHN0cmF5IGFzc2lnbm1lbnQgaW5zaWRlIGl0IGlzIGNhdWdodCBieSB0aGUgc2FtZVxuICAgIC8vIHByb3RlY3Rpb24gZXZlcnkgb3RoZXIgc3RhZ2UgZ2V0cy4gKFR5cGVkU2NvcGUgYnJpbmdzIGl0cyBvd24gcHJveHkuKVxuICAgIGNvbnN0IHJhd1Njb3BlID0gdGhpcy5kZXBzLnNjb3BlRmFjdG9yeShjb250ZXh0LCBub2RlLm5hbWUsIHRoaXMuZGVwcy5yZWFkT25seUNvbnRleHQsIHRoaXMuZGVwcy5leGVjdXRpb25FbnYpO1xuICAgIGNvbnN0IGlzVHlwZWRTY29wZSA9IHJhd1Njb3BlICYmIChyYXdTY29wZSBhcyBhbnkpW0lTX1RZUEVEX1NDT1BFXSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBzY29wZSA9IGlzVHlwZWRTY29wZVxuICAgICAgPyByYXdTY29wZVxuICAgICAgOiAoY3JlYXRlUHJvdGVjdGVkU2NvcGUocmF3U2NvcGUgYXMgb2JqZWN0LCB7XG4gICAgICAgICAgbW9kZTogdGhpcy5kZXBzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBub2RlLm5hbWUsXG4gICAgICAgIH0pIGFzIFRTY29wZSk7XG4gICAgbm90aWZ5KHJhd1Njb3BlLCAnbm90aWZ5U3RhZ2VTdGFydCcpO1xuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnJlc29sdmVJdGVtcyhjb25maWcsIHNjb3BlLCBub2RlKTtcbiAgICBjb25zdCB0b3RhbCA9IGl0ZW1zLmxlbmd0aDtcbiAgICBjb25zdCBicmFuY2hDb3VudCA9IE1hdGgubWluKHRvdGFsLCBjb25maWcubWF4QnJhbmNoZXMpO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IHRvdGFsID4gYnJhbmNoQ291bnQ7XG5cbiAgICBjb250ZXh0LmFkZExvZygncGFyYWxsZWxGb3JFYWNoJywge1xuICAgICAgaXRlbXM6IHRvdGFsLFxuICAgICAgYnJhbmNoZXM6IGJyYW5jaENvdW50LFxuICAgICAgbWF4QnJhbmNoZXM6IGNvbmZpZy5tYXhCcmFuY2hlcyxcbiAgICAgIHRydW5jYXRlZCxcbiAgICAgIGludG86IGNvbmZpZy5pbnRvLFxuICAgIH0pO1xuICAgIGlmICh0cnVuY2F0ZWQpIHtcbiAgICAgIC8vIFN0YXRlZCwgbm90IHNpbGVudCDigJQgaW4gdGhlIHN0YWdlJ3Mgb3duIGZsb3cgbWVzc2FnZXMgQU5EIGl0cyBsb2dzIGFib3ZlLlxuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKFxuICAgICAgICAnY2hpbGRyZW4nLFxuICAgICAgICBgbWF4QnJhbmNoZXMgcmVhY2hlZDogcnVubmluZyAke2JyYW5jaENvdW50fSBvZiAke3RvdGFsfSBpdGVtcyAoJHt0b3RhbCAtIGJyYW5jaENvdW50fSBub3QgcnVuKWAsXG4gICAgICAgIHsgY291bnQ6IGJyYW5jaENvdW50IH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRzOiB1bmtub3duW107XG4gICAgaWYgKGJyYW5jaENvdW50ID09PSAwKSB7XG4gICAgICAvLyBaZXJvIGl0ZW1zID0gemVybyBicmFuY2hlczogbm8gZmFuLW91dCBldmVudCwgYW4gZW1wdHkgb3JkZXJlZCBhcnJheS5cbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnJhbmNoZXMgPSB0aGlzLmJ1aWxkQnJhbmNoZXMobm9kZSwgaXRlbXMsIGJyYW5jaENvdW50KTtcbiAgICAgIHRoaXMuaG9va3MucmVjb3JkQnJhbmNoU3RydWN0dXJlKG5vZGUuaWQsIGJyYW5jaGVzKTtcblxuICAgICAgLy8gVGhlIGZhbi1vdXQgbm9kZSBoYW5kZWQgdG8gQ2hpbGRyZW5FeGVjdXRvciBpcyBhIHRlbXAgdmlldyBjYXJyeWluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBicmFuY2hlcyAoc2FtZSBzaGFwZSBgZXhlY3V0ZVNlbGVjdGVkQ2hpbGRyZW5gIHVzZXMgZm9yIGl0c1xuICAgICAgLy8gc2VsZWN0ZWQgc3Vic2V0KSDigJQgdGhlIHNoYXJlZCBncmFwaCBub2RlIGlzIG5ldmVyIG11dGF0ZWQsIHNvIGEgbG9vcFxuICAgICAgLy8gcmV2aXNpdCByZWdlbmVyYXRlcyBjbGVhbmx5LlxuICAgICAgY29uc3QgZm9ya1ZpZXc6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBjaGlsZHJlbjogYnJhbmNoZXMsXG4gICAgICAgIC4uLihjb25maWcuZmFpbEZhc3QgIT09IHVuZGVmaW5lZCAmJiB7IGZhaWxGYXN0OiBjb25maWcuZmFpbEZhc3QgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjaGlsZFJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICAgICAgZm9ya1ZpZXcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdHMgPSB0aGlzLmNvbGxlY3RPcmRlcmVkKG5vZGUsIGJyYW5jaENvdW50LCBjaGlsZFJlc3VsdHMpO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGVSZXN1bHRzKHJhd1Njb3BlLCBjb250ZXh0LCBjb25maWcuaW50bywgcmVzdWx0cyk7XG4gICAgbm90aWZ5KHJhd1Njb3BlLCAnbm90aWZ5U3RhZ2VFbmQnKTtcbiAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgdGhlIGl0ZW1zIHNlbGVjdG9yIGFnYWluc3QgdGhlIGxpdmUgc2NvcGUuIEEgbm9uLWFycmF5IHJldHVybiBpc1xuICAgKiBhIGNoYXJ0IGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24g4oCUIGl0IGZhaWxzIGxvdWRseSwgbmFtaW5nIHRoZSBzdGFnZS5cbiAgICpcbiAgICogVGhlIHNlbGVjdG9yIHJlYWRzIHRoZSB0eXBlZCBzY29wZSwgc28gd2hhdCBpdCByZXR1cm5zIGlzIHVzdWFsbHkgdGhlXG4gICAqIHNjb3BlJ3Mgb3duIGFycmF5IEhBTkRMRSAoYSBQcm94eSBib3VuZCB0byB0aGUgcGFyZW50IHN0YWdlKSBhbmQgZXZlcnlcbiAgICogYGl0ZW1zW2luZGV4XWAgYW4gZWxlbWVudCBoYW5kbGUuIFRoZSBpdGVtcyBhcmUgYWJvdXQgdG8gY3Jvc3MgaW50b1xuICAgKiBicmFuY2ggcnVudGltZXMg4oCUIGNsb3NlZCBvdmVyIGJ5IGBicmFuY2goaXRlbSwgaW5kZXgpYCBhbmQgc2VlZGVkIGFzIHRoZVxuICAgKiBicmFuY2gncyBgaXRlbWAg4oCUIHNvIHRoZXkgYXJlIHRha2VuIGFzIFZBTFVFUyBoZXJlIChgdW53cmFwSGFuZGxlc2AsXG4gICAqIHJlYWN0aXZlL2hhbmRsZXMudHMpLiA5LjIyLjDigJM5LjIzLjIgc2VlZGVkIHRoZSBoYW5kbGUgaXRzZWxmIGFuZCBldmVyeVxuICAgKiBicmFuY2ggb3ZlciBhbiBvYmplY3QgaXRlbSBmYWlsZWQgYXQgaXRzIHNlZWQgY29tbWl0IChEYXRhQ2xvbmVFcnJvcikuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVJdGVtcyhcbiAgICBjb25maWc6IFBhcmFsbGVsRm9yRWFjaENvbmZpZzx1bmtub3duLCBUU2NvcGU+LFxuICAgIHNjb3BlOiBUU2NvcGUsXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICk6IHJlYWRvbmx5IHVua25vd25bXSB7XG4gICAgY29uc3QgaXRlbXMgPSB1bndyYXBIYW5kbGVzKGNvbmZpZy5pdGVtcyhzY29wZSkpO1xuICAgIGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1zID09PSBudWxsKSByZXR1cm4gW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcGFyYWxsZWxGb3JFYWNoICcke25vZGUuaWR9JzogaXRlbXMoKSBtdXN0IHJldHVybiBhbiBhcnJheSAoZ290ICR7dHlwZW9mIGl0ZW1zfSkuIGAgK1xuICAgICAgICAgICdSZXR1cm4gW10gdG8gcnVuIHplcm8gYnJhbmNoZXMuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIC8qKiBHZW5lcmF0ZSBvbmUgc3ViZmxvdy1tb3VudCBub2RlIHBlciBicmFuY2gsIHJlZ2lzdGVyaW5nIGVhY2ggYnJhbmNoIGNoYXJ0LiAqL1xuICBwcml2YXRlIGJ1aWxkQnJhbmNoZXMoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgaXRlbXM6IHJlYWRvbmx5IHVua25vd25bXSxcbiAgICBicmFuY2hDb3VudDogbnVtYmVyLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHtcbiAgICBjb25zdCBjb25maWcgPSBub2RlLnBhcmFsbGVsRm9yRWFjaCBhcyBQYXJhbGxlbEZvckVhY2hDb25maWc8dW5rbm93biwgVFNjb3BlPjtcbiAgICBjb25zdCBicmFuY2hlczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJyYW5jaENvdW50OyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdO1xuICAgICAgY29uc3Qgc3ViZmxvd0lkID0gYnVpbGRCcmFuY2hTZWdtZW50KG5vZGUuaWQsIGluZGV4KTtcbiAgICAgIGNvbnN0IGNoYXJ0ID0gY29uZmlnLmJyYW5jaChpdGVtLCBpbmRleCk7XG4gICAgICBpZiAoIWNoYXJ0IHx8ICFjaGFydC5yb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgcGFyYWxsZWxGb3JFYWNoICcke25vZGUuaWR9JzogYnJhbmNoKGl0ZW0sICR7aW5kZXh9KSBtdXN0IHJldHVybiBhIGJ1aWx0IGNoYXJ0IGAgK1xuICAgICAgICAgICAgJyh0aGUgcmVzdWx0IG9mIGZsb3dDaGFydCguLi4pLmJ1aWxkKCkpLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgcHJlZml4aW5nIGEgbGF6eSBzdWJmbG93IGdldHMg4oCUIHRoZSBicmFuY2gncyBpbm5lciBpZHMgYmVjb21lXG4gICAgICAvLyBgPHNlZ21lbnQ+LzxpZD5gLCBzbyBpdHMgc3RhZ2VzIGFkZHJlc3MgYXMgYDxzZWdtZW50Pi88aWQ+IzxuPmAuXG4gICAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmhvb2tzLnByZWZpeE5vZGVUcmVlKGNoYXJ0LnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZCk7XG4gICAgICB0aGlzLmhvb2tzLnJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhzdWJmbG93SWQsIHByZWZpeGVkUm9vdCwgY2hhcnQpO1xuXG4gICAgICBicmFuY2hlcy5wdXNoKHtcbiAgICAgICAgbmFtZTogYCR7bm9kZS5uYW1lfSBbJHtpbmRleH1dYCxcbiAgICAgICAgaWQ6IHN1YmZsb3dJZCxcbiAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZTogYCR7bm9kZS5uYW1lfSBbJHtpbmRleH1dYCxcbiAgICAgICAgc3ViZmxvd01vdW50T3B0aW9uczoge1xuICAgICAgICAgIC8vIEQxJ3MgXCJpbnB1dE1hcHBlciBzZWFtIGZvciBmZWVkaW5nIHRoZSBpdGVtIGluXCI6IHRoZSBpdGVtIGlzXG4gICAgICAgICAgLy8gdmlzaWJsZSBJTiB0aGUgYnJhbmNoJ3Mgc2NvcGUgKGFuZCBzbyBpbiBpdHMgY29tbWl0IGxvZykgYXMgd2VsbCBhc1xuICAgICAgICAgIC8vIGNsb3NlZCBvdmVyIGJ5IHRoZSBmYWN0b3J5IOKAlCBwcm92ZW5hbmNlIGJlYXRzIGEgaGlkZGVuIGNsb3N1cmUuXG4gICAgICAgICAgaW5wdXRNYXBwZXI6ICgpID0+ICh7IGl0ZW0sIGluZGV4IH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJyYW5jaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIHJlc3VsdHMgaW4gSVRFTVMgb3JkZXIg4oCUIG5ldmVyIGNvbXBsZXRpb24gb3JkZXIuXG4gICAqXG4gICAqIFRoZSBicmFuY2gncyB2YWx1ZSBpcyBpdHMgc3ViZmxvdyBvdXRwdXQsIGZhbGxpbmcgYmFjayB0byB0aGUgYnJhbmNoJ3NcbiAgICogZmluYWwgc2hhcmVkIHN0YXRlICh0aGUgVHlwZWRTY29wZSBjYXNlLCB3aGVyZSBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuXG4gICAqIHZvaWQpIOKAlCB0aGUgc2FtZSBgc3ViZmxvd091dHB1dCA/PyBzaGFyZWRTdGF0ZWAgcnVsZSBgU3ViZmxvd0V4ZWN1dG9yYFxuICAgKiBhcHBsaWVzIHRvIGFuIG91dHB1dE1hcHBlci5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE9yZGVyZWQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoQ291bnQ6IG51bWJlcixcbiAgICBjaGlsZFJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPixcbiAgKTogdW5rbm93bltdIHtcbiAgICBjb25zdCBvcmRlcmVkOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYnJhbmNoQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IGJ1aWxkQnJhbmNoU2VnbWVudChub2RlLmlkLCBpbmRleCk7XG4gICAgICBjb25zdCBlbnRyeSA9IGNoaWxkUmVzdWx0c1tzdWJmbG93SWRdO1xuICAgICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuaXNFcnJvcikge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydCBtb2RlOiBhIGZhaWxlZCBicmFuY2gga2VlcHMgaXRzIFNMT1QgKG9yZGVyIGlzIGl0ZW1zXG4gICAgICAgIC8vIG9yZGVyKSB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS4gZmFpbEZhc3QgbW9kZSBuZXZlciByZWFjaGVzIGhlcmUg4oCUXG4gICAgICAgIC8vIHRoZSBlcnJvciBhbHJlYWR5IHJlamVjdGVkIHRoZSB3aG9sZSBzdGFnZS5cbiAgICAgICAgb3JkZXJlZC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3JkZXJlZC5wdXNoKGVudHJ5LnJlc3VsdCA/PyB0aGlzLmhvb2tzLmJyYW5jaFNoYXJlZFN0YXRlKHN1YmZsb3dJZCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSB0aGUgb3JkZXJlZCBhcnJheSBhcyBPTkUgdmFsdWUgb24gdGhlIHBhcmVudCBzY29wZS5cbiAgICpcbiAgICogYCRzZXRWYWx1ZWAgZGVsaWJlcmF0ZWx5LCB3aGVyZSBhdmFpbGFibGU6IHRoZSBUeXBlZFNjb3BlIHNldCB0cmFwXG4gICAqIEpTT04tcm91bmQtdHJpcHMgZXZlcnkgb2JqZWN0IHdyaXRlIChEYXRl4oaSc3RyaW5nLCBNYXDihpJ7fSksIGFuZCBicmFuY2hcbiAgICogcmVzdWx0cyBhcmUgZXhhY3RseSB0aGUga2luZCBvZiBwYXlsb2FkIHRoYXQgd291bGQgc2lsZW50bHkgZGVncmFkZS5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVSZXN1bHRzKHJhd1Njb3BlOiBUU2NvcGUsIGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgaW50bzogc3RyaW5nLCByZXN1bHRzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjb25zdCBzID0gcmF3U2NvcGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIHM/LiRzZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKHMuJHNldFZhbHVlIGFzIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWQpKGludG8sIHJlc3VsdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHM/LnNldFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAocy5zZXRWYWx1ZSBhcyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKShpbnRvLCByZXN1bHRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm8gZmFjYWRlIChoYW5kLXJvbGxlZCBzY29wZSBmYWN0b3J5KSDigJQgd3JpdGUgc3RyYWlnaHQgdG8gdGhlIGZyYW1lLlxuICAgIGNvbnRleHQuc2V0R2xvYmFsKGludG8sIHJlc3VsdHMpO1xuICB9XG59XG5cbi8qKiBGaXJlIGEgc2NvcGUgbGlmZWN5Y2xlIG5vdGlmaWNhdGlvbiBpZiB0aGUgc2NvcGUgc3VwcG9ydHMgaXQuICovXG5mdW5jdGlvbiBub3RpZnkoc2NvcGU6IHVua25vd24sIG1ldGhvZDogJ25vdGlmeVN0YWdlU3RhcnQnIHwgJ25vdGlmeVN0YWdlRW5kJyk6IHZvaWQge1xuICBjb25zdCBzID0gc2NvcGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGlmIChzICYmIHR5cGVvZiBzW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIChzW21ldGhvZF0gYXMgKCkgPT4gdm9pZCkoKTtcbn1cbiJdfQ==
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyYWxsZWxGb3JFYWNoSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFzQnRGLE1BQU0sT0FBTyxzQkFBc0I7SUFFdkI7SUFDQTtJQUNBO0lBSFYsWUFDVSxJQUErQixFQUMvQixnQkFBZ0QsRUFDaEQsS0FBeUM7UUFGekMsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQztRQUNoRCxVQUFLLEdBQUwsS0FBSyxDQUFvQztJQUNoRCxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FDUCxJQUE2QixFQUM3QixPQUFxQixFQUNyQixVQUE4QixFQUM5QixnQkFBa0M7UUFFbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQXlELENBQUM7UUFFOUUsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSxxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7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QztnQkFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEIsU0FBUztZQUNYLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBcUIsRUFBRSxJQUFZLEVBQUUsT0FBa0I7UUFDNUYsTUFBTSxDQUFDLEdBQUcsUUFBOEMsQ0FBQztRQUN6RCxJQUFJLE9BQU8sQ0FBQyxFQUFFLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxDQUFDLENBQUMsU0FBbUQsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEUsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxFQUFFLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsUUFBa0QsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDckUsT0FBTztRQUNULENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBRUQsb0VBQW9FO0FBQ3BFLFNBQVMsTUFBTSxDQUFDLEtBQWMsRUFBRSxNQUE2QztJQUMzRSxNQUFNLENBQUMsR0FBRyxLQUE0QyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVU7UUFBRyxDQUFDLENBQUMsTUFBTSxDQUFnQixFQUFFLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyYWxsZWxGb3JFYWNoSGFuZGxlciDigJQgZHluYW1pYyBmYW4tb3V0OiBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggQ09VTlRcbiAqIGRlY2lkZWQgYXQgcnVudGltZSBmcm9tIHRoZSBwYXlsb2FkLlxuICpcbiAqIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQgKEQxICsgRDIpLiBSb3VuZCBCIGJ1aWxkcyBleGFjdGx5XG4gKiB0aGF0IGRvY3VtZW50LlxuICpcbiAqICMjIFdoYXQgdGhpcyBoYW5kbGVyIGRvZXMgTk9UIGludmVudFxuICpcbiAqIEFsbW9zdCBldmVyeXRoaW5nIGhlcmUgaXMgZXhpc3RpbmcgbWFjaGluZXJ5LCB3aXJlZCB0b2dldGhlcjpcbiAqXG4gKiAtICoqRWFjaCBicmFuY2ggaXMgYSBnZW5lcmF0ZWQgU1VCRkxPVy4qKiBJdHMgcGF0aCBzZWdtZW50IGlzXG4gKiAgIGA8cGFyZW50U3RhZ2VJZD5+PGluZGV4PmAgKHNlZSBgaWRzL2JyYW5jaFNlZ21lbnQudHNgKSDigJQgYSBzdWJmbG93UGF0aFxuICogICBzZWdtZW50IGluIHRoZSBncmFtbWFyIHRoYXQgYWxyZWFkeSBzaGlwcywgTk9UIGEgbmV3IGRlbGltaXRlciBjbGFzcy4gU28gYVxuICogICBicmFuY2ggZ2V0cywgZm9yIGZyZWU6IGEgZnJlc2ggaXNvbGF0ZWQgYEV4ZWN1dGlvblJ1bnRpbWVgIChicmFuY2hlcyBjYW5ub3RcbiAqICAgY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0IHN0YXRlKSwgdGhlIGlucHV0TWFwcGVyIHNlYW0gZm9yIGZlZWRpbmcgdGhlXG4gKiAgIGl0ZW0gaW4sIGFuZCDigJQgdGhlIHBvaW50IG9mIHRoZSB3aG9sZSBkZXNpZ24g4oCUIGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCxcbiAqICAgYGNhdXNhbENoYWluYCwgYHNsaWNlRm9yS2V5YCBhbmQgYGZvcndhcmRTbGljZUZvcktleWAgcmVhZGluZyBicmFuY2hcbiAqICAgY29tbWl0cyB3aXRoIFpFUk8gY2hhbmdlcywgYmVjYXVzZSB0aGUgaWQgc2hhcGUgSVMgdGhlIHNoaXBwZWQgc2hhcGUuXG4gKiAtICoqVGhlIGZhbi1vdXQgaXRzZWxmIGlzIGBDaGlsZHJlbkV4ZWN1dG9yYC4qKiBUaGF0IGlzIHdoYXQgbWFrZXMgdGhlXG4gKiAgIGZhaWx1cmUgcG9saWN5IFwiUGFyYWxsZWwncyBleGlzdGluZyBmYWlsdXJlIHBvbGljeVwiIHJhdGhlciB0aGFuIGEgc2Vjb25kXG4gKiAgIG9uZTogYGZhaWxGYXN0YCDihpIgYFByb21pc2UuYWxsYCwgb3RoZXJ3aXNlIGJlc3QtZWZmb3J0IGBQcm9taXNlLmFsbFNldHRsZWRgLlxuICogICBJdCBhbHNvIGZpcmVzIGBvbkZvcmtgICsgYG9uU3RhZ2VFeGVjdXRlZCgnZm9yaycpYCBhbmQgYnViYmxlcyBhXG4gKiAgIGBQYXVzZVNpZ25hbGAgb3V0IG9mIGEgYnJhbmNoLCBhbGwgdW5jaGFuZ2VkLlxuICpcbiAqICMjIFRoZSBsYXdzIHRoaXMgaGFuZGxlciBvd25zXG4gKlxuICogKipPcmRlciBpcyBpdGVtcyBvcmRlci4qKiBSZXN1bHRzIGFyZSBhc3NlbWJsZWQgYnkgaW5kZXggZnJvbSB0aGUgZmFuLW91dCdzXG4gKiBrZXllZCByZXN1bHRzLCBuZXZlciBieSBjb21wbGV0aW9uIG9yZGVyLCBhbmQgbGFuZCBhcyBPTkUgYXJyYXkgd3JpdGUgb24gdGhlXG4gKiBwYXJlbnQg4oCUIHNvIGBpbnRvW2ldYCBpcyBhbHdheXMgYnJhbmNoIGBpYCdzIHJlc3VsdCBubyBtYXR0ZXIgd2hpY2ggYnJhbmNoXG4gKiBmaW5pc2hlZCBmaXJzdC4gQSBmYWlsZWQgYnJhbmNoIChiZXN0LWVmZm9ydCBtb2RlKSBsZWF2ZXMgYHVuZGVmaW5lZGAgaW4gaXRzXG4gKiBzbG90OyB3aGljaCBicmFuY2ggZmFpbGVkIGlzIG5vdCByZXBvcnRlZCBoZXJlLCBiZWNhdXNlIHRoYXQgZ2FwIGlzXG4gKiBwcmUtZXhpc3RpbmcgaW4gdGhlIHBhcmFsbGVsIGZhbi1vdXQgYW5kIG5vdCB0aGlzIGZlYXR1cmUncyB0byB3aWRlbi5cbiAqXG4gKiAqKm1heEJyYW5jaGVzIHRydW5jYXRlcywgYW5kIHNheXMgc28uKiogSXRlbXMgcGFzdCB0aGUgY2VpbGluZyBkbyBub3QgcnVuLlxuICogVGhlIHRydW5jYXRpb24gaXMgcmVjb3JkZWQgaW4gdGhlIHN0YWdlJ3Mgb3duIGNvbW1pdC12aXNpYmxlIGxvZyBhbmQgYXMgYVxuICogZmxvdyBtZXNzYWdlIOKAlCBib3VuZGVkIGV4ZWN1dGlvbiwgc3RhdGVkLCBuZXZlciBzaWxlbnQuXG4gKlxuICogKipCcmFuY2ggY2hhcnRzIGFyZSByZS1yZWdpc3RlcmVkIG9uIEVWRVJZIHZpc2l0LioqIFRoZSBnZW5lcmF0ZWQgc2VnbWVudHNcbiAqIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucywgYW5kIHN1YmZsb3cgcmVnaXN0cmF0aW9uIGlzIG5vcm1hbGx5XG4gKiBmaXJzdC13cml0ZS13aW5zIOKAlCB3aGljaCB3b3VsZCBtZWFuIGEgbG9vcGluZyBmYW4tb3V0IHNpbGVudGx5IHJlLWV4ZWN1dGluZ1xuICogaXRlcmF0aW9uIDEncyBicmFuY2ggY2hhcnRzIGZvcmV2ZXIsIGV2ZW4gd2hlbiB0aGUgZmFjdG9yeSByZXR1cm5zIGRpZmZlcmVudFxuICogY2hhcnRzLiBUaGlzIGhhbmRsZXIgb3ZlcndyaXRlcyBpbnN0ZWFkLiBQZXItaXRlcmF0aW9uIHJlc3VsdHMgc3RheVxuICogYWRkcmVzc2FibGUgdGhyb3VnaCB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhcyB0aGV5IGRvIGZvclxuICogYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAqXG4gKiAqKkV2ZW50IG9yZGVyLioqIGBvblN0YWdlU3RhcnRgIOKGkiB0aGUgYGl0ZW1zYCByZWFkIOKGkiBgb25Gb3JrYCDihpIgYnJhbmNoZXMg4oaSXG4gKiB0aGUgb3JkZXJlZC1hcnJheSB3cml0ZSDihpIgYG9uU3RhZ2VFbmRgIOKGkiBgb25Db21taXRgLiBUaGUgc3RhZ2UncyBvd24gY29tbWl0XG4gKiB0aGVyZWZvcmUgbGFuZHMgQUZURVIgaXRzIGBvbkZvcmtgLCB3aGljaCBpcyB0aGUgb25lIHBsYWNlIGEgc3RhZ2UncyBjb21taXRcbiAqIGZvbGxvd3MgaXRzIGZhbi1vdXQgZXZlbnQg4oCUIHVuYXZvaWRhYmxlIGFuZCBob25lc3Q6IHRoZSByZXN1bHQgaXMgbm90XG4gKiBrbm93YWJsZSB1bnRpbCB0aGUgYnJhbmNoZXMgc2V0dGxlLlxuICovXG5cbmltcG9ydCB7IGJ1aWxkQnJhbmNoU2VnbWVudCB9IGZyb20gJy4uLy4uL2lkcy9icmFuY2hTZWdtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyB1bndyYXBIYW5kbGVzIH0gZnJvbSAnLi4vLi4vcmVhY3RpdmUvaGFuZGxlcy5qcyc7XG5pbXBvcnQgeyBJU19UWVBFRF9TQ09QRSB9IGZyb20gJy4uLy4uL3JlYWN0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmFuY2hDaGFydCwgSGFuZGxlckRlcHMsIE5vZGVSZXN1bHRUeXBlLCBQYXJhbGxlbEZvckVhY2hDb25maWcgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuXG4vKipcbiAqIFRyYXZlcnNlci1vd25lZCBvcGVyYXRpb25zIHRoZSBoYW5kbGVyIG5lZWRzLiBQYXNzZWQgYXMgZnVuY3Rpb25zIChub3QgdGhlXG4gKiB0cmF2ZXJzZXIpIHNvIHRoZSBoYW5kbGVyIGtlZXBzIHRoZSBzYW1lIG5vLWJhY2stcmVmZXJlbmNlIHNoYXBlIGFzIGV2ZXJ5XG4gKiBvdGhlciBoYW5kbGVyIGluIHRoaXMgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsRm9yRWFjaEhvb2tzPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKiogVGhlIHRyYXZlcnNlcidzIGBwcmVmaXhOb2RlVHJlZWAg4oCUIGJ5dGUtdHdpbiBvZiB0aGUgYnVpbGRlcidzIGBfcHJlZml4Tm9kZVRyZWVgLiAqL1xuICBwcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFJlZ2lzdGVyIChPVkVSV1JJVElORykgYSBnZW5lcmF0ZWQgYnJhbmNoIHN1YmZsb3cgKyBpdHMgc3RhZ2UgZnVuY3Rpb25zLiAqL1xuICByZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkOiBzdHJpbmcsIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBjaGFydDogQnJhbmNoQ2hhcnQpOiB2b2lkO1xuICAvKiogUmVhZCBhIGNvbXBsZXRlZCBicmFuY2gncyBmaW5hbCBzaGFyZWQgc3RhdGUsIGZvciB0aGUgYHN1YmZsb3dPdXRwdXQgPz8gc3RhdGVgIGZhbGxiYWNrLiAqL1xuICBicmFuY2hTaGFyZWRTdGF0ZShzdWJmbG93SWQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAvKiogTWlycm9yIHRoZSBnZW5lcmF0ZWQgYnJhbmNoZXMgaW50byB0aGUgcnVudGltZSBzdHJ1Y3R1cmUsIGZvciB2aXN1YWxpemF0aW9uLiAqL1xuICByZWNvcmRCcmFuY2hTdHJ1Y3R1cmUobm9kZUlkOiBzdHJpbmcsIGJyYW5jaGVzOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFBhcmFsbGVsRm9yRWFjaEhhbmRsZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPixcbiAgICBwcml2YXRlIGNoaWxkcmVuRXhlY3V0b3I6IENoaWxkcmVuRXhlY3V0b3I8VE91dCwgVFNjb3BlPixcbiAgICBwcml2YXRlIGhvb2tzOiBQYXJhbGxlbEZvckVhY2hIb29rczxUT3V0LCBUU2NvcGU+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZmFuLW91dCB0byBjb21wbGV0aW9uIGFuZCBjb21taXQgdGhlIG9yZGVyZWQgcmVzdWx0cy5cbiAgICogUmV0dXJucyB0aGUgcmVzdWx0cyBhcnJheSAodGhlIHN0YWdlJ3Mgb3V0cHV0KS5cbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgY29uc3QgY29uZmlnID0gbm9kZS5wYXJhbGxlbEZvckVhY2ggYXMgUGFyYWxsZWxGb3JFYWNoQ29uZmlnPHVua25vd24sIFRTY29wZT47XG5cbiAgICAvLyBTYW1lIHNjb3BlIGNvbnN0cnVjdGlvbiBTdGFnZVJ1bm5lciBwZXJmb3JtcywgcHJvdGVjdGlvbiBpbmNsdWRlZDogdGhpc1xuICAgIC8vIHN0YWdlIGhhcyBubyB1c2VyIGZ1bmN0aW9uLCBidXQgYGl0ZW1zKHNjb3BlKWAgSVMgdXNlciBjb2RlLCBzbyBpdHMgcmVhZHNcbiAgICAvLyBhcmUgdHJhY2tlZCBhbmQgYSBzdHJheSBhc3NpZ25tZW50IGluc2lkZSBpdCBpcyBjYXVnaHQgYnkgdGhlIHNhbWVcbiAgICAvLyBwcm90ZWN0aW9uIGV2ZXJ5IG90aGVyIHN0YWdlIGdldHMuIChUeXBlZFNjb3BlIGJyaW5ncyBpdHMgb3duIHByb3h5LilcbiAgICBjb25zdCByYXdTY29wZSA9IHRoaXMuZGVwcy5zY29wZUZhY3RvcnkoY29udGV4dCwgbm9kZS5uYW1lLCB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0LCB0aGlzLmRlcHMuZXhlY3V0aW9uRW52KTtcbiAgICBjb25zdCBpc1R5cGVkU2NvcGUgPSByYXdTY29wZSAmJiAocmF3U2NvcGUgYXMgYW55KVtJU19UWVBFRF9TQ09QRV0gPT09IHRydWU7XG4gICAgY29uc3Qgc2NvcGUgPSBpc1R5cGVkU2NvcGVcbiAgICAgID8gcmF3U2NvcGVcbiAgICAgIDogKGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IHRoaXMuZGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICB9KSBhcyBUU2NvcGUpO1xuICAgIG5vdGlmeShyYXdTY29wZSwgJ25vdGlmeVN0YWdlU3RhcnQnKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5yZXNvbHZlSXRlbXMoY29uZmlnLCBzY29wZSwgbm9kZSk7XG4gICAgY29uc3QgdG90YWwgPSBpdGVtcy5sZW5ndGg7XG4gICAgY29uc3QgYnJhbmNoQ291bnQgPSBNYXRoLm1pbih0b3RhbCwgY29uZmlnLm1heEJyYW5jaGVzKTtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSB0b3RhbCA+IGJyYW5jaENvdW50O1xuXG4gICAgY29udGV4dC5hZGRMb2coJ3BhcmFsbGVsRm9yRWFjaCcsIHtcbiAgICAgIGl0ZW1zOiB0b3RhbCxcbiAgICAgIGJyYW5jaGVzOiBicmFuY2hDb3VudCxcbiAgICAgIG1heEJyYW5jaGVzOiBjb25maWcubWF4QnJhbmNoZXMsXG4gICAgICB0cnVuY2F0ZWQsXG4gICAgICBpbnRvOiBjb25maWcuaW50byxcbiAgICB9KTtcbiAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAvLyBTdGF0ZWQsIG5vdCBzaWxlbnQg4oCUIGluIHRoZSBzdGFnZSdzIG93biBmbG93IG1lc3NhZ2VzIEFORCBpdHMgbG9ncyBhYm92ZS5cbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICAgICAgJ2NoaWxkcmVuJyxcbiAgICAgICAgYG1heEJyYW5jaGVzIHJlYWNoZWQ6IHJ1bm5pbmcgJHticmFuY2hDb3VudH0gb2YgJHt0b3RhbH0gaXRlbXMgKCR7dG90YWwgLSBicmFuY2hDb3VudH0gbm90IHJ1bilgLFxuICAgICAgICB7IGNvdW50OiBicmFuY2hDb3VudCB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0czogdW5rbm93bltdO1xuICAgIGlmIChicmFuY2hDb3VudCA9PT0gMCkge1xuICAgICAgLy8gWmVybyBpdGVtcyA9IHplcm8gYnJhbmNoZXM6IG5vIGZhbi1vdXQgZXZlbnQsIGFuIGVtcHR5IG9yZGVyZWQgYXJyYXkuXG4gICAgICByZXN1bHRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJyYW5jaGVzID0gdGhpcy5idWlsZEJyYW5jaGVzKG5vZGUsIGl0ZW1zLCBicmFuY2hDb3VudCk7XG4gICAgICB0aGlzLmhvb2tzLnJlY29yZEJyYW5jaFN0cnVjdHVyZShub2RlLmlkLCBicmFuY2hlcyk7XG5cbiAgICAgIC8vIFRoZSBmYW4tb3V0IG5vZGUgaGFuZGVkIHRvIENoaWxkcmVuRXhlY3V0b3IgaXMgYSB0ZW1wIHZpZXcgY2FycnlpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgYnJhbmNoZXMgKHNhbWUgc2hhcGUgYGV4ZWN1dGVTZWxlY3RlZENoaWxkcmVuYCB1c2VzIGZvciBpdHNcbiAgICAgIC8vIHNlbGVjdGVkIHN1YnNldCkg4oCUIHRoZSBzaGFyZWQgZ3JhcGggbm9kZSBpcyBuZXZlciBtdXRhdGVkLCBzbyBhIGxvb3BcbiAgICAgIC8vIHJldmlzaXQgcmVnZW5lcmF0ZXMgY2xlYW5seS5cbiAgICAgIGNvbnN0IGZvcmtWaWV3OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgY2hpbGRyZW46IGJyYW5jaGVzLFxuICAgICAgICAuLi4oY29uZmlnLmZhaWxGYXN0ICE9PSB1bmRlZmluZWQgJiYgeyBmYWlsRmFzdDogY29uZmlnLmZhaWxGYXN0IH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY2hpbGRSZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgIGZvcmtWaWV3LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICByZXN1bHRzID0gdGhpcy5jb2xsZWN0T3JkZXJlZChub2RlLCBicmFuY2hDb3VudCwgY2hpbGRSZXN1bHRzKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlUmVzdWx0cyhyYXdTY29wZSwgY29udGV4dCwgY29uZmlnLmludG8sIHJlc3VsdHMpO1xuICAgIG5vdGlmeShyYXdTY29wZSwgJ25vdGlmeVN0YWdlRW5kJyk7XG4gICAgY29udGV4dC5jb21taXQoKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIHRoZSBpdGVtcyBzZWxlY3RvciBhZ2FpbnN0IHRoZSBsaXZlIHNjb3BlLiBBIG5vbi1hcnJheSByZXR1cm4gaXNcbiAgICogYSBjaGFydCBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uIOKAlCBpdCBmYWlscyBsb3VkbHksIG5hbWluZyB0aGUgc3RhZ2UuXG4gICAqXG4gICAqIFRoZSBzZWxlY3RvciByZWFkcyB0aGUgdHlwZWQgc2NvcGUsIHNvIHdoYXQgaXQgcmV0dXJucyBpcyB1c3VhbGx5IHRoZVxuICAgKiBzY29wZSdzIG93biBhcnJheSBIQU5ETEUgKGEgUHJveHkgYm91bmQgdG8gdGhlIHBhcmVudCBzdGFnZSkgYW5kIGV2ZXJ5XG4gICAqIGBpdGVtc1tpbmRleF1gIGFuIGVsZW1lbnQgaGFuZGxlLiBUaGUgaXRlbXMgYXJlIGFib3V0IHRvIGNyb3NzIGludG9cbiAgICogYnJhbmNoIHJ1bnRpbWVzIOKAlCBjbG9zZWQgb3ZlciBieSBgYnJhbmNoKGl0ZW0sIGluZGV4KWAgYW5kIHNlZWRlZCBhcyB0aGVcbiAgICogYnJhbmNoJ3MgYGl0ZW1gIOKAlCBzbyB0aGV5IGFyZSB0YWtlbiBhcyBWQUxVRVMgaGVyZSAoYHVud3JhcEhhbmRsZXNgLFxuICAgKiByZWFjdGl2ZS9oYW5kbGVzLnRzKS4gOS4yMi4w4oCTOS4yMy4yIHNlZWRlZCB0aGUgaGFuZGxlIGl0c2VsZiBhbmQgZXZlcnlcbiAgICogYnJhbmNoIG92ZXIgYW4gb2JqZWN0IGl0ZW0gZmFpbGVkIGF0IGl0cyBzZWVkIGNvbW1pdCAoRGF0YUNsb25lRXJyb3IpLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlSXRlbXMoXG4gICAgY29uZmlnOiBQYXJhbGxlbEZvckVhY2hDb25maWc8dW5rbm93biwgVFNjb3BlPixcbiAgICBzY29wZTogVFNjb3BlLFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICApOiByZWFkb25seSB1bmtub3duW10ge1xuICAgIGNvbnN0IGl0ZW1zID0gdW53cmFwSGFuZGxlcyhjb25maWcuaXRlbXMoc2NvcGUpKTtcbiAgICBpZiAoaXRlbXMgPT09IHVuZGVmaW5lZCB8fCBpdGVtcyA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHBhcmFsbGVsRm9yRWFjaCAnJHtub2RlLmlkfSc6IGl0ZW1zKCkgbXVzdCByZXR1cm4gYW4gYXJyYXkgKGdvdCAke3R5cGVvZiBpdGVtc30pLiBgICtcbiAgICAgICAgICAnUmV0dXJuIFtdIHRvIHJ1biB6ZXJvIGJyYW5jaGVzLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICAvKiogR2VuZXJhdGUgb25lIHN1YmZsb3ctbW91bnQgbm9kZSBwZXIgYnJhbmNoLCByZWdpc3RlcmluZyBlYWNoIGJyYW5jaCBjaGFydC4gKi9cbiAgcHJpdmF0ZSBidWlsZEJyYW5jaGVzKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGl0ZW1zOiByZWFkb25seSB1bmtub3duW10sXG4gICAgYnJhbmNoQ291bnQ6IG51bWJlcixcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSB7XG4gICAgY29uc3QgY29uZmlnID0gbm9kZS5wYXJhbGxlbEZvckVhY2ggYXMgUGFyYWxsZWxGb3JFYWNoQ29uZmlnPHVua25vd24sIFRTY29wZT47XG4gICAgY29uc3QgYnJhbmNoZXM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBicmFuY2hDb3VudDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IGJ1aWxkQnJhbmNoU2VnbWVudChub2RlLmlkLCBpbmRleCk7XG4gICAgICBjb25zdCBjaGFydCA9IGNvbmZpZy5icmFuY2goaXRlbSwgaW5kZXgpO1xuICAgICAgaWYgKCFjaGFydCB8fCAhY2hhcnQucm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHBhcmFsbGVsRm9yRWFjaCAnJHtub2RlLmlkfSc6IGJyYW5jaChpdGVtLCAke2luZGV4fSkgbXVzdCByZXR1cm4gYSBidWlsdCBjaGFydCBgICtcbiAgICAgICAgICAgICcodGhlIHJlc3VsdCBvZiBmbG93Q2hhcnQoLi4uKS5idWlsZCgpKS4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW1lIHByZWZpeGluZyBhIGxhenkgc3ViZmxvdyBnZXRzIOKAlCB0aGUgYnJhbmNoJ3MgaW5uZXIgaWRzIGJlY29tZVxuICAgICAgLy8gYDxzZWdtZW50Pi88aWQ+YCwgc28gaXRzIHN0YWdlcyBhZGRyZXNzIGFzIGA8c2VnbWVudD4vPGlkPiM8bj5gLlxuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5ob29rcy5wcmVmaXhOb2RlVHJlZShjaGFydC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzdWJmbG93SWQpO1xuICAgICAgdGhpcy5ob29rcy5yZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkLCBwcmVmaXhlZFJvb3QsIGNoYXJ0KTtcblxuICAgICAgYnJhbmNoZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGAke25vZGUubmFtZX0gWyR7aW5kZXh9XWAsXG4gICAgICAgIGlkOiBzdWJmbG93SWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd05hbWU6IGAke25vZGUubmFtZX0gWyR7aW5kZXh9XWAsXG4gICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IHtcbiAgICAgICAgICAvLyBEMSdzIFwiaW5wdXRNYXBwZXIgc2VhbSBmb3IgZmVlZGluZyB0aGUgaXRlbSBpblwiOiB0aGUgaXRlbSBpc1xuICAgICAgICAgIC8vIHZpc2libGUgSU4gdGhlIGJyYW5jaCdzIHNjb3BlIChhbmQgc28gaW4gaXRzIGNvbW1pdCBsb2cpIGFzIHdlbGwgYXNcbiAgICAgICAgICAvLyBjbG9zZWQgb3ZlciBieSB0aGUgZmFjdG9yeSDigJQgcHJvdmVuYW5jZSBiZWF0cyBhIGhpZGRlbiBjbG9zdXJlLlxuICAgICAgICAgIGlucHV0TWFwcGVyOiAoKSA9PiAoeyBpdGVtLCBpbmRleCB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBicmFuY2hlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSByZXN1bHRzIGluIElURU1TIG9yZGVyIOKAlCBuZXZlciBjb21wbGV0aW9uIG9yZGVyLlxuICAgKlxuICAgKiBUaGUgYnJhbmNoJ3MgdmFsdWUgaXMgaXRzIHN1YmZsb3cgb3V0cHV0LCBmYWxsaW5nIGJhY2sgdG8gdGhlIGJyYW5jaCdzXG4gICAqIGZpbmFsIHNoYXJlZCBzdGF0ZSAodGhlIFR5cGVkU2NvcGUgY2FzZSwgd2hlcmUgc3RhZ2UgZnVuY3Rpb25zIHJldHVyblxuICAgKiB2b2lkKSDigJQgdGhlIHNhbWUgYHN1YmZsb3dPdXRwdXQgPz8gc2hhcmVkU3RhdGVgIHJ1bGUgYFN1YmZsb3dFeGVjdXRvcmBcbiAgICogYXBwbGllcyB0byBhbiBvdXRwdXRNYXBwZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3RPcmRlcmVkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGJyYW5jaENvdW50OiBudW1iZXIsXG4gICAgY2hpbGRSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT4sXG4gICk6IHVua25vd25bXSB7XG4gICAgY29uc3Qgb3JkZXJlZDogdW5rbm93bltdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJyYW5jaENvdW50OyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBidWlsZEJyYW5jaFNlZ21lbnQobm9kZS5pZCwgaW5kZXgpO1xuICAgICAgY29uc3QgZW50cnkgPSBjaGlsZFJlc3VsdHNbc3ViZmxvd0lkXTtcbiAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LmlzRXJyb3IpIHtcbiAgICAgICAgLy8gQmVzdC1lZmZvcnQgbW9kZTogYSBmYWlsZWQgYnJhbmNoIGtlZXBzIGl0cyBTTE9UIChvcmRlciBpcyBpdGVtc1xuICAgICAgICAvLyBvcmRlcikgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuIGZhaWxGYXN0IG1vZGUgbmV2ZXIgcmVhY2hlcyBoZXJlIOKAlFxuICAgICAgICAvLyB0aGUgZXJyb3IgYWxyZWFkeSByZWplY3RlZCB0aGUgd2hvbGUgc3RhZ2UuXG4gICAgICAgIG9yZGVyZWQucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9yZGVyZWQucHVzaChlbnRyeS5yZXN1bHQgPz8gdGhpcy5ob29rcy5icmFuY2hTaGFyZWRTdGF0ZShzdWJmbG93SWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgdGhlIG9yZGVyZWQgYXJyYXkgYXMgT05FIHZhbHVlIG9uIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAqXG4gICAqIGAkc2V0VmFsdWVgIGRlbGliZXJhdGVseSwgd2hlcmUgYXZhaWxhYmxlOiB0aGUgVHlwZWRTY29wZSBzZXQgdHJhcFxuICAgKiBKU09OLXJvdW5kLXRyaXBzIGV2ZXJ5IG9iamVjdCB3cml0ZSAoRGF0ZeKGknN0cmluZywgTWFw4oaSe30pLCBhbmQgYnJhbmNoXG4gICAqIHJlc3VsdHMgYXJlIGV4YWN0bHkgdGhlIGtpbmQgb2YgcGF5bG9hZCB0aGF0IHdvdWxkIHNpbGVudGx5IGRlZ3JhZGUuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlUmVzdWx0cyhyYXdTY29wZTogVFNjb3BlLCBjb250ZXh0OiBTdGFnZUNvbnRleHQsIGludG86IHN0cmluZywgcmVzdWx0czogdW5rbm93bltdKTogdm9pZCB7XG4gICAgY29uc3QgcyA9IHJhd1Njb3BlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBzPy4kc2V0VmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIChzLiRzZXRWYWx1ZSBhcyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKShpbnRvLCByZXN1bHRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzPy5zZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKHMuc2V0VmFsdWUgYXMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkoaW50bywgcmVzdWx0cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vIGZhY2FkZSAoaGFuZC1yb2xsZWQgc2NvcGUgZmFjdG9yeSkg4oCUIHdyaXRlIHN0cmFpZ2h0IHRvIHRoZSBmcmFtZS5cbiAgICBjb250ZXh0LnNldEdsb2JhbChpbnRvLCByZXN1bHRzKTtcbiAgfVxufVxuXG4vKiogRmlyZSBhIHNjb3BlIGxpZmVjeWNsZSBub3RpZmljYXRpb24gaWYgdGhlIHNjb3BlIHN1cHBvcnRzIGl0LiAqL1xuZnVuY3Rpb24gbm90aWZ5KHNjb3BlOiB1bmtub3duLCBtZXRob2Q6ICdub3RpZnlTdGFnZVN0YXJ0JyB8ICdub3RpZnlTdGFnZUVuZCcpOiB2b2lkIHtcbiAgY29uc3QgcyA9IHNjb3BlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBpZiAocyAmJiB0eXBlb2Ygc1ttZXRob2RdID09PSAnZnVuY3Rpb24nKSAoc1ttZXRob2RdIGFzICgpID0+IHZvaWQpKCk7XG59XG4iXX0=
@@ -61,7 +61,7 @@
61
61
  * root with its inputMapper (its earlier stages recompute what the capture
62
62
  * would have held), exactly as 9.27.0 did.
63
63
  */
64
- import { PauseSignal } from '../../pause/types.js';
64
+ import { isPausedExecution, PauseSignal } from '../../pause/types.js';
65
65
  export class ResumeEntry {
66
66
  /**
67
67
  * Where the resumed TOP-LEVEL traversal starts: the stand-in (a top-level
@@ -217,6 +217,10 @@ export function raiseQueuedPause(queue) {
217
217
  const [first, ...rest] = queue;
218
218
  const { pause, level } = first;
219
219
  const signal = new PauseSignal(pause.pauseData, pause.pausedStageId, pause.pausedBy);
220
+ // The sibling paused in an EARLIER run: its own execution, not this run's.
221
+ if (isPausedExecution(pause.pausedExecution)) {
222
+ signal.stampExecution(pause.pausedExecution.runtimeStageId, pause.pausedExecution.runId);
223
+ }
220
224
  const below = pause.subflowPath.slice(level);
221
225
  for (let i = below.length - 1; i >= 0; i--) {
222
226
  const state = ownEntry(pause.subflowStates, below[i]);
@@ -462,10 +466,15 @@ function validPendingPause(raw, n) {
462
466
  subflowStates: states ?? {},
463
467
  ...(record.pauseData !== undefined && { pauseData: record.pauseData }),
464
468
  ...(record.pausedBy === 'interrupt' && { pausedBy: 'interrupt' }),
469
+ // A record, never a plan input: kept only when well-formed (an older or
470
+ // hand-edited entry simply resumes without a link).
471
+ ...(isPausedExecution(record.pausedExecution) && {
472
+ pausedExecution: { runId: record.pausedExecution.runId, runtimeStageId: record.pausedExecution.runtimeStageId },
473
+ }),
465
474
  };
466
475
  }
467
476
  /** `record[key]` only when it is the record's OWN property — never through the prototype chain. */
468
477
  function ownEntry(record, key) {
469
478
  return record && Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;
470
479
  }
471
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdW1lRW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFHSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUE4Q25ELE1BQU0sT0FBTyxXQUFXO0lBQ3RCOzs7OztPQUtHO0lBQ00sS0FBSyxDQUFzQztJQUNwRCw2RkFBNkY7SUFDcEYsa0JBQWtCLENBQXFDO0lBQ2hFOzs7Ozs7T0FNRztJQUNNLGtCQUFrQixDQUFxQjtJQUNoRCxpRkFBaUY7SUFDaEUsT0FBTyxDQUF1QztJQUUvRCxZQUNFLEtBQTBDLEVBQzFDLElBQXdDLEVBQ3hDLGtCQUEyQyxFQUMzQyxrQkFBMkI7UUFFM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQWUsSUFPekI7UUFDQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsRUFBZ0Is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Q3BDLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JHLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssV0FBVztRQUNsRSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUN2RCxPQUFPO1FBQ0wsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUF1QjtRQUM3QyxXQUFXLEVBQUUsV0FBdUI7UUFDcEMsYUFBYSxFQUFHLE1BQThELElBQUksRUFBRTtRQUNwRixHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFvQixFQUFFLENBQUM7S0FDM0UsQ0FBQztBQUNKLENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsU0FBUyxRQUFRLENBQUksTUFBcUMsRUFBRSxHQUFXO0lBQ3JFLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc3VtZUVudHJ5IOKAlCB0aGUgcmVzdW1lJ3MgT05FLVNIT1QgcmUtZW50cnkgKE0yLCBwYXVzZS9yZXN1bWUpLlxuICpcbiAqIEEgcmVzdW1lIGhhcyB0byBnZXQgYmFjayB0byBhIHN0YWdlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFydC4gSXQgZG9lcyB0aGF0XG4gKiB3aXRoIGEgc21hbGwgc3ludGhldGljIHN0cnVjdHVyZTogYSBzdGFuZC1pbiBmb3IgdGhlIHBhdXNlZCBzdGFnZSAodGhlXG4gKiBzdGFnZSdzIG93biBub2RlIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZSByZXN1bWUgaGFsZiDigJQgb3IsIGZvciBhblxuICogYGludGVycnVwdCgpYCBwYXVzZSwgZm9yIGl0cyBvd24gZnVuY3Rpb24gd2l0aCB0aGUgYW5zd2VyIGRlcG9zaXRlZCksIGFuZCxcbiAqIGZvciBhIHBhdXNlIGluc2lkZSBzdWJmbG93cywgdGhlIGNoZWNrcG9pbnQncyBjYXB0dXJlIG9mIGVhY2ggc3ViZmxvdydzXG4gKiBzdGF0ZSBvbiB0aGUgd2F5IGRvd24uXG4gKlxuICogVEhFIExBVzogdGhhdCBzdHJ1Y3R1cmUgaXMgdXNlZCBFWEFDVExZIE9OQ0UsIGZvciB0aGUgcmUtZW50cnkuIFRoZSBzdGFuZC1pblxuICogaXMgd2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIFNUQVJUUyAob3Igd2hlcmUgdGhlIGxlYWYgc3ViZmxvdydzIHRyYXZlcnNhbFxuICogc3RhcnRzKSDigJQgaXQgaXMgbmV2ZXIgYSBub2RlIGFueSBpZCBjYW4gcmVzb2x2ZSB0by4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXVzZVxuICogcGF0aCB0YWtlcyBpdHMgc2VlZCBhbmQgaXRzIGVudHJ5IHBvaW50IG9uIGl0cyBGSVJTVCBlbnRyeSBhbmQgbmV2ZXIgYWdhaW4uXG4gKiBBZnRlciB0aGF0IHRoZSBydW4gYmVsb25ncyB0byB0aGUgcmVhbCBjaGFydDogZXZlcnkgbG9vcCB0YXJnZXQsIGV2ZXJ5IGxhdGVyXG4gKiBzdWJmbG93IGVudHJ5IChyZWFsIHJvb3QsIGlucHV0TWFwcGVyIHJ1bnMpLCBldmVyeSByZS12aXNpdCBvZiB0aGUgcGF1c2VkXG4gKiBzdGFnZSAod2hpY2ggcGF1c2VzIGFnYWluKSByZXNvbHZlcyBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdC5cbiAqXG4gKiBPTkUgUlVMRSBBVCBFVkVSWSBMRVZFTCDigJQgd2hhdCBydW5zIGFmdGVyIHRoZSBlbnRyeS4gT24gdGhlIG9yaWdpbmFsIHJ1bixcbiAqIHdoYXRldmVyIERJU1BBVENIRUQgdGhlIHBhdXNlZCBzdGFnZSAob3IgdGhlIG1vdW50IG9mIHRoZSBuZXh0IHN1YmZsb3cgb25cbiAqIHRoZSBwYXRoKSDigJQgYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmsg4oCUIHJhbiBpdHMgb3duIGNvbnRpbnVhdGlvbiBvbmNlXG4gKiB0aGF0IGNoaWxkJ3MgY2hhaW4gZW5kZWQ6IHRoZSBkZWNpZGVyJ3MgYG5leHRgLCB0aGUgZm9yaydzIGpvaW4uIEEgcmVzdW1lXG4gKiBlbnRlcnMgQVQgdGhlIGNoaWxkLCBzbyB0aGF0IGNvbnRpbnVhdGlvbiBtdXN0IGJlIGNhcnJpZWQ6IHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkIHdpdGggdGhlIGVuY2xvc2luZyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkIGF0IHRoZSBlbmRcbiAqIG9mIGl0cyBvd24gY2hhaW4gKGB7IC4uLmNoaWxkLCBuZXh0OiBkaXNwYXRjaGVyLm5leHQgfWAgZm9yIGEgY2hhcnQgdGhlXG4gKiBidWlsZGVyIG1hZGUpLiBJdCBpcyByZWFkIGZyb20gdGhlIENIQVJULCBsZXZlbCBieSBsZXZlbCDigJQgbmV2ZXIgZnJvbSB0aGVcbiAqIGNoZWNrcG9pbnQsIHNvIGFuIGVkaXRlZCBjaGVja3BvaW50IGNhbm5vdCByZWRpcmVjdCBhIHJ1biDigJQgYW5kIGl0IGxhbmRzXG4gKiBhdCB0aGUgbGV2ZWwgaXQgYmVsb25ncyB0bzogYSB0b3AtbGV2ZWwgZGVjaWRlcidzIGBuZXh0YCBydW5zIGF0IHRoZSB0b3BcbiAqIGxldmVsLCBhZnRlciB0aGUgc3ViZmxvdydzIG91dHB1dE1hcHBlciwgbm90IGluc2lkZSB0aGUgc3ViZmxvdy5cbiAqXG4gKiBQQVJBTExFTCBTSUJMSU5HUyBUSEFUIFBBVVNFRCBUT08gKDkuMjguMCkuIFdoZW4gdHdvIGNoaWxkcmVuIG9mIG9uZVxuICogZmFuLW91dCBwYXVzZWQsIHRoZSBjaGVja3BvaW50IGFza3MgdGhlIGZpcnN0IGFuZCBjYXJyaWVzIHRoZSBvdGhlcnNcbiAqIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkuIEF0IHRoYXQgZmFuLW91dCdzIGxldmVsIHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkJ3Mgb3duIGNoYWluIG9ubHkg4oCUIG5vIGpvaW4g4oCUIGFuZCBvbmNlIGl0IGVuZHMsIHRoZSBuZXh0IHNpYmxpbmcnc1xuICogcGF1c2UgaXMgcmFpc2VkIGFnYWluIGFzIGl0IHdhcyAoaXRzIHF1ZXN0aW9uLCBpdHMgY2FwdHVyZWQgc3RhdGUpLCB3aXRob3V0XG4gKiByZS1ydW5uaW5nIGFueXRoaW5nLiBUaGUgam9pbiBydW5zIG9ubHkgd2hlbiB0aGUgbGFzdCBzaWJsaW5nIGlzIHJlc3VtZWQuXG4gKlxuICogQmVmb3JlIDkuMjguMCB0aGUgc3RydWN0dXJlIHN0YXllZCBpbiBmb3JjZSBmb3IgdGhlIHdob2xlIHJlc3VtZWQgcnVuIOKAlCB0aGVcbiAqIHRyYXZlcnNhbCB3YXMgUk9PVEVEIGF0IHRoZSBzdGFuZC1pbiAoc28gYSBsb29wIGJhY2sgdG8gdGhlIHBhdXNlZCBpZCByZS1yYW5cbiAqIHRoZSByZXN1bWUgaGFsZiwgYW5kIGEgbG9vcCB0YXJnZXQgdXBzdHJlYW0gb2YgdGhlIHJlc3VtZSBwb2ludCB3YXNcbiAqIHVucmVhY2hhYmxlOiBvbmUgc3RhZ2UgcmFuLCB0aGVuIHRoZSBydW4gZW5kZWQgc2lsZW50bHkpLCBhbmQgdGhlIGxlYWZcbiAqIHN1YmZsb3cncyByb290IHdhcyBTV0FQUEVEIGZvciB0aGUgc3RhbmQtaW4gaW4gdGhlIHN1YmZsb3cgZGljdGlvbmFyeSAoc28gYVxuICogbGF0ZXIgZW50cnkgaW50byBpdCB3b3VsZCByZS1ydW4gdGhlIHJlc3VtZSBoYWxmIG9uIGEgc3RhbGUgc2VlZCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFdoYXQgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKCkgYnVpbGRzIGZvciBhIHBhdXNlIGF0ICdzZi1hL3NmLWIvYXNrJ1xuICogLy8gKHN1YmZsb3dQYXRoIFsnc2YtYScsICdzZi1hL3NmLWInXSksICdzZi1hL3NmLWInIG1vdW50ZWQgYXMgYSBkZWNpZGVyXG4gKiAvLyBicmFuY2ggaW5zaWRlIHNmLWEgd2hvc2UgZGVjaWRlciBjb250aW51ZXMgdG8gJ3NmLWEvYWZ0ZXInOlxuICogY29uc3QgZW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuKHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0pO1xuICogZW50cnkuc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcC1sZXZlbCBtb3VudCBvZiAnc2YtYSdcbiAqIGVudHJ5LmVudGVyU3ViZmxvdygnc2YtYScpOyAgICAgIC8vIHsgc2VlZDogc2YtYSdzIGNhcHR1cmUsIGVudHJ5OiB7IC4uLm1vdW50IG9mICdzZi1hL3NmLWInLCBuZXh0OiBzZi1hL2FmdGVyIH0gfVxuICogZW50cnkuZW50ZXJTdWJmbG93KCdzZi1hL3NmLWInKTsgLy8geyBzZWVkOiBzZi1iJ3MgY2FwdHVyZSwgZW50cnk6IHRoZSBzdGFuZC1pbiB9XG4gKiBlbnRyeS5lbnRlclN1YmZsb3coJ3NmLWEvc2YtYicpOyAvLyB1bmRlZmluZWQg4oCUIGEgbGF0ZXIgZW50cnkgaXMgYW4gb3JkaW5hcnkgb25lXG4gKiBgYGBcbiAqXG4gKiBBIHBhdXNlIHR3byAob3IgbW9yZSkgc3ViZmxvd3MgZGVlcCB0aGVyZWZvcmUgcmUtZW50ZXJzIGVhY2ggb3V0ZXIgc3ViZmxvd1xuICogQVQgdGhlIG1vdW50IG9mIHRoZSBuZXh0IG9uZSDigJQgdGhlIG91dGVyIHN1YmZsb3cncyBzdGFnZXMgYmVmb3JlIHRoYXQgbW91bnRcbiAqIGRvIG5vdCBydW4gYWdhaW4gKHRoZXkgZGlkIGJlZm9yZSA5LjI4LjApLiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIGRlZ3JhZGVkXG4gKiBjaGVja3BvaW50IG1pc3NpbmcgYW4gb3V0ZXIgc3ViZmxvdydzIGNhcHR1cmU6IHRoYXQgc3ViZmxvdyByZS1ydW5zIGZyb20gaXRzXG4gKiByb290IHdpdGggaXRzIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmVcbiAqIHdvdWxkIGhhdmUgaGVsZCksIGV4YWN0bHkgYXMgOS4yNy4wIGRpZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBlbmRpbmdQYXVzZSB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuXG4vKipcbiAqIEEgcGFyYWxsZWwgc2libGluZydzIHBhdXNlLCBxdWV1ZWQgYXQgdGhlIGxldmVsIG9mIGl0cyBmYW4tb3V0OiByYWlzZWRcbiAqIGFnYWluIHRoZXJlIG9uY2UgdGhlIHJlc3VtZWQgY2hpbGQncyBjaGFpbiBlbmRzIChzZWUge0BsaW5rIHJhaXNlUXVldWVkUGF1c2V9KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZWRQYXVzZSB7XG4gIC8qKiBUaGUgc2libGluZydzIHBhdXNlIGFzIHRoZSBjaGVja3BvaW50IGNhcnJpZXMgaXQg4oCUIGl0cyBwYXRoIGZyb20gdGhlIHRvcC4gKi9cbiAgcmVhZG9ubHkgcGF1c2U6IFBlbmRpbmdQYXVzZTtcbiAgLyoqIEhvdyBtYW55IHN1YmZsb3dzIGRlZXAgdGhlIGZhbi1vdXQgc2l0cyAoMCA9IHRoZSB0b3AgbGV2ZWwpLiAqL1xuICByZWFkb25seSBsZXZlbDogbnVtYmVyO1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UncyBuYW1lLCBmb3IgdGhlIGBvblBhdXNlYCBldmVudC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgc3ViZmxvdyBib3VuZGFyeSBvbiB0aGUgd2F5IGJhY2sgdG8gYSBwYXVzZWQgc3RhZ2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZUhvcDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqIFRoZSBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKGEgYEZsb3djaGFydENoZWNrcG9pbnQuc3ViZmxvd1BhdGhgIGVudHJ5KS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3ViZmxvdydzIHN0YXRlIGF0IHRoZSBwYXVzZSAoYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdYCkuXG4gICAqIFNlZWRzIHRoZSBuZXN0ZWQgcnVudGltZSBJTlNURUFEIG9mIHRoZSBpbnB1dE1hcHBlcidzIHZhbHVlcyDigJQgdGhlIGNhcHR1cmVcbiAgICogYWxyZWFkeSBob2xkcyB0aGUgcG9zdC1pbnB1dCwgcHJlLXBhdXNlIG1lbW9yeSAodGhlIGlucHV0TWFwcGVyIHN0aWxsXG4gICAqIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHkgYXJncyBvbmx5KS4gQWJzZW50IHdoZW4gdGhlIGNoZWNrcG9pbnRcbiAgICogaG9sZHMgbm8gY2FwdHVyZSBmb3IgdGhpcyBzdWJmbG93OyB0aGUgaW5wdXRNYXBwZXIgdGhlbiBzZWVkcyBpdCwgYXMgb25cbiAgICogYW55IGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VlZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogV2hlcmUgdGhpcyBzdWJmbG93J3MgdHJhdmVyc2FsIHN0YXJ0cyBvbiB0aGUgcmUtZW50cnk6IHRoZSBtb3VudCBvZiB0aGVcbiAgICogbmV4dCBzdWJmbG93IG9uIHRoZSBwYXRoLCBvciDigJQgb24gdGhlIGxhc3QgaG9wIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAgICogc3RhbmQtaW4sIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZCAoc2VlIHRoZVxuICAgKiBtb2R1bGUgZG9jKS4gQWJzZW50OiB0aGUgc3ViZmxvdydzIG93biByb290IOKAlCBhIHNlZWQtb25seSBob3AgKHNlZVxuICAgKiB7QGxpbmsgUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzfSksIG9yIGFuIG91dGVyIHN1YmZsb3cgd2hvc2UgY2FwdHVyZSB0aGVcbiAgICogY2hlY2twb2ludCBsYWNrcy5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXVzZXMgb2YgcGFyYWxsZWwgc2libGluZ3Mgd2hvc2UgZmFuLW91dCBzaXRzIGluIFRISVMgc3ViZmxvdywgcmFpc2VkIGluXG4gICAqIG9yZGVyIG9uY2UgYGVudHJ5YCdzIGNoYWluIGVuZHMgKHRoZSBmaXJzdCBpcyByYWlzZWQsIHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KS4gQWJzZW50IHdoZW4gbm8gc2libGluZyBpcyB3YWl0aW5nIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc3VtZUVudHJ5PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogV2hlcmUgdGhlIHJlc3VtZWQgVE9QLUxFVkVMIHRyYXZlcnNhbCBzdGFydHM6IHRoZSBzdGFuZC1pbiAoYSB0b3AtbGV2ZWxcbiAgICogcGF1c2UpIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3Qgc3ViZmxvdyBvbiB0aGUgcGF0aCDigJQgZWFjaCB3aXRoIGl0c1xuICAgKiBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkLiBgdW5kZWZpbmVkYCBmb3IgYSBzZWVkLW9ubHkgZW50cnkg4oCUXG4gICAqIHRoZSB0cmF2ZXJzYWwgc3RhcnRzIGF0IGl0cyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZyBwYXVzZXMgd2hvc2UgZmFuLW91dCBzaXRzIGF0IHRoZSBUT1AgbGV2ZWwg4oCUIHJhaXNlZCBvbmNlIGBzdGFydGAncyBjaGFpbiBlbmRzLiAqL1xuICByZWFkb25seSBzdGFydFBlbmRpbmdQYXVzZXM6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBIb3cgbWFueSBzdGFnZSBleGVjdXRpb25zIHRoZSByZXN1bWVkIHJ1biBtYWtlcyBiZWZvcmUgdGhlIHN0YW5kLWluIHJ1bnNcbiAgICog4oCUIG9uZSBwZXIgc3ViZmxvdyBvbiB0aGUgcGF0aCwgZWFjaCBlbnRlcmVkIGF0IGl0cyBtb3VudCDigJQgc28gdGhlXG4gICAqIGV4ZWN1dG9yJ3MgYG9uUmVzdW1lYCBuYW1lcyB0aGUgc3RhbmQtaW4ncyBvd24gYHJ1bnRpbWVTdGFnZUlkYC5cbiAgICogYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW5ub3QgYmUga25vd24gYmVmb3JlIHRoZSBydW46IGFuIG91dGVyIHN1YmZsb3dcbiAgICogbWlzc2luZyBpdHMgY2FwdHVyZSByZS1ydW5zIGZyb20gaXRzIHJvb3QuXG4gICAqL1xuICByZWFkb25seSBzdGVwc0JlZm9yZVN0YW5kSW46IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEhvcHMgbm90IHRha2VuIHlldCwgYnkgc3ViZmxvdyBpZC4gQSBob3AgbGVhdmVzIHRoaXMgbWFwIHdoZW4gaXQgaXMgdGFrZW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZzogTWFwPHN0cmluZywgUmVzdW1lSG9wPFRPdXQsIFRTY29wZT4+O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICAgIGhvcHM6IHJlYWRvbmx5IFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+W10sXG4gICAgc3RhcnRQZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBzdGVwc0JlZm9yZVN0YW5kSW4/OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnN0YXJ0UGVuZGluZ1BhdXNlcyA9IHN0YXJ0UGVuZGluZ1BhdXNlcztcbiAgICB0aGlzLnN0ZXBzQmVmb3JlU3RhbmRJbiA9IHN0ZXBzQmVmb3JlU3RhbmRJbjtcbiAgICB0aGlzLnBlbmRpbmcgPSBuZXcgTWFwKGhvcHMubWFwKChob3ApID0+IFtob3Auc3ViZmxvd0lkLCBob3BdKSk7XG4gIH1cblxuICAvKipcbiAgICogUGxhbiB0aGUgcmUtZW50cnkgb2YgYSBwYXVzZWQgY2hhcnQuIEV2ZXJ5IG1vdW50IG9uIHRoZSBwYXRoLCBldmVyeVxuICAgKiBkaXNwYXRjaGVyIGNvbnRpbnVhdGlvbiBhbmQgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGlzIHJlc29sdmVkIEhFUkUsXG4gICAqIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0LCBiZWZvcmUgYSBzaW5nbGUgc3RhZ2UgcnVucyDigJQgc28gYSBjaGVja3BvaW50XG4gICAqIHdob3NlIHBhdGggdGhlIGNoYXJ0IGNhbm5vdCB3YWxrIGlzIHJlZnVzZWQgdXAgZnJvbnQgaW5zdGVhZCBvZiByZXN1bWluZ1xuICAgKiBpbnRvIHRoZSB3cm9uZyBzaGFwZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBgcm9vdGAgYW5kIGBzdWJmbG93c2A6IHRoZSBjaGFydCBhcyBidWlsdFxuICAgKiAgIChgRmxvd0NoYXJ0LnJvb3RgLCBgRmxvd0NoYXJ0LnN1YmZsb3dzYCk7IGBwYXRoYDpcbiAgICogICBgY2hlY2twb2ludC5zdWJmbG93UGF0aGAsIG91dGVybW9zdCBmaXJzdDsgYGNhcHR1cmVzYDpcbiAgICogICBgY2hlY2twb2ludC5zdWJmbG93U3RhdGVzYCAoYSBkZXRhY2hlZCBjb3B5KTsgYHN0YW5kSW5gOiB0aGUgbm9kZSB0aGF0XG4gICAqICAgcnVucyB0aGUgcmVzdW1lIGhhbGYg4oCUIHRoZSBwYXVzZWQgc3RhZ2UncyBvd24gbm9kZSwgZnVuY3Rpb24gc3dhcHBlZFxuICAgKiAgIChpdHMgY29udGludWF0aW9uIGlzIGF0dGFjaGVkIGhlcmUpOyBgcGVuZGluZ1BhdXNlc2A6XG4gICAqICAgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2AgKGEgZGV0YWNoZWQgY29weSkuXG4gICAqIEB0aHJvd3Mgd2hlbiBhIHN1YmZsb3cgb24gdGhlIHBhdGggaXMgbWlzc2luZywgbW91bnRlZCBtb3JlIHRoYW4gb25jZSwgb3JcbiAgICogICBpdHMgbW91bnQgY2Fubm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgZW5jbG9zaW5nIGdyYXBoOyBvciB3aGVuIGEgcGVuZGluZ1xuICAgKiAgIHBhdXNlIGlzIG1hbGZvcm1lZCBvciBpcyBub3QgYSBwYXJhbGxlbCBzaWJsaW5nIG9mIHRoZSBwYXVzZWQgc3RhZ2VcbiAgICovXG4gIHN0YXRpYyBwbGFuPFRPdXQsIFRTY29wZT4oYXJnczoge1xuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGNhcHR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgc3RhbmRJbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuICB9KTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyByb290LCBzdWJmbG93cywgcGF0aCwgY2FwdHVyZXMsIHN0YW5kSW4gfSA9IGFyZ3M7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+KCk7XG5cbiAgICAvLyAxLiBXYWxrIHRoZSBwYXRoOiB0aGUgZ3JhcGggb2YgZXZlcnkgbGV2ZWwsIHRoZSBtb3VudCBvZiBldmVyeSBzdWJmbG93LlxuICAgIGNvbnN0IGdyYXBoczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtyb290XTtcbiAgICBjb25zdCBtb3VudHM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IHBhdGhbaV07XG4gICAgICBtb3VudHMucHVzaChjaGFydC5vbmx5TW91bnQoZ3JhcGhzW2ldLCBzdWJmbG93SWQsIGkgPT09IDAgPyAndGhlIGZsb3djaGFydCcgOiBgc3ViZmxvdyAnJHtwYXRoW2kgLSAxXX0nYCkpO1xuICAgICAgLy8gT3duIGVudHJpZXMgb25seTogYSBwYXRoIHNlZ21lbnQgaXMgZGF0YSBmcm9tIGEgc3RvcmVkIGNoZWNrcG9pbnQsXG4gICAgICAvLyBhbmQgYCdfX3Byb3RvX18nYCBtdXN0IG5vdCByZXNvbHZlIHRocm91Z2ggdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgc3ViZmxvd0lkKTtcbiAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZXN1bWU6IHN1YmZsb3cgJyR7c3ViZmxvd0lkfScgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGZsb3djaGFydC4gYCArXG4gICAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGdyYXBocy5wdXNoKGRlZmluaXRpb24ucm9vdCk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZMZXZlbCA9IHBhdGgubGVuZ3RoO1xuICAgIC8vIFRoZSBwYXVzZWQgc3RhZ2UncyBSRUFMIG5vZGUg4oCUIHdob3NlIGRpc3BhdGNoZXIgdGhlIHN0YW5kLWluJ3NcbiAgICAvLyBjb250aW51YXRpb24gY29tZXMgZnJvbS4gKFRoZSBleGVjdXRvciBhbHJlYWR5IGZvdW5kIGl0OyBhIGRpcmVjdFxuICAgIC8vIGNhbGxlcidzIHN0YW5kLWluIHRoYXQgaXMgbm90IGluIHRoZSBsZWFmIGdyYXBoIHNpbXBseSBoYXMgbm9uZS4pXG4gICAgY29uc3QgcGF1c2VkID0gY2hhcnQuc3RhZ2UoZ3JhcGhzW2xlYWZMZXZlbF0sIHN0YW5kSW4uaWQpO1xuXG4gICAgLy8gMi4gUXVldWUgZXZlcnkgd2FpdGluZyBzaWJsaW5nIHBhdXNlIGF0IHRoZSBsZXZlbCBvZiBpdHMgZmFuLW91dC5cbiAgICBjb25zdCBxdWV1ZXMgPSBxdWV1ZVNpYmxpbmdQYXVzZXMoYXJncy5wZW5kaW5nUGF1c2VzLCB7IGNoYXJ0LCBzdWJmbG93cywgcm9vdCwgcGF0aCwgZ3JhcGhzLCBtb3VudHMsIHBhdXNlZCB9KTtcblxuICAgIC8vIDMuIFRoZSBvbmUtc2hvdCBlbnRyeSBvZiBldmVyeSBsZXZlbDogdGhlIGNoaWxkLCB0aGVuIGl0cyBkaXNwYXRjaGVyJ3NcbiAgICAvLyAgICBjb250aW51YXRpb24g4oCUIHVwIHRvIHRoZSBmYW4tb3V0IHdoZW4gc2libGluZ3Mgd2FpdCB0aGVyZS5cbiAgICBjb25zdCBjaGlsZEF0ID0gKGxldmVsOiBudW1iZXIpID0+IChsZXZlbCA8IGxlYWZMZXZlbCA/IG1vdW50c1tsZXZlbF0gOiBwYXVzZWQpO1xuICAgIGNvbnN0IGVudHJ5QXQgPSAobGV2ZWw6IG51bWJlcik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRBdChsZXZlbCk7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IGxldmVsIDwgbGVhZkxldmVsID8gbW91bnRzW2xldmVsXSA6IHN0YW5kSW47XG4gICAgICBpZiAoIWNoaWxkKSByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gY2hhcnQuZW50cnkoZ3JhcGhzW2xldmVsXSwgY2hpbGQsIHJlcGxhY2VtZW50LCBxdWV1ZXNbbGV2ZWxdPy5mYW5PdXQpO1xuICAgIH07XG4gICAgLy8gNC4gVGhlIGhvcHMuIEEgc3ViZmxvdyB3aXRoIG5vIGNhcHR1cmUgaXMgZW50ZXJlZCBhdCBpdHMgUk9PVCB3aXRoIGl0c1xuICAgIC8vICAgIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmUgaGVsZCkg4oCUXG4gICAgLy8gICAgZXhjZXB0IHRoZSBsZWFmLCB3aG9zZSBlbnRyeSBpcyBhbHdheXMgdGhlIHN0YW5kLWluOiByZS1ydW5uaW5nIGl0XG4gICAgLy8gICAgZnJvbSBpdHMgcm9vdCB3b3VsZCBhc2sgYWdhaW4gYW5kIGxvc2UgdGhlIGFuc3dlci5cbiAgICBjb25zdCBob3BzOiBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPltdID0gW107XG4gICAgbGV0IGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IHBhdGhbaV07XG4gICAgICBjb25zdCBzZWVkID0gb3duRW50cnkoY2FwdHVyZXMsIHN1YmZsb3dJZCk7XG4gICAgICBjb25zdCBpc0xlYWZIb3AgPSBpID09PSBwYXRoLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VlZCA9PT0gdW5kZWZpbmVkICYmICFpc0xlYWZIb3ApIHtcbiAgICAgICAgZXZlcnlMZXZlbEF0SXRzRW50cnkgPSBmYWxzZTtcbiAgICAgICAgaG9wcy5wdXNoKHsgc3ViZmxvd0lkIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdhaXRpbmcgPSBxdWV1ZXNbaSArIDFdPy5wYXVzZXM7XG4gICAgICBob3BzLnB1c2goe1xuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC4uLihzZWVkICE9PSB1bmRlZmluZWQgJiYgeyBzZWVkIH0pLFxuICAgICAgICBlbnRyeTogZW50cnlBdChpICsgMSksXG4gICAgICAgIC4uLih3YWl0aW5nICYmIHsgcGVuZGluZ1BhdXNlczogd2FpdGluZyB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFdmVyeSBsZXZlbCBlbnRlcmVkIGF0IGl0cyBlbnRyeTogb25lIGV4ZWN1dGlvbiAodGhlIG1vdW50KSBwZXIgbGV2ZWxcbiAgICAvLyBydW5zIGJlZm9yZSB0aGUgc3RhbmQtaW4uXG4gICAgcmV0dXJuIG5ldyBSZXN1bWVFbnRyeShlbnRyeUF0KDApLCBob3BzLCBxdWV1ZXNbMF0/LnBhdXNlcywgZXZlcnlMZXZlbEF0SXRzRW50cnkgPyBwYXRoLmxlbmd0aCA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBzZWVkLW9ubHkgZW50cnk6IGVhY2ggY2FwdHVyZSBzZWVkcyB0aGUgRklSU1QgZW50cnkgaW50byBpdHMgc3ViZmxvdyxcbiAgICogd2hpY2ggdGhlbiBzdGFydHMgYXQgaXRzIG93biByb290LiBXaGF0IHRoZSBkZXByZWNhdGVkXG4gICAqIGBzdWJmbG93U3RhdGVzRm9yUmVzdW1lYCBvcHRpb24gKFRyYXZlcnNlck9wdGlvbnMgLyBIYW5kbGVyRGVwcykgbWVhbnNcbiAgICogc2luY2UgOS4yOC4wIOKAlCB0aGUgc2FtZSBvbmUtc2hvdCBsYXcsIHdpdGhvdXQgYSBzdGFuZC1pbiBvciBhIHBhdGguXG4gICAqL1xuICBzdGF0aWMgZnJvbUNhcHR1cmVzPFRPdXQsIFRTY29wZT4oY2FwdHVyZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBuZXcgUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPihcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIE9iamVjdC5lbnRyaWVzKGNhcHR1cmVzKS5tYXAoKFtzdWJmbG93SWQsIHNlZWRdKSA9PiAoeyBzdWJmbG93SWQsIHNlZWQgfSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlLWVudHJ5IGludG8gYHN1YmZsb3dJZGAsIHRha2VuIOKAlCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgZW50cnkgaXNcbiAgICogYW4gb3JkaW5hcnkgb25lICh0aGUgc3ViZmxvdyBpcyBvZmYgdGhlIHBhdXNlIHBhdGgsIG9yIGl0cyBob3Agd2FzIGFscmVhZHlcbiAgICogdGFrZW4pLiBPTkUtU0hPVDogYSBob3AgaXMgcmV0dXJuZWQgYXQgbW9zdCBvbmNlLCBzbyBhIHNlY29uZCBlbnRyeSBpbnRvXG4gICAqIHRoZSBzYW1lIHN1YmZsb3cgKGEgbG9vcCBwYXNzaW5nIGl0cyBtb3VudCBhZ2FpbikgcnVucyB0aGUgcmVhbCBzdWJmbG93XG4gICAqIGZyb20gaXRzIHJlYWwgcm9vdCB3aXRoIGl0cyBpbnB1dE1hcHBlci5cbiAgICovXG4gIGVudGVyU3ViZmxvdyhzdWJmbG93SWQ6IHN0cmluZyk6IFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBob3AgPSB0aGlzLnBlbmRpbmcuZ2V0KHN1YmZsb3dJZCk7XG4gICAgaWYgKGhvcCAhPT0gdW5kZWZpbmVkKSB0aGlzLnBlbmRpbmcuZGVsZXRlKHN1YmZsb3dJZCk7XG4gICAgcmV0dXJuIGhvcDtcbiAgfVxuXG4gIC8qKiBgdHJ1ZWAgb25jZSBldmVyeSBob3AgaGFzIGJlZW4gdGFrZW4g4oCUIHRoZSByZXN0IG9mIHRoZSBydW4gaXMgb3JkaW5hcnkuICovXG4gIGdldCBzcGVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nLnNpemUgPT09IDA7XG4gIH1cbn1cblxuLy8g4pSA4pSAIFJhaXNpbmcgYSB3YWl0aW5nIHNpYmxpbmcncyBwYXVzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBRdWV1ZSBgcXVldWVgIGJlaGluZCBhIHBhdXNlIHBhc3NpbmcgdGhyb3VnaCBpdHMgbGV2ZWw6IGEgcGF1c2UgcmFpc2VkXG4gKiB3aGlsZSBzaWJsaW5ncyBzdGlsbCB3YWl0IG11c3QgY2FycnkgdGhlbSB0byBpdHMgY2hlY2twb2ludC4gRWFjaCBwYXRoIGlzXG4gKiBjdXQgdG8gdGhhdCBsZXZlbCDigJQgdGhlIGJ1YmJsZS11cCBwcmVwZW5kcyB0aGUgbGV2ZWxzIGFib3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVldWVCZWhpbmQoc2lnbmFsOiBQYXVzZVNpZ25hbCwgcXVldWU6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCB7IHBhdXNlLCBsZXZlbCB9IG9mIHF1ZXVlKSB7XG4gICAgc2lnbmFsLmFkZFBlbmRpbmdQYXVzZSh7IC4uLnBhdXNlLCBzdWJmbG93UGF0aDogcGF1c2Uuc3ViZmxvd1BhdGguc2xpY2UobGV2ZWwpIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHdhaXRpbmcgc2libGluZydzIHBhdXNlLCByYWlzZWQgYWdhaW4gYXQgaXRzIGZhbi1vdXQncyBsZXZlbCDigJRcbiAqIGV4YWN0bHkgYXMgaXQgYnViYmxlZCB1cCB0byB0aGF0IGxldmVsIHRoZSBmaXJzdCB0aW1lIChpdHMgc3RhZ2UsIGl0c1xuICogcXVlc3Rpb24sIGl0cyBvd24gc3ViZmxvdyBjYXB0dXJlcyksIG5vdGhpbmcgcmUtcnVuOyB0aGUgcmVzdCBvZiB0aGUgcXVldWVcbiAqIHdhaXRzIGJlaGluZCBpdC4gVGhlIHN1YmZsb3dzIEFCT1ZFIHRoZSBmYW4tb3V0IGNhcHR1cmUgdGhlbXNlbHZlcyBhZnJlc2hcbiAqIGFzIGl0IGJ1YmJsZXMgdXAsIHNvIHRoZXkgY2Fycnkgd2hhdCB0aGUgcmVzdW1lZCBjaGlsZCB3cm90ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhaXNlUXVldWVkUGF1c2UocXVldWU6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10pOiBQYXVzZVNpZ25hbCB7XG4gIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBxdWV1ZTtcbiAgY29uc3QgeyBwYXVzZSwgbGV2ZWwgfSA9IGZpcnN0O1xuICBjb25zdCBzaWduYWwgPSBuZXcgUGF1c2VTaWduYWwocGF1c2UucGF1c2VEYXRhLCBwYXVzZS5wYXVzZWRTdGFnZUlkLCBwYXVzZS5wYXVzZWRCeSk7XG4gIGNvbnN0IGJlbG93ID0gcGF1c2Uuc3ViZmxvd1BhdGguc2xpY2UobGV2ZWwpO1xuICBmb3IgKGxldCBpID0gYmVsb3cubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IG93bkVudHJ5KHBhdXNlLnN1YmZsb3dTdGF0ZXMsIGJlbG93W2ldKTtcbiAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCkgc2lnbmFsLmNhcHR1cmVTdWJmbG93U2NvcGUoYmVsb3dbaV0sIHN0YXRlKTtcbiAgICBzaWduYWwucHJlcGVuZFN1YmZsb3coYmVsb3dbaV0pO1xuICB9XG4gIHF1ZXVlQmVoaW5kKHNpZ25hbCwgcmVzdCk7XG4gIHJldHVybiBzaWduYWw7XG59XG5cbi8vIOKUgOKUgCBSZWFkaW5nIHRoZSBjaGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUaGUgbm9kZSB0aGF0IG1vdW50cyBgc3ViZmxvd0lkYCwgZm91bmQgYnkgREZTIGZyb20gYHN0YXJ0YCBvdmVyIGBuZXh0YCBhbmRcbiAqIGBjaGlsZHJlbmAgKGxvb3AtcmVmIHN0dWJzIHNraXBwZWQg4oCUIHRoZXkgc2hhcmUgdGhlaXIgdGFyZ2V0J3MgaWQgYW5kIGNhcnJ5XG4gKiBub3RoaW5nKS4gQ3ljbGUtc2FmZSAodmlzaXRlZCBieSBpZGVudGl0eSwgc28gYW4gYWJzZW50IGlkIHRlcm1pbmF0ZXMgdG9vKTtcbiAqIGZpcnN0IG1hdGNoIGluIERGUyBwcmUtb3JkZXIgKGNoaWxkcmVuIGJlZm9yZSBgbmV4dGAsIGxpa2UgdGhlIGJ1aWxkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vdW50PFRPdXQsIFRTY29wZT4oXG4gIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgc3ViZmxvd0lkOiBzdHJpbmcsXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBkaXNwYXRjaGVySW5kZXgoc3RhcnQpLmtleXMoKSkge1xuICAgIGlmIChub2RlLnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHJlYWwgbm9kZSBvZiBvbmUgbGV2ZWwncyBncmFwaCwgaW4gREZTIHByZS1vcmRlciwgbWFwcGVkIHRvIHRoZVxuICogRElTUEFUQ0hFUiB3aG9zZSBjaGlsZC1jaGFpbiBob2xkcyBpdCDigJQgdGhlIG5vZGUgd2hvc2UgYGNoaWxkcmVuYCBpdFxuICogZGVzY2VuZHMgZnJvbSAoYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmspIOKAlCBvciBgdW5kZWZpbmVkYCBmb3IgYSBub2RlXG4gKiBvbiB0aGUgbGV2ZWwncyBvd24gc3BpbmUuIExvb3Agc3R1YnMgYXJlIHNraXBwZWQ7IHZpc2l0ZWQgYnkgaWRlbnRpdHksIHNvXG4gKiB0d28gbW91bnRzIHNoYXJpbmcgYW4gaWQgYXJlIGJvdGggaW5kZXhlZCBhbmQgYSBjeWNsZSB0ZXJtaW5hdGVzLlxuICovXG5mdW5jdGlvbiBkaXNwYXRjaGVySW5kZXg8VE91dCwgVFNjb3BlPihcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4pOiBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHN0YWNrOiBBcnJheTxbU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkXT4gPSBbW3Jvb3QsIHVuZGVmaW5lZF1dO1xuICBmb3IgKGxldCB0b3AgPSBzdGFjay5wb3AoKTsgdG9wICE9PSB1bmRlZmluZWQ7IHRvcCA9IHN0YWNrLnBvcCgpKSB7XG4gICAgY29uc3QgW25vZGUsIGRpc3BhdGNoZXJdID0gdG9wO1xuICAgIGlmIChub2RlLmlzTG9vcFJlZiB8fCBpbmRleC5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgIGluZGV4LnNldChub2RlLCBkaXNwYXRjaGVyKTtcbiAgICAvLyBMSUZPOiBwdXNoIGBuZXh0YCBmaXJzdCBhbmQgY2hpbGRyZW4gcmV2ZXJzZWQsIHNvIGNoaWxkcmVuIGFyZSB2aXNpdGVkXG4gICAgLy8gYmVmb3JlIGBuZXh0YCBhbmQgdGhlIGZpcnN0IGNoaWxkIGZpcnN0IOKAlCBwcmUtb3JkZXIsIGxpa2UgdGhlIGJ1aWxkZXIuXG4gICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChbbm9kZS5uZXh0LCBkaXNwYXRjaGVyXSk7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAobGV0IGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBzdGFjay5wdXNoKFtub2RlLmNoaWxkcmVuW2ldLCBub2RlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqIE9uZSBwbGFuJ3MgdmlldyBvZiB0aGUgY2hhcnQ6IGVhY2ggbGV2ZWwncyBpbmRleCBidWlsdCBvbmNlLiAqL1xuY2xhc3MgQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleGVzID0gbmV3IE1hcDxcbiAgICBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPlxuICA+KCk7XG5cbiAgcHJpdmF0ZSBvZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikge1xuICAgIGxldCBpbmRleCA9IHRoaXMuaW5kZXhlcy5nZXQocm9vdCk7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgaW5kZXggPSBkaXNwYXRjaGVySW5kZXgocm9vdCk7XG4gICAgICB0aGlzLmluZGV4ZXMuc2V0KHJvb3QsIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIEV2ZXJ5IG1vdW50IG9mIGBzdWJmbG93SWRgIGluIGByb290YCdzIGdyYXBoLCBpbiBERlMgcHJlLW9yZGVyLiAqL1xuICBtb3VudHNPZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgc3ViZmxvd0lkOiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub2Yocm9vdCkua2V5cygpXS5maWx0ZXIoKG5vZGUpID0+IG5vZGUuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpO1xuICB9XG5cbiAgLyoqIFRoZSBvbmUgbW91bnQgb2YgYHN1YmZsb3dJZGAgaW4gYHJvb3RgJ3MgZ3JhcGgg4oCUIHJlZnVzZWQgd2hlbiBhYnNlbnQgb3IgYW1iaWd1b3VzLiAqL1xuICBvbmx5TW91bnQocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZDogc3RyaW5nLCBncmFwaE5hbWU6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMubW91bnRzT2Yocm9vdCwgc3ViZmxvd0lkKTtcbiAgICBpZiAoZm91bmQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiB0aGUgbW91bnQgb2Ygc3ViZmxvdyAnJHtzdWJmbG93SWR9JyBpcyBub3QgcmVhY2hhYmxlIGZyb20gJHtncmFwaE5hbWV9LiBgICtcbiAgICAgICAgICBcIlRoZSBjaGVja3BvaW50J3Mgc3ViZmxvd1BhdGggZG9lcyBub3QgbWF0Y2ggdGhpcyBjaGFydCDigJQgaXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmb3VuZC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UgaW4gJHtncmFwaE5hbWV9IGAgK1xuICAgICAgICAgIGAoJHtmb3VuZC5tYXAoKG5vZGUpID0+IGAnJHtub2RlLm5hbWV9J2ApLmpvaW4oJywgJyl9KSwgYW5kIGEgY2hlY2twb2ludCdzIHN1YmZsb3dQYXRoIGNhbm5vdCBzYXkgd2hpY2ggYCArXG4gICAgICAgICAgJ21vdW50IHBhdXNlZC4gR2l2ZSBlYWNoIG1vdW50IGl0cyBvd24gc3ViZmxvdyBpZCB0byBtYWtlIGEgcGF1c2UgaW5zaWRlIGl0IHJlc3VtYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kWzBdO1xuICB9XG5cbiAgLyoqIFRoZSByZWFsIHN0YWdlIGBpZGAgaW4gYHJvb3RgJ3MgZ3JhcGggKGZpcnN0IGluIERGUyBwcmUtb3JkZXIpLCBpZiBhbnkuICovXG4gIHN0YWdlKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBpZDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLm9mKHJvb3QpLmtleXMoKSkgaWYgKG5vZGUuaWQgPT09IGlkKSByZXR1cm4gbm9kZTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBkaXNwYXRjaGVyIHdob3NlIGNoaWxkLWNoYWluIGhvbGRzIGBub2RlYCBpbiBgcm9vdGAncyBncmFwaCAoYHVuZGVmaW5lZGAgb24gdGhlIHNwaW5lKS4gKi9cbiAgZGlzcGF0Y2hlck9mKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vZihyb290KS5nZXQobm9kZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZS1zaG90IGVudHJ5IGZvciBgY2hpbGRgIChhIG1vdW50IG9uIHRoZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlKVxuICAgKiBpbiBgcm9vdGAncyBncmFwaDogYHJlcGxhY2VtZW50YCAodGhlIG5vZGUgdGhhdCBydW5zIOKAlCB0aGUgbW91bnQgaXRzZWxmLFxuICAgKiBvciB0aGUgc3RhbmQtaW4pIHdpdGggd2hhdCByYW4gYWZ0ZXIgYGNoaWxkYCdzIGNoYWluIG9uIHRoZSBvcmlnaW5hbCBydW5cbiAgICogYXR0YWNoZWQgd2hlcmUgdGhhdCBjaGFpbiBlbmRzIOKAlCBgeyAuLi5jaGlsZCwgbmV4dDogZGlzcGF0Y2hlci5uZXh0IH1gIGZvclxuICAgKiBhIGNoYXJ0IHRoZSBidWlsZGVyIG1hZGU6XG4gICAqXG4gICAqICAg4oCiIG9uIHRoZSBsZXZlbCdzIHNwaW5lOiBub3RoaW5nIHRvIGF0dGFjaCDigJQgdGhlIHNwaW5lIGdvZXMgb24gYnkgaXRzZWxmO1xuICAgKiAgIOKAoiBhIERFQ0lERVIncyBvciBTRUxFQ1RPUidzIGJyYW5jaDogdGhlIGRpc3BhdGNoZXIncyBgbmV4dGA7XG4gICAqICAg4oCiIGEgRk9SSyBjaGlsZDogdGhlIGZvcmsncyBgbmV4dGAg4oCUIGl0cyBqb2luLlxuICAgKlxuICAgKiBQYXN0IGEgZGlzcGF0Y2hlciB3aXRoIG5vIGBuZXh0YCwgdGhlIHdhbGsgZ29lcyBvbiBPVVRXQVJEIHRvIHRoZSBvbmVcbiAgICogZW5jbG9zaW5nIGl0LiBJdCBzdG9wcyBhdCBgc3RvcEF0YCDigJQgdGhlIGZhbi1vdXQgd2hlcmUgc2libGluZ3Mgc3RpbGxcbiAgICogd2FpdCwgd2hvc2Ugam9pbiBtdXN0IG5vdCBydW4geWV0LiBOb3RoaW5nIHRvIGF0dGFjaDogYHJlcGxhY2VtZW50YFxuICAgKiBpdHNlbGYuXG4gICAqL1xuICBlbnRyeShcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgcmVwbGFjZW1lbnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0b3BBdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gYXBwZW5kQXRDaGFpbkVuZChyZXBsYWNlbWVudCwgdGhpcy5hZnRlcihyb290LCBjaGlsZCwgc3RvcEF0KSk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBydW5zIG9uY2UgYG5vZGVgJ3MgY2hhaW4gZW5kczogaXRzIGRpc3BhdGNoZXIncyBgbmV4dGAgY2hhaW4sIHRoZW4g4oCUXG4gICAqIHdoZXJlIFRIQVQgZW5kcyDigJQgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUgZGlzcGF0Y2hlciBlbmNsb3NpbmcgaXQsIG91dHdhcmQsXG4gICAqIHVwIHRvIGBzdG9wQXRgIChleGNsdXNpdmUpLiBgdW5kZWZpbmVkYCBvbiB0aGUgc3BpbmUuXG4gICAqL1xuICBwcml2YXRlIGFmdGVyKFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0b3BBdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5kaXNwYXRjaGVyT2Yocm9vdCwgbm9kZSk7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IHVuZGVmaW5lZCB8fCBkaXNwYXRjaGVyID09PSBzdG9wQXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0ZXIgPSB0aGlzLmFmdGVyKHJvb3QsIGRpc3BhdGNoZXIsIHN0b3BBdCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIubmV4dCA/IGFwcGVuZEF0Q2hhaW5FbmQoZGlzcGF0Y2hlci5uZXh0LCBvdXRlcikgOiBvdXRlcjtcbiAgfVxufVxuXG4vKipcbiAqIGBzdGFydGAncyBjaGFpbiB3aXRoIGBhZnRlcmAgYXR0YWNoZWQgd2hlcmUgaXQgZW5kcyDigJQgdGhlIGNoYWluJ3Mgbm9kZXNcbiAqIGNvcGllZCBvbiB0aGUgd2F5IChuZXZlciByZWdpc3RlcmVkIGFueXdoZXJlOiBpZHMgc3RpbGwgcmVzb2x2ZSB0byB0aGUgcmVhbFxuICogbm9kZXMpLiBBIGNoYWluIHRoYXQgZW5kcyBpbiBhIGxvb3Agc3R1YiAob3IgbG9vcHMgYmFjayBvbiBpdHNlbGYpIGlzXG4gKiByZXR1cm5lZCBhcyBpczogY29udHJvbCBsZWF2ZXMgaXQgdGhyb3VnaCB0aGUgbG9vcCwgbmV2ZXIgXCJhZnRlclwiIGl0LlxuICovXG5mdW5jdGlvbiBhcHBlbmRBdENoYWluRW5kPFRPdXQsIFRTY29wZT4oXG4gIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgYWZ0ZXI6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBpZiAoYWZ0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHN0YXJ0O1xuICBjb25zdCBjaGFpbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgZm9yIChsZXQgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBzdGFydDsgbm9kZSAhPT0gdW5kZWZpbmVkOyBub2RlID0gbm9kZS5uZXh0KSB7XG4gICAgaWYgKG5vZGUuaXNMb29wUmVmIHx8IHNlZW4uaGFzKG5vZGUpKSByZXR1cm4gc3RhcnQ7XG4gICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgY2hhaW4ucHVzaChub2RlKTtcbiAgfVxuICBsZXQgbmV4dCA9IGFmdGVyO1xuICBmb3IgKGxldCBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIG5leHQgPSB7IC4uLmNoYWluW2ldLCBuZXh0IH07XG4gIHJldHVybiBuZXh0O1xufVxuXG4vLyDilIDilIAgV2FpdGluZyBzaWJsaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFRoZSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGF0IG9uZSBsZXZlbCwgYW5kIHRoZSBmYW4tb3V0IHRoZXkgd2FpdCBpbi4gKi9cbmludGVyZmFjZSBMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4ge1xuICByZWFkb25seSBmYW5PdXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICByZWFkb25seSBwYXVzZXM6IFF1ZXVlZFBhdXNlW107XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2AgKHVudHJ1c3RlZCBpbnB1dCkgYW5kIHF1ZXVlIGVhY2ggYXQgdGhlXG4gKiBsZXZlbCBvZiBpdHMgZmFuLW91dDogdGhlIGRlcHRoIHdoZXJlIGl0cyBwYXRoIHBhcnRzIGZyb20gdGhlIHBhdXNlZFxuICogc3RhZ2Uncy4gVGhlcmUsIHRoZSBwYXVzZWQgc3RhZ2UncyBjaGlsZCAoYSBtb3VudCBvbiB0aGUgcGF0aCwgb3IgdGhlIHN0YWdlXG4gKiBpdHNlbGYpIGFuZCB0aGUgc2libGluZydzIG11c3QgYm90aCBoYW5nIG9mZiBPTkUgcGFyYWxsZWwgZGlzcGF0Y2hlciDigJQgYVxuICogZm9yayBvciBhIHNlbGVjdG9yIOKAlCBvciB0aGUgcmVjb3JkIGlzIG5vdCBhIHNpYmxpbmcgYW5kIHRoZSByZXN1bWUgaXNcbiAqIHJlZnVzZWQgcmF0aGVyIHRoYW4gYXNrZWQgYSBxdWVzdGlvbiB0aGUgY2hhcnQgY291bGQgbm90IGhhdmUgcmFpc2VkLlxuICovXG5mdW5jdGlvbiBxdWV1ZVNpYmxpbmdQYXVzZXM8VE91dCwgVFNjb3BlPihcbiAgcGVuZGluZzogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW10gfCB1bmRlZmluZWQsXG4gIGF0OiB7XG4gICAgY2hhcnQ6IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBncmFwaHM6IHJlYWRvbmx5IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgbW91bnRzOiByZWFkb25seSBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIHBhdXNlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIH0sXG4pOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcXVldWVzOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+ID0gW107XG4gIGlmIChwZW5kaW5nID09PSB1bmRlZmluZWQpIHJldHVybiBxdWV1ZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShwZW5kaW5nKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHBlbmRpbmdQYXVzZXMgbXVzdCBiZSBhbiBhcnJheS4nKTtcbiAgY29uc3QgeyBjaGFydCwgc3ViZmxvd3MsIHJvb3QsIHBhdGgsIGdyYXBocywgbW91bnRzLCBwYXVzZWQgfSA9IGF0O1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcGVuZGluZy5mb3JFYWNoKChyYXc6IHVua25vd24sIG4pID0+IHtcbiAgICBjb25zdCBwYXVzZSA9IHZhbGlkUGVuZGluZ1BhdXNlKHJhdywgbik7XG4gICAgLy8gT25lIHJlY29yZCBwZXIgcGF1c2VkIHNpYmxpbmc6IGEgcmVwZWF0IHdvdWxkIGFzayB0aGUgc2FtZSBxdWVzdGlvbiB0d2ljZS5cbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcGF1c2Uuc3ViZmxvd1BhdGgsIHBhdXNlLnBhdXNlZFN0YWdlSWRdKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzWyR7bn1dICgnJHtwYXVzZS5wYXVzZWRTdGFnZUlkfScpIHJlcGVhdHMgYW4gZWFybGllciBlbnRyeS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIHdoaWxlIChsZXZlbCA8IHBhdGgubGVuZ3RoICYmIGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoICYmIHBhdGhbbGV2ZWxdID09PSBwYXVzZS5zdWJmbG93UGF0aFtsZXZlbF0pIGxldmVsKys7XG4gICAgY29uc3QgZ3JhcGggPSBncmFwaHNbbGV2ZWxdO1xuICAgIGNvbnN0IG91cnMgPSBsZXZlbCA8IHBhdGgubGVuZ3RoID8gbW91bnRzW2xldmVsXSA6IHBhdXNlZDtcbiAgICBjb25zdCB0aGVpck1vdW50cyA9IGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoID8gY2hhcnQubW91bnRzT2YoZ3JhcGgsIHBhdXNlLnN1YmZsb3dQYXRoW2xldmVsXSkgOiBbXTtcbiAgICBjb25zdCB0aGVpcnMgPVxuICAgICAgbGV2ZWwgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGhcbiAgICAgICAgPyB0aGVpck1vdW50cy5sZW5ndGggPT09IDFcbiAgICAgICAgICA/IHRoZWlyTW91bnRzWzBdXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgOiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCk7XG4gICAgY29uc3QgZmFuT3V0ID0gb3VycyA/IGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgb3VycykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNTaWJsaW5nID1cbiAgICAgIG91cnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhlaXJzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG91cnMgIT09IHRoZWlycyAmJlxuICAgICAgZmFuT3V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgdGhlaXJzKSA9PT0gZmFuT3V0ICYmXG4gICAgICAhZmFuT3V0LmRlY2lkZXJGbiAmJlxuICAgICAgKHF1ZXVlc1tsZXZlbF0gPT09IHVuZGVmaW5lZCB8fCBxdWV1ZXNbbGV2ZWxdIS5mYW5PdXQgPT09IGZhbk91dCk7XG4gICAgaWYgKCFpc1NpYmxpbmcgfHwgIXdhbGtzVG9JdHNTdGFnZShjaGFydCwgc3ViZmxvd3MsIGdyYXBoLCBwYXVzZSwgbGV2ZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNbJHtufV0gKCcke3BhdXNlLnBhdXNlZFN0YWdlSWR9JykgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiBgICtcbiAgICAgICAgICBgdGhlIHBhdXNlZCBzdGFnZSAnJHtwYXVzZWQ/LmlkID8/ICc/J30nIGluIHRoaXMgY2hhcnQg4oCUIG5vIGZvcmsgb3Igc2VsZWN0b3IgcnVucyB0aGVtIGJvdGgsIG9yIGl0cyBgICtcbiAgICAgICAgICAncGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoYXQgc3RhZ2UuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBsZWFmUm9vdCA9XG4gICAgICBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggPT09IDAgPyByb290IDogb3duRW50cnkoc3ViZmxvd3MsIHBhdXNlLnN1YmZsb3dQYXRoW3BhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdKT8ucm9vdDtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSAobGVhZlJvb3QgJiYgY2hhcnQuc3RhZ2UobGVhZlJvb3QsIHBhdXNlLnBhdXNlZFN0YWdlSWQpPy5uYW1lKSA/PyBwYXVzZS5wYXVzZWRTdGFnZUlkO1xuICAgIGNvbnN0IHF1ZXVlID0gKHF1ZXVlc1tsZXZlbF0gPz89IHsgZmFuT3V0OiBmYW5PdXQhLCBwYXVzZXM6IFtdIH0pO1xuICAgIHF1ZXVlLnBhdXNlcy5wdXNoKHsgcGF1c2UsIGxldmVsLCBzdGFnZU5hbWUgfSk7XG4gIH0pO1xuICByZXR1cm4gcXVldWVzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB3YWl0aW5nIHNpYmxpbmcncyBXSE9MRSBwYXRoIGJlbG93IGl0cyBmYW4tb3V0IHdhbGtzIHRoaXMgY2hhcnQ6XG4gKiBldmVyeSBzZWdtZW50IHRoZSBvbmx5IG1vdW50IG9mIGl0cyBzdWJmbG93IGluIHRoZSBlbmNsb3NpbmcgZ3JhcGgsIGV2ZXJ5XG4gKiBzdWJmbG93IHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBsYXN0IGdyYXBoIOKAlCBjaGVja2VkIGF0XG4gKiB0aGUgRklSU1QgcmVzdW1lLCBzbyBhIHRhbXBlcmVkIHJlY29yZCBpcyByZWZ1c2VkIHVwIGZyb250LCBub3Qgd2hlbiBpdHNcbiAqIHR1cm4gY29tZXMuXG4gKi9cbmZ1bmN0aW9uIHdhbGtzVG9JdHNTdGFnZTxUT3V0LCBUU2NvcGU+KFxuICBjaGFydDogQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZCxcbiAgZmFuT3V0R3JhcGg6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZTogUGVuZGluZ1BhdXNlLFxuICBsZXZlbDogbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGxldCBncmFwaCA9IGZhbk91dEdyYXBoO1xuICBmb3IgKGxldCBpID0gbGV2ZWw7IGkgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjaGFydC5tb3VudHNPZihncmFwaCwgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pO1xuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGdyYXBoID0gZGVmaW5pdGlvbi5yb290O1xuICB9XG4gIHJldHVybiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIE9uZSBgcGVuZGluZ1BhdXNlc2AgZW50cnksIGNoZWNrZWQgZmllbGQgYnkgZmllbGQg4oCUIGl0IGNvbWVzIGZyb20gc3RvcmVkLCB1bnRydXN0ZWQgZGF0YS4gKi9cbmZ1bmN0aW9uIHZhbGlkUGVuZGluZ1BhdXNlKHJhdzogdW5rbm93biwgbjogbnVtYmVyKTogUGVuZGluZ1BhdXNlIHtcbiAgY29uc3QgcmVmdXNlID0gKHdoYXQ6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hlY2twb2ludDogcGVuZGluZ1BhdXNlc1ske259XSAke3doYXR9LmApO1xuICB9O1xuICBpZiAocmF3ID09PSBudWxsIHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmF3KSkgcmVmdXNlKCdtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBjb25zdCByZWNvcmQgPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2YgcmVjb3JkLnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJlY29yZC5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZSgnbXVzdCBuYW1lIGl0cyBwYXVzZWQgc3RhZ2UgKHBhdXNlZFN0YWdlSWQsIGEgbm9uLWVtcHR5IHN0cmluZyknKTtcbiAgfVxuICBjb25zdCBzdWJmbG93UGF0aCA9IHJlY29yZC5zdWJmbG93UGF0aDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN1YmZsb3dQYXRoKSB8fCAhc3ViZmxvd1BhdGguZXZlcnkoKHMpID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJykpIHtcbiAgICByZWZ1c2UoJ211c3QgY2FycnkgaXRzIHN1YmZsb3dQYXRoIChhbiBhcnJheSBvZiBzdHJpbmdzKScpO1xuICB9XG4gIGNvbnN0IHN0YXRlcyA9IHJlY29yZC5zdWJmbG93U3RhdGVzO1xuICBpZiAoc3RhdGVzICE9PSB1bmRlZmluZWQgJiYgKHN0YXRlcyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHN0YXRlcykpKSB7XG4gICAgcmVmdXNlKCdtdXN0IGNhcnJ5IGl0cyBzdWJmbG93U3RhdGVzIGFzIGFuIG9iamVjdCcpO1xuICB9XG4gIGlmIChyZWNvcmQucGF1c2VkQnkgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQucGF1c2VkQnkgIT09ICdpbnRlcnJ1cHQnKVxuICAgIHJlZnVzZShcImhhcyBhbiB1bmtub3duIHBhdXNlZEJ5IChvbmx5ICdpbnRlcnJ1cHQnKVwiKTtcbiAgcmV0dXJuIHtcbiAgICBwYXVzZWRTdGFnZUlkOiByZWNvcmQucGF1c2VkU3RhZ2VJZCBhcyBzdHJpbmcsXG4gICAgc3ViZmxvd1BhdGg6IHN1YmZsb3dQYXRoIGFzIHN0cmluZ1tdLFxuICAgIHN1YmZsb3dTdGF0ZXM6IChzdGF0ZXMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkKSA/PyB7fSxcbiAgICAuLi4ocmVjb3JkLnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiByZWNvcmQucGF1c2VEYXRhIH0pLFxuICAgIC4uLihyZWNvcmQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnICYmIHsgcGF1c2VkQnk6ICdpbnRlcnJ1cHQnIGFzIGNvbnN0IH0pLFxuICB9O1xufVxuXG4vKiogYHJlY29yZFtrZXldYCBvbmx5IHdoZW4gaXQgaXMgdGhlIHJlY29yZCdzIE9XTiBwcm9wZXJ0eSDigJQgbmV2ZXIgdGhyb3VnaCB0aGUgcHJvdG90eXBlIGNoYWluLiAqL1xuZnVuY3Rpb24gb3duRW50cnk8VD4ocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlY29yZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVjb3JkLCBrZXkpID8gcmVjb3JkW2tleV0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdW1lRW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFHSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUE4Q3RFLE1BQU0sT0FBTyxXQUFXO0lBQ3RCOzs7OztPQUtHO0lBQ00sS0FBSyxDQUFzQztJQUNwRCw2RkFBNkY7SUFDcEYsa0JBQWtCLENBQXFDO0lBQ2hFOzs7Ozs7T0FNRztJQUNNLGtCQUFrQixDQUFxQjtJQUNoRCxpRkFBaUY7SUFDaEUsT0FBTyxDQUF1QztJQUUvRCxZQUNFLEtBQTBDLEVBQzFDLElBQXdDLEVBQ3hDLGtCQUEyQyxFQUMzQyxrQkFBMkI7UUFFM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQWUsSUFPekI7UUFDQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJ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Q0FBQztBQUNKLENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsU0FBUyxRQUFRLENBQUksTUFBcUMsRUFBRSxHQUFXO0lBQ3JFLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc3VtZUVudHJ5IOKAlCB0aGUgcmVzdW1lJ3MgT05FLVNIT1QgcmUtZW50cnkgKE0yLCBwYXVzZS9yZXN1bWUpLlxuICpcbiAqIEEgcmVzdW1lIGhhcyB0byBnZXQgYmFjayB0byBhIHN0YWdlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFydC4gSXQgZG9lcyB0aGF0XG4gKiB3aXRoIGEgc21hbGwgc3ludGhldGljIHN0cnVjdHVyZTogYSBzdGFuZC1pbiBmb3IgdGhlIHBhdXNlZCBzdGFnZSAodGhlXG4gKiBzdGFnZSdzIG93biBub2RlIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZSByZXN1bWUgaGFsZiDigJQgb3IsIGZvciBhblxuICogYGludGVycnVwdCgpYCBwYXVzZSwgZm9yIGl0cyBvd24gZnVuY3Rpb24gd2l0aCB0aGUgYW5zd2VyIGRlcG9zaXRlZCksIGFuZCxcbiAqIGZvciBhIHBhdXNlIGluc2lkZSBzdWJmbG93cywgdGhlIGNoZWNrcG9pbnQncyBjYXB0dXJlIG9mIGVhY2ggc3ViZmxvdydzXG4gKiBzdGF0ZSBvbiB0aGUgd2F5IGRvd24uXG4gKlxuICogVEhFIExBVzogdGhhdCBzdHJ1Y3R1cmUgaXMgdXNlZCBFWEFDVExZIE9OQ0UsIGZvciB0aGUgcmUtZW50cnkuIFRoZSBzdGFuZC1pblxuICogaXMgd2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIFNUQVJUUyAob3Igd2hlcmUgdGhlIGxlYWYgc3ViZmxvdydzIHRyYXZlcnNhbFxuICogc3RhcnRzKSDigJQgaXQgaXMgbmV2ZXIgYSBub2RlIGFueSBpZCBjYW4gcmVzb2x2ZSB0by4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXVzZVxuICogcGF0aCB0YWtlcyBpdHMgc2VlZCBhbmQgaXRzIGVudHJ5IHBvaW50IG9uIGl0cyBGSVJTVCBlbnRyeSBhbmQgbmV2ZXIgYWdhaW4uXG4gKiBBZnRlciB0aGF0IHRoZSBydW4gYmVsb25ncyB0byB0aGUgcmVhbCBjaGFydDogZXZlcnkgbG9vcCB0YXJnZXQsIGV2ZXJ5IGxhdGVyXG4gKiBzdWJmbG93IGVudHJ5IChyZWFsIHJvb3QsIGlucHV0TWFwcGVyIHJ1bnMpLCBldmVyeSByZS12aXNpdCBvZiB0aGUgcGF1c2VkXG4gKiBzdGFnZSAod2hpY2ggcGF1c2VzIGFnYWluKSByZXNvbHZlcyBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdC5cbiAqXG4gKiBPTkUgUlVMRSBBVCBFVkVSWSBMRVZFTCDigJQgd2hhdCBydW5zIGFmdGVyIHRoZSBlbnRyeS4gT24gdGhlIG9yaWdpbmFsIHJ1bixcbiAqIHdoYXRldmVyIERJU1BBVENIRUQgdGhlIHBhdXNlZCBzdGFnZSAob3IgdGhlIG1vdW50IG9mIHRoZSBuZXh0IHN1YmZsb3cgb25cbiAqIHRoZSBwYXRoKSDigJQgYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmsg4oCUIHJhbiBpdHMgb3duIGNvbnRpbnVhdGlvbiBvbmNlXG4gKiB0aGF0IGNoaWxkJ3MgY2hhaW4gZW5kZWQ6IHRoZSBkZWNpZGVyJ3MgYG5leHRgLCB0aGUgZm9yaydzIGpvaW4uIEEgcmVzdW1lXG4gKiBlbnRlcnMgQVQgdGhlIGNoaWxkLCBzbyB0aGF0IGNvbnRpbnVhdGlvbiBtdXN0IGJlIGNhcnJpZWQ6IHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkIHdpdGggdGhlIGVuY2xvc2luZyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkIGF0IHRoZSBlbmRcbiAqIG9mIGl0cyBvd24gY2hhaW4gKGB7IC4uLmNoaWxkLCBuZXh0OiBkaXNwYXRjaGVyLm5leHQgfWAgZm9yIGEgY2hhcnQgdGhlXG4gKiBidWlsZGVyIG1hZGUpLiBJdCBpcyByZWFkIGZyb20gdGhlIENIQVJULCBsZXZlbCBieSBsZXZlbCDigJQgbmV2ZXIgZnJvbSB0aGVcbiAqIGNoZWNrcG9pbnQsIHNvIGFuIGVkaXRlZCBjaGVja3BvaW50IGNhbm5vdCByZWRpcmVjdCBhIHJ1biDigJQgYW5kIGl0IGxhbmRzXG4gKiBhdCB0aGUgbGV2ZWwgaXQgYmVsb25ncyB0bzogYSB0b3AtbGV2ZWwgZGVjaWRlcidzIGBuZXh0YCBydW5zIGF0IHRoZSB0b3BcbiAqIGxldmVsLCBhZnRlciB0aGUgc3ViZmxvdydzIG91dHB1dE1hcHBlciwgbm90IGluc2lkZSB0aGUgc3ViZmxvdy5cbiAqXG4gKiBQQVJBTExFTCBTSUJMSU5HUyBUSEFUIFBBVVNFRCBUT08gKDkuMjguMCkuIFdoZW4gdHdvIGNoaWxkcmVuIG9mIG9uZVxuICogZmFuLW91dCBwYXVzZWQsIHRoZSBjaGVja3BvaW50IGFza3MgdGhlIGZpcnN0IGFuZCBjYXJyaWVzIHRoZSBvdGhlcnNcbiAqIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkuIEF0IHRoYXQgZmFuLW91dCdzIGxldmVsIHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkJ3Mgb3duIGNoYWluIG9ubHkg4oCUIG5vIGpvaW4g4oCUIGFuZCBvbmNlIGl0IGVuZHMsIHRoZSBuZXh0IHNpYmxpbmcnc1xuICogcGF1c2UgaXMgcmFpc2VkIGFnYWluIGFzIGl0IHdhcyAoaXRzIHF1ZXN0aW9uLCBpdHMgY2FwdHVyZWQgc3RhdGUpLCB3aXRob3V0XG4gKiByZS1ydW5uaW5nIGFueXRoaW5nLiBUaGUgam9pbiBydW5zIG9ubHkgd2hlbiB0aGUgbGFzdCBzaWJsaW5nIGlzIHJlc3VtZWQuXG4gKlxuICogQmVmb3JlIDkuMjguMCB0aGUgc3RydWN0dXJlIHN0YXllZCBpbiBmb3JjZSBmb3IgdGhlIHdob2xlIHJlc3VtZWQgcnVuIOKAlCB0aGVcbiAqIHRyYXZlcnNhbCB3YXMgUk9PVEVEIGF0IHRoZSBzdGFuZC1pbiAoc28gYSBsb29wIGJhY2sgdG8gdGhlIHBhdXNlZCBpZCByZS1yYW5cbiAqIHRoZSByZXN1bWUgaGFsZiwgYW5kIGEgbG9vcCB0YXJnZXQgdXBzdHJlYW0gb2YgdGhlIHJlc3VtZSBwb2ludCB3YXNcbiAqIHVucmVhY2hhYmxlOiBvbmUgc3RhZ2UgcmFuLCB0aGVuIHRoZSBydW4gZW5kZWQgc2lsZW50bHkpLCBhbmQgdGhlIGxlYWZcbiAqIHN1YmZsb3cncyByb290IHdhcyBTV0FQUEVEIGZvciB0aGUgc3RhbmQtaW4gaW4gdGhlIHN1YmZsb3cgZGljdGlvbmFyeSAoc28gYVxuICogbGF0ZXIgZW50cnkgaW50byBpdCB3b3VsZCByZS1ydW4gdGhlIHJlc3VtZSBoYWxmIG9uIGEgc3RhbGUgc2VlZCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFdoYXQgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKCkgYnVpbGRzIGZvciBhIHBhdXNlIGF0ICdzZi1hL3NmLWIvYXNrJ1xuICogLy8gKHN1YmZsb3dQYXRoIFsnc2YtYScsICdzZi1hL3NmLWInXSksICdzZi1hL3NmLWInIG1vdW50ZWQgYXMgYSBkZWNpZGVyXG4gKiAvLyBicmFuY2ggaW5zaWRlIHNmLWEgd2hvc2UgZGVjaWRlciBjb250aW51ZXMgdG8gJ3NmLWEvYWZ0ZXInOlxuICogY29uc3QgZW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuKHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0pO1xuICogZW50cnkuc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcC1sZXZlbCBtb3VudCBvZiAnc2YtYSdcbiAqIGVudHJ5LmVudGVyU3ViZmxvdygnc2YtYScpOyAgICAgIC8vIHsgc2VlZDogc2YtYSdzIGNhcHR1cmUsIGVudHJ5OiB7IC4uLm1vdW50IG9mICdzZi1hL3NmLWInLCBuZXh0OiBzZi1hL2FmdGVyIH0gfVxuICogZW50cnkuZW50ZXJTdWJmbG93KCdzZi1hL3NmLWInKTsgLy8geyBzZWVkOiBzZi1iJ3MgY2FwdHVyZSwgZW50cnk6IHRoZSBzdGFuZC1pbiB9XG4gKiBlbnRyeS5lbnRlclN1YmZsb3coJ3NmLWEvc2YtYicpOyAvLyB1bmRlZmluZWQg4oCUIGEgbGF0ZXIgZW50cnkgaXMgYW4gb3JkaW5hcnkgb25lXG4gKiBgYGBcbiAqXG4gKiBBIHBhdXNlIHR3byAob3IgbW9yZSkgc3ViZmxvd3MgZGVlcCB0aGVyZWZvcmUgcmUtZW50ZXJzIGVhY2ggb3V0ZXIgc3ViZmxvd1xuICogQVQgdGhlIG1vdW50IG9mIHRoZSBuZXh0IG9uZSDigJQgdGhlIG91dGVyIHN1YmZsb3cncyBzdGFnZXMgYmVmb3JlIHRoYXQgbW91bnRcbiAqIGRvIG5vdCBydW4gYWdhaW4gKHRoZXkgZGlkIGJlZm9yZSA5LjI4LjApLiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIGRlZ3JhZGVkXG4gKiBjaGVja3BvaW50IG1pc3NpbmcgYW4gb3V0ZXIgc3ViZmxvdydzIGNhcHR1cmU6IHRoYXQgc3ViZmxvdyByZS1ydW5zIGZyb20gaXRzXG4gKiByb290IHdpdGggaXRzIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmVcbiAqIHdvdWxkIGhhdmUgaGVsZCksIGV4YWN0bHkgYXMgOS4yNy4wIGRpZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBlbmRpbmdQYXVzZSB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzUGF1c2VkRXhlY3V0aW9uLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcblxuLyoqXG4gKiBBIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSwgcXVldWVkIGF0IHRoZSBsZXZlbCBvZiBpdHMgZmFuLW91dDogcmFpc2VkXG4gKiBhZ2FpbiB0aGVyZSBvbmNlIHRoZSByZXN1bWVkIGNoaWxkJ3MgY2hhaW4gZW5kcyAoc2VlIHtAbGluayByYWlzZVF1ZXVlZFBhdXNlfSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVkUGF1c2Uge1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZSBhcyB0aGUgY2hlY2twb2ludCBjYXJyaWVzIGl0IOKAlCBpdHMgcGF0aCBmcm9tIHRoZSB0b3AuICovXG4gIHJlYWRvbmx5IHBhdXNlOiBQZW5kaW5nUGF1c2U7XG4gIC8qKiBIb3cgbWFueSBzdWJmbG93cyBkZWVwIHRoZSBmYW4tb3V0IHNpdHMgKDAgPSB0aGUgdG9wIGxldmVsKS4gKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IG51bWJlcjtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlJ3MgbmFtZSwgZm9yIHRoZSBgb25QYXVzZWAgZXZlbnQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogT25lIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHdheSBiYWNrIHRvIGEgcGF1c2VkIHN0YWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVIb3A8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKiBUaGUgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChhIGBGbG93Y2hhcnRDaGVja3BvaW50LnN1YmZsb3dQYXRoYCBlbnRyeSkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBzdGF0ZSBhdCB0aGUgcGF1c2UgKGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNbc3ViZmxvd0lkXWApLlxuICAgKiBTZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgSU5TVEVBRCBvZiB0aGUgaW5wdXRNYXBwZXIncyB2YWx1ZXMg4oCUIHRoZSBjYXB0dXJlXG4gICAqIGFscmVhZHkgaG9sZHMgdGhlIHBvc3QtaW5wdXQsIHByZS1wYXVzZSBtZW1vcnkgKHRoZSBpbnB1dE1hcHBlciBzdGlsbFxuICAgKiBydW5zLCBmb3IgdGhlIHN0YWdlcycgcmVhZC1vbmx5IGFyZ3Mgb25seSkuIEFic2VudCB3aGVuIHRoZSBjaGVja3BvaW50XG4gICAqIGhvbGRzIG5vIGNhcHR1cmUgZm9yIHRoaXMgc3ViZmxvdzsgdGhlIGlucHV0TWFwcGVyIHRoZW4gc2VlZHMgaXQsIGFzIG9uXG4gICAqIGFueSBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHNlZWQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFdoZXJlIHRoaXMgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgb24gdGhlIHJlLWVudHJ5OiB0aGUgbW91bnQgb2YgdGhlXG4gICAqIG5leHQgc3ViZmxvdyBvbiB0aGUgcGF0aCwgb3Ig4oCUIG9uIHRoZSBsYXN0IGhvcCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzXG4gICAqIHN0YW5kLWluLCBlYWNoIHdpdGggaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24gYXR0YWNoZWQgKHNlZSB0aGVcbiAgICogbW9kdWxlIGRvYykuIEFic2VudDogdGhlIHN1YmZsb3cncyBvd24gcm9vdCDigJQgYSBzZWVkLW9ubHkgaG9wIChzZWVcbiAgICoge0BsaW5rIFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlc30pLCBvciBhbiBvdXRlciBzdWJmbG93IHdob3NlIGNhcHR1cmUgdGhlXG4gICAqIGNoZWNrcG9pbnQgbGFja3MuXG4gICAqL1xuICByZWFkb25seSBlbnRyeT86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGF1c2VzIG9mIHBhcmFsbGVsIHNpYmxpbmdzIHdob3NlIGZhbi1vdXQgc2l0cyBpbiBUSElTIHN1YmZsb3csIHJhaXNlZCBpblxuICAgKiBvcmRlciBvbmNlIGBlbnRyeWAncyBjaGFpbiBlbmRzICh0aGUgZmlyc3QgaXMgcmFpc2VkLCB0aGUgcmVzdCB3YWl0XG4gICAqIGJlaGluZCBpdCkuIEFic2VudCB3aGVuIG5vIHNpYmxpbmcgaXMgd2FpdGluZyBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG59XG5cbmV4cG9ydCBjbGFzcyBSZXN1bWVFbnRyeTxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSByZXN1bWVkIFRPUC1MRVZFTCB0cmF2ZXJzYWwgc3RhcnRzOiB0aGUgc3RhbmQtaW4gKGEgdG9wLWxldmVsXG4gICAqIHBhdXNlKSBvciB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3cgb24gdGhlIHBhdGgg4oCUIGVhY2ggd2l0aCBpdHNcbiAgICogZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZC4gYHVuZGVmaW5lZGAgZm9yIGEgc2VlZC1vbmx5IGVudHJ5IOKAlFxuICAgKiB0aGUgdHJhdmVyc2FsIHN0YXJ0cyBhdCBpdHMgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFNpYmxpbmcgcGF1c2VzIHdob3NlIGZhbi1vdXQgc2l0cyBhdCB0aGUgVE9QIGxldmVsIOKAlCByYWlzZWQgb25jZSBgc3RhcnRgJ3MgY2hhaW4gZW5kcy4gKi9cbiAgcmVhZG9ubHkgc3RhcnRQZW5kaW5nUGF1c2VzOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogSG93IG1hbnkgc3RhZ2UgZXhlY3V0aW9ucyB0aGUgcmVzdW1lZCBydW4gbWFrZXMgYmVmb3JlIHRoZSBzdGFuZC1pbiBydW5zXG4gICAqIOKAlCBvbmUgcGVyIHN1YmZsb3cgb24gdGhlIHBhdGgsIGVhY2ggZW50ZXJlZCBhdCBpdHMgbW91bnQg4oCUIHNvIHRoZVxuICAgKiBleGVjdXRvcidzIGBvblJlc3VtZWAgbmFtZXMgdGhlIHN0YW5kLWluJ3Mgb3duIGBydW50aW1lU3RhZ2VJZGAuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGtub3duIGJlZm9yZSB0aGUgcnVuOiBhbiBvdXRlciBzdWJmbG93XG4gICAqIG1pc3NpbmcgaXRzIGNhcHR1cmUgcmUtcnVucyBmcm9tIGl0cyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcHNCZWZvcmVTdGFuZEluOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBIb3BzIG5vdCB0YWtlbiB5ZXQsIGJ5IHN1YmZsb3cgaWQuIEEgaG9wIGxlYXZlcyB0aGlzIG1hcCB3aGVuIGl0IGlzIHRha2VuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmc6IE1hcDxzdHJpbmcsIFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+PjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBob3BzOiByZWFkb25seSBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPltdLFxuICAgIHN0YXJ0UGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10sXG4gICAgc3RlcHNCZWZvcmVTdGFuZEluPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5zdGFydFBlbmRpbmdQYXVzZXMgPSBzdGFydFBlbmRpbmdQYXVzZXM7XG4gICAgdGhpcy5zdGVwc0JlZm9yZVN0YW5kSW4gPSBzdGVwc0JlZm9yZVN0YW5kSW47XG4gICAgdGhpcy5wZW5kaW5nID0gbmV3IE1hcChob3BzLm1hcCgoaG9wKSA9PiBbaG9wLnN1YmZsb3dJZCwgaG9wXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYW4gdGhlIHJlLWVudHJ5IG9mIGEgcGF1c2VkIGNoYXJ0LiBFdmVyeSBtb3VudCBvbiB0aGUgcGF0aCwgZXZlcnlcbiAgICogZGlzcGF0Y2hlciBjb250aW51YXRpb24gYW5kIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBpcyByZXNvbHZlZCBIRVJFLFxuICAgKiBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdCwgYmVmb3JlIGEgc2luZ2xlIHN0YWdlIHJ1bnMg4oCUIHNvIGEgY2hlY2twb2ludFxuICAgKiB3aG9zZSBwYXRoIHRoZSBjaGFydCBjYW5ub3Qgd2FsayBpcyByZWZ1c2VkIHVwIGZyb250IGluc3RlYWQgb2YgcmVzdW1pbmdcbiAgICogaW50byB0aGUgd3Jvbmcgc2hhcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIC0gYHJvb3RgIGFuZCBgc3ViZmxvd3NgOiB0aGUgY2hhcnQgYXMgYnVpbHRcbiAgICogICAoYEZsb3dDaGFydC5yb290YCwgYEZsb3dDaGFydC5zdWJmbG93c2ApOyBgcGF0aGA6XG4gICAqICAgYGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhgLCBvdXRlcm1vc3QgZmlyc3Q7IGBjYXB0dXJlc2A6XG4gICAqICAgYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc2AgKGEgZGV0YWNoZWQgY29weSk7IGBzdGFuZEluYDogdGhlIG5vZGUgdGhhdFxuICAgKiAgIHJ1bnMgdGhlIHJlc3VtZSBoYWxmIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3Mgb3duIG5vZGUsIGZ1bmN0aW9uIHN3YXBwZWRcbiAgICogICAoaXRzIGNvbnRpbnVhdGlvbiBpcyBhdHRhY2hlZCBoZXJlKTsgYHBlbmRpbmdQYXVzZXNgOlxuICAgKiAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgIChhIGRldGFjaGVkIGNvcHkpLlxuICAgKiBAdGhyb3dzIHdoZW4gYSBzdWJmbG93IG9uIHRoZSBwYXRoIGlzIG1pc3NpbmcsIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UsIG9yXG4gICAqICAgaXRzIG1vdW50IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIGVuY2xvc2luZyBncmFwaDsgb3Igd2hlbiBhIHBlbmRpbmdcbiAgICogICBwYXVzZSBpcyBtYWxmb3JtZWQgb3IgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiB0aGUgcGF1c2VkIHN0YWdlXG4gICAqL1xuICBzdGF0aWMgcGxhbjxUT3V0LCBUU2NvcGU+KGFyZ3M6IHtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBjYXB0dXJlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIHN0YW5kSW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBQZW5kaW5nUGF1c2VbXTtcbiAgfSk6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0gPSBhcmdzO1xuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPigpO1xuXG4gICAgLy8gMS4gV2FsayB0aGUgcGF0aDogdGhlIGdyYXBoIG9mIGV2ZXJ5IGxldmVsLCB0aGUgbW91bnQgb2YgZXZlcnkgc3ViZmxvdy5cbiAgICBjb25zdCBncmFwaHM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgY29uc3QgbW91bnRzOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBwYXRoW2ldO1xuICAgICAgbW91bnRzLnB1c2goY2hhcnQub25seU1vdW50KGdyYXBoc1tpXSwgc3ViZmxvd0lkLCBpID09PSAwID8gJ3RoZSBmbG93Y2hhcnQnIDogYHN1YmZsb3cgJyR7cGF0aFtpIC0gMV19J2ApKTtcbiAgICAgIC8vIE93biBlbnRyaWVzIG9ubHk6IGEgcGF0aCBzZWdtZW50IGlzIGRhdGEgZnJvbSBhIHN0b3JlZCBjaGVja3BvaW50LFxuICAgICAgLy8gYW5kIGAnX19wcm90b19fJ2AgbXVzdCBub3QgcmVzb2x2ZSB0aHJvdWdoIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gb3duRW50cnkoc3ViZmxvd3MsIHN1YmZsb3dJZCk7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICAgJ1RoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBncmFwaHMucHVzaChkZWZpbml0aW9uLnJvb3QpO1xuICAgIH1cbiAgICBjb25zdCBsZWFmTGV2ZWwgPSBwYXRoLmxlbmd0aDtcbiAgICAvLyBUaGUgcGF1c2VkIHN0YWdlJ3MgUkVBTCBub2RlIOKAlCB3aG9zZSBkaXNwYXRjaGVyIHRoZSBzdGFuZC1pbidzXG4gICAgLy8gY29udGludWF0aW9uIGNvbWVzIGZyb20uIChUaGUgZXhlY3V0b3IgYWxyZWFkeSBmb3VuZCBpdDsgYSBkaXJlY3RcbiAgICAvLyBjYWxsZXIncyBzdGFuZC1pbiB0aGF0IGlzIG5vdCBpbiB0aGUgbGVhZiBncmFwaCBzaW1wbHkgaGFzIG5vbmUuKVxuICAgIGNvbnN0IHBhdXNlZCA9IGNoYXJ0LnN0YWdlKGdyYXBoc1tsZWFmTGV2ZWxdLCBzdGFuZEluLmlkKTtcblxuICAgIC8vIDIuIFF1ZXVlIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBwYXVzZSBhdCB0aGUgbGV2ZWwgb2YgaXRzIGZhbi1vdXQuXG4gICAgY29uc3QgcXVldWVzID0gcXVldWVTaWJsaW5nUGF1c2VzKGFyZ3MucGVuZGluZ1BhdXNlcywgeyBjaGFydCwgc3ViZmxvd3MsIHJvb3QsIHBhdGgsIGdyYXBocywgbW91bnRzLCBwYXVzZWQgfSk7XG5cbiAgICAvLyAzLiBUaGUgb25lLXNob3QgZW50cnkgb2YgZXZlcnkgbGV2ZWw6IHRoZSBjaGlsZCwgdGhlbiBpdHMgZGlzcGF0Y2hlcidzXG4gICAgLy8gICAgY29udGludWF0aW9uIOKAlCB1cCB0byB0aGUgZmFuLW91dCB3aGVuIHNpYmxpbmdzIHdhaXQgdGhlcmUuXG4gICAgY29uc3QgY2hpbGRBdCA9IChsZXZlbDogbnVtYmVyKSA9PiAobGV2ZWwgPCBsZWFmTGV2ZWwgPyBtb3VudHNbbGV2ZWxdIDogcGF1c2VkKTtcbiAgICBjb25zdCBlbnRyeUF0ID0gKGxldmVsOiBudW1iZXIpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkQXQobGV2ZWwpO1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBsZXZlbCA8IGxlYWZMZXZlbCA/IG1vdW50c1tsZXZlbF0gOiBzdGFuZEluO1xuICAgICAgaWYgKCFjaGlsZCkgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGNoYXJ0LmVudHJ5KGdyYXBoc1tsZXZlbF0sIGNoaWxkLCByZXBsYWNlbWVudCwgcXVldWVzW2xldmVsXT8uZmFuT3V0KTtcbiAgICB9O1xuICAgIC8vIDQuIFRoZSBob3BzLiBBIHN1YmZsb3cgd2l0aCBubyBjYXB0dXJlIGlzIGVudGVyZWQgYXQgaXRzIFJPT1Qgd2l0aCBpdHNcbiAgICAvLyAgICBpbnB1dE1hcHBlciAoaXRzIGVhcmxpZXIgc3RhZ2VzIHJlY29tcHV0ZSB3aGF0IHRoZSBjYXB0dXJlIGhlbGQpIOKAlFxuICAgIC8vICAgIGV4Y2VwdCB0aGUgbGVhZiwgd2hvc2UgZW50cnkgaXMgYWx3YXlzIHRoZSBzdGFuZC1pbjogcmUtcnVubmluZyBpdFxuICAgIC8vICAgIGZyb20gaXRzIHJvb3Qgd291bGQgYXNrIGFnYWluIGFuZCBsb3NlIHRoZSBhbnN3ZXIuXG4gICAgY29uc3QgaG9wczogUmVzdW1lSG9wPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuICAgIGxldCBldmVyeUxldmVsQXRJdHNFbnRyeSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBwYXRoW2ldO1xuICAgICAgY29uc3Qgc2VlZCA9IG93bkVudHJ5KGNhcHR1cmVzLCBzdWJmbG93SWQpO1xuICAgICAgY29uc3QgaXNMZWFmSG9wID0gaSA9PT0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgaWYgKHNlZWQgPT09IHVuZGVmaW5lZCAmJiAhaXNMZWFmSG9wKSB7XG4gICAgICAgIGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID0gZmFsc2U7XG4gICAgICAgIGhvcHMucHVzaCh7IHN1YmZsb3dJZCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB3YWl0aW5nID0gcXVldWVzW2kgKyAxXT8ucGF1c2VzO1xuICAgICAgaG9wcy5wdXNoKHtcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAuLi4oc2VlZCAhPT0gdW5kZWZpbmVkICYmIHsgc2VlZCB9KSxcbiAgICAgICAgZW50cnk6IGVudHJ5QXQoaSArIDEpLFxuICAgICAgICAuLi4od2FpdGluZyAmJiB7IHBlbmRpbmdQYXVzZXM6IHdhaXRpbmcgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gRXZlcnkgbGV2ZWwgZW50ZXJlZCBhdCBpdHMgZW50cnk6IG9uZSBleGVjdXRpb24gKHRoZSBtb3VudCkgcGVyIGxldmVsXG4gICAgLy8gcnVucyBiZWZvcmUgdGhlIHN0YW5kLWluLlxuICAgIHJldHVybiBuZXcgUmVzdW1lRW50cnkoZW50cnlBdCgwKSwgaG9wcywgcXVldWVzWzBdPy5wYXVzZXMsIGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID8gcGF0aC5sZW5ndGggOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2VlZC1vbmx5IGVudHJ5OiBlYWNoIGNhcHR1cmUgc2VlZHMgdGhlIEZJUlNUIGVudHJ5IGludG8gaXRzIHN1YmZsb3csXG4gICAqIHdoaWNoIHRoZW4gc3RhcnRzIGF0IGl0cyBvd24gcm9vdC4gV2hhdCB0aGUgZGVwcmVjYXRlZFxuICAgKiBgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZWAgb3B0aW9uIChUcmF2ZXJzZXJPcHRpb25zIC8gSGFuZGxlckRlcHMpIG1lYW5zXG4gICAqIHNpbmNlIDkuMjguMCDigJQgdGhlIHNhbWUgb25lLXNob3QgbGF3LCB3aXRob3V0IGEgc3RhbmQtaW4gb3IgYSBwYXRoLlxuICAgKi9cbiAgc3RhdGljIGZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KGNhcHR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gbmV3IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBPYmplY3QuZW50cmllcyhjYXB0dXJlcykubWFwKChbc3ViZmxvd0lkLCBzZWVkXSkgPT4gKHsgc3ViZmxvd0lkLCBzZWVkIH0pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZS1lbnRyeSBpbnRvIGBzdWJmbG93SWRgLCB0YWtlbiDigJQgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGVudHJ5IGlzXG4gICAqIGFuIG9yZGluYXJ5IG9uZSAodGhlIHN1YmZsb3cgaXMgb2ZmIHRoZSBwYXVzZSBwYXRoLCBvciBpdHMgaG9wIHdhcyBhbHJlYWR5XG4gICAqIHRha2VuKS4gT05FLVNIT1Q6IGEgaG9wIGlzIHJldHVybmVkIGF0IG1vc3Qgb25jZSwgc28gYSBzZWNvbmQgZW50cnkgaW50b1xuICAgKiB0aGUgc2FtZSBzdWJmbG93IChhIGxvb3AgcGFzc2luZyBpdHMgbW91bnQgYWdhaW4pIHJ1bnMgdGhlIHJlYWwgc3ViZmxvd1xuICAgKiBmcm9tIGl0cyByZWFsIHJvb3Qgd2l0aCBpdHMgaW5wdXRNYXBwZXIuXG4gICAqL1xuICBlbnRlclN1YmZsb3coc3ViZmxvd0lkOiBzdHJpbmcpOiBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaG9wID0gdGhpcy5wZW5kaW5nLmdldChzdWJmbG93SWQpO1xuICAgIGlmIChob3AgIT09IHVuZGVmaW5lZCkgdGhpcy5wZW5kaW5nLmRlbGV0ZShzdWJmbG93SWQpO1xuICAgIHJldHVybiBob3A7XG4gIH1cblxuICAvKiogYHRydWVgIG9uY2UgZXZlcnkgaG9wIGhhcyBiZWVuIHRha2VuIOKAlCB0aGUgcmVzdCBvZiB0aGUgcnVuIGlzIG9yZGluYXJ5LiAqL1xuICBnZXQgc3BlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZy5zaXplID09PSAwO1xuICB9XG59XG5cbi8vIOKUgOKUgCBSYWlzaW5nIGEgd2FpdGluZyBzaWJsaW5nJ3MgcGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUXVldWUgYHF1ZXVlYCBiZWhpbmQgYSBwYXVzZSBwYXNzaW5nIHRocm91Z2ggaXRzIGxldmVsOiBhIHBhdXNlIHJhaXNlZFxuICogd2hpbGUgc2libGluZ3Mgc3RpbGwgd2FpdCBtdXN0IGNhcnJ5IHRoZW0gdG8gaXRzIGNoZWNrcG9pbnQuIEVhY2ggcGF0aCBpc1xuICogY3V0IHRvIHRoYXQgbGV2ZWwg4oCUIHRoZSBidWJibGUtdXAgcHJlcGVuZHMgdGhlIGxldmVscyBhYm92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlQmVoaW5kKHNpZ25hbDogUGF1c2VTaWduYWwsIHF1ZXVlOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgeyBwYXVzZSwgbGV2ZWwgfSBvZiBxdWV1ZSkge1xuICAgIHNpZ25hbC5hZGRQZW5kaW5nUGF1c2UoeyAuLi5wYXVzZSwgc3ViZmxvd1BhdGg6IHBhdXNlLnN1YmZsb3dQYXRoLnNsaWNlKGxldmVsKSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB3YWl0aW5nIHNpYmxpbmcncyBwYXVzZSwgcmFpc2VkIGFnYWluIGF0IGl0cyBmYW4tb3V0J3MgbGV2ZWwg4oCUXG4gKiBleGFjdGx5IGFzIGl0IGJ1YmJsZWQgdXAgdG8gdGhhdCBsZXZlbCB0aGUgZmlyc3QgdGltZSAoaXRzIHN0YWdlLCBpdHNcbiAqIHF1ZXN0aW9uLCBpdHMgb3duIHN1YmZsb3cgY2FwdHVyZXMpLCBub3RoaW5nIHJlLXJ1bjsgdGhlIHJlc3Qgb2YgdGhlIHF1ZXVlXG4gKiB3YWl0cyBiZWhpbmQgaXQuIFRoZSBzdWJmbG93cyBBQk9WRSB0aGUgZmFuLW91dCBjYXB0dXJlIHRoZW1zZWx2ZXMgYWZyZXNoXG4gKiBhcyBpdCBidWJibGVzIHVwLCBzbyB0aGV5IGNhcnJ5IHdoYXQgdGhlIHJlc3VtZWQgY2hpbGQgd3JvdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYWlzZVF1ZXVlZFBhdXNlKHF1ZXVlOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdKTogUGF1c2VTaWduYWwge1xuICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gcXVldWU7XG4gIGNvbnN0IHsgcGF1c2UsIGxldmVsIH0gPSBmaXJzdDtcbiAgY29uc3Qgc2lnbmFsID0gbmV3IFBhdXNlU2lnbmFsKHBhdXNlLnBhdXNlRGF0YSwgcGF1c2UucGF1c2VkU3RhZ2VJZCwgcGF1c2UucGF1c2VkQnkpO1xuICAvLyBUaGUgc2libGluZyBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW46IGl0cyBvd24gZXhlY3V0aW9uLCBub3QgdGhpcyBydW4ncy5cbiAgaWYgKGlzUGF1c2VkRXhlY3V0aW9uKHBhdXNlLnBhdXNlZEV4ZWN1dGlvbikpIHtcbiAgICBzaWduYWwuc3RhbXBFeGVjdXRpb24ocGF1c2UucGF1c2VkRXhlY3V0aW9uLnJ1bnRpbWVTdGFnZUlkLCBwYXVzZS5wYXVzZWRFeGVjdXRpb24ucnVuSWQpO1xuICB9XG4gIGNvbnN0IGJlbG93ID0gcGF1c2Uuc3ViZmxvd1BhdGguc2xpY2UobGV2ZWwpO1xuICBmb3IgKGxldCBpID0gYmVsb3cubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IG93bkVudHJ5KHBhdXNlLnN1YmZsb3dTdGF0ZXMsIGJlbG93W2ldKTtcbiAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCkgc2lnbmFsLmNhcHR1cmVTdWJmbG93U2NvcGUoYmVsb3dbaV0sIHN0YXRlKTtcbiAgICBzaWduYWwucHJlcGVuZFN1YmZsb3coYmVsb3dbaV0pO1xuICB9XG4gIHF1ZXVlQmVoaW5kKHNpZ25hbCwgcmVzdCk7XG4gIHJldHVybiBzaWduYWw7XG59XG5cbi8vIOKUgOKUgCBSZWFkaW5nIHRoZSBjaGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUaGUgbm9kZSB0aGF0IG1vdW50cyBgc3ViZmxvd0lkYCwgZm91bmQgYnkgREZTIGZyb20gYHN0YXJ0YCBvdmVyIGBuZXh0YCBhbmRcbiAqIGBjaGlsZHJlbmAgKGxvb3AtcmVmIHN0dWJzIHNraXBwZWQg4oCUIHRoZXkgc2hhcmUgdGhlaXIgdGFyZ2V0J3MgaWQgYW5kIGNhcnJ5XG4gKiBub3RoaW5nKS4gQ3ljbGUtc2FmZSAodmlzaXRlZCBieSBpZGVudGl0eSwgc28gYW4gYWJzZW50IGlkIHRlcm1pbmF0ZXMgdG9vKTtcbiAqIGZpcnN0IG1hdGNoIGluIERGUyBwcmUtb3JkZXIgKGNoaWxkcmVuIGJlZm9yZSBgbmV4dGAsIGxpa2UgdGhlIGJ1aWxkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vdW50PFRPdXQsIFRTY29wZT4oXG4gIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgc3ViZmxvd0lkOiBzdHJpbmcsXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBkaXNwYXRjaGVySW5kZXgoc3RhcnQpLmtleXMoKSkge1xuICAgIGlmIChub2RlLnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHJlYWwgbm9kZSBvZiBvbmUgbGV2ZWwncyBncmFwaCwgaW4gREZTIHByZS1vcmRlciwgbWFwcGVkIHRvIHRoZVxuICogRElTUEFUQ0hFUiB3aG9zZSBjaGlsZC1jaGFpbiBob2xkcyBpdCDigJQgdGhlIG5vZGUgd2hvc2UgYGNoaWxkcmVuYCBpdFxuICogZGVzY2VuZHMgZnJvbSAoYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmspIOKAlCBvciBgdW5kZWZpbmVkYCBmb3IgYSBub2RlXG4gKiBvbiB0aGUgbGV2ZWwncyBvd24gc3BpbmUuIExvb3Agc3R1YnMgYXJlIHNraXBwZWQ7IHZpc2l0ZWQgYnkgaWRlbnRpdHksIHNvXG4gKiB0d28gbW91bnRzIHNoYXJpbmcgYW4gaWQgYXJlIGJvdGggaW5kZXhlZCBhbmQgYSBjeWNsZSB0ZXJtaW5hdGVzLlxuICovXG5mdW5jdGlvbiBkaXNwYXRjaGVySW5kZXg8VE91dCwgVFNjb3BlPihcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4pOiBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHN0YWNrOiBBcnJheTxbU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkXT4gPSBbW3Jvb3QsIHVuZGVmaW5lZF1dO1xuICBmb3IgKGxldCB0b3AgPSBzdGFjay5wb3AoKTsgdG9wICE9PSB1bmRlZmluZWQ7IHRvcCA9IHN0YWNrLnBvcCgpKSB7XG4gICAgY29uc3QgW25vZGUsIGRpc3BhdGNoZXJdID0gdG9wO1xuICAgIGlmIChub2RlLmlzTG9vcFJlZiB8fCBpbmRleC5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgIGluZGV4LnNldChub2RlLCBkaXNwYXRjaGVyKTtcbiAgICAvLyBMSUZPOiBwdXNoIGBuZXh0YCBmaXJzdCBhbmQgY2hpbGRyZW4gcmV2ZXJzZWQsIHNvIGNoaWxkcmVuIGFyZSB2aXNpdGVkXG4gICAgLy8gYmVmb3JlIGBuZXh0YCBhbmQgdGhlIGZpcnN0IGNoaWxkIGZpcnN0IOKAlCBwcmUtb3JkZXIsIGxpa2UgdGhlIGJ1aWxkZXIuXG4gICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChbbm9kZS5uZXh0LCBkaXNwYXRjaGVyXSk7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAobGV0IGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBzdGFjay5wdXNoKFtub2RlLmNoaWxkcmVuW2ldLCBub2RlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqIE9uZSBwbGFuJ3MgdmlldyBvZiB0aGUgY2hhcnQ6IGVhY2ggbGV2ZWwncyBpbmRleCBidWlsdCBvbmNlLiAqL1xuY2xhc3MgQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleGVzID0gbmV3IE1hcDxcbiAgICBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPlxuICA+KCk7XG5cbiAgcHJpdmF0ZSBvZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikge1xuICAgIGxldCBpbmRleCA9IHRoaXMuaW5kZXhlcy5nZXQocm9vdCk7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgaW5kZXggPSBkaXNwYXRjaGVySW5kZXgocm9vdCk7XG4gICAgICB0aGlzLmluZGV4ZXMuc2V0KHJvb3QsIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIEV2ZXJ5IG1vdW50IG9mIGBzdWJmbG93SWRgIGluIGByb290YCdzIGdyYXBoLCBpbiBERlMgcHJlLW9yZGVyLiAqL1xuICBtb3VudHNPZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgc3ViZmxvd0lkOiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub2Yocm9vdCkua2V5cygpXS5maWx0ZXIoKG5vZGUpID0+IG5vZGUuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpO1xuICB9XG5cbiAgLyoqIFRoZSBvbmUgbW91bnQgb2YgYHN1YmZsb3dJZGAgaW4gYHJvb3RgJ3MgZ3JhcGgg4oCUIHJlZnVzZWQgd2hlbiBhYnNlbnQgb3IgYW1iaWd1b3VzLiAqL1xuICBvbmx5TW91bnQocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZDogc3RyaW5nLCBncmFwaE5hbWU6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMubW91bnRzT2Yocm9vdCwgc3ViZmxvd0lkKTtcbiAgICBpZiAoZm91bmQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiB0aGUgbW91bnQgb2Ygc3ViZmxvdyAnJHtzdWJmbG93SWR9JyBpcyBub3QgcmVhY2hhYmxlIGZyb20gJHtncmFwaE5hbWV9LiBgICtcbiAgICAgICAgICBcIlRoZSBjaGVja3BvaW50J3Mgc3ViZmxvd1BhdGggZG9lcyBub3QgbWF0Y2ggdGhpcyBjaGFydCDigJQgaXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmb3VuZC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UgaW4gJHtncmFwaE5hbWV9IGAgK1xuICAgICAgICAgIGAoJHtmb3VuZC5tYXAoKG5vZGUpID0+IGAnJHtub2RlLm5hbWV9J2ApLmpvaW4oJywgJyl9KSwgYW5kIGEgY2hlY2twb2ludCdzIHN1YmZsb3dQYXRoIGNhbm5vdCBzYXkgd2hpY2ggYCArXG4gICAgICAgICAgJ21vdW50IHBhdXNlZC4gR2l2ZSBlYWNoIG1vdW50IGl0cyBvd24gc3ViZmxvdyBpZCB0byBtYWtlIGEgcGF1c2UgaW5zaWRlIGl0IHJlc3VtYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kWzBdO1xuICB9XG5cbiAgLyoqIFRoZSByZWFsIHN0YWdlIGBpZGAgaW4gYHJvb3RgJ3MgZ3JhcGggKGZpcnN0IGluIERGUyBwcmUtb3JkZXIpLCBpZiBhbnkuICovXG4gIHN0YWdlKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBpZDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLm9mKHJvb3QpLmtleXMoKSkgaWYgKG5vZGUuaWQgPT09IGlkKSByZXR1cm4gbm9kZTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBkaXNwYXRjaGVyIHdob3NlIGNoaWxkLWNoYWluIGhvbGRzIGBub2RlYCBpbiBgcm9vdGAncyBncmFwaCAoYHVuZGVmaW5lZGAgb24gdGhlIHNwaW5lKS4gKi9cbiAgZGlzcGF0Y2hlck9mKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vZihyb290KS5nZXQobm9kZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZS1zaG90IGVudHJ5IGZvciBgY2hpbGRgIChhIG1vdW50IG9uIHRoZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlKVxuICAgKiBpbiBgcm9vdGAncyBncmFwaDogYHJlcGxhY2VtZW50YCAodGhlIG5vZGUgdGhhdCBydW5zIOKAlCB0aGUgbW91bnQgaXRzZWxmLFxuICAgKiBvciB0aGUgc3RhbmQtaW4pIHdpdGggd2hhdCByYW4gYWZ0ZXIgYGNoaWxkYCdzIGNoYWluIG9uIHRoZSBvcmlnaW5hbCBydW5cbiAgICogYXR0YWNoZWQgd2hlcmUgdGhhdCBjaGFpbiBlbmRzIOKAlCBgeyAuLi5jaGlsZCwgbmV4dDogZGlzcGF0Y2hlci5uZXh0IH1gIGZvclxuICAgKiBhIGNoYXJ0IHRoZSBidWlsZGVyIG1hZGU6XG4gICAqXG4gICAqICAg4oCiIG9uIHRoZSBsZXZlbCdzIHNwaW5lOiBub3RoaW5nIHRvIGF0dGFjaCDigJQgdGhlIHNwaW5lIGdvZXMgb24gYnkgaXRzZWxmO1xuICAgKiAgIOKAoiBhIERFQ0lERVIncyBvciBTRUxFQ1RPUidzIGJyYW5jaDogdGhlIGRpc3BhdGNoZXIncyBgbmV4dGA7XG4gICAqICAg4oCiIGEgRk9SSyBjaGlsZDogdGhlIGZvcmsncyBgbmV4dGAg4oCUIGl0cyBqb2luLlxuICAgKlxuICAgKiBQYXN0IGEgZGlzcGF0Y2hlciB3aXRoIG5vIGBuZXh0YCwgdGhlIHdhbGsgZ29lcyBvbiBPVVRXQVJEIHRvIHRoZSBvbmVcbiAgICogZW5jbG9zaW5nIGl0LiBJdCBzdG9wcyBhdCBgc3RvcEF0YCDigJQgdGhlIGZhbi1vdXQgd2hlcmUgc2libGluZ3Mgc3RpbGxcbiAgICogd2FpdCwgd2hvc2Ugam9pbiBtdXN0IG5vdCBydW4geWV0LiBOb3RoaW5nIHRvIGF0dGFjaDogYHJlcGxhY2VtZW50YFxuICAgKiBpdHNlbGYuXG4gICAqL1xuICBlbnRyeShcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgcmVwbGFjZW1lbnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0b3BBdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gYXBwZW5kQXRDaGFpbkVuZChyZXBsYWNlbWVudCwgdGhpcy5hZnRlcihyb290LCBjaGlsZCwgc3RvcEF0KSk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBydW5zIG9uY2UgYG5vZGVgJ3MgY2hhaW4gZW5kczogaXRzIGRpc3BhdGNoZXIncyBgbmV4dGAgY2hhaW4sIHRoZW4g4oCUXG4gICAqIHdoZXJlIFRIQVQgZW5kcyDigJQgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUgZGlzcGF0Y2hlciBlbmNsb3NpbmcgaXQsIG91dHdhcmQsXG4gICAqIHVwIHRvIGBzdG9wQXRgIChleGNsdXNpdmUpLiBgdW5kZWZpbmVkYCBvbiB0aGUgc3BpbmUuXG4gICAqL1xuICBwcml2YXRlIGFmdGVyKFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0b3BBdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5kaXNwYXRjaGVyT2Yocm9vdCwgbm9kZSk7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IHVuZGVmaW5lZCB8fCBkaXNwYXRjaGVyID09PSBzdG9wQXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0ZXIgPSB0aGlzLmFmdGVyKHJvb3QsIGRpc3BhdGNoZXIsIHN0b3BBdCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIubmV4dCA/IGFwcGVuZEF0Q2hhaW5FbmQoZGlzcGF0Y2hlci5uZXh0LCBvdXRlcikgOiBvdXRlcjtcbiAgfVxufVxuXG4vKipcbiAqIGBzdGFydGAncyBjaGFpbiB3aXRoIGBhZnRlcmAgYXR0YWNoZWQgd2hlcmUgaXQgZW5kcyDigJQgdGhlIGNoYWluJ3Mgbm9kZXNcbiAqIGNvcGllZCBvbiB0aGUgd2F5IChuZXZlciByZWdpc3RlcmVkIGFueXdoZXJlOiBpZHMgc3RpbGwgcmVzb2x2ZSB0byB0aGUgcmVhbFxuICogbm9kZXMpLiBBIGNoYWluIHRoYXQgZW5kcyBpbiBhIGxvb3Agc3R1YiAob3IgbG9vcHMgYmFjayBvbiBpdHNlbGYpIGlzXG4gKiByZXR1cm5lZCBhcyBpczogY29udHJvbCBsZWF2ZXMgaXQgdGhyb3VnaCB0aGUgbG9vcCwgbmV2ZXIgXCJhZnRlclwiIGl0LlxuICovXG5mdW5jdGlvbiBhcHBlbmRBdENoYWluRW5kPFRPdXQsIFRTY29wZT4oXG4gIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgYWZ0ZXI6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBpZiAoYWZ0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHN0YXJ0O1xuICBjb25zdCBjaGFpbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgZm9yIChsZXQgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBzdGFydDsgbm9kZSAhPT0gdW5kZWZpbmVkOyBub2RlID0gbm9kZS5uZXh0KSB7XG4gICAgaWYgKG5vZGUuaXNMb29wUmVmIHx8IHNlZW4uaGFzKG5vZGUpKSByZXR1cm4gc3RhcnQ7XG4gICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgY2hhaW4ucHVzaChub2RlKTtcbiAgfVxuICBsZXQgbmV4dCA9IGFmdGVyO1xuICBmb3IgKGxldCBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIG5leHQgPSB7IC4uLmNoYWluW2ldLCBuZXh0IH07XG4gIHJldHVybiBuZXh0O1xufVxuXG4vLyDilIDilIAgV2FpdGluZyBzaWJsaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFRoZSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGF0IG9uZSBsZXZlbCwgYW5kIHRoZSBmYW4tb3V0IHRoZXkgd2FpdCBpbi4gKi9cbmludGVyZmFjZSBMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4ge1xuICByZWFkb25seSBmYW5PdXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICByZWFkb25seSBwYXVzZXM6IFF1ZXVlZFBhdXNlW107XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2AgKHVudHJ1c3RlZCBpbnB1dCkgYW5kIHF1ZXVlIGVhY2ggYXQgdGhlXG4gKiBsZXZlbCBvZiBpdHMgZmFuLW91dDogdGhlIGRlcHRoIHdoZXJlIGl0cyBwYXRoIHBhcnRzIGZyb20gdGhlIHBhdXNlZFxuICogc3RhZ2Uncy4gVGhlcmUsIHRoZSBwYXVzZWQgc3RhZ2UncyBjaGlsZCAoYSBtb3VudCBvbiB0aGUgcGF0aCwgb3IgdGhlIHN0YWdlXG4gKiBpdHNlbGYpIGFuZCB0aGUgc2libGluZydzIG11c3QgYm90aCBoYW5nIG9mZiBPTkUgcGFyYWxsZWwgZGlzcGF0Y2hlciDigJQgYVxuICogZm9yayBvciBhIHNlbGVjdG9yIOKAlCBvciB0aGUgcmVjb3JkIGlzIG5vdCBhIHNpYmxpbmcgYW5kIHRoZSByZXN1bWUgaXNcbiAqIHJlZnVzZWQgcmF0aGVyIHRoYW4gYXNrZWQgYSBxdWVzdGlvbiB0aGUgY2hhcnQgY291bGQgbm90IGhhdmUgcmFpc2VkLlxuICovXG5mdW5jdGlvbiBxdWV1ZVNpYmxpbmdQYXVzZXM8VE91dCwgVFNjb3BlPihcbiAgcGVuZGluZzogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW10gfCB1bmRlZmluZWQsXG4gIGF0OiB7XG4gICAgY2hhcnQ6IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBncmFwaHM6IHJlYWRvbmx5IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgbW91bnRzOiByZWFkb25seSBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIHBhdXNlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIH0sXG4pOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcXVldWVzOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+ID0gW107XG4gIGlmIChwZW5kaW5nID09PSB1bmRlZmluZWQpIHJldHVybiBxdWV1ZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShwZW5kaW5nKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHBlbmRpbmdQYXVzZXMgbXVzdCBiZSBhbiBhcnJheS4nKTtcbiAgY29uc3QgeyBjaGFydCwgc3ViZmxvd3MsIHJvb3QsIHBhdGgsIGdyYXBocywgbW91bnRzLCBwYXVzZWQgfSA9IGF0O1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcGVuZGluZy5mb3JFYWNoKChyYXc6IHVua25vd24sIG4pID0+IHtcbiAgICBjb25zdCBwYXVzZSA9IHZhbGlkUGVuZGluZ1BhdXNlKHJhdywgbik7XG4gICAgLy8gT25lIHJlY29yZCBwZXIgcGF1c2VkIHNpYmxpbmc6IGEgcmVwZWF0IHdvdWxkIGFzayB0aGUgc2FtZSBxdWVzdGlvbiB0d2ljZS5cbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcGF1c2Uuc3ViZmxvd1BhdGgsIHBhdXNlLnBhdXNlZFN0YWdlSWRdKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzWyR7bn1dICgnJHtwYXVzZS5wYXVzZWRTdGFnZUlkfScpIHJlcGVhdHMgYW4gZWFybGllciBlbnRyeS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIHdoaWxlIChsZXZlbCA8IHBhdGgubGVuZ3RoICYmIGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoICYmIHBhdGhbbGV2ZWxdID09PSBwYXVzZS5zdWJmbG93UGF0aFtsZXZlbF0pIGxldmVsKys7XG4gICAgY29uc3QgZ3JhcGggPSBncmFwaHNbbGV2ZWxdO1xuICAgIGNvbnN0IG91cnMgPSBsZXZlbCA8IHBhdGgubGVuZ3RoID8gbW91bnRzW2xldmVsXSA6IHBhdXNlZDtcbiAgICBjb25zdCB0aGVpck1vdW50cyA9IGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoID8gY2hhcnQubW91bnRzT2YoZ3JhcGgsIHBhdXNlLnN1YmZsb3dQYXRoW2xldmVsXSkgOiBbXTtcbiAgICBjb25zdCB0aGVpcnMgPVxuICAgICAgbGV2ZWwgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGhcbiAgICAgICAgPyB0aGVpck1vdW50cy5sZW5ndGggPT09IDFcbiAgICAgICAgICA/IHRoZWlyTW91bnRzWzBdXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgOiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCk7XG4gICAgY29uc3QgZmFuT3V0ID0gb3VycyA/IGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgb3VycykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNTaWJsaW5nID1cbiAgICAgIG91cnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhlaXJzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG91cnMgIT09IHRoZWlycyAmJlxuICAgICAgZmFuT3V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgdGhlaXJzKSA9PT0gZmFuT3V0ICYmXG4gICAgICAhZmFuT3V0LmRlY2lkZXJGbiAmJlxuICAgICAgKHF1ZXVlc1tsZXZlbF0gPT09IHVuZGVmaW5lZCB8fCBxdWV1ZXNbbGV2ZWxdIS5mYW5PdXQgPT09IGZhbk91dCk7XG4gICAgaWYgKCFpc1NpYmxpbmcgfHwgIXdhbGtzVG9JdHNTdGFnZShjaGFydCwgc3ViZmxvd3MsIGdyYXBoLCBwYXVzZSwgbGV2ZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNbJHtufV0gKCcke3BhdXNlLnBhdXNlZFN0YWdlSWR9JykgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiBgICtcbiAgICAgICAgICBgdGhlIHBhdXNlZCBzdGFnZSAnJHtwYXVzZWQ/LmlkID8/ICc/J30nIGluIHRoaXMgY2hhcnQg4oCUIG5vIGZvcmsgb3Igc2VsZWN0b3IgcnVucyB0aGVtIGJvdGgsIG9yIGl0cyBgICtcbiAgICAgICAgICAncGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoYXQgc3RhZ2UuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBsZWFmUm9vdCA9XG4gICAgICBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggPT09IDAgPyByb290IDogb3duRW50cnkoc3ViZmxvd3MsIHBhdXNlLnN1YmZsb3dQYXRoW3BhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdKT8ucm9vdDtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSAobGVhZlJvb3QgJiYgY2hhcnQuc3RhZ2UobGVhZlJvb3QsIHBhdXNlLnBhdXNlZFN0YWdlSWQpPy5uYW1lKSA/PyBwYXVzZS5wYXVzZWRTdGFnZUlkO1xuICAgIGNvbnN0IHF1ZXVlID0gKHF1ZXVlc1tsZXZlbF0gPz89IHsgZmFuT3V0OiBmYW5PdXQhLCBwYXVzZXM6IFtdIH0pO1xuICAgIHF1ZXVlLnBhdXNlcy5wdXNoKHsgcGF1c2UsIGxldmVsLCBzdGFnZU5hbWUgfSk7XG4gIH0pO1xuICByZXR1cm4gcXVldWVzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB3YWl0aW5nIHNpYmxpbmcncyBXSE9MRSBwYXRoIGJlbG93IGl0cyBmYW4tb3V0IHdhbGtzIHRoaXMgY2hhcnQ6XG4gKiBldmVyeSBzZWdtZW50IHRoZSBvbmx5IG1vdW50IG9mIGl0cyBzdWJmbG93IGluIHRoZSBlbmNsb3NpbmcgZ3JhcGgsIGV2ZXJ5XG4gKiBzdWJmbG93IHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBsYXN0IGdyYXBoIOKAlCBjaGVja2VkIGF0XG4gKiB0aGUgRklSU1QgcmVzdW1lLCBzbyBhIHRhbXBlcmVkIHJlY29yZCBpcyByZWZ1c2VkIHVwIGZyb250LCBub3Qgd2hlbiBpdHNcbiAqIHR1cm4gY29tZXMuXG4gKi9cbmZ1bmN0aW9uIHdhbGtzVG9JdHNTdGFnZTxUT3V0LCBUU2NvcGU+KFxuICBjaGFydDogQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZCxcbiAgZmFuT3V0R3JhcGg6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZTogUGVuZGluZ1BhdXNlLFxuICBsZXZlbDogbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGxldCBncmFwaCA9IGZhbk91dEdyYXBoO1xuICBmb3IgKGxldCBpID0gbGV2ZWw7IGkgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjaGFydC5tb3VudHNPZihncmFwaCwgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pO1xuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGdyYXBoID0gZGVmaW5pdGlvbi5yb290O1xuICB9XG4gIHJldHVybiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIE9uZSBgcGVuZGluZ1BhdXNlc2AgZW50cnksIGNoZWNrZWQgZmllbGQgYnkgZmllbGQg4oCUIGl0IGNvbWVzIGZyb20gc3RvcmVkLCB1bnRydXN0ZWQgZGF0YS4gKi9cbmZ1bmN0aW9uIHZhbGlkUGVuZGluZ1BhdXNlKHJhdzogdW5rbm93biwgbjogbnVtYmVyKTogUGVuZGluZ1BhdXNlIHtcbiAgY29uc3QgcmVmdXNlID0gKHdoYXQ6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hlY2twb2ludDogcGVuZGluZ1BhdXNlc1ske259XSAke3doYXR9LmApO1xuICB9O1xuICBpZiAocmF3ID09PSBudWxsIHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmF3KSkgcmVmdXNlKCdtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBjb25zdCByZWNvcmQgPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2YgcmVjb3JkLnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJlY29yZC5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZSgnbXVzdCBuYW1lIGl0cyBwYXVzZWQgc3RhZ2UgKHBhdXNlZFN0YWdlSWQsIGEgbm9uLWVtcHR5IHN0cmluZyknKTtcbiAgfVxuICBjb25zdCBzdWJmbG93UGF0aCA9IHJlY29yZC5zdWJmbG93UGF0aDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN1YmZsb3dQYXRoKSB8fCAhc3ViZmxvd1BhdGguZXZlcnkoKHMpID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJykpIHtcbiAgICByZWZ1c2UoJ211c3QgY2FycnkgaXRzIHN1YmZsb3dQYXRoIChhbiBhcnJheSBvZiBzdHJpbmdzKScpO1xuICB9XG4gIGNvbnN0IHN0YXRlcyA9IHJlY29yZC5zdWJmbG93U3RhdGVzO1xuICBpZiAoc3RhdGVzICE9PSB1bmRlZmluZWQgJiYgKHN0YXRlcyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHN0YXRlcykpKSB7XG4gICAgcmVmdXNlKCdtdXN0IGNhcnJ5IGl0cyBzdWJmbG93U3RhdGVzIGFzIGFuIG9iamVjdCcpO1xuICB9XG4gIGlmIChyZWNvcmQucGF1c2VkQnkgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQucGF1c2VkQnkgIT09ICdpbnRlcnJ1cHQnKVxuICAgIHJlZnVzZShcImhhcyBhbiB1bmtub3duIHBhdXNlZEJ5IChvbmx5ICdpbnRlcnJ1cHQnKVwiKTtcbiAgcmV0dXJuIHtcbiAgICBwYXVzZWRTdGFnZUlkOiByZWNvcmQucGF1c2VkU3RhZ2VJZCBhcyBzdHJpbmcsXG4gICAgc3ViZmxvd1BhdGg6IHN1YmZsb3dQYXRoIGFzIHN0cmluZ1tdLFxuICAgIHN1YmZsb3dTdGF0ZXM6IChzdGF0ZXMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkKSA/PyB7fSxcbiAgICAuLi4ocmVjb3JkLnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiByZWNvcmQucGF1c2VEYXRhIH0pLFxuICAgIC4uLihyZWNvcmQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnICYmIHsgcGF1c2VkQnk6ICdpbnRlcnJ1cHQnIGFzIGNvbnN0IH0pLFxuICAgIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQ6IGtlcHQgb25seSB3aGVuIHdlbGwtZm9ybWVkIChhbiBvbGRlciBvclxuICAgIC8vIGhhbmQtZWRpdGVkIGVudHJ5IHNpbXBseSByZXN1bWVzIHdpdGhvdXQgYSBsaW5rKS5cbiAgICAuLi4oaXNQYXVzZWRFeGVjdXRpb24ocmVjb3JkLnBhdXNlZEV4ZWN1dGlvbikgJiYge1xuICAgICAgcGF1c2VkRXhlY3V0aW9uOiB7IHJ1bklkOiByZWNvcmQucGF1c2VkRXhlY3V0aW9uLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcmVjb3JkLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKiogYHJlY29yZFtrZXldYCBvbmx5IHdoZW4gaXQgaXMgdGhlIHJlY29yZCdzIE9XTiBwcm9wZXJ0eSDigJQgbmV2ZXIgdGhyb3VnaCB0aGUgcHJvdG90eXBlIGNoYWluLiAqL1xuZnVuY3Rpb24gb3duRW50cnk8VD4ocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlY29yZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVjb3JkLCBrZXkpID8gcmVjb3JkW2tleV0gOiB1bmRlZmluZWQ7XG59XG4iXX0=