@decaf-ts/integrations 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/dist/integrations.cjs +3 -3
  2. package/dist/integrations.js +3 -3
  3. package/lib/cjs/graph/engine/constants.cjs +58 -0
  4. package/lib/cjs/graph/engine/decorators.cjs +4 -0
  5. package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
  6. package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
  7. package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
  8. package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
  9. package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
  10. package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
  11. package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
  12. package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
  13. package/lib/cjs/graph/{errors → engine/errors}/index.cjs +2 -2
  14. package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
  15. package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
  16. package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
  17. package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
  18. package/lib/cjs/graph/{events → engine/events}/index.cjs +2 -2
  19. package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
  20. package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
  21. package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +408 -0
  22. package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
  23. package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
  24. package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
  25. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
  26. package/lib/cjs/graph/{execution → engine/execution}/index.cjs +2 -2
  27. package/lib/cjs/graph/engine/index.cjs +84 -0
  28. package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
  29. package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
  30. package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
  31. package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
  32. package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
  33. package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
  34. package/lib/cjs/graph/{loops → engine/loops}/index.cjs +2 -2
  35. package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
  36. package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
  37. package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
  38. package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
  39. package/lib/cjs/graph/{pinning → engine/pinning}/index.cjs +2 -2
  40. package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
  41. package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
  42. package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
  43. package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
  44. package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
  45. package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
  46. package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
  47. package/lib/cjs/graph/{planning → engine/planning}/index.cjs +2 -2
  48. package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
  49. package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
  50. package/lib/cjs/graph/{registry → engine/registry}/index.cjs +2 -2
  51. package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
  52. package/lib/cjs/graph/{snapshots → engine/snapshots}/index.cjs +2 -2
  53. package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
  54. package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
  55. package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
  56. package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
  57. package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
  58. package/lib/cjs/graph/{store → engine/store}/index.cjs +2 -2
  59. package/lib/cjs/graph/engine/types.cjs +4 -0
  60. package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
  61. package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
  62. package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
  63. package/lib/cjs/graph/{validation → engine/validation}/index.cjs +2 -2
  64. package/lib/cjs/graph/index.cjs +10 -60
  65. package/lib/cjs/graph/shared/constants.cjs +44 -0
  66. package/lib/cjs/graph/shared/index.cjs +38 -0
  67. package/lib/cjs/graph/{nodes → shared/nodes}/agent.cjs +2 -2
  68. package/lib/cjs/graph/shared/nodes/base.cjs +35 -0
  69. package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
  70. package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
  71. package/lib/cjs/graph/{nodes → shared/nodes}/index.cjs +2 -2
  72. package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
  73. package/lib/cjs/graph/shared/types.cjs +4 -0
  74. package/lib/cjs/index.cjs +3 -3
  75. package/lib/cjs/nest/index.cjs +2 -3
  76. package/lib/esm/graph/engine/constants.js +62 -0
  77. package/lib/esm/graph/engine/decorators.js +2 -0
  78. package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
  79. package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
  80. package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
  81. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
  82. package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
  83. package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
  84. package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
  85. package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
  86. package/lib/esm/graph/engine/errors/index.js +14 -0
  87. package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
  88. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
  89. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
  90. package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
  91. package/lib/esm/graph/engine/events/index.js +10 -0
  92. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
  93. package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
  94. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +403 -0
  95. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
  96. package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
  97. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
  98. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
  99. package/lib/esm/graph/engine/execution/index.js +13 -0
  100. package/lib/esm/graph/engine/index.js +67 -0
  101. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
  102. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
  103. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
  104. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
  105. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
  106. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
  107. package/lib/esm/graph/engine/loops/index.js +12 -0
  108. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
  109. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
  110. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
  111. package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
  112. package/lib/esm/graph/engine/pinning/index.js +10 -0
  113. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
  114. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
  115. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
  116. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
  117. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
  118. package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
  119. package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
  120. package/lib/esm/graph/engine/planning/index.js +13 -0
  121. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
  122. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
  123. package/lib/esm/graph/engine/registry/index.js +8 -0
  124. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
  125. package/lib/esm/graph/engine/snapshots/index.js +7 -0
  126. package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
  127. package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
  128. package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
  129. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
  130. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
  131. package/lib/esm/graph/engine/store/index.js +11 -0
  132. package/lib/esm/graph/engine/types.js +2 -0
  133. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
  134. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
  135. package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
  136. package/lib/esm/graph/engine/validation/index.js +9 -0
  137. package/lib/esm/graph/index.js +9 -59
  138. package/lib/esm/graph/shared/constants.js +56 -0
  139. package/lib/esm/graph/shared/index.js +19 -0
  140. package/lib/esm/graph/shared/nodes/agent.js +101 -0
  141. package/lib/esm/graph/shared/nodes/base.js +30 -0
  142. package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
  143. package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
  144. package/lib/esm/graph/shared/nodes/index.js +18 -0
  145. package/lib/esm/graph/shared/nodes/triggers.js +241 -0
  146. package/lib/esm/graph/shared/types.js +2 -0
  147. package/lib/esm/index.js +3 -3
  148. package/lib/esm/nest/index.js +1 -2
  149. package/lib/types/graph/engine/constants.d.cts +59 -0
  150. package/lib/types/graph/engine/constants.d.mts +59 -0
  151. package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
  152. package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
  153. package/lib/types/graph/engine/index.d.cts +61 -0
  154. package/lib/types/graph/engine/index.d.mts +61 -0
  155. package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
  156. package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
  157. package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
  158. package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
  159. package/lib/types/graph/{types.d.cts → engine/types.d.cts} +8 -116
  160. package/lib/types/graph/{types.d.mts → engine/types.d.mts} +8 -116
  161. package/lib/types/graph/index.d.cts +8 -53
  162. package/lib/types/graph/index.d.mts +8 -53
  163. package/lib/types/graph/shared/constants.d.cts +53 -0
  164. package/lib/types/graph/shared/constants.d.mts +53 -0
  165. package/lib/types/graph/shared/index.d.cts +18 -0
  166. package/lib/types/graph/shared/index.d.mts +18 -0
  167. package/lib/types/graph/shared/types.d.cts +121 -0
  168. package/lib/types/graph/shared/types.d.mts +121 -0
  169. package/lib/types/index.d.cts +2 -2
  170. package/lib/types/index.d.mts +2 -2
  171. package/lib/types/nest/index.d.cts +0 -1
  172. package/lib/types/nest/index.d.mts +0 -1
  173. package/package.json +25 -3
  174. package/lib/cjs/graph/constants.cjs +0 -94
  175. package/lib/cjs/graph/decorators.cjs +0 -4
  176. package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
  177. package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
  178. package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
  179. package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
  180. package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
  181. package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
  182. package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
  183. package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
  184. package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
  185. package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
  186. package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
  187. package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
  188. package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
  189. package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
  190. package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
  191. package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
  192. package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
  193. package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
  194. package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
  195. package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
  196. package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
  197. package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
  198. package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
  199. package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
  200. package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
  201. package/lib/cjs/graph/nodes/base.cjs +0 -35
  202. package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
  203. package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
  204. package/lib/cjs/graph/nodes/triggers.cjs +0 -250
  205. package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
  206. package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
  207. package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
  208. package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
  209. package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
  210. package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
  211. package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
  212. package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
  213. package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
  214. package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
  215. package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
  216. package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
  217. package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
  218. package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
  219. package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
  220. package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
  221. package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
  222. package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
  223. package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
  224. package/lib/cjs/graph/types.cjs +0 -4
  225. package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
  226. package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
  227. package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
  228. package/lib/esm/graph/constants.js +0 -106
  229. package/lib/esm/graph/decorators.js +0 -2
  230. package/lib/esm/graph/errors/GraphCycleError.js +0 -15
  231. package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
  232. package/lib/esm/graph/errors/GraphInputError.js +0 -15
  233. package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
  234. package/lib/esm/graph/errors/GraphPinningError.js +0 -15
  235. package/lib/esm/graph/errors/GraphPortError.js +0 -15
  236. package/lib/esm/graph/errors/GraphStoreError.js +0 -15
  237. package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
  238. package/lib/esm/graph/errors/index.js +0 -14
  239. package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
  240. package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
  241. package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
  242. package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
  243. package/lib/esm/graph/events/index.js +0 -10
  244. package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
  245. package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
  246. package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
  247. package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
  248. package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
  249. package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
  250. package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
  251. package/lib/esm/graph/execution/index.js +0 -13
  252. package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
  253. package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
  254. package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
  255. package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
  256. package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
  257. package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
  258. package/lib/esm/graph/loops/index.js +0 -12
  259. package/lib/esm/graph/nodes/agent.js +0 -101
  260. package/lib/esm/graph/nodes/base.js +0 -30
  261. package/lib/esm/graph/nodes/category-styles.js +0 -34
  262. package/lib/esm/graph/nodes/flow-control.js +0 -455
  263. package/lib/esm/graph/nodes/index.js +0 -18
  264. package/lib/esm/graph/nodes/triggers.js +0 -241
  265. package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
  266. package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
  267. package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
  268. package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
  269. package/lib/esm/graph/pinning/index.js +0 -10
  270. package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
  271. package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
  272. package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
  273. package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
  274. package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
  275. package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
  276. package/lib/esm/graph/planning/GraphTopology.js +0 -52
  277. package/lib/esm/graph/planning/index.js +0 -13
  278. package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
  279. package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
  280. package/lib/esm/graph/registry/index.js +0 -8
  281. package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
  282. package/lib/esm/graph/snapshots/index.js +0 -7
  283. package/lib/esm/graph/store/GraphCachedValue.js +0 -2
  284. package/lib/esm/graph/store/GraphValueKey.js +0 -7
  285. package/lib/esm/graph/store/GraphValueStore.js +0 -71
  286. package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
  287. package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
  288. package/lib/esm/graph/store/index.js +0 -11
  289. package/lib/esm/graph/types.js +0 -2
  290. package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
  291. package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
  292. package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
  293. package/lib/esm/graph/validation/index.js +0 -9
  294. package/lib/types/graph/constants.d.cts +0 -101
  295. package/lib/types/graph/constants.d.mts +0 -101
  296. /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
  297. /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
  298. /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
  299. /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
  300. /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
  301. /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
  302. /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
  303. /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
  304. /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
  305. /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
  306. /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
  307. /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
  308. /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
  309. /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
  310. /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
  311. /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
  312. /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
  313. /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
  314. /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
  315. /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
  316. /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
  317. /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
  318. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
  319. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
  320. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
  321. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
  322. /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
  323. /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
  324. /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
  325. /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
  326. /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
  327. /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
  328. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
  329. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
  330. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
  331. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
  332. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
  333. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
  334. /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
  335. /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
  336. /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
  337. /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
  338. /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
  339. /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
  340. /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
  341. /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
  342. /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
  343. /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
  344. /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
  345. /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
  346. /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
  347. /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
  348. /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
  349. /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
  350. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
  351. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
  352. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
  353. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
  354. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
  355. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
  356. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
  357. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
  358. /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
  359. /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
  360. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
  361. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
  362. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
  363. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
  364. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
  365. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
  366. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
  367. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
  368. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
  369. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
  370. /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
  371. /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
  372. /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
  373. /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
  374. /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
  375. /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
  376. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
  377. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
  378. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
  379. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
  380. /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
  381. /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
  382. /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
  383. /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
  384. /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
  385. /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
  386. /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
  387. /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
  388. /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
  389. /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
  390. /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
  391. /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
  392. /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
  393. /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
  394. /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
  395. /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
  396. /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
  397. /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
  398. /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
  399. /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
  400. /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
  401. /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
  402. /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
  403. /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
  404. /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
  405. /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
  406. /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
  407. /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
  408. /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
  409. /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
  410. /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
  411. /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
  412. /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
  413. /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
  414. /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
  415. /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
  416. /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
  417. /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
@@ -0,0 +1,408 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphExecutionEngine = void 0;
4
+ const constants_js_1 = require("./../constants.cjs");
5
+ const constants_js_2 = require("./../../shared/constants.cjs");
6
+ const GraphExecutionEventEmitter_js_1 = require("./../events/GraphExecutionEventEmitter.cjs");
7
+ const GraphExecutionEventFactory_js_1 = require("./../events/GraphExecutionEventFactory.cjs");
8
+ const GraphExecutionPlanner_js_1 = require("./../planning/GraphExecutionPlanner.cjs");
9
+ const InMemoryGraphValueStoreAdapter_js_1 = require("./../store/InMemoryGraphValueStoreAdapter.cjs");
10
+ const GraphValueStore_js_1 = require("./../store/GraphValueStore.cjs");
11
+ const GraphPinningService_js_1 = require("./../pinning/GraphPinningService.cjs");
12
+ const GraphPinningPolicy_js_1 = require("./../pinning/GraphPinningPolicy.cjs");
13
+ const GraphPinningDependencyResolver_js_1 = require("./../pinning/GraphPinningDependencyResolver.cjs");
14
+ const GraphExecutionContext_js_1 = require("./GraphExecutionContext.cjs");
15
+ const GraphExecutionFrame_js_1 = require("./GraphExecutionFrame.cjs");
16
+ const GraphExecutionResult_js_1 = require("./GraphExecutionResult.cjs");
17
+ /**
18
+ * Reference graph execution engine.
19
+ *
20
+ * Executes a {@link GraphWorkflowDefinition} by:
21
+ * 1. Planning the workflow into topological layers.
22
+ * 2. Seeding workflow inputs into the value store.
23
+ * 3. Executing nodes layer-by-layer with configurable concurrency.
24
+ * 4. Routing values along edges.
25
+ * 5. Emitting structured events through Decaf's Observable pipeline.
26
+ * 6. Returning a complete {@link GraphExecutionResult}.
27
+ */
28
+ class GraphExecutionEngine {
29
+ constructor(config) {
30
+ this.emitter = config.eventEmitter ?? new GraphExecutionEventEmitter_js_1.GraphExecutionEventEmitter();
31
+ this.planner = config.planner ?? new GraphExecutionPlanner_js_1.GraphExecutionPlanner();
32
+ this.valueStoreAdapter =
33
+ config.valueStoreAdapter ?? new InMemoryGraphValueStoreAdapter_js_1.InMemoryGraphValueStoreAdapter();
34
+ this.defaultOptions = config.defaultOptions ?? {};
35
+ this.codeSandboxEvaluator = config.codeSandboxEvaluator;
36
+ this.config = config;
37
+ config.onEngineCreated?.(this);
38
+ }
39
+ observe(observer) {
40
+ return this.emitter.observe(observer);
41
+ }
42
+ unObserve(observer) {
43
+ this.emitter.unObserve(observer);
44
+ }
45
+ async updateObservers(event) {
46
+ await this.emitter.updateObservers(event);
47
+ }
48
+ /**
49
+ * Executes a workflow with the given inputs and options.
50
+ */
51
+ async execute(workflow, inputs = {}, options = {}) {
52
+ const opts = this.mergeOptions(options);
53
+ const runId = opts.runId ?? this.generateRunId();
54
+ const path = opts.path ?? [];
55
+ const eventFactory = new GraphExecutionEventFactory_js_1.GraphExecutionEventFactory();
56
+ const valueStore = new GraphValueStore_js_1.GraphValueStore(this.valueStoreAdapter);
57
+ valueStore.seedWorkflowInputs(inputs);
58
+ const plan = this.planner.plan(workflow);
59
+ const frame = new GraphExecutionFrame_js_1.GraphExecutionFrame(runId, plan, valueStore, eventFactory);
60
+ const emitFn = async (partial) => {
61
+ await this.emitEvent(frame, {
62
+ type: partial.type ?? constants_js_2.GraphExecutionEventType.NODE_OUTPUT,
63
+ runId,
64
+ parentRunId: opts.parentRunId,
65
+ workflowId: workflow.name,
66
+ nodeId: partial.nodeId,
67
+ path: partial.path ?? path,
68
+ ...partial,
69
+ });
70
+ };
71
+ await this.emitEvent(frame, {
72
+ type: constants_js_2.GraphExecutionEventType.WORKFLOW_STARTED,
73
+ runId,
74
+ parentRunId: opts.parentRunId,
75
+ workflowId: workflow.name,
76
+ path,
77
+ status: constants_js_2.GraphExecutionStatus.RUNNING,
78
+ payload: { inputs },
79
+ });
80
+ await this.emitEvent(frame, {
81
+ type: constants_js_2.GraphExecutionEventType.WORKFLOW_PLANNED,
82
+ runId,
83
+ parentRunId: opts.parentRunId,
84
+ workflowId: workflow.name,
85
+ path,
86
+ status: constants_js_2.GraphExecutionStatus.PLANNING,
87
+ payload: { layers: plan.layers.length, nodes: plan.nodes.length },
88
+ });
89
+ try {
90
+ for (const layer of plan.layers) {
91
+ await this.executeLayer(frame, plan, layer.nodes, opts, emitFn);
92
+ }
93
+ frame.finish();
94
+ await this.emitEvent(frame, {
95
+ type: constants_js_2.GraphExecutionEventType.WORKFLOW_COMPLETED,
96
+ runId,
97
+ parentRunId: opts.parentRunId,
98
+ workflowId: workflow.name,
99
+ path,
100
+ status: constants_js_2.GraphExecutionStatus.SUCCEEDED,
101
+ payload: { outputs: valueStore.getWorkflowValues() },
102
+ });
103
+ return (0, GraphExecutionResult_js_1.buildGraphExecutionResult)(frame, workflow, inputs, constants_js_2.GraphExecutionStatus.SUCCEEDED, opts.metadata);
104
+ }
105
+ catch (error) {
106
+ frame.finish();
107
+ const errorPayload = this.toErrorPayload(error);
108
+ await this.emitEvent(frame, {
109
+ type: constants_js_2.GraphExecutionEventType.WORKFLOW_FAILED,
110
+ runId,
111
+ parentRunId: opts.parentRunId,
112
+ workflowId: workflow.name,
113
+ path,
114
+ status: constants_js_2.GraphExecutionStatus.FAILED,
115
+ error: errorPayload,
116
+ });
117
+ return (0, GraphExecutionResult_js_1.buildGraphExecutionResult)(frame, workflow, inputs, constants_js_2.GraphExecutionStatus.FAILED, opts.metadata);
118
+ }
119
+ }
120
+ /**
121
+ * Pins a node and its upstream dependencies after a completed run.
122
+ *
123
+ * Delegates to {@link GraphPinningService}. The plan and result must come
124
+ * from a prior successful execution of the same workflow.
125
+ */
126
+ async pinNode(options) {
127
+ const service = this.createPinningService();
128
+ await service.pinNode(options);
129
+ await this.emitPinningEvent(options.nodeId, constants_js_2.GraphExecutionEventType.NODE_PINNED);
130
+ }
131
+ /**
132
+ * Unpins a node by its fingerprint.
133
+ */
134
+ async unpinNode(options) {
135
+ const service = this.createPinningService();
136
+ await service.unpinNode(options);
137
+ await this.emitPinningEvent(options.nodeId, constants_js_2.GraphExecutionEventType.NODE_UNPINNED);
138
+ }
139
+ /**
140
+ * Creates a {@link GraphPinningService} backed by this engine's value store
141
+ * adapter.
142
+ */
143
+ createPinningService() {
144
+ const store = new GraphValueStore_js_1.GraphValueStore(this.valueStoreAdapter);
145
+ return new GraphPinningService_js_1.GraphPinningService(store, new GraphPinningPolicy_js_1.GraphPinningPolicy(), new GraphPinningDependencyResolver_js_1.GraphPinningDependencyResolver());
146
+ }
147
+ /**
148
+ * Emits a pinning-related event to all observers.
149
+ */
150
+ async emitPinningEvent(nodeId, type) {
151
+ const factory = new GraphExecutionEventFactory_js_1.GraphExecutionEventFactory();
152
+ const event = factory.create({
153
+ id: "",
154
+ sequence: 0,
155
+ timestamp: new Date(),
156
+ runId: "pinning",
157
+ workflowId: "",
158
+ type,
159
+ nodeId,
160
+ path: [],
161
+ });
162
+ await this.emitter.updateObservers(event);
163
+ }
164
+ /**
165
+ * Executes a layer of nodes with the configured concurrency.
166
+ */
167
+ async executeLayer(frame, plan, nodes, opts, emitFn) {
168
+ const concurrency = Math.max(1, opts.concurrency ?? constants_js_1.GRAPH_DEFAULT_CONCURRENCY);
169
+ const queue = [...nodes];
170
+ while (queue.length > 0) {
171
+ const batch = queue.splice(0, concurrency);
172
+ await Promise.all(batch.map((node) => this.executeNode(frame, plan, node, opts, emitFn)));
173
+ }
174
+ }
175
+ /**
176
+ * Executes a single node.
177
+ */
178
+ async executeNode(frame, plan, planNode, opts, emitFn) {
179
+ const startedAt = new Date();
180
+ const nodePath = [...(opts.path ?? []), planNode.id];
181
+ await this.emitEvent(frame, {
182
+ type: constants_js_2.GraphExecutionEventType.NODE_STARTED,
183
+ runId: frame.runId,
184
+ workflowId: plan.workflowId,
185
+ nodeId: planNode.id,
186
+ path: nodePath,
187
+ status: constants_js_2.GraphExecutionStatus.RUNNING,
188
+ });
189
+ const inputs = this.resolveNodeInputs(frame, plan, planNode);
190
+ // Cache-hit: check for a pinned value before executing the node
191
+ if (opts.usePinnedValues) {
192
+ const cached = await this.tryPinnedValue(frame, plan, planNode, inputs);
193
+ if (cached) {
194
+ frame.valueStore.setNodeOutputs(planNode.id, cached.outputs);
195
+ this.routeOutgoingEdges(frame, plan, planNode, cached.outputs);
196
+ const finishedAt = new Date();
197
+ const result = {
198
+ nodeId: planNode.id,
199
+ status: constants_js_2.GraphExecutionStatus.CACHED,
200
+ inputs,
201
+ outputs: cached.outputs,
202
+ startedAt,
203
+ finishedAt,
204
+ fromCache: true,
205
+ pinned: true,
206
+ events: [],
207
+ };
208
+ frame.recordNodeResult(result);
209
+ await this.emitEvent(frame, {
210
+ type: constants_js_2.GraphExecutionEventType.NODE_CACHE_HIT,
211
+ runId: frame.runId,
212
+ workflowId: plan.workflowId,
213
+ nodeId: planNode.id,
214
+ path: nodePath,
215
+ status: constants_js_2.GraphExecutionStatus.CACHED,
216
+ payload: { outputs: cached.outputs },
217
+ });
218
+ await this.emitEvent(frame, {
219
+ type: constants_js_2.GraphExecutionEventType.NODE_COMPLETED,
220
+ runId: frame.runId,
221
+ workflowId: plan.workflowId,
222
+ nodeId: planNode.id,
223
+ path: nodePath,
224
+ status: constants_js_2.GraphExecutionStatus.SUCCEEDED,
225
+ payload: { outputs: cached.outputs, fromCache: true },
226
+ });
227
+ return;
228
+ }
229
+ }
230
+ try {
231
+ const executor = this.config.registry.resolve(planNode.kind);
232
+ const context = new GraphExecutionContext_js_1.GraphExecutionContext(frame.runId, opts.parentRunId, plan.workflow, planNode.definition, nodePath, emitFn, opts.metadata);
233
+ const outputs = await executor.execute(inputs, context);
234
+ const resolvedOutputs = outputs ?? {};
235
+ frame.valueStore.setNodeOutputs(planNode.id, resolvedOutputs);
236
+ this.routeOutgoingEdges(frame, plan, planNode, resolvedOutputs);
237
+ const finishedAt = new Date();
238
+ const result = {
239
+ nodeId: planNode.id,
240
+ status: constants_js_2.GraphExecutionStatus.SUCCEEDED,
241
+ inputs,
242
+ outputs: resolvedOutputs,
243
+ startedAt,
244
+ finishedAt,
245
+ events: [],
246
+ };
247
+ frame.recordNodeResult(result);
248
+ await this.emitEvent(frame, {
249
+ type: constants_js_2.GraphExecutionEventType.NODE_COMPLETED,
250
+ runId: frame.runId,
251
+ workflowId: plan.workflowId,
252
+ nodeId: planNode.id,
253
+ path: nodePath,
254
+ status: constants_js_2.GraphExecutionStatus.SUCCEEDED,
255
+ payload: { outputs: resolvedOutputs },
256
+ });
257
+ }
258
+ catch (error) {
259
+ const finishedAt = new Date();
260
+ const errorPayload = this.toErrorPayload(error);
261
+ const result = {
262
+ nodeId: planNode.id,
263
+ status: constants_js_2.GraphExecutionStatus.FAILED,
264
+ inputs,
265
+ error: errorPayload,
266
+ startedAt,
267
+ finishedAt,
268
+ events: [],
269
+ };
270
+ frame.recordNodeResult(result);
271
+ await this.emitEvent(frame, {
272
+ type: constants_js_2.GraphExecutionEventType.NODE_FAILED,
273
+ runId: frame.runId,
274
+ workflowId: plan.workflowId,
275
+ nodeId: planNode.id,
276
+ path: nodePath,
277
+ status: constants_js_2.GraphExecutionStatus.FAILED,
278
+ error: errorPayload,
279
+ });
280
+ if (opts.failFast ?? true)
281
+ throw error;
282
+ }
283
+ }
284
+ /**
285
+ * Resolves a node's input values from incoming edges.
286
+ */
287
+ resolveNodeInputs(frame, plan, planNode) {
288
+ const inputs = {};
289
+ const incoming = plan.incomingByNode.get(planNode.id) ?? [];
290
+ for (const edge of incoming) {
291
+ inputs[edge.targetPort] = frame.valueStore.getPort(edge.sourceNodeId, edge.sourcePort);
292
+ }
293
+ return inputs;
294
+ }
295
+ /**
296
+ * Attempts to read a pinned value for the node. Returns the cached outputs
297
+ * when a valid pinned value exists, or `undefined` to proceed with normal
298
+ * execution.
299
+ */
300
+ async tryPinnedValue(frame, plan, planNode, inputs) {
301
+ const policy = new GraphPinningPolicy_js_1.GraphPinningPolicy();
302
+ if (!policy.shouldUsePinnedValue(planNode))
303
+ return undefined;
304
+ const service = this.createPinningService();
305
+ const depFingerprints = this.computeDependencyFingerprints(frame, plan, planNode.id);
306
+ return service.readPinnedValue(plan.workflow, planNode, inputs, depFingerprints);
307
+ }
308
+ /**
309
+ * Recursively computes fingerprints for all upstream dependencies of a node
310
+ * using the results already accumulated in the frame.
311
+ */
312
+ computeDependencyFingerprints(frame, plan, nodeId) {
313
+ const service = this.createPinningService();
314
+ const depResolver = new GraphPinningDependencyResolver_js_1.GraphPinningDependencyResolver();
315
+ const deps = depResolver.getDependencies(plan, nodeId);
316
+ const fingerprints = {};
317
+ for (const dep of deps) {
318
+ const node = plan.nodes.find((n) => n.id === dep);
319
+ if (node) {
320
+ const depResult = frame.nodeResults.get(dep);
321
+ const inputs = depResult?.inputs ?? {};
322
+ const nestedDeps = this.computeDependencyFingerprints(frame, plan, dep);
323
+ fingerprints[dep] = service.computeFingerprint(plan.workflow, node, inputs, nestedDeps);
324
+ }
325
+ }
326
+ return fingerprints;
327
+ }
328
+ /**
329
+ * Routes a node's outputs to downstream inputs and workflow outputs.
330
+ */
331
+ routeOutgoingEdges(frame, plan, planNode, outputs) {
332
+ const outgoing = plan.outgoingByNode.get(planNode.id) ?? [];
333
+ for (const edge of outgoing) {
334
+ const value = outputs[edge.sourcePort];
335
+ if (edge.targetNodeId === constants_js_1.GRAPH_WORKFLOW_BOUNDARY) {
336
+ frame.valueStore.setWorkflowOutput(edge.targetPort, value);
337
+ }
338
+ this.emitEvent(frame, {
339
+ type: constants_js_2.GraphExecutionEventType.EDGE_VALUE_ROUTED,
340
+ runId: frame.runId,
341
+ workflowId: plan.workflowId,
342
+ edgeId: edge.id,
343
+ nodeId: planNode.id,
344
+ path: [],
345
+ payload: { edge, value },
346
+ }).catch(() => {
347
+ // observer failures must not crash
348
+ });
349
+ }
350
+ }
351
+ /**
352
+ * Emits an event, records it in the frame, and dispatches to observers.
353
+ */
354
+ async emitEvent(frame, partial) {
355
+ const event = frame.eventFactory.create({
356
+ id: "",
357
+ sequence: 0,
358
+ timestamp: new Date(),
359
+ ...partial,
360
+ });
361
+ frame.appendEvent(event);
362
+ await this.emitter.updateObservers(event);
363
+ }
364
+ /**
365
+ * Merges default options with the given options.
366
+ */
367
+ mergeOptions(options) {
368
+ return {
369
+ concurrency: constants_js_1.GRAPH_DEFAULT_CONCURRENCY,
370
+ failFast: true,
371
+ validateInputs: true,
372
+ validateOutputs: true,
373
+ usePinnedValues: true,
374
+ writeThroughCache: false,
375
+ path: [],
376
+ metadata: {},
377
+ ...this.defaultOptions,
378
+ ...options,
379
+ };
380
+ }
381
+ /**
382
+ * Generates a unique run id.
383
+ */
384
+ generateRunId() {
385
+ return (globalThis.crypto?.randomUUID?.() ??
386
+ `graph-run-${Date.now()}-${Math.random().toString(36).slice(2)}`);
387
+ }
388
+ /**
389
+ * Converts an error into a serialized payload.
390
+ */
391
+ toErrorPayload(error) {
392
+ if (error instanceof Error) {
393
+ return {
394
+ name: error.name,
395
+ message: error.message,
396
+ stack: error.stack,
397
+ code: error.graphCode ??
398
+ (typeof error.code === "number"
399
+ ? String(error.code)
400
+ : error.code),
401
+ };
402
+ }
403
+ return { name: "UnknownError", message: String(error) };
404
+ }
405
+ }
406
+ exports.GraphExecutionEngine = GraphExecutionEngine;
407
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL2V4ZWN1dGlvbi9HcmFwaEV4ZWN1dGlvbkVuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHVCQUF1QixHQUN4QiwwQkFBcUI7QUFDdEIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsb0NBQStCO0FBYWhDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxrREFBNkM7QUFDbEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtEQUE2QztBQUVsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsK0NBQTBDO0FBSTFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxxREFBZ0Q7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQ0FBaUM7QUFFM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDRDQUF1QztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMkNBQXNDO0FBQ25FLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSx1REFBa0Q7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1DQUFnQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUNBQThCO0FBQzVELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQ0FBK0I7QUE0Qm5FOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBUy9CLFlBQVksTUFBa0M7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksMEJBQTBCLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUI7WUFDcEIsTUFBTSxDQUFDLGlCQUFpQixJQUFJLElBQUksOEJB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dGlvbi9HcmFwaEV4ZWN1dGlvbkVuZ2luZVxuICogQHN1bW1hcnkgUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgZ3JhcGggd29ya2Zsb3dzIGRlY2xhcmVkIHdpdGggYEBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoYCwgZW1pdHMgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLCBzdXBwb3J0cyBwYXJhbGxlbCBub2RlIGV4ZWN1dGlvbiB3aXRoaW4gdG9wb2xvZ2ljYWwgbGF5ZXJzLCBhbmQgcmV0dXJucyBhIGNvbXBsZXRlIGV4ZWN1dGlvbiByZXN1bHQuXG4gKi9cbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuXG5pbXBvcnQge1xuICBHUkFQSF9ERUZBVUxUX0NPTkNVUlJFTkNZLFxuICBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUsXG4gIEdyYXBoRXhlY3V0aW9uU3RhdHVzLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUge1xuICBHcmFwaEV4ZWN1dGlvbkVycm9yUGF5bG9hZCxcbiAgR3JhcGhFeGVjdXRpb25FdmVudCxcbiAgR3JhcGhFeGVjdXRpb25PcHRpb25zLFxuICBHcmFwaEV4ZWN1dGlvblJlc3VsdCxcbiAgR3JhcGhFeGVjdXRpb25WYWx1ZXMsXG4gIEdyYXBoTm9kZUV4ZWN1dGlvblJlc3VsdCxcbiAgR3JhcGhQaW5Ob2RlT3B0aW9ucyxcbiAgR3JhcGhVbnBpbk5vZGVPcHRpb25zLFxuICBHcmFwaFJ1bklkLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25PYnNlcnZlciB9IGZyb20gXCIuLi9ldmVudHMvR3JhcGhFeGVjdXRpb25PYnNlcnZlclwiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXIgfSBmcm9tIFwiLi4vZXZlbnRzL0dyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSB9IGZyb20gXCIuLi9ldmVudHMvR3JhcGhFeGVjdXRpb25FdmVudEZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeSB9IGZyb20gXCIuLi9yZWdpc3RyeS9HcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvblBsYW5uZXIgfSBmcm9tIFwiLi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFubmVyXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbiB9IGZyb20gXCIuLi9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5cIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25QbGFuTm9kZSB9IGZyb20gXCIuLi9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5Ob2RlXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIgfSBmcm9tIFwiLi4vc3RvcmUvR3JhcGhWYWx1ZVN0b3JlQWRhcHRlclwiO1xuaW1wb3J0IHsgSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyIH0gZnJvbSBcIi4uL3N0b3JlL0luTWVtb3J5R3JhcGhWYWx1ZVN0b3JlQWRhcHRlclwiO1xuaW1wb3J0IHsgR3JhcGhWYWx1ZVN0b3JlIH0gZnJvbSBcIi4uL3N0b3JlL0dyYXBoVmFsdWVTdG9yZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaENhY2hlZFZhbHVlIH0gZnJvbSBcIi4uL3N0b3JlL0dyYXBoQ2FjaGVkVmFsdWVcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ1NlcnZpY2UgfSBmcm9tIFwiLi4vcGlubmluZy9HcmFwaFBpbm5pbmdTZXJ2aWNlXCI7XG5pbXBvcnQgeyBHcmFwaFBpbm5pbmdQb2xpY3kgfSBmcm9tIFwiLi4vcGlubmluZy9HcmFwaFBpbm5pbmdQb2xpY3lcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlciB9IGZyb20gXCIuLi9waW5uaW5nL0dyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlclwiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25Db250ZXh0XCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkZyYW1lIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25GcmFtZVwiO1xuaW1wb3J0IHsgYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IENvZGVTYW5kYm94RXZhbHVhdG9yIH0gZnJvbSBcIi4vQ29kZVNhbmRib3hFdmFsdWF0b3JcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUge0BsaW5rIEdyYXBoRXhlY3V0aW9uRW5naW5lfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaEV4ZWN1dGlvbkVuZ2luZUNvbmZpZyB7XG4gIHJlZ2lzdHJ5OiBHcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5O1xuICBwbGFubmVyPzogR3JhcGhFeGVjdXRpb25QbGFubmVyO1xuICB2YWx1ZVN0b3JlQWRhcHRlcj86IEdyYXBoVmFsdWVTdG9yZUFkYXB0ZXI7XG4gIGV2ZW50RW1pdHRlcj86IEdyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyO1xuICBkZWZhdWx0T3B0aW9ucz86IFBhcnRpYWw8R3JhcGhFeGVjdXRpb25PcHRpb25zPjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBsdWdnYWJsZSBjb2RlIHNhbmRib3ggZXZhbHVhdG9yIGZvciBjb2RlLWJhc2VkIGNvbmRpdGlvbnNcbiAgICogKERFQ0FGLTMyIMKnMjIuNCkuIFdoZW4gYWJzZW50LCBjb2RlIGNvbmRpdGlvbnMgdGhyb3dcbiAgICogYEdSQVBIX0NPREVfU0FOREJPWF9OT1RfQ09ORklHVVJFRGAuIERvd25zdHJlYW0gcHJvamVjdHMgKGUuZy4gQUxGUkVEKVxuICAgKiBzdXBwbHkgdGhlIGFjdHVhbCBWTSBzYW5kYm94IGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgY29kZVNhbmRib3hFdmFsdWF0b3I/OiBDb2RlU2FuZGJveEV2YWx1YXRvcjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgYXQgdGhlIGVuZCBvZiBlbmdpbmUgY29uc3RydWN0aW9uIHdpdGggdGhlXG4gICAqIGZ1bGx5LWluaXRpYWxpc2VkIGVuZ2luZSBpbnN0YW5jZS4gVXNlIHRoaXMgdG8gcmVnaXN0ZXIgZXhlY3V0b3JzIHRoYXRcbiAgICogbmVlZCBhIGJhY2stcmVmZXJlbmNlIHRvIHRoZSBlbmdpbmUgKGUuZy4gbG9vcCBleGVjdXRvcnMgdGhhdCBleGVjdXRlXG4gICAqIHN1Yi13b3JrZmxvd3MgdGhyb3VnaCB0aGUgc2FtZSBlbmdpbmUpLlxuICAgKi9cbiAgb25FbmdpbmVDcmVhdGVkPzogKGVuZ2luZTogR3JhcGhFeGVjdXRpb25FbmdpbmUpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKlxuICogRXhlY3V0ZXMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGJ5OlxuICogMS4gUGxhbm5pbmcgdGhlIHdvcmtmbG93IGludG8gdG9wb2xvZ2ljYWwgbGF5ZXJzLlxuICogMi4gU2VlZGluZyB3b3JrZmxvdyBpbnB1dHMgaW50byB0aGUgdmFsdWUgc3RvcmUuXG4gKiAzLiBFeGVjdXRpbmcgbm9kZXMgbGF5ZXItYnktbGF5ZXIgd2l0aCBjb25maWd1cmFibGUgY29uY3VycmVuY3kuXG4gKiA0LiBSb3V0aW5nIHZhbHVlcyBhbG9uZyBlZGdlcy5cbiAqIDUuIEVtaXR0aW5nIHN0cnVjdHVyZWQgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLlxuICogNi4gUmV0dXJuaW5nIGEgY29tcGxldGUge0BsaW5rIEdyYXBoRXhlY3V0aW9uUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uRW5naW5lXG4gIGltcGxlbWVudHMgT2JzZXJ2YWJsZTxbR3JhcGhFeGVjdXRpb25PYnNlcnZlcl0sIFtHcmFwaEV4ZWN1dGlvbkV2ZW50XT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGVtaXR0ZXI6IEdyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYW5uZXI6IEdyYXBoRXhlY3V0aW9uUGxhbm5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZVN0b3JlQWRhcHRlcjogR3JhcGhWYWx1ZVN0b3JlQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbk9wdGlvbnM+O1xuICAvKiogUGx1Z2dhYmxlIGNvZGUgc2FuZGJveCBldmFsdWF0b3IgKMKnMjIuNCk7IG1heSBiZSB1bmRlZmluZWQuICovXG4gIHJlYWRvbmx5IGNvZGVTYW5kYm94RXZhbHVhdG9yPzogQ29kZVNhbmRib3hFdmFsdWF0b3I7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBHcmFwaEV4ZWN1dGlvbkVuZ2luZUNvbmZpZykge1xuICAgIHRoaXMuZW1pdHRlciA9IGNvbmZpZy5ldmVudEVtaXR0ZXIgPz8gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5wbGFubmVyID0gY29uZmlnLnBsYW5uZXIgPz8gbmV3IEdyYXBoRXhlY3V0aW9uUGxhbm5lcigpO1xuICAgIHRoaXMudmFsdWVTdG9yZUFkYXB0ZXIgPVxuICAgICAgY29uZmlnLnZhbHVlU3RvcmVBZGFwdGVyID8/IG5ldyBJbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIoKTtcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0gY29uZmlnLmRlZmF1bHRPcHRpb25zID8/IHt9O1xuICAgIHRoaXMuY29kZVNhbmRib3hFdmFsdWF0b3IgPSBjb25maWcuY29kZVNhbmRib3hFdmFsdWF0b3I7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgY29uZmlnLm9uRW5naW5lQ3JlYXRlZD8uKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IEdyYXBoRXhlY3V0aW9uRW5naW5lQ29uZmlnO1xuXG4gIG9ic2VydmUob2JzZXJ2ZXI6IEdyYXBoRXhlY3V0aW9uT2JzZXJ2ZXIpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0dGVyLm9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBHcmFwaEV4ZWN1dGlvbk9ic2VydmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0dGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoZXZlbnQ6IEdyYXBoRXhlY3V0aW9uRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHdvcmtmbG93IHdpdGggdGhlIGdpdmVuIGlucHV0cyBhbmQgb3B0aW9ucy5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoXG4gICAgd29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uLFxuICAgIGlucHV0czogR3JhcGhFeGVjdXRpb25WYWx1ZXMgPSB7fSxcbiAgICBvcHRpb25zOiBHcmFwaEV4ZWN1dGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPEdyYXBoRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMubWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIGNvbnN0IHJ1bklkID0gb3B0cy5ydW5JZCA/PyB0aGlzLmdlbmVyYXRlUnVuSWQoKTtcbiAgICBjb25zdCBwYXRoID0gb3B0cy5wYXRoID8/IFtdO1xuICAgIGNvbnN0IGV2ZW50RmFjdG9yeSA9IG5ldyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSgpO1xuICAgIGNvbnN0IHZhbHVlU3RvcmUgPSBuZXcgR3JhcGhWYWx1ZVN0b3JlKHRoaXMudmFsdWVTdG9yZUFkYXB0ZXIpO1xuICAgIHZhbHVlU3RvcmUuc2VlZFdvcmtmbG93SW5wdXRzKGlucHV0cyk7XG5cbiAgICBjb25zdCBwbGFuID0gdGhpcy5wbGFubmVyLnBsYW4od29ya2Zsb3cpO1xuICAgIGNvbnN0IGZyYW1lID0gbmV3IEdyYXBoRXhlY3V0aW9uRnJhbWUoXG4gICAgICBydW5JZCxcbiAgICAgIHBsYW4sXG4gICAgICB2YWx1ZVN0b3JlLFxuICAgICAgZXZlbnRGYWN0b3J5XG4gICAgKTtcblxuICAgIGNvbnN0IGVtaXRGbiA9IGFzeW5jIChwYXJ0aWFsOiBQYXJ0aWFsPEdyYXBoRXhlY3V0aW9uRXZlbnQ+KSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICB0eXBlOiBwYXJ0aWFsLnR5cGUgPz8gR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9PVVRQVVQsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dJZDogd29ya2Zsb3cubmFtZSxcbiAgICAgICAgbm9kZUlkOiBwYXJ0aWFsLm5vZGVJZCxcbiAgICAgICAgcGF0aDogcGFydGlhbC5wYXRoID8/IHBhdGgsXG4gICAgICAgIC4uLnBhcnRpYWwsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX1NUQVJURUQsXG4gICAgICBydW5JZCxcbiAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgd29ya2Zsb3dJZDogd29ya2Zsb3cubmFtZSxcbiAgICAgIHBhdGgsXG4gICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlJVTk5JTkcsXG4gICAgICBwYXlsb2FkOiB7IGlucHV0cyB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX1BMQU5ORUQsXG4gICAgICBydW5JZCxcbiAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgd29ya2Zsb3dJZDogd29ya2Zsb3cubmFtZSxcbiAgICAgIHBhdGgsXG4gICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlBMQU5OSU5HLFxuICAgICAgcGF5bG9hZDogeyBsYXllcnM6IHBsYW4ubGF5ZXJzLmxlbmd0aCwgbm9kZXM6IHBsYW4ubm9kZXMubGVuZ3RoIH0sXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBwbGFuLmxheWVycykge1xuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbGF5ZXIubm9kZXMsIG9wdHMsIGVtaXRGbik7XG4gICAgICB9XG5cbiAgICAgIGZyYW1lLmZpbmlzaCgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19DT01QTEVURUQsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dJZDogd29ya2Zsb3cubmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgIHBheWxvYWQ6IHsgb3V0cHV0czogdmFsdWVTdG9yZS5nZXRXb3JrZmxvd1ZhbHVlcygpIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJ1aWxkR3JhcGhFeGVjdXRpb25SZXN1bHQoXG4gICAgICAgIGZyYW1lLFxuICAgICAgICB3b3JrZmxvdyxcbiAgICAgICAgaW5wdXRzLFxuICAgICAgICBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgIG9wdHMubWV0YWRhdGFcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZyYW1lLmZpbmlzaCgpO1xuICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0gdGhpcy50b0Vycm9yUGF5bG9hZChlcnJvcik7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX0ZBSUxFRCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCxcbiAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdChcbiAgICAgICAgZnJhbWUsXG4gICAgICAgIHdvcmtmbG93LFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCxcbiAgICAgICAgb3B0cy5tZXRhZGF0YVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGlucyBhIG5vZGUgYW5kIGl0cyB1cHN0cmVhbSBkZXBlbmRlbmNpZXMgYWZ0ZXIgYSBjb21wbGV0ZWQgcnVuLlxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIEdyYXBoUGlubmluZ1NlcnZpY2V9LiBUaGUgcGxhbiBhbmQgcmVzdWx0IG11c3QgY29tZVxuICAgKiBmcm9tIGEgcHJpb3Igc3VjY2Vzc2Z1bCBleGVjdXRpb24gb2YgdGhlIHNhbWUgd29ya2Zsb3cuXG4gICAqL1xuICBhc3luYyBwaW5Ob2RlKG9wdGlvbnM6IEdyYXBoUGluTm9kZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5jcmVhdGVQaW5uaW5nU2VydmljZSgpO1xuICAgIGF3YWl0IHNlcnZpY2UucGluTm9kZShvcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLmVtaXRQaW5uaW5nRXZlbnQob3B0aW9ucy5ub2RlSWQsIEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfUElOTkVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnBpbnMgYSBub2RlIGJ5IGl0cyBmaW5nZXJwcmludC5cbiAgICovXG4gIGFzeW5jIHVucGluTm9kZShvcHRpb25zOiBHcmFwaFVucGluTm9kZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5jcmVhdGVQaW5uaW5nU2VydmljZSgpO1xuICAgIGF3YWl0IHNlcnZpY2UudW5waW5Ob2RlKG9wdGlvbnMpO1xuICAgIGF3YWl0IHRoaXMuZW1pdFBpbm5pbmdFdmVudChvcHRpb25zLm5vZGVJZCwgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9VTlBJTk5FRCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBHcmFwaFBpbm5pbmdTZXJ2aWNlfSBiYWNrZWQgYnkgdGhpcyBlbmdpbmUncyB2YWx1ZSBzdG9yZVxuICAgKiBhZGFwdGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVQaW5uaW5nU2VydmljZSgpOiBHcmFwaFBpbm5pbmdTZXJ2aWNlIHtcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBHcmFwaFZhbHVlU3RvcmUodGhpcy52YWx1ZVN0b3JlQWRhcHRlcik7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFBpbm5pbmdTZXJ2aWNlKFxuICAgICAgc3RvcmUsXG4gICAgICBuZXcgR3JhcGhQaW5uaW5nUG9saWN5KCksXG4gICAgICBuZXcgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgcGlubmluZy1yZWxhdGVkIGV2ZW50IHRvIGFsbCBvYnNlcnZlcnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVtaXRQaW5uaW5nRXZlbnQoXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGVcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSgpO1xuICAgIGNvbnN0IGV2ZW50ID0gZmFjdG9yeS5jcmVhdGUoe1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBzZXF1ZW5jZTogMCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIHJ1bklkOiBcInBpbm5pbmdcIixcbiAgICAgIHdvcmtmbG93SWQ6IFwiXCIsXG4gICAgICB0eXBlLFxuICAgICAgbm9kZUlkLFxuICAgICAgcGF0aDogW10sXG4gICAgfSBhcyBPbWl0PEdyYXBoRXhlY3V0aW9uRXZlbnQsIFwiaWRcIiB8IFwic2VxdWVuY2VcIiB8IFwidGltZXN0YW1wXCI+KTtcbiAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGxheWVyIG9mIG5vZGVzIHdpdGggdGhlIGNvbmZpZ3VyZWQgY29uY3VycmVuY3kuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMYXllcihcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgbm9kZXM6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSxcbiAgICBvcHRzOiBHcmFwaEV4ZWN1dGlvbk9wdGlvbnMsXG4gICAgZW1pdEZuOiAoZXZlbnQ6IFBhcnRpYWw8R3JhcGhFeGVjdXRpb25FdmVudD4pID0+IFByb21pc2U8dm9pZD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBNYXRoLm1heChcbiAgICAgIDEsXG4gICAgICBvcHRzLmNvbmN1cnJlbmN5ID8/IEdSQVBIX0RFRkFVTFRfQ09OQ1VSUkVOQ1lcbiAgICApO1xuICAgIGNvbnN0IHF1ZXVlID0gWy4uLm5vZGVzXTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHF1ZXVlLnNwbGljZSgwLCBjb25jdXJyZW5jeSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgYmF0Y2gubWFwKChub2RlKSA9PiB0aGlzLmV4ZWN1dGVOb2RlKGZyYW1lLCBwbGFuLCBub2RlLCBvcHRzLCBlbWl0Rm4pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBzaW5nbGUgbm9kZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGxhbjogR3JhcGhFeGVjdXRpb25QbGFuLFxuICAgIHBsYW5Ob2RlOiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlLFxuICAgIG9wdHM6IEdyYXBoRXhlY3V0aW9uT3B0aW9ucyxcbiAgICBlbWl0Rm46IChldmVudDogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbkV2ZW50PikgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IG5vZGVQYXRoID0gWy4uLihvcHRzLnBhdGggPz8gW10pLCBwbGFuTm9kZS5pZF07XG5cbiAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9TVEFSVEVELFxuICAgICAgcnVuSWQ6IGZyYW1lLnJ1bklkLFxuICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgIHBhdGg6IG5vZGVQYXRoLFxuICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5SVU5OSU5HLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5wdXRzID0gdGhpcy5yZXNvbHZlTm9kZUlucHV0cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUpO1xuXG4gICAgLy8gQ2FjaGUtaGl0OiBjaGVjayBmb3IgYSBwaW5uZWQgdmFsdWUgYmVmb3JlIGV4ZWN1dGluZyB0aGUgbm9kZVxuICAgIGlmIChvcHRzLnVzZVBpbm5lZFZhbHVlcykge1xuICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy50cnlQaW5uZWRWYWx1ZShmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIGlucHV0cyk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0Tm9kZU91dHB1dHMocGxhbk5vZGUuaWQsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgdGhpcy5yb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBjYWNoZWQub3V0cHV0cyk7XG5cbiAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogR3JhcGhOb2RlRXhlY3V0aW9uUmVzdWx0ID0ge1xuICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5DQUNIRUQsXG4gICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgIG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzLFxuICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSxcbiAgICAgICAgICBwaW5uZWQ6IHRydWUsXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9DQUNIRV9ISVQsXG4gICAgICAgICAgcnVuSWQ6IGZyYW1lLnJ1bklkLFxuICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgIHBhdGg6IG5vZGVQYXRoLFxuICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgIHBheWxvYWQ6IHsgb3V0cHV0czogY2FjaGVkLm91dHB1dHMgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NPTVBMRVRFRCxcbiAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiBjYWNoZWQub3V0cHV0cywgZnJvbUNhY2hlOiB0cnVlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpcy5jb25maWcucmVnaXN0cnkucmVzb2x2ZShwbGFuTm9kZS5raW5kKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgR3JhcGhFeGVjdXRpb25Db250ZXh0KFxuICAgICAgICBmcmFtZS5ydW5JZCxcbiAgICAgICAgb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgcGxhbi53b3JrZmxvdyxcbiAgICAgICAgcGxhbk5vZGUuZGVmaW5pdGlvbixcbiAgICAgICAgbm9kZVBhdGgsXG4gICAgICAgIGVtaXRGbixcbiAgICAgICAgb3B0cy5tZXRhZGF0YVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUoaW5wdXRzLCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IHJlc29sdmVkT3V0cHV0cyA9IG91dHB1dHMgPz8ge307XG5cbiAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0Tm9kZU91dHB1dHMocGxhbk5vZGUuaWQsIHJlc29sdmVkT3V0cHV0cyk7XG4gICAgICB0aGlzLnJvdXRlT3V0Z29pbmdFZGdlcyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIHJlc29sdmVkT3V0cHV0cyk7XG5cbiAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgcmVzdWx0OiBHcmFwaE5vZGVFeGVjdXRpb25SZXN1bHQgPSB7XG4gICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuU1VDQ0VFREVELFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIG91dHB1dHM6IHJlc29sdmVkT3V0cHV0cyxcbiAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICBldmVudHM6IFtdLFxuICAgICAgfTtcbiAgICAgIGZyYW1lLnJlY29yZE5vZGVSZXN1bHQocmVzdWx0KTtcblxuICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9DT01QTEVURUQsXG4gICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgIHBheWxvYWQ6IHsgb3V0cHV0czogcmVzb2x2ZWRPdXRwdXRzIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLnRvRXJyb3JQYXlsb2FkKGVycm9yKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogR3JhcGhOb2RlRXhlY3V0aW9uUmVzdWx0ID0ge1xuICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCxcbiAgICAgICAgaW5wdXRzLFxuICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgIGV2ZW50czogW10sXG4gICAgICB9O1xuICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0ZBSUxFRCxcbiAgICAgICAgcnVuSWQ6IGZyYW1lLnJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgIHBhdGg6IG5vZGVQYXRoLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCxcbiAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0cy5mYWlsRmFzdCA/PyB0cnVlKSB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBub2RlJ3MgaW5wdXQgdmFsdWVzIGZyb20gaW5jb21pbmcgZWRnZXMuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlSW5wdXRzKFxuICAgIGZyYW1lOiBHcmFwaEV4ZWN1dGlvbkZyYW1lLFxuICAgIHBsYW46IEdyYXBoRXhlY3V0aW9uUGxhbixcbiAgICBwbGFuTm9kZTogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVxuICApOiBHcmFwaEV4ZWN1dGlvblZhbHVlcyB7XG4gICAgY29uc3QgaW5wdXRzOiBHcmFwaEV4ZWN1dGlvblZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IGluY29taW5nID0gcGxhbi5pbmNvbWluZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBpbmNvbWluZykge1xuICAgICAgaW5wdXRzW2VkZ2UudGFyZ2V0UG9ydF0gPSBmcmFtZS52YWx1ZVN0b3JlLmdldFBvcnQoXG4gICAgICAgIGVkZ2Uuc291cmNlTm9kZUlkLFxuICAgICAgICBlZGdlLnNvdXJjZVBvcnRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gcmVhZCBhIHBpbm5lZCB2YWx1ZSBmb3IgdGhlIG5vZGUuIFJldHVybnMgdGhlIGNhY2hlZCBvdXRwdXRzXG4gICAqIHdoZW4gYSB2YWxpZCBwaW5uZWQgdmFsdWUgZXhpc3RzLCBvciBgdW5kZWZpbmVkYCB0byBwcm9jZWVkIHdpdGggbm9ybWFsXG4gICAqIGV4ZWN1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJ5UGlubmVkVmFsdWUoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGxhbjogR3JhcGhFeGVjdXRpb25QbGFuLFxuICAgIHBsYW5Ob2RlOiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlLFxuICAgIGlucHV0czogR3JhcGhFeGVjdXRpb25WYWx1ZXNcbiAgKTogUHJvbWlzZTxHcmFwaENhY2hlZFZhbHVlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbmV3IEdyYXBoUGlubmluZ1BvbGljeSgpO1xuICAgIGlmICghcG9saWN5LnNob3VsZFVzZVBpbm5lZFZhbHVlKHBsYW5Ob2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgY29uc3QgZGVwRmluZ2VycHJpbnRzID0gdGhpcy5jb21wdXRlRGVwZW5kZW5jeUZpbmdlcnByaW50cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUuaWQpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlYWRQaW5uZWRWYWx1ZShcbiAgICAgIHBsYW4ud29ya2Zsb3csXG4gICAgICBwbGFuTm9kZSxcbiAgICAgIGlucHV0cyxcbiAgICAgIGRlcEZpbmdlcnByaW50c1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgY29tcHV0ZXMgZmluZ2VycHJpbnRzIGZvciBhbGwgdXBzdHJlYW0gZGVwZW5kZW5jaWVzIG9mIGEgbm9kZVxuICAgKiB1c2luZyB0aGUgcmVzdWx0cyBhbHJlYWR5IGFjY3VtdWxhdGVkIGluIHRoZSBmcmFtZS5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZURlcGVuZGVuY3lGaW5nZXJwcmludHMoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGxhbjogR3JhcGhFeGVjdXRpb25QbGFuLFxuICAgIG5vZGVJZDogc3RyaW5nXG4gICk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgY29uc3QgZGVwUmVzb2x2ZXIgPSBuZXcgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyKCk7XG4gICAgY29uc3QgZGVwcyA9IGRlcFJlc29sdmVyLmdldERlcGVuZGVuY2llcyhwbGFuLCBub2RlSWQpO1xuICAgIGNvbnN0IGZpbmdlcnByaW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwbGFuLm5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGRlcCk7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBjb25zdCBkZXBSZXN1bHQgPSBmcmFtZS5ub2RlUmVzdWx0cy5nZXQoZGVwKTtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZGVwUmVzdWx0Py5pbnB1dHMgPz8ge307XG4gICAgICAgIGNvbnN0IG5lc3RlZERlcHMgPSB0aGlzLmNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBkZXApO1xuICAgICAgICBmaW5nZXJwcmludHNbZGVwXSA9IHNlcnZpY2UuY29tcHV0ZUZpbmdlcnByaW50KFxuICAgICAgICAgIHBsYW4ud29ya2Zsb3csXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgbmVzdGVkRGVwc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmluZ2VycHJpbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlcyBhIG5vZGUncyBvdXRwdXRzIHRvIGRvd25zdHJlYW0gaW5wdXRzIGFuZCB3b3JrZmxvdyBvdXRwdXRzLlxuICAgKi9cbiAgcHJpdmF0ZSByb3V0ZU91dGdvaW5nRWRnZXMoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGxhbjogR3JhcGhFeGVjdXRpb25QbGFuLFxuICAgIHBsYW5Ob2RlOiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlLFxuICAgIG91dHB1dHM6IEdyYXBoRXhlY3V0aW9uVmFsdWVzXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG91dGdvaW5nID0gcGxhbi5vdXRnb2luZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRnb2luZykge1xuICAgICAgY29uc3QgdmFsdWUgPSBvdXRwdXRzW2VkZ2Uuc291cmNlUG9ydF07XG4gICAgICBpZiAoZWRnZS50YXJnZXROb2RlSWQgPT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZKSB7XG4gICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0V29ya2Zsb3dPdXRwdXQoZWRnZS50YXJnZXRQb3J0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5FREdFX1ZBTFVFX1JPVVRFRCxcbiAgICAgICAgcnVuSWQ6IGZyYW1lLnJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgIGVkZ2VJZDogZWRnZS5pZCxcbiAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgcGF0aDogW10sXG4gICAgICAgIHBheWxvYWQ6IHsgZWRnZSwgdmFsdWUgfSxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gb2JzZXJ2ZXIgZmFpbHVyZXMgbXVzdCBub3QgY3Jhc2hcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCwgcmVjb3JkcyBpdCBpbiB0aGUgZnJhbWUsIGFuZCBkaXNwYXRjaGVzIHRvIG9ic2VydmVycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1pdEV2ZW50KFxuICAgIGZyYW1lOiBHcmFwaEV4ZWN1dGlvbkZyYW1lLFxuICAgIHBhcnRpYWw6IFBhcnRpYWw8R3JhcGhFeGVjdXRpb25FdmVudD4gJiB7XG4gICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZTtcbiAgICAgIHJ1bklkOiBHcmFwaFJ1bklkO1xuICAgICAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAgICAgcGF0aDogc3RyaW5nW107XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudCA9IGZyYW1lLmV2ZW50RmFjdG9yeS5jcmVhdGUoe1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBzZXF1ZW5jZTogMCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIC4uLnBhcnRpYWwsXG4gICAgfSBhcyBPbWl0PEdyYXBoRXhlY3V0aW9uRXZlbnQsIFwiaWRcIiB8IFwic2VxdWVuY2VcIiB8IFwidGltZXN0YW1wXCI+KTtcbiAgICBmcmFtZS5hcHBlbmRFdmVudChldmVudCk7XG4gICAgYXdhaXQgdGhpcy5lbWl0dGVyLnVwZGF0ZU9ic2VydmVycyhldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZU9wdGlvbnMoXG4gICAgb3B0aW9uczogR3JhcGhFeGVjdXRpb25PcHRpb25zXG4gICk6IEdyYXBoRXhlY3V0aW9uT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmN1cnJlbmN5OiBHUkFQSF9ERUZBVUxUX0NPTkNVUlJFTkNZLFxuICAgICAgZmFpbEZhc3Q6IHRydWUsXG4gICAgICB2YWxpZGF0ZUlucHV0czogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlT3V0cHV0czogdHJ1ZSxcbiAgICAgIHVzZVBpbm5lZFZhbHVlczogdHJ1ZSxcbiAgICAgIHdyaXRlVGhyb3VnaENhY2hlOiBmYWxzZSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgLi4udGhpcy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgcnVuIGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdsb2JhbFRoaXMuY3J5cHRvPy5yYW5kb21VVUlEPy4oKSA/P1xuICAgICAgYGdyYXBoLXJ1bi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gZXJyb3IgaW50byBhIHNlcmlhbGl6ZWQgcGF5bG9hZC5cbiAgICovXG4gIHByaXZhdGUgdG9FcnJvclBheWxvYWQoZXJyb3I6IHVua25vd24pOiBHcmFwaEV4ZWN1dGlvbkVycm9yUGF5bG9hZCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICAgICAgY29kZTpcbiAgICAgICAgICAoZXJyb3IgYXMgYW55KS5ncmFwaENvZGUgPz9cbiAgICAgICAgICAodHlwZW9mIChlcnJvciBhcyBhbnkpLmNvZGUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgID8gU3RyaW5nKChlcnJvciBhcyBhbnkpLmNvZGUpXG4gICAgICAgICAgICA6IChlcnJvciBhcyBhbnkpLmNvZGUpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbmFtZTogXCJVbmtub3duRXJyb3JcIiwgbWVzc2FnZTogU3RyaW5nKGVycm9yKSB9O1xuICB9XG59XG4iXX0=
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJHcmFwaEV4ZWN1dGlvbkVuZ2luZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBd0Y7QUFDeEYsOERBQTZGO0FBQzdGLDZGQUF1RjtBQUN2Riw2RkFBdUY7QUFDdkYscUZBQStFO0FBQy9FLG9HQUE4RjtBQUM5RixzRUFBZ0U7QUFDaEUsZ0ZBQTBFO0FBQzFFLDhFQUF3RTtBQUN4RSxzR0FBZ0c7QUFDaEcseUVBQW1FO0FBQ25FLHFFQUErRDtBQUMvRCx1RUFBc0U7QUFDdEU7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsb0JBQW9CO0lBQzdCLFlBQVksTUFBTTtRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLDBEQUEwQixFQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksZ0RBQXFCLEVBQUUsQ0FBQztRQUM3RCxJQUFJLENBQUMsaUJBQWlCO1lBQ2xCLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLGtFQUE4QixFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLFFBQVE7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxTQUFTLENBQUMsUUFBUTtRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEs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S0FBSztRQUNoQixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPO2dCQUNILElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUztvQkFDakIsQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTt3QkFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUNwQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzthQUN4QixDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0NBQ0o7QUF6WEQsb0RBeVhDO0FBQ0QsMHgwQ0FBMHgwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdSQVBIX0RFRkFVTFRfQ09OQ1VSUkVOQ1ksIEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZLCB9IGZyb20gXCIuLy4uL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUsIEdyYXBoRXhlY3V0aW9uU3RhdHVzLCB9IGZyb20gXCIuLy4uLy4uL3NoYXJlZC9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4vLi4vZXZlbnRzL0dyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyLmpzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSB9IGZyb20gXCIuLy4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25QbGFubmVyIH0gZnJvbSBcIi4vLi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzXCI7XG5pbXBvcnQgeyBJbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIgfSBmcm9tIFwiLi8uLi9zdG9yZS9Jbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIuanNcIjtcbmltcG9ydCB7IEdyYXBoVmFsdWVTdG9yZSB9IGZyb20gXCIuLy4uL3N0b3JlL0dyYXBoVmFsdWVTdG9yZS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nU2VydmljZSB9IGZyb20gXCIuLy4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nUG9saWN5IH0gZnJvbSBcIi4vLi4vcGlubmluZy9HcmFwaFBpbm5pbmdQb2xpY3kuanNcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlciB9IGZyb20gXCIuLy4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyLmpzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkNvbnRleHQuanNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRnJhbWUgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkZyYW1lLmpzXCI7XG5pbXBvcnQgeyBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25SZXN1bHQuanNcIjtcbi8qKlxuICogUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKlxuICogRXhlY3V0ZXMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGJ5OlxuICogMS4gUGxhbm5pbmcgdGhlIHdvcmtmbG93IGludG8gdG9wb2xvZ2ljYWwgbGF5ZXJzLlxuICogMi4gU2VlZGluZyB3b3JrZmxvdyBpbnB1dHMgaW50byB0aGUgdmFsdWUgc3RvcmUuXG4gKiAzLiBFeGVjdXRpbmcgbm9kZXMgbGF5ZXItYnktbGF5ZXIgd2l0aCBjb25maWd1cmFibGUgY29uY3VycmVuY3kuXG4gKiA0LiBSb3V0aW5nIHZhbHVlcyBhbG9uZyBlZGdlcy5cbiAqIDUuIEVtaXR0aW5nIHN0cnVjdHVyZWQgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLlxuICogNi4gUmV0dXJuaW5nIGEgY29tcGxldGUge0BsaW5rIEdyYXBoRXhlY3V0aW9uUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uRW5naW5lIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gY29uZmlnLmV2ZW50RW1pdHRlciA/PyBuZXcgR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wbGFubmVyID0gY29uZmlnLnBsYW5uZXIgPz8gbmV3IEdyYXBoRXhlY3V0aW9uUGxhbm5lcigpO1xuICAgICAgICB0aGlzLnZhbHVlU3RvcmVBZGFwdGVyID1cbiAgICAgICAgICAgIGNvbmZpZy52YWx1ZVN0b3JlQWRhcHRlciA/PyBuZXcgSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyKCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBjb25maWcuZGVmYXVsdE9wdGlvbnMgPz8ge307XG4gICAgICAgIHRoaXMuY29kZVNhbmRib3hFdmFsdWF0b3IgPSBjb25maWcuY29kZVNhbmRib3hFdmFsdWF0b3I7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBjb25maWcub25FbmdpbmVDcmVhdGVkPy4odGhpcyk7XG4gICAgfVxuICAgIG9ic2VydmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vYnNlcnZlKG9ic2VydmVyKTtcbiAgICB9XG4gICAgdW5PYnNlcnZlKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoZXZlbnQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0dGVyLnVwZGF0ZU9ic2VydmVycyhldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgd29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gaW5wdXRzIGFuZCBvcHRpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUod29ya2Zsb3csIGlucHV0cyA9IHt9LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMubWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gdGhpcy5nZW5lcmF0ZVJ1bklkKCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBvcHRzLnBhdGggPz8gW107XG4gICAgICAgIGNvbnN0IGV2ZW50RmFjdG9yeSA9IG5ldyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSgpO1xuICAgICAgICBjb25zdCB2YWx1ZVN0b3JlID0gbmV3IEdyYXBoVmFsdWVTdG9yZSh0aGlzLnZhbHVlU3RvcmVBZGFwdGVyKTtcbiAgICAgICAgdmFsdWVTdG9yZS5zZWVkV29ya2Zsb3dJbnB1dHMoaW5wdXRzKTtcbiAgICAgICAgY29uc3QgcGxhbiA9IHRoaXMucGxhbm5lci5wbGFuKHdvcmtmbG93KTtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgR3JhcGhFeGVjdXRpb25GcmFtZShydW5JZCwgcGxhbiwgdmFsdWVTdG9yZSwgZXZlbnRGYWN0b3J5KTtcbiAgICAgICAgY29uc3QgZW1pdEZuID0gYXN5bmMgKHBhcnRpYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFydGlhbC50eXBlID8/IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfT1VUUFVULFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgICAgbm9kZUlkOiBwYXJ0aWFsLm5vZGVJZCxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXJ0aWFsLnBhdGggPz8gcGF0aCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19TVEFSVEVELFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5SVU5OSU5HLFxuICAgICAgICAgICAgcGF5bG9hZDogeyBpbnB1dHMgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19QTEFOTkVELFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5QTEFOTklORyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHsgbGF5ZXJzOiBwbGFuLmxheWVycy5sZW5ndGgsIG5vZGVzOiBwbGFuLm5vZGVzLmxlbmd0aCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgcGxhbi5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbGF5ZXIubm9kZXMsIG9wdHMsIGVtaXRGbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcmFtZS5maW5pc2goKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfQ09NUExFVEVELFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IHZhbHVlU3RvcmUuZ2V0V29ya2Zsb3dWYWx1ZXMoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdChmcmFtZSwgd29ya2Zsb3csIGlucHV0cywgR3JhcGhFeGVjdXRpb25TdGF0dXMuU1VDQ0VFREVELCBvcHRzLm1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZyYW1lLmZpbmlzaCgpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0gdGhpcy50b0Vycm9yUGF5bG9hZChlcnJvcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkR3JhcGhFeGVjdXRpb25SZXN1bHQoZnJhbWUsIHdvcmtmbG93LCBpbnB1dHMsIEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCwgb3B0cy5tZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUGlucyBhIG5vZGUgYW5kIGl0cyB1cHN0cmVhbSBkZXBlbmRlbmNpZXMgYWZ0ZXIgYSBjb21wbGV0ZWQgcnVuLlxuICAgICAqXG4gICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBHcmFwaFBpbm5pbmdTZXJ2aWNlfS4gVGhlIHBsYW4gYW5kIHJlc3VsdCBtdXN0IGNvbWVcbiAgICAgKiBmcm9tIGEgcHJpb3Igc3VjY2Vzc2Z1bCBleGVjdXRpb24gb2YgdGhlIHNhbWUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgYXN5bmMgcGluTm9kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgICAgIGF3YWl0IHNlcnZpY2UucGluTm9kZShvcHRpb25zKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0UGlubmluZ0V2ZW50KG9wdGlvbnMubm9kZUlkLCBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1BJTk5FRCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucGlucyBhIG5vZGUgYnkgaXRzIGZpbmdlcnByaW50LlxuICAgICAqL1xuICAgIGFzeW5jIHVucGluTm9kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgICAgIGF3YWl0IHNlcnZpY2UudW5waW5Ob2RlKG9wdGlvbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXRQaW5uaW5nRXZlbnQob3B0aW9ucy5ub2RlSWQsIEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfVU5QSU5ORUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEdyYXBoUGlubmluZ1NlcnZpY2V9IGJhY2tlZCBieSB0aGlzIGVuZ2luZSdzIHZhbHVlIHN0b3JlXG4gICAgICogYWRhcHRlci5cbiAgICAgKi9cbiAgICBjcmVhdGVQaW5uaW5nU2VydmljZSgpIHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBuZXcgR3JhcGhWYWx1ZVN0b3JlKHRoaXMudmFsdWVTdG9yZUFkYXB0ZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEdyYXBoUGlubmluZ1NlcnZpY2Uoc3RvcmUsIG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKSwgbmV3IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBwaW5uaW5nLXJlbGF0ZWQgZXZlbnQgdG8gYWxsIG9ic2VydmVycy5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0UGlubmluZ0V2ZW50KG5vZGVJZCwgdHlwZSkge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICBzZXF1ZW5jZTogMCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHJ1bklkOiBcInBpbm5pbmdcIixcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IFwiXCIsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBsYXllciBvZiBub2RlcyB3aXRoIHRoZSBjb25maWd1cmVkIGNvbmN1cnJlbmN5LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbm9kZXMsIG9wdHMsIGVtaXRGbikge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWF4KDEsIG9wdHMuY29uY3VycmVuY3kgPz8gR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSk7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLm5vZGVzXTtcbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIGNvbmN1cnJlbmN5KTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoLm1hcCgobm9kZSkgPT4gdGhpcy5leGVjdXRlTm9kZShmcmFtZSwgcGxhbiwgbm9kZSwgb3B0cywgZW1pdEZuKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgc2luZ2xlIG5vZGUuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZU5vZGUoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBvcHRzLCBlbWl0Rm4pIHtcbiAgICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3Qgbm9kZVBhdGggPSBbLi4uKG9wdHMucGF0aCA/PyBbXSksIHBsYW5Ob2RlLmlkXTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfU1RBUlRFRCxcbiAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMucmVzb2x2ZU5vZGVJbnB1dHMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlKTtcbiAgICAgICAgLy8gQ2FjaGUtaGl0OiBjaGVjayBmb3IgYSBwaW5uZWQgdmFsdWUgYmVmb3JlIGV4ZWN1dGluZyB0aGUgbm9kZVxuICAgICAgICBpZiAob3B0cy51c2VQaW5uZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMudHJ5UGlubmVkVmFsdWUoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBpbnB1dHMpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0Tm9kZU91dHB1dHMocGxhbk5vZGUuaWQsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlT3V0Z29pbmdFZGdlcyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzLFxuICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfQ0FDSEVfSElULFxuICAgICAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICAgICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9DT01QTEVURUQsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgb3V0cHV0czogY2FjaGVkLm91dHB1dHMsIGZyb21DYWNoZTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLmNvbmZpZy5yZWdpc3RyeS5yZXNvbHZlKHBsYW5Ob2RlLmtpbmQpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQoZnJhbWUucnVuSWQsIG9wdHMucGFyZW50UnVuSWQsIHBsYW4ud29ya2Zsb3csIHBsYW5Ob2RlLmRlZmluaXRpb24sIG5vZGVQYXRoLCBlbWl0Rm4sIG9wdHMubWV0YWRhdGEpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUoaW5wdXRzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3V0cHV0cyA9IG91dHB1dHMgPz8ge307XG4gICAgICAgICAgICBmcmFtZS52YWx1ZVN0b3JlLnNldE5vZGVPdXRwdXRzKHBsYW5Ob2RlLmlkLCByZXNvbHZlZE91dHB1dHMpO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCByZXNvbHZlZE91dHB1dHMpO1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgb3V0cHV0czogcmVzb2x2ZWRPdXRwdXRzLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NPTVBMRVRFRCxcbiAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiByZXNvbHZlZE91dHB1dHMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLnRvRXJyb3JQYXlsb2FkKGVycm9yKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdHMuZmFpbEZhc3QgPz8gdHJ1ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIG5vZGUncyBpbnB1dCB2YWx1ZXMgZnJvbSBpbmNvbWluZyBlZGdlcy5cbiAgICAgKi9cbiAgICByZXNvbHZlTm9kZUlucHV0cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0ge307XG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcGxhbi5pbmNvbWluZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgaW5jb21pbmcpIHtcbiAgICAgICAgICAgIGlucHV0c1tlZGdlLnRhcmdldFBvcnRdID0gZnJhbWUudmFsdWVTdG9yZS5nZXRQb3J0KGVkZ2Uuc291cmNlTm9kZUlkLCBlZGdlLnNvdXJjZVBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIHJlYWQgYSBwaW5uZWQgdmFsdWUgZm9yIHRoZSBub2RlLiBSZXR1cm5zIHRoZSBjYWNoZWQgb3V0cHV0c1xuICAgICAqIHdoZW4gYSB2YWxpZCBwaW5uZWQgdmFsdWUgZXhpc3RzLCBvciBgdW5kZWZpbmVkYCB0byBwcm9jZWVkIHdpdGggbm9ybWFsXG4gICAgICogZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHRyeVBpbm5lZFZhbHVlKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKTtcbiAgICAgICAgaWYgKCFwb2xpY3kuc2hvdWxkVXNlUGlubmVkVmFsdWUocGxhbk5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICAgICAgY29uc3QgZGVwRmluZ2VycHJpbnRzID0gdGhpcy5jb21wdXRlRGVwZW5kZW5jeUZpbmdlcnByaW50cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUuaWQpO1xuICAgICAgICByZXR1cm4gc2VydmljZS5yZWFkUGlubmVkVmFsdWUocGxhbi53b3JrZmxvdywgcGxhbk5vZGUsIGlucHV0cywgZGVwRmluZ2VycHJpbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgY29tcHV0ZXMgZmluZ2VycHJpbnRzIGZvciBhbGwgdXBzdHJlYW0gZGVwZW5kZW5jaWVzIG9mIGEgbm9kZVxuICAgICAqIHVzaW5nIHRoZSByZXN1bHRzIGFscmVhZHkgYWNjdW11bGF0ZWQgaW4gdGhlIGZyYW1lLlxuICAgICAqL1xuICAgIGNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBub2RlSWQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICAgICAgY29uc3QgZGVwUmVzb2x2ZXIgPSBuZXcgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBkZXBSZXNvbHZlci5nZXREZXBlbmRlbmNpZXMocGxhbiwgbm9kZUlkKTtcbiAgICAgICAgY29uc3QgZmluZ2VycHJpbnRzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwbGFuLm5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGRlcCk7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IGZyYW1lLm5vZGVSZXN1bHRzLmdldChkZXApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IGRlcFJlc3VsdD8uaW5wdXRzID8/IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZERlcHMgPSB0aGlzLmNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBkZXApO1xuICAgICAgICAgICAgICAgIGZpbmdlcnByaW50c1tkZXBdID0gc2VydmljZS5jb21wdXRlRmluZ2VycHJpbnQocGxhbi53b3JrZmxvdywgbm9kZSwgaW5wdXRzLCBuZXN0ZWREZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluZ2VycHJpbnRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3V0ZXMgYSBub2RlJ3Mgb3V0cHV0cyB0byBkb3duc3RyZWFtIGlucHV0cyBhbmQgd29ya2Zsb3cgb3V0cHV0cy5cbiAgICAgKi9cbiAgICByb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBvdXRwdXRzKSB7XG4gICAgICAgIGNvbnN0IG91dGdvaW5nID0gcGxhbi5vdXRnb2luZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2Ygb3V0Z29pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3V0cHV0c1tlZGdlLnNvdXJjZVBvcnRdO1xuICAgICAgICAgICAgaWYgKGVkZ2UudGFyZ2V0Tm9kZUlkID09PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSkge1xuICAgICAgICAgICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0V29ya2Zsb3dPdXRwdXQoZWRnZS50YXJnZXRQb3J0LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkVER0VfVkFMVUVfUk9VVEVELFxuICAgICAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgICAgICAgICAgZWRnZUlkOiBlZGdlLmlkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlZGdlLCB2YWx1ZSB9LFxuICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG9ic2VydmVyIGZhaWx1cmVzIG11c3Qgbm90IGNyYXNoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCwgcmVjb3JkcyBpdCBpbiB0aGUgZnJhbWUsIGFuZCBkaXNwYXRjaGVzIHRvIG9ic2VydmVycy5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0RXZlbnQoZnJhbWUsIHBhcnRpYWwpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBmcmFtZS5ldmVudEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgICAgIGlkOiBcIlwiLFxuICAgICAgICAgICAgc2VxdWVuY2U6IDAsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICB9KTtcbiAgICAgICAgZnJhbWUuYXBwZW5kRXZlbnQoZXZlbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgICAqL1xuICAgIG1lcmdlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICAgIGZhaWxGYXN0OiB0cnVlLFxuICAgICAgICAgICAgdmFsaWRhdGVJbnB1dHM6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZU91dHB1dHM6IHRydWUsXG4gICAgICAgICAgICB1c2VQaW5uZWRWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgICB3cml0ZVRocm91Z2hDYWNoZTogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgcnVuIGlkLlxuICAgICAqL1xuICAgIGdlbmVyYXRlUnVuSWQoKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQ/LigpID8/XG4gICAgICAgICAgICBgZ3JhcGgtcnVuLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gZXJyb3IgaW50byBhIHNlcmlhbGl6ZWQgcGF5bG9hZC5cbiAgICAgKi9cbiAgICB0b0Vycm9yUGF5bG9hZChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICAgICAgICAgIGNvZGU6IGVycm9yLmdyYXBoQ29kZSA/P1xuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGVycm9yLmNvZGUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVycm9yLmNvZGUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIlVua25vd25FcnJvclwiLCBtZXNzYWdlOiBTdHJpbmcoZXJyb3IpIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pUjNKaGNHaEZlR1ZqZFhScGIyNUZibWRwYm1VdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUl1TGk4dUxpOHVMaTh1TGk4dUxpOXpjbU12WjNKaGNHZ3ZaVzVuYVc1bEwyVjRaV04xZEdsdmJpOUhjbUZ3YUVWNFpXTjFkR2x2YmtWdVoybHVaUzUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGUlFTeFBRVUZQTEVWQlEwd3NlVUpCUVhsQ0xFVkJRM3BDTEhWQ1FVRjFRaXhIUVVONFFpd3dRa0ZCY1VJN1FVRkRkRUlzVDBGQlR5eEZRVU5NTEhWQ1FVRjFRaXhGUVVOMlFpeHZRa0ZCYjBJc1IwRkRja0lzYjBOQlFTdENPMEZCWVdoRExFOUJRVThzUlVGQlJTd3dRa0ZCTUVJc1JVRkJSU3hyUkVGQk5rTTdRVUZEYkVZc1QwRkJUeXhGUVVGRkxEQkNRVUV3UWl4RlFVRkZMR3RFUVVFMlF6dEJRVVZzUml4UFFVRlBMRVZCUVVVc2NVSkJRWEZDTEVWQlFVVXNLME5CUVRCRE8wRkJTVEZGTEU5QlFVOHNSVUZCUlN3NFFrRkJPRUlzUlVGQlJTeHhSRUZCWjBRN1FVRkRla1lzVDBGQlR5eEZRVUZGTEdWQlFXVXNSVUZCUlN4elEwRkJhVU03UVVGRk0wUXNUMEZCVHl4RlFVRkZMRzFDUVVGdFFpeEZRVUZGTERSRFFVRjFRenRCUVVOeVJTeFBRVUZQTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzTWtOQlFYTkRPMEZCUTI1RkxFOUJRVThzUlVGQlJTdzRRa0ZCT0VJc1JVRkJSU3gxUkVGQmEwUTdRVUZETTBZc1QwRkJUeXhGUVVGRkxIRkNRVUZ4UWl4RlFVRkZMRzFEUVVGblF6dEJRVU5vUlN4UFFVRlBMRVZCUVVVc2JVSkJRVzFDTEVWQlFVVXNhVU5CUVRoQ08wRkJRelZFTEU5QlFVOHNSVUZCUlN4NVFrRkJlVUlzUlVGQlJTeHJRMEZCSzBJN1FVRTBRbTVGT3pzN096czdPenM3TzBkQlZVYzdRVUZEU0N4TlFVRk5MRTlCUVU4c2IwSkJRVzlDTzBsQlV5OUNMRmxCUVZrc1RVRkJhME03VVVGRE5VTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeEpRVUZKTEVsQlFVa3NNRUpCUVRCQ0xFVkJRVVVzUTBGQlF6dFJRVU4yUlN4SlFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFMUJRVTBzUTBGQlF5eFBRVUZQTEVsQlFVa3NTVUZCU1N4eFFrRkJjVUlzUlVGQlJTeERRVUZETzFGQlF6ZEVMRWxCUVVrc1EwRkJReXhwUWtGQmFVSTdXVUZEY0VJc1RVRkJUU3hEUVVGRExHbENRVUZwUWl4SlFVRkpMRWxCUVVrc09FSkJRVGhDTEVWQlFVVXNRMEZCUXp0UlFVTnVSU3hKUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEUxQlFVMHNRMEZCUXl4alFVRmpMRWxCUVVrc1JVRkJSU3hEUVVGRE8xRkJRMnhFTEVsQlFVa3NRMEZCUXl4dlFrRkJiMElzUjBGQlJ5eE5RVUZOTEVOQlFVTXNiMEpCUVc5Q0xFTkJRVU03VVVGRGVFUXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03VVVGRGNrSXNUVUZCVFN4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzBsQlEycERMRU5CUVVNN1NVRkpSQ3hQUVVGUExFTkJRVU1zVVVGQlowTTdVVUZEZEVNc1QwRkJUeXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRKUVVONFF5eERRVUZETzBsQlJVUXNVMEZCVXl4RFFVRkRMRkZCUVdkRE8xRkJRM2hETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBsQlEyNURMRU5CUVVNN1NVRkZSQ3hMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEV0QlFUQkNPMUZCUXpsRExFMUJRVTBzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4bFFVRmxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03U1VGRE5VTXNRMEZCUXp0SlFVVkVPenRQUVVWSE8wbEJRMGdzUzBGQlN5eERRVUZETEU5QlFVOHNRMEZEV0N4UlFVRnBReXhGUVVOcVF5eFRRVUVyUWl4RlFVRkZMRVZCUTJwRExGVkJRV2xETEVWQlFVVTdVVUZGYmtNc1RVRkJUU3hKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRSUVVONFF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhKUVVGSkxFbEJRVWtzUTBGQlF5eGhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTnFSQ3hOUVVGTkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVc1EwRkJRenRSUVVNM1FpeE5RVUZOTEZsQlFWa3NSMEZCUnl4SlFVRkpMREJDUVVFd1FpeEZRVUZGTEVOQlFVTTdVVUZEZEVRc1RVRkJUU3hWUVVGVkxFZEJRVWNzU1VGQlNTeGxRVUZsTEVOQlFVTXNTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEVOQlFVTTdVVUZETDBRc1ZVRkJWU3hEUVVGRExHdENRVUZyUWl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8xRkJSWFJETEUxQlFVMHNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMUZCUTNwRExFMUJRVTBzUzBGQlN5eEhRVUZITEVsQlFVa3NiVUpCUVcxQ0xFTkJRMjVETEV0QlFVc3NSVUZEVEN4SlFVRkpMRVZCUTBvc1ZVRkJWU3hGUVVOV0xGbEJRVmtzUTBGRFlpeERRVUZETzFGQlJVWXNUVUZCVFN4TlFVRk5MRWRCUVVjc1MwRkJTeXhGUVVGRkxFOUJRWEZETEVWQlFVVXNSVUZCUlR0WlFVTTNSQ3hOUVVGTkxFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNTMEZCU3l4RlFVRkZPMmRDUVVNeFFpeEpRVUZKTEVWQlFVVXNUMEZCVHl4RFFVRkRMRWxCUVVrc1NVRkJTU3gxUWtGQmRVSXNRMEZCUXl4WFFVRlhPMmRDUVVONlJDeExRVUZMTzJkQ1FVTk1MRmRCUVZjc1JVRkJSU3hKUVVGSkxFTkJRVU1zVjBGQlZ6dG5Ra0ZETjBJc1ZVRkJWU3hGUVVGRkxGRkJRVkVzUTBGQlF5eEpRVUZKTzJkQ1FVTjZRaXhOUVVGTkxFVkJRVVVzVDBGQlR5eERRVUZETEUxQlFVMDdaMEpCUTNSQ0xFbEJRVWtzUlVGQlJTeFBRVUZQTEVOQlFVTXNTVUZCU1N4SlFVRkpMRWxCUVVrN1owSkJRekZDTEVkQlFVY3NUMEZCVHp0aFFVTllMRU5CUVVNc1EwRkJRenRSUVVOTUxFTkJRVU1zUTBGQlF6dFJRVVZHTEUxQlFVMHNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhMUVVGTExFVkJRVVU3V1VGRE1VSXNTVUZCU1N4RlFVRkZMSFZDUVVGMVFpeERRVUZETEdkQ1FVRm5RanRaUVVNNVF5eExRVUZMTzFsQlEwd3NWMEZCVnl4RlFVRkZMRWxCUVVrc1EwRkJReXhYUVVGWE8xbEJRemRDTEZWQlFWVXNSVUZCUlN4UlFVRlJMRU5CUVVNc1NVRkJTVHRaUVVONlFpeEpRVUZKTzFsQlEwb3NUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEU5QlFVODdXVUZEY0VNc1QwRkJUeXhGUVVGRkxFVkJRVVVzVFVGQlRTeEZRVUZGTzFOQlEzQkNMRU5CUVVNc1EwRkJRenRSUVVWSUxFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1dVRkRNVUlzU1VGQlNTeEZRVUZGTEhWQ1FVRjFRaXhEUVVGRExHZENRVUZuUWp0WlFVTTVReXhMUVVGTE8xbEJRMHdzVjBGQlZ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4WFFVRlhPMWxCUXpkQ0xGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1R0WlFVTjZRaXhKUVVGSk8xbEJRMG9zVFVGQlRTeEZRVUZGTEc5Q1FVRnZRaXhEUVVGRExGRkJRVkU3V1VGRGNrTXNUMEZCVHl4RlFVRkZMRVZCUVVVc1RVRkJUU3hGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RlFVRkZMRXRCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNSVUZCUlR0VFFVTnNSU3hEUVVGRExFTkJRVU03VVVGRlNDeEpRVUZKTEVOQlFVTTdXVUZEU0N4TFFVRkxMRTFCUVUwc1MwRkJTeXhKUVVGSkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0blFrRkRhRU1zVFVGQlRTeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRXRCUVVzc1JVRkJSU3hKUVVGSkxFVkJRVVVzUzBGQlN5eERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03V1VGRGJFVXNRMEZCUXp0WlFVVkVMRXRCUVVzc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFpRVVZtTEUxQlFVMHNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhMUVVGTExFVkJRVVU3WjBKQlF6RkNMRWxCUVVrc1JVRkJSU3gxUWtGQmRVSXNRMEZCUXl4clFrRkJhMEk3WjBKQlEyaEVMRXRCUVVzN1owSkJRMHdzVjBGQlZ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4WFFVRlhPMmRDUVVNM1FpeFZRVUZWTEVWQlFVVXNVVUZCVVN4RFFVRkRMRWxCUVVrN1owSkJRM3BDTEVsQlFVazdaMEpCUTBvc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRk5CUVZNN1owSkJRM1JETEU5QlFVOHNSVUZCUlN4RlFVRkZMRTlCUVU4c1JVRkJSU3hWUVVGVkxFTkJRVU1zYVVKQlFXbENMRVZCUVVVc1JVRkJSVHRoUVVOeVJDeERRVUZETEVOQlFVTTdXVUZGU0N4UFFVRlBMSGxDUVVGNVFpeERRVU01UWl4TFFVRkxMRVZCUTB3c1VVRkJVU3hGUVVOU0xFMUJRVTBzUlVGRFRpeHZRa0ZCYjBJc1EwRkJReXhUUVVGVExFVkJRemxDTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUTJRc1EwRkJRenRSUVVOS0xFTkJRVU03VVVGQlF5eFBRVUZQTEV0QlFVc3NSVUZCUlN4RFFVRkRPMWxCUTJZc1MwRkJTeXhEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFsQlEyWXNUVUZCVFN4WlFVRlpMRWRCUVVjc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0WlFVVm9SQ3hOUVVGTkxFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNTMEZCU3l4RlFVRkZPMmRDUVVNeFFpeEpRVUZKTEVWQlFVVXNkVUpCUVhWQ0xFTkJRVU1zWlVGQlpUdG5Ra0ZETjBNc1MwRkJTenRuUWtGRFRDeFhRVUZYTEVWQlFVVXNTVUZCU1N4RFFVRkRMRmRCUVZjN1owSkJRemRDTEZWQlFWVXNSVUZCUlN4UlFVRlJMRU5CUVVNc1NVRkJTVHRuUWtGRGVrSXNTVUZCU1R0blFrRkRTaXhOUVVGTkxFVkJRVVVzYjBKQlFXOUNMRU5CUVVNc1RVRkJUVHRuUWtGRGJrTXNTMEZCU3l4RlFVRkZMRmxCUVZrN1lVRkRjRUlzUTBGQlF5eERRVUZETzFsQlJVZ3NUMEZCVHl4NVFrRkJlVUlzUTBGRE9VSXNTMEZCU3l4RlFVTk1MRkZCUVZFc1JVRkRVaXhOUVVGTkxFVkJRMDRzYjBKQlFXOUNMRU5CUVVNc1RVRkJUU3hGUVVNelFpeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVTmtMRU5CUVVNN1VVRkRTaXhEUVVGRE8wbEJRMGdzUTBGQlF6dEpRVVZFT3pzN096dFBRVXRITzBsQlEwZ3NTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhQUVVFMFFqdFJRVU40UXl4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zYjBKQlFXOUNMRVZCUVVVc1EwRkJRenRSUVVNMVF5eE5RVUZOTEU5QlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03VVVGREwwSXNUVUZCVFN4SlFVRkpMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1JVRkJSU3gxUWtGQmRVSXNRMEZCUXl4WFFVRlhMRU5CUVVNc1EwRkJRenRKUVVOdVJpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTQ3hMUVVGTExFTkJRVU1zVTBGQlV5eERRVUZETEU5QlFUaENPMUZCUXpWRExFMUJRVTBzVDBGQlR5eEhRVUZITEVsQlFVa3NRMEZCUXl4dlFrRkJiMElzUlVGQlJTeERRVUZETzFGQlF6VkRMRTFCUVUwc1QwRkJUeXhEUVVGRExGTkJRVk1zUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0UlFVTnFReXhOUVVGTkxFbEJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEhWQ1FVRjFRaXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETzBsQlEzSkdMRU5CUVVNN1NVRkZSRHM3TzA5QlIwYzdTVUZEU3l4dlFrRkJiMEk3VVVGRE1VSXNUVUZCVFN4TFFVRkxMRWRCUVVjc1NVRkJTU3hsUVVGbExFTkJRVU1zU1VGQlNTeERRVUZETEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03VVVGRE1VUXNUMEZCVHl4SlFVRkpMRzFDUVVGdFFpeERRVU0xUWl4TFFVRkxMRVZCUTB3c1NVRkJTU3hyUWtGQmEwSXNSVUZCUlN4RlFVTjRRaXhKUVVGSkxEaENRVUU0UWl4RlFVRkZMRU5CUTNKRExFTkJRVU03U1VGRFNpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhMUVVGTExFTkJRVU1zWjBKQlFXZENMRU5CUXpWQ0xFMUJRV01zUlVGRFpDeEpRVUUyUWp0UlFVVTNRaXhOUVVGTkxFOUJRVThzUjBGQlJ5eEpRVUZKTERCQ1FVRXdRaXhGUVVGRkxFTkJRVU03VVVGRGFrUXNUVUZCVFN4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF6dFpRVU16UWl4RlFVRkZMRVZCUVVVc1JVRkJSVHRaUVVOT0xGRkJRVkVzUlVGQlJTeERRVUZETzFsQlExZ3NVMEZCVXl4RlFVRkZMRWxCUVVrc1NVRkJTU3hGUVVGRk8xbEJRM0pDTEV0QlFVc3NSVUZCUlN4VFFVRlRPMWxCUTJoQ0xGVkJRVlVzUlVGQlJTeEZRVUZGTzFsQlEyUXNTVUZCU1R0WlFVTktMRTFCUVUwN1dVRkRUaXhKUVVGSkxFVkJRVVVzUlVGQlJUdFRRVU54UkN4RFFVRkRMRU5CUVVNN1VVRkRha1VzVFVGQlRTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMR1ZCUVdVc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEpRVU0xUXl4RFFVRkRPMGxCUlVRN08wOUJSVWM3U1VGRFN5eExRVUZMTEVOQlFVTXNXVUZCV1N4RFFVTjRRaXhMUVVFd1FpeEZRVU14UWl4SlFVRjNRaXhGUVVONFFpeExRVUVyUWl4RlFVTXZRaXhKUVVFeVFpeEZRVU16UWl4TlFVRTRSRHRSUVVVNVJDeE5RVUZOTEZkQlFWY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVNeFFpeERRVUZETEVWQlEwUXNTVUZCU1N4RFFVRkRMRmRCUVZjc1NVRkJTU3g1UWtGQmVVSXNRMEZET1VNc1EwRkJRenRSUVVOR0xFMUJRVTBzUzBGQlN5eEhRVUZITEVOQlFVTXNSMEZCUnl4TFFVRkxMRU5CUVVNc1EwRkJRenRSUVVWNlFpeFBRVUZQTEV0QlFVc3NRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU03V1VGRGVFSXNUVUZCVFN4TFFVRkxMRWRCUVVjc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVWQlFVVXNWMEZCVnl4RFFVRkRMRU5CUVVNN1dVRkRNME1zVFVGQlRTeFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVTm1MRXRCUVVzc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVWQlFVVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU1zUzBGQlN5eEZRVUZGTEVsQlFVa3NSVUZCUlN4SlFVRkpMRVZCUVVVc1NVRkJTU3hGUVVGRkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlEzWkZMRU5CUVVNN1VVRkRTaXhEUVVGRE8wbEJRMGdzUTBGQlF6dEpRVVZFT3p0UFFVVkhPMGxCUTBzc1MwRkJTeXhEUVVGRExGZEJRVmNzUTBGRGRrSXNTMEZCTUVJc1JVRkRNVUlzU1VGQmQwSXNSVUZEZUVJc1VVRkJaME1zUlVGRGFFTXNTVUZCTWtJc1JVRkRNMElzVFVGQk9FUTdVVUZGT1VRc1RVRkJUU3hUUVVGVExFZEJRVWNzU1VGQlNTeEpRVUZKTEVWQlFVVXNRMEZCUXp0UlFVTTNRaXhOUVVGTkxGRkJRVkVzUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hKUVVGSkxFVkJRVVVzUTBGQlF5eEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRSUVVWeVJDeE5RVUZOTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1MwRkJTeXhGUVVGRk8xbEJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eFpRVUZaTzFsQlF6RkRMRXRCUVVzc1JVRkJSU3hMUVVGTExFTkJRVU1zUzBGQlN6dFpRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3V1VGRE0wSXNUVUZCVFN4RlFVRkZMRkZCUVZFc1EwRkJReXhGUVVGRk8xbEJRMjVDTEVsQlFVa3NSVUZCUlN4UlFVRlJPMWxCUTJRc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRTlCUVU4N1UwRkRja01zUTBGQlF5eERRVUZETzFGQlJVZ3NUVUZCVFN4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRXRCUVVzc1JVRkJSU3hKUVVGSkxFVkJRVVVzVVVGQlVTeERRVUZETEVOQlFVTTdVVUZGTjBRc1owVkJRV2RGTzFGQlEyaEZMRWxCUVVrc1NVRkJTU3hEUVVGRExHVkJRV1VzUlVGQlJTeERRVUZETzFsQlEzcENMRTFCUVUwc1RVRkJUU3hIUVVGSExFMUJRVTBzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4TFFVRkxMRVZCUVVVc1NVRkJTU3hGUVVGRkxGRkJRVkVzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXp0WlFVTjRSU3hKUVVGSkxFMUJRVTBzUlVGQlJTeERRVUZETzJkQ1FVTllMRXRCUVVzc1EwRkJReXhWUVVGVkxFTkJRVU1zWTBGQll5eERRVUZETEZGQlFWRXNRMEZCUXl4RlFVRkZMRVZCUVVVc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzJkQ1FVTTNSQ3hKUVVGSkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNc1MwRkJTeXhGUVVGRkxFbEJRVWtzUlVGQlJTeFJRVUZSTEVWQlFVVXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8yZENRVVV2UkN4TlFVRk5MRlZCUVZVc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzJkQ1FVTTVRaXhOUVVGTkxFMUJRVTBzUjBGQk5rSTdiMEpCUTNaRExFMUJRVTBzUlVGQlJTeFJRVUZSTEVOQlFVTXNSVUZCUlR0dlFrRkRia0lzVFVGQlRTeEZRVUZGTEc5Q1FVRnZRaXhEUVVGRExFMUJRVTA3YjBKQlEyNURMRTFCUVUwN2IwSkJRMDRzVDBGQlR5eEZRVUZGTEUxQlFVMHNRMEZCUXl4UFFVRlBPMjlDUVVOMlFpeFRRVUZUTzI5Q1FVTlVMRlZCUVZVN2IwSkJRMVlzVTBGQlV5eEZRVUZGTEVsQlFVazdiMEpCUTJZc1RVRkJUU3hGUVVGRkxFbEJRVWs3YjBKQlExb3NUVUZCVFN4RlFVRkZMRVZCUVVVN2FVSkJRMWdzUTBGQlF6dG5Ra0ZEUml4TFFVRkxMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1owSkJSUzlDTEUxQlFVMHNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhMUVVGTExFVkJRVVU3YjBKQlF6RkNMRWxCUVVrc1JVRkJSU3gxUWtGQmRVSXNRMEZCUXl4alFVRmpPMjlDUVVNMVF5eExRVUZMTEVWQlFVVXNTMEZCU3l4RFFVRkRMRXRCUVVzN2IwSkJRMnhDTEZWQlFWVXNSVUZCUlN4SlFVRkpMRU5CUVVNc1ZVRkJWVHR2UWtGRE0wSXNUVUZCVFN4RlFVRkZMRkZCUVZFc1EwRkJReXhGUVVGRk8yOUNRVU51UWl4SlFVRkpMRVZCUVVVc1VVRkJVVHR2UWtGRFpDeE5RVUZOTEVWQlFVVXNiMEpCUVc5Q0xFTkJRVU1zVFVGQlRUdHZRa0ZEYmtNc1QwRkJUeXhGUVVGRkxFVkJRVVVzVDBGQlR5eEZRVUZGTEUxQlFVMHNRMEZCUXl4UFFVRlBMRVZCUVVVN2FVSkJRM0pETEVOQlFVTXNRMEZCUXp0blFrRkZTQ3hOUVVGTkxFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNTMEZCU3l4RlFVRkZPMjlDUVVNeFFpeEpRVUZKTEVWQlFVVXNkVUpCUVhWQ0xFTkJRVU1zWTBGQll6dHZRa0ZETlVNc1MwRkJTeXhGUVVGRkxFdEJRVXNzUTBGQlF5eExRVUZMTzI5Q1FVTnNRaXhWUVVGVkxFVkJRVVVzU1VGQlNTeERRVUZETEZWQlFWVTdiMEpCUXpOQ0xFMUJRVTBzUlVGQlJTeFJRVUZSTEVOQlFVTXNSVUZCUlR0dlFrRkRia0lzU1VGQlNTeEZRVUZGTEZGQlFWRTdiMEpCUTJRc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRk5CUVZNN2IwSkJRM1JETEU5QlFVOHNSVUZCUlN4RlFVRkZMRTlCUVU4c1JVRkJSU3hOUVVGTkxFTkJRVU1zVDBGQlR5eEZRVUZGTEZOQlFWTXNSVUZCUlN4SlFVRkpMRVZCUVVVN2FVSkJRM1JFTEVOQlFVTXNRMEZCUXp0blFrRkRTQ3hQUVVGUE8xbEJRMVFzUTBGQlF6dFJRVU5JTEVOQlFVTTdVVUZGUkN4SlFVRkpMRU5CUVVNN1dVRkRTQ3hOUVVGTkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1EwRkJReXhQUVVGUExFTkJRVU1zVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUXpkRUxFMUJRVTBzVDBGQlR5eEhRVUZITEVsQlFVa3NjVUpCUVhGQ0xFTkJRM1pETEV0QlFVc3NRMEZCUXl4TFFVRkxMRVZCUTFnc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGRGFFSXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkRZaXhSUVVGUkxFTkJRVU1zVlVGQlZTeEZRVU51UWl4UlFVRlJMRVZCUTFJc1RVRkJUU3hGUVVOT0xFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlEyUXNRMEZCUXp0WlFVVkdMRTFCUVUwc1QwRkJUeXhIUVVGSExFMUJRVTBzVVVGQlVTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRVZCUVVVc1QwRkJUeXhEUVVGRExFTkJRVU03V1VGRGVFUXNUVUZCVFN4bFFVRmxMRWRCUVVjc1QwRkJUeXhKUVVGSkxFVkJRVVVzUTBGQlF6dFpRVVYwUXl4TFFVRkxMRU5CUVVNc1ZVRkJWU3hEUVVGRExHTkJRV01zUTBGQlF5eFJRVUZSTEVOQlFVTXNSVUZCUlN4RlFVRkZMR1ZCUVdVc1EwRkJReXhEUVVGRE8xbEJRemxFTEVsQlFVa3NRMEZCUXl4clFrRkJhMElzUTBGQlF5eExRVUZMTEVWQlFVVXNTVUZCU1N4RlFVRkZMRkZCUVZFc1JVRkJSU3hsUVVGbExFTkJRVU1zUTBGQlF6dFpRVVZvUlN4TlFVRk5MRlZCUVZVc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzFsQlF6bENMRTFCUVUwc1RVRkJUU3hIUVVFMlFqdG5Ra0ZEZGtNc1RVRkJUU3hGUVVGRkxGRkJRVkVzUTBGQlF5eEZRVUZGTzJkQ1FVTnVRaXhOUVVGTkxFVkJRVVVzYjBKQlFXOUNMRU5CUVVNc1UwRkJVenRuUWtGRGRFTXNUVUZCVFR0blFrRkRUaXhQUVVGUExFVkJRVVVzWlVGQlpUdG5Ra0ZEZUVJc1UwRkJVenRuUWtGRFZDeFZRVUZWTzJkQ1FVTldMRTFCUVUwc1JVRkJSU3hGUVVGRk8yRkJRMWdzUTBGQlF6dFpRVU5HTEV0QlFVc3NRMEZCUXl4blFrRkJaMElzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0WlFVVXZRaXhOUVVGTkxFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNTMEZCU3l4RlFVRkZPMmRDUVVNeFFpeEpRVUZKTEVWQlFVVXNkVUpCUVhWQ0xFTkJRVU1zWTBGQll6dG5Ra0ZETlVNc1MwRkJTeXhGUVVGRkxFdEJRVXNzUTBGQlF5eExRVUZMTzJkQ1FVTnNRaXhWUVVGVkxFVkJRVVVzU1VGQlNTeERRVUZETEZWQlFWVTdaMEpCUXpOQ0xFMUJRVTBzUlVGQlJTeFJRVUZSTEVOQlFVTXNSVUZCUlR0blFrRkRia0lzU1VGQlNTeEZRVUZGTEZGQlFWRTdaMEpCUTJRc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRk5CUVZNN1owSkJRM1JETEU5QlFVOHNSVUZCUlN4RlFVRkZMRTlCUVU4c1JVRkJSU3hsUVVGbExFVkJRVVU3WVVGRGRFTXNRMEZCUXl4RFFVRkRPMUZCUTB3c1EwRkJRenRSUVVGRExFOUJRVThzUzBGQlN5eEZRVUZGTEVOQlFVTTdXVUZEWml4TlFVRk5MRlZCUVZVc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzFsQlF6bENMRTFCUVUwc1dVRkJXU3hIUVVGSExFbEJRVWtzUTBGQlF5eGpRVUZqTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1dVRkRhRVFzVFVGQlRTeE5RVUZOTEVkQlFUWkNPMmRDUVVOMlF5eE5RVUZOTEVWQlFVVXNVVUZCVVN4RFFVRkRMRVZCUVVVN1owSkJRMjVDTEUxQlFVMHNSVUZCUlN4dlFrRkJiMElzUTBGQlF5eE5RVUZOTzJkQ1FVTnVReXhOUVVGTk8yZENRVU5PTEV0QlFVc3NSVUZCUlN4WlFVRlpPMmRDUVVOdVFpeFRRVUZUTzJkQ1FVTlVMRlZCUVZVN1owSkJRMVlzVFVGQlRTeEZRVUZGTEVWQlFVVTdZVUZEV0N4RFFVRkRPMWxCUTBZc1MwRkJTeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8xbEJSUzlDTEUxQlFVMHNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhMUVVGTExFVkJRVVU3WjBKQlF6RkNMRWxCUVVrc1JVRkJSU3gxUWtGQmRVSXNRMEZCUXl4WFFVRlhPMmRDUVVONlF5eExRVUZMTEVWQlFVVXNTMEZCU3l4RFFVRkRMRXRCUVVzN1owSkJRMnhDTEZWQlFWVXNSVUZCUlN4SlFVRkpMRU5CUVVNc1ZVRkJWVHRuUWtGRE0wSXNUVUZCVFN4RlFVRkZMRkZCUVZFc1EwRkJReXhGUVVGRk8yZENRVU51UWl4SlFVRkpMRVZCUVVVc1VVRkJVVHRuUWtGRFpDeE5RVUZOTEVWQlFVVXNiMEpCUVc5Q0xFTkJRVU1zVFVGQlRUdG5Ra0ZEYmtNc1MwRkJTeXhGUVVGRkxGbEJRVms3WVVGRGNFSXNRMEZCUXl4RFFVRkRPMWxCUlVnc1NVRkJTU3hKUVVGSkxFTkJRVU1zVVVGQlVTeEpRVUZKTEVsQlFVazdaMEpCUVVVc1RVRkJUU3hMUVVGTExFTkJRVU03VVVGRGVrTXNRMEZCUXp0SlFVTklMRU5CUVVNN1NVRkZSRHM3VDBGRlJ6dEpRVU5MTEdsQ1FVRnBRaXhEUVVOMlFpeExRVUV3UWl4RlFVTXhRaXhKUVVGM1FpeEZRVU40UWl4UlFVRm5RenRSUVVWb1F5eE5RVUZOTEUxQlFVMHNSMEZCZVVJc1JVRkJSU3hEUVVGRE8xRkJRM2hETEUxQlFVMHNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUjBGQlJ5eERRVUZETEZGQlFWRXNRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03VVVGRE5VUXNTMEZCU3l4TlFVRk5MRWxCUVVrc1NVRkJTU3hSUVVGUkxFVkJRVVVzUTBGQlF6dFpRVU0xUWl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGVkJRVlVzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXl4VlFVRlZMRU5CUVVNc1QwRkJUeXhEUVVOb1JDeEpRVUZKTEVOQlFVTXNXVUZCV1N4RlFVTnFRaXhKUVVGSkxFTkJRVU1zVlVGQlZTeERRVU5vUWl4RFFVRkRPMUZCUTBvc1EwRkJRenRSUVVORUxFOUJRVThzVFVGQlRTeERRVUZETzBsQlEyaENMRU5CUVVNN1NVRkZSRHM3T3p0UFFVbEhPMGxCUTBzc1MwRkJTeXhEUVVGRExHTkJRV01zUTBGRE1VSXNTMEZCTUVJc1JVRkRNVUlzU1VGQmQwSXNSVUZEZUVJc1VVRkJaME1zUlVGRGFFTXNUVUZCTkVJN1VVRkZOVUlzVFVGQlRTeE5RVUZOTEVkQlFVY3NTVUZCU1N4clFrRkJhMElzUlVGQlJTeERRVUZETzFGQlEzaERMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zYjBKQlFXOUNMRU5CUVVNc1VVRkJVU3hEUVVGRE8xbEJRVVVzVDBGQlR5eFRRVUZUTEVOQlFVTTdVVUZGTjBRc1RVRkJUU3hQUVVGUExFZEJRVWNzU1VGQlNTeERRVUZETEc5Q1FVRnZRaXhGUVVGRkxFTkJRVU03VVVGRE5VTXNUVUZCVFN4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExEWkNRVUUyUWl4RFFVRkRMRXRCUVVzc1JVRkJSU3hKUVVGSkxFVkJRVVVzVVVGQlVTeERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMUZCUTNKR0xFOUJRVThzVDBGQlR5eERRVUZETEdWQlFXVXNRMEZETlVJc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGRFlpeFJRVUZSTEVWQlExSXNUVUZCVFN4RlFVTk9MR1ZCUVdVc1EwRkRhRUlzUTBGQlF6dEpRVU5LTEVOQlFVTTdTVUZGUkRzN08wOUJSMGM3U1VGRFN5dzJRa0ZCTmtJc1EwRkRia01zUzBGQk1FSXNSVUZETVVJc1NVRkJkMElzUlVGRGVFSXNUVUZCWXp0UlFVVmtMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eHZRa0ZCYjBJc1JVRkJSU3hEUVVGRE8xRkJRelZETEUxQlFVMHNWMEZCVnl4SFFVRkhMRWxCUVVrc09FSkJRVGhDTEVWQlFVVXNRMEZCUXp0UlFVTjZSQ3hOUVVGTkxFbEJRVWtzUjBGQlJ5eFhRVUZYTEVOQlFVTXNaVUZCWlN4RFFVRkRMRWxCUVVrc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dFJRVU4yUkN4TlFVRk5MRmxCUVZrc1IwRkJNa0lzUlVGQlJTeERRVUZETzFGQlEyaEVMRXRCUVVzc1RVRkJUU3hIUVVGSExFbEJRVWtzU1VGQlNTeEZRVUZGTEVOQlFVTTdXVUZEZGtJc1RVRkJUU3hKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRXRCUVVzc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRGJFUXNTVUZCU1N4SlFVRkpMRVZCUVVVc1EwRkJRenRuUWtGRFZDeE5RVUZOTEZOQlFWTXNSMEZCUnl4TFFVRkxMRU5CUVVNc1YwRkJWeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0blFrRkROME1zVFVGQlRTeE5RVUZOTEVkQlFVY3NVMEZCVXl4RlFVRkZMRTFCUVUwc1NVRkJTU3hGUVVGRkxFTkJRVU03WjBKQlEzWkRMRTFCUVUwc1ZVRkJWU3hIUVVGSExFbEJRVWtzUTBGQlF5dzJRa0ZCTmtJc1EwRkJReXhMUVVGTExFVkJRVVVzU1VGQlNTeEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMmRDUVVONFJTeFpRVUZaTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1QwRkJUeXhEUVVGRExHdENRVUZyUWl4RFFVTTFReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVU5pTEVsQlFVa3NSVUZEU2l4TlFVRk5MRVZCUTA0c1ZVRkJWU3hEUVVOWUxFTkJRVU03V1VGRFNpeERRVUZETzFGQlEwZ3NRMEZCUXp0UlFVTkVMRTlCUVU4c1dVRkJXU3hEUVVGRE8wbEJRM1JDTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExHdENRVUZyUWl4RFFVTjRRaXhMUVVFd1FpeEZRVU14UWl4SlFVRjNRaXhGUVVONFFpeFJRVUZuUXl4RlFVTm9ReXhQUVVFMlFqdFJRVVUzUWl4TlFVRk5MRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zWTBGQll5eERRVUZETEVkQlFVY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzFGQlF6VkVMRXRCUVVzc1RVRkJUU3hKUVVGSkxFbEJRVWtzVVVGQlVTeEZRVUZGTEVOQlFVTTdXVUZETlVJc1RVRkJUU3hMUVVGTExFZEJRVWNzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRaUVVOMlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4WlFVRlpMRXRCUVVzc2RVSkJRWFZDTEVWQlFVVXNRMEZCUXp0blFrRkRiRVFzUzBGQlN5eERRVUZETEZWQlFWVXNRMEZCUXl4cFFrRkJhVUlzUTBGQlF5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xbEJRemRFTEVOQlFVTTdXVUZEUkN4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFdEJRVXNzUlVGQlJUdG5Ra0ZEY0VJc1NVRkJTU3hGUVVGRkxIVkNRVUYxUWl4RFFVRkRMR2xDUVVGcFFqdG5Ra0ZETDBNc1MwRkJTeXhGUVVGRkxFdEJRVXNzUTBGQlF5eExRVUZMTzJkQ1FVTnNRaXhWUVVGVkxFVkJRVVVzU1VGQlNTeERRVUZETEZWQlFWVTdaMEpCUXpOQ0xFMUJRVTBzUlVGQlJTeEpRVUZKTEVOQlFVTXNSVUZCUlR0blFrRkRaaXhOUVVGTkxFVkJRVVVzVVVGQlVTeERRVUZETEVWQlFVVTdaMEpCUTI1Q0xFbEJRVWtzUlVGQlJTeEZRVUZGTzJkQ1FVTlNMRTlCUVU4c1JVRkJSU3hGUVVGRkxFbEJRVWtzUlVGQlJTeExRVUZMTEVWQlFVVTdZVUZEZWtJc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eEhRVUZITEVWQlFVVTdaMEpCUTFvc2JVTkJRVzFETzFsQlEzSkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRMHdzUTBGQlF6dEpRVU5JTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExFdEJRVXNzUTBGQlF5eFRRVUZUTEVOQlEzSkNMRXRCUVRCQ0xFVkJRekZDTEU5QlMwTTdVVUZGUkN4TlFVRk5MRXRCUVVzc1IwRkJSeXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNRMEZCUXp0WlFVTjBReXhGUVVGRkxFVkJRVVVzUlVGQlJUdFpRVU5PTEZGQlFWRXNSVUZCUlN4RFFVRkRPMWxCUTFnc1UwRkJVeXhGUVVGRkxFbEJRVWtzU1VGQlNTeEZRVUZGTzFsQlEzSkNMRWRCUVVjc1QwRkJUenRUUVVOdFJDeERRVUZETEVOQlFVTTdVVUZEYWtVc1MwRkJTeXhEUVVGRExGZEJRVmNzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVTjZRaXhOUVVGTkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNaVUZCWlN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wbEJRelZETEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExGbEJRVmtzUTBGRGJFSXNUMEZCT0VJN1VVRkZPVUlzVDBGQlR6dFpRVU5NTEZkQlFWY3NSVUZCUlN4NVFrRkJlVUk3V1VGRGRFTXNVVUZCVVN4RlFVRkZMRWxCUVVrN1dVRkRaQ3hqUVVGakxFVkJRVVVzU1VGQlNUdFpRVU53UWl4bFFVRmxMRVZCUVVVc1NVRkJTVHRaUVVOeVFpeGxRVUZsTEVWQlFVVXNTVUZCU1R0WlFVTnlRaXhwUWtGQmFVSXNSVUZCUlN4TFFVRkxPMWxCUTNoQ0xFbEJRVWtzUlVGQlJTeEZRVUZGTzFsQlExSXNVVUZCVVN4RlFVRkZMRVZCUVVVN1dVRkRXaXhIUVVGSExFbEJRVWtzUTBGQlF5eGpRVUZqTzFsQlEzUkNMRWRCUVVjc1QwRkJUenRUUVVOWUxFTkJRVU03U1VGRFNpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhoUVVGaE8xRkJRMjVDTEU5QlFVOHNRMEZEVEN4VlFVRlZMRU5CUVVNc1RVRkJUU3hGUVVGRkxGVkJRVlVzUlVGQlJTeEZRVUZGTzFsQlEycERMR0ZCUVdFc1NVRkJTU3hEUVVGRExFZEJRVWNzUlVGQlJTeEpRVUZKTEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhSUVVGUkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRMnBGTEVOQlFVTTdTVUZEU2l4RFFVRkRPMGxCUlVRN08wOUJSVWM3U1VGRFN5eGpRVUZqTEVOQlFVTXNTMEZCWXp0UlFVTnVReXhKUVVGSkxFdEJRVXNzV1VGQldTeExRVUZMTEVWQlFVVXNRMEZCUXp0WlFVTXpRaXhQUVVGUE8yZENRVU5NTEVsQlFVa3NSVUZCUlN4TFFVRkxMRU5CUVVNc1NVRkJTVHRuUWtGRGFFSXNUMEZCVHl4RlFVRkZMRXRCUVVzc1EwRkJReXhQUVVGUE8yZENRVU4wUWl4TFFVRkxMRVZCUVVVc1MwRkJTeXhEUVVGRExFdEJRVXM3WjBKQlEyeENMRWxCUVVrc1JVRkRSQ3hMUVVGaExFTkJRVU1zVTBGQlV6dHZRa0ZEZUVJc1EwRkJReXhQUVVGUkxFdEJRV0VzUTBGQlF5eEpRVUZKTEV0QlFVc3NVVUZCVVR0M1FrRkRkRU1zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUlN4TFFVRmhMRU5CUVVNc1NVRkJTU3hEUVVGRE8zZENRVU0zUWl4RFFVRkRMRU5CUVVVc1MwRkJZU3hEUVVGRExFbEJRVWtzUTBGQlF6dGhRVU16UWl4RFFVRkRPMUZCUTBvc1EwRkJRenRSUVVORUxFOUJRVThzUlVGQlJTeEpRVUZKTEVWQlFVVXNZMEZCWXl4RlFVRkZMRTlCUVU4c1JVRkJSU3hOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETEVWQlFVVXNRMEZCUXp0SlFVTXhSQ3hEUVVGRE8wTkJRMFlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUVCdGIyUjFiR1VnYVc1MFpXZHlZWFJwYjI1ekwyZHlZWEJvTDJWNFpXTjFkR2x2Ymk5SGNtRndhRVY0WldOMWRHbHZia1Z1WjJsdVpWeHVJQ29nUUhOMWJXMWhjbmtnVW1WbVpYSmxibU5sSUdkeVlYQm9JR1Y0WldOMWRHbHZiaUJsYm1kcGJtVXVYRzRnS2lCQVpHVnpZM0pwY0hScGIyNGdSWGhsWTNWMFpYTWdaM0poY0dnZ2QyOXlhMlpzYjNkeklHUmxZMnhoY21Wa0lIZHBkR2dnWUVCa1pXTmhaaTEwY3k5MWFTMWtaV052Y21GMGIzSnpMMmR5WVhCb1lDd2daVzFwZEhNZ1pYWmxiblJ6SUhSb2NtOTFaMmdnUkdWallXWW5jeUJQWW5ObGNuWmhZbXhsSUhCcGNHVnNhVzVsTENCemRYQndiM0owY3lCd1lYSmhiR3hsYkNCdWIyUmxJR1Y0WldOMWRHbHZiaUIzYVhSb2FXNGdkRzl3YjJ4dloybGpZV3dnYkdGNVpYSnpMQ0JoYm1RZ2NtVjBkWEp1Y3lCaElHTnZiWEJzWlhSbElHVjRaV04xZEdsdmJpQnlaWE4xYkhRdVhHNGdLaTljYm1sdGNHOXlkQ0IwZVhCbElIc2dUMkp6WlhKMllXSnNaU0I5SUdaeWIyMGdYQ0pBWkdWallXWXRkSE12WTI5eVpWd2lPMXh1YVcxd2IzSjBJSFI1Y0dVZ2V5QkhjbUZ3YUZkdmNtdG1iRzkzUkdWbWFXNXBkR2x2YmlCOUlHWnliMjBnWENKQVpHVmpZV1l0ZEhNdmRXa3RaR1ZqYjNKaGRHOXljeTluY21Gd2FGd2lPMXh1WEc1cGJYQnZjblFnZTF4dUlDQkhVa0ZRU0Y5RVJVWkJWVXhVWDBOUFRrTlZVbEpGVGtOWkxGeHVJQ0JIVWtGUVNGOVhUMUpMUmt4UFYxOUNUMVZPUkVGU1dTeGNibjBnWm5KdmJTQmNJaTR1TDJOdmJuTjBZVzUwYzF3aU8xeHVhVzF3YjNKMElIdGNiaUFnUjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEZSNWNHVXNYRzRnSUVkeVlYQm9SWGhsWTNWMGFXOXVVM1JoZEhWekxGeHVmU0JtY205dElGd2lMaTR2TGk0dmMyaGhjbVZrTDJOdmJuTjBZVzUwYzF3aU8xeHVhVzF3YjNKMElIUjVjR1VnZTF4dUlDQkhjbUZ3YUVWNFpXTjFkR2x2YmtWeWNtOXlVR0Y1Ykc5aFpDeGNiaUFnUjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEN4Y2JpQWdSM0poY0doRmVHVmpkWFJwYjI1UGNIUnBiMjV6TEZ4dUlDQkhjbUZ3YUVWNFpXTjFkR2x2YmxKbGMzVnNkQ3hjYmlBZ1IzSmhjR2hGZUdWamRYUnBiMjVXWVd4MVpYTXNYRzRnSUVkeVlYQm9UbTlrWlVWNFpXTjFkR2x2YmxKbGMzVnNkQ3hjYmlBZ1IzSmhjR2hRYVc1T2IyUmxUM0IwYVc5dWN5eGNiaUFnUjNKaGNHaFZibkJwYms1dlpHVlBjSFJwYjI1ekxGeHVJQ0JIY21Gd2FGSjFia2xrTEZ4dWZTQm1jbTl0SUZ3aUxpNHZkSGx3WlhOY0lqdGNibWx0Y0c5eWRDQjBlWEJsSUhzZ1IzSmhjR2hGZUdWamRYUnBiMjVQWW5ObGNuWmxjaUI5SUdaeWIyMGdYQ0l1TGk5bGRtVnVkSE12UjNKaGNHaEZlR1ZqZFhScGIyNVBZbk5sY25abGNsd2lPMXh1YVcxd2IzSjBJSHNnUjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEVWdGFYUjBaWElnZlNCbWNtOXRJRndpTGk0dlpYWmxiblJ6TDBkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SRmJXbDBkR1Z5WENJN1hHNXBiWEJ2Y25RZ2V5QkhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBSbUZqZEc5eWVTQjlJR1p5YjIwZ1hDSXVMaTlsZG1WdWRITXZSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVpoWTNSdmNubGNJanRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSM0poY0doT2IyUmxSWGhsWTNWMGIzSlNaV2RwYzNSeWVTQjlJR1p5YjIwZ1hDSXVMaTl5WldkcGMzUnllUzlIY21Gd2FFNXZaR1ZGZUdWamRYUnZjbEpsWjJsemRISjVYQ0k3WEc1cGJYQnZjblFnZXlCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1dVpYSWdmU0JtY205dElGd2lMaTR2Y0d4aGJtNXBibWN2UjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1Ym1WeVhDSTdYRzVwYlhCdmNuUWdkSGx3WlNCN0lFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJpQjlJR1p5YjIwZ1hDSXVMaTl3YkdGdWJtbHVaeTlIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVjSWp0Y2JtbHRjRzl5ZENCMGVYQmxJSHNnUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1VG05a1pTQjlJR1p5YjIwZ1hDSXVMaTl3YkdGdWJtbHVaeTlIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVPYjJSbFhDSTdYRzVwYlhCdmNuUWdkSGx3WlNCN0lFZHlZWEJvVm1Gc2RXVlRkRzl5WlVGa1lYQjBaWElnZlNCbWNtOXRJRndpTGk0dmMzUnZjbVV2UjNKaGNHaFdZV3gxWlZOMGIzSmxRV1JoY0hSbGNsd2lPMXh1YVcxd2IzSjBJSHNnU1c1TlpXMXZjbmxIY21Gd2FGWmhiSFZsVTNSdmNtVkJaR0Z3ZEdWeUlIMGdabkp2YlNCY0lpNHVMM04wYjNKbEwwbHVUV1Z0YjNKNVIzSmhjR2hXWVd4MVpWTjBiM0psUVdSaGNIUmxjbHdpTzF4dWFXMXdiM0owSUhzZ1IzSmhjR2hXWVd4MVpWTjBiM0psSUgwZ1puSnZiU0JjSWk0dUwzTjBiM0psTDBkeVlYQm9WbUZzZFdWVGRHOXlaVndpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJIY21Gd2FFTmhZMmhsWkZaaGJIVmxJSDBnWm5KdmJTQmNJaTR1TDNOMGIzSmxMMGR5WVhCb1EyRmphR1ZrVm1Gc2RXVmNJanRjYm1sdGNHOXlkQ0I3SUVkeVlYQm9VR2x1Ym1sdVoxTmxjblpwWTJVZ2ZTQm1jbTl0SUZ3aUxpNHZjR2x1Ym1sdVp5OUhjbUZ3YUZCcGJtNXBibWRUWlhKMmFXTmxYQ0k3WEc1cGJYQnZjblFnZXlCSGNtRndhRkJwYm01cGJtZFFiMnhwWTNrZ2ZTQm1jbTl0SUZ3aUxpNHZjR2x1Ym1sdVp5OUhjbUZ3YUZCcGJtNXBibWRRYjJ4cFkzbGNJanRjYm1sdGNHOXlkQ0I3SUVkeVlYQm9VR2x1Ym1sdVowUmxjR1Z1WkdWdVkzbFNaWE52YkhabGNpQjlJR1p5YjIwZ1hDSXVMaTl3YVc1dWFXNW5MMGR5WVhCb1VHbHVibWx1WjBSbGNHVnVaR1Z1WTNsU1pYTnZiSFpsY2x3aU8xeHVhVzF3YjNKMElIc2dSM0poY0doRmVHVmpkWFJwYjI1RGIyNTBaWGgwSUgwZ1puSnZiU0JjSWk0dlIzSmhjR2hGZUdWamRYUnBiMjVEYjI1MFpYaDBYQ0k3WEc1cGJYQnZjblFnZXlCSGNtRndhRVY0WldOMWRHbHZia1p5WVcxbElIMGdabkp2YlNCY0lpNHZSM0poY0doRmVHVmpkWFJwYjI1R2NtRnRaVndpTzF4dWFXMXdiM0owSUhzZ1luVnBiR1JIY21Gd2FFVjRaV04xZEdsdmJsSmxjM1ZzZENCOUlHWnliMjBnWENJdUwwZHlZWEJvUlhobFkzVjBhVzl1VW1WemRXeDBYQ0k3WEc1cGJYQnZjblFnZEhsd1pTQjdJRU52WkdWVFlXNWtZbTk0UlhaaGJIVmhkRzl5SUgwZ1puSnZiU0JjSWk0dlEyOWtaVk5oYm1SaWIzaEZkbUZzZFdGMGIzSmNJanRjYmx4dUx5b3FYRzRnS2lCRGIyNW1hV2QxY21GMGFXOXVJR1p2Y2lCMGFHVWdlMEJzYVc1cklFZHlZWEJvUlhobFkzVjBhVzl1Ulc1bmFXNWxmUzVjYmlBcUwxeHVaWGh3YjNKMElHbHVkR1Z5Wm1GalpTQkhjbUZ3YUVWNFpXTjFkR2x2YmtWdVoybHVaVU52Ym1acFp5QjdYRzRnSUhKbFoybHpkSEo1T2lCSGNtRndhRTV2WkdWRmVHVmpkWFJ2Y2xKbFoybHpkSEo1TzF4dUlDQndiR0Z1Ym1WeVB6b2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVibVZ5TzF4dUlDQjJZV3gxWlZOMGIzSmxRV1JoY0hSbGNqODZJRWR5WVhCb1ZtRnNkV1ZUZEc5eVpVRmtZWEIwWlhJN1hHNGdJR1YyWlc1MFJXMXBkSFJsY2o4NklFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUkZiV2wwZEdWeU8xeHVJQ0JrWldaaGRXeDBUM0IwYVc5dWN6ODZJRkJoY25ScFlXdzhSM0poY0doRmVHVmpkWFJwYjI1UGNIUnBiMjV6UGp0Y2JpQWdMeW9xWEc0Z0lDQXFJRTl3ZEdsdmJtRnNJSEJzZFdkbllXSnNaU0JqYjJSbElITmhibVJpYjNnZ1pYWmhiSFZoZEc5eUlHWnZjaUJqYjJSbExXSmhjMlZrSUdOdmJtUnBkR2x2Ym5OY2JpQWdJQ29nS0VSRlEwRkdMVE15SU1Lbk1qSXVOQ2t1SUZkb1pXNGdZV0p6Wlc1MExDQmpiMlJsSUdOdmJtUnBkR2x2Ym5NZ2RHaHliM2RjYmlBZ0lDb2dZRWRTUVZCSVgwTlBSRVZmVTBGT1JFSlBXRjlPVDFSZlEwOU9Sa2xIVlZKRlJHQXVJRVJ2ZDI1emRISmxZVzBnY0hKdmFtVmpkSE1nS0dVdVp5NGdRVXhHVWtWRUtWeHVJQ0FnS2lCemRYQndiSGtnZEdobElHRmpkSFZoYkNCV1RTQnpZVzVrWW05NElHbHRjR3hsYldWdWRHRjBhVzl1TGx4dUlDQWdLaTljYmlBZ1kyOWtaVk5oYm1SaWIzaEZkbUZzZFdGMGIzSS9PaUJEYjJSbFUyRnVaR0p2ZUVWMllXeDFZWFJ2Y2p0Y2JpQWdMeW9xWEc0Z0lDQXFJRTl3ZEdsdmJtRnNJR05oYkd4aVlXTnJJR2x1ZG05clpXUWdZWFFnZEdobElHVnVaQ0J2WmlCbGJtZHBibVVnWTI5dWMzUnlkV04wYVc5dUlIZHBkR2dnZEdobFhHNGdJQ0FxSUdaMWJHeDVMV2x1YVhScFlXeHBjMlZrSUdWdVoybHVaU0JwYm5OMFlXNWpaUzRnVlhObElIUm9hWE1nZEc4Z2NtVm5hWE4wWlhJZ1pYaGxZM1YwYjNKeklIUm9ZWFJjYmlBZ0lDb2dibVZsWkNCaElHSmhZMnN0Y21WbVpYSmxibU5sSUhSdklIUm9aU0JsYm1kcGJtVWdLR1V1Wnk0Z2JHOXZjQ0JsZUdWamRYUnZjbk1nZEdoaGRDQmxlR1ZqZFhSbFhHNGdJQ0FxSUhOMVlpMTNiM0pyWm14dmQzTWdkR2h5YjNWbmFDQjBhR1VnYzJGdFpTQmxibWRwYm1VcExseHVJQ0FnS2k5Y2JpQWdiMjVGYm1kcGJtVkRjbVZoZEdWa1B6b2dLR1Z1WjJsdVpUb2dSM0poY0doRmVHVmpkWFJwYjI1RmJtZHBibVVwSUQwK0lIWnZhV1E3WEc1OVhHNWNiaThxS2x4dUlDb2dVbVZtWlhKbGJtTmxJR2R5WVhCb0lHVjRaV04xZEdsdmJpQmxibWRwYm1VdVhHNGdLbHh1SUNvZ1JYaGxZM1YwWlhNZ1lTQjdRR3hwYm1zZ1IzSmhjR2hYYjNKclpteHZkMFJsWm1sdWFYUnBiMjU5SUdKNU9seHVJQ29nTVM0Z1VHeGhibTVwYm1jZ2RHaGxJSGR2Y210bWJHOTNJR2x1ZEc4Z2RHOXdiMnh2WjJsallXd2diR0Y1WlhKekxseHVJQ29nTWk0Z1UyVmxaR2x1WnlCM2IzSnJabXh2ZHlCcGJuQjFkSE1nYVc1MGJ5QjBhR1VnZG1Gc2RXVWdjM1J2Y21VdVhHNGdLaUF6TGlCRmVHVmpkWFJwYm1jZ2JtOWtaWE1nYkdGNVpYSXRZbmt0YkdGNVpYSWdkMmwwYUNCamIyNW1hV2QxY21GaWJHVWdZMjl1WTNWeWNtVnVZM2t1WEc0Z0tpQTBMaUJTYjNWMGFXNW5JSFpoYkhWbGN5QmhiRzl1WnlCbFpHZGxjeTVjYmlBcUlEVXVJRVZ0YVhSMGFXNW5JSE4wY25WamRIVnlaV1FnWlhabGJuUnpJSFJvY205MVoyZ2dSR1ZqWVdZbmN5QlBZbk5sY25aaFlteGxJSEJwY0dWc2FXNWxMbHh1SUNvZ05pNGdVbVYwZFhKdWFXNW5JR0VnWTI5dGNHeGxkR1VnZTBCc2FXNXJJRWR5WVhCb1JYaGxZM1YwYVc5dVVtVnpkV3gwZlM1Y2JpQXFMMXh1Wlhod2IzSjBJR05zWVhOeklFZHlZWEJvUlhobFkzVjBhVzl1Ulc1bmFXNWxYRzRnSUdsdGNHeGxiV1Z1ZEhNZ1QySnpaWEoyWVdKc1pUeGJSM0poY0doRmVHVmpkWFJwYjI1UFluTmxjblpsY2wwc0lGdEhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBYVDRnZTF4dUlDQndjbWwyWVhSbElISmxZV1J2Ym14NUlHVnRhWFIwWlhJNklFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUkZiV2wwZEdWeU8xeHVJQ0J3Y21sMllYUmxJSEpsWVdSdmJteDVJSEJzWVc1dVpYSTZJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhibTVsY2p0Y2JpQWdjSEpwZG1GMFpTQnlaV0ZrYjI1c2VTQjJZV3gxWlZOMGIzSmxRV1JoY0hSbGNqb2dSM0poY0doV1lXeDFaVk4wYjNKbFFXUmhjSFJsY2p0Y2JpQWdjSEpwZG1GMFpTQnlaV0ZrYjI1c2VTQmtaV1poZFd4MFQzQjBhVzl1Y3pvZ1VHRnlkR2xoYkR4SGNtRndhRVY0WldOMWRHbHZiazl3ZEdsdmJuTStPMXh1SUNBdktpb2dVR3gxWjJkaFlteGxJR052WkdVZ2MyRnVaR0p2ZUNCbGRtRnNkV0YwYjNJZ0tNS25Nakl1TkNrN0lHMWhlU0JpWlNCMWJtUmxabWx1WldRdUlDb3ZYRzRnSUhKbFlXUnZibXg1SUdOdlpHVlRZVzVrWW05NFJYWmhiSFZoZEc5eVB6b2dRMjlrWlZOaGJtUmliM2hGZG1Gc2RXRjBiM0k3WEc1Y2JpQWdZMjl1YzNSeWRXTjBiM0lvWTI5dVptbG5PaUJIY21Gd2FFVjRaV04xZEdsdmJrVnVaMmx1WlVOdmJtWnBaeWtnZTF4dUlDQWdJSFJvYVhNdVpXMXBkSFJsY2lBOUlHTnZibVpwWnk1bGRtVnVkRVZ0YVhSMFpYSWdQejhnYm1WM0lFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUkZiV2wwZEdWeUtDazdYRzRnSUNBZ2RHaHBjeTV3YkdGdWJtVnlJRDBnWTI5dVptbG5MbkJzWVc1dVpYSWdQejhnYm1WM0lFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJtNWxjaWdwTzF4dUlDQWdJSFJvYVhNdWRtRnNkV1ZUZEc5eVpVRmtZWEIwWlhJZ1BWeHVJQ0FnSUNBZ1kyOXVabWxuTG5aaGJIVmxVM1J2Y21WQlpHRndkR1Z5SUQ4L0lHNWxkeUJKYmsxbGJXOXllVWR5WVhCb1ZtRnNkV1ZUZEc5eVpVRmtZWEIwWlhJb0tUdGNiaUFnSUNCMGFHbHpMbVJsWm1GMWJIUlBjSFJwYjI1eklEMGdZMjl1Wm1sbkxtUmxabUYxYkhSUGNIUnBiMjV6SUQ4L0lIdDlPMXh1SUNBZ0lIUm9hWE11WTI5a1pWTmhibVJpYjNoRmRtRnNkV0YwYjNJZ1BTQmpiMjVtYVdjdVkyOWtaVk5oYm1SaWIzaEZkbUZzZFdGMGIzSTdYRzRnSUNBZ2RHaHBjeTVqYjI1bWFXY2dQU0JqYjI1bWFXYzdYRzRnSUNBZ1kyOXVabWxuTG05dVJXNW5hVzVsUTNKbFlYUmxaRDh1S0hSb2FYTXBPMXh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0J5WldGa2IyNXNlU0JqYjI1bWFXYzZJRWR5WVhCb1JYaGxZM1YwYVc5dVJXNW5hVzVsUTI5dVptbG5PMXh1WEc0Z0lHOWljMlZ5ZG1Vb2IySnpaWEoyWlhJNklFZHlZWEJvUlhobFkzVjBhVzl1VDJKelpYSjJaWElwT2lBb0tTQTlQaUIyYjJsa0lIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NWxiV2wwZEdWeUxtOWljMlZ5ZG1Vb2IySnpaWEoyWlhJcE8xeHVJQ0I5WEc1Y2JpQWdkVzVQWW5ObGNuWmxLRzlpYzJWeWRtVnlPaUJIY21Gd2FFVjRaV04xZEdsdmJrOWljMlZ5ZG1WeUtUb2dkbTlwWkNCN1hHNGdJQ0FnZEdocGN5NWxiV2wwZEdWeUxuVnVUMkp6WlhKMlpTaHZZbk5sY25abGNpazdYRzRnSUgxY2JseHVJQ0JoYzNsdVl5QjFjR1JoZEdWUFluTmxjblpsY25Nb1pYWmxiblE2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5RcE9pQlFjbTl0YVhObFBIWnZhV1ErSUh0Y2JpQWdJQ0JoZDJGcGRDQjBhR2x6TG1WdGFYUjBaWEl1ZFhCa1lYUmxUMkp6WlhKMlpYSnpLR1YyWlc1MEtUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJGZUdWamRYUmxjeUJoSUhkdmNtdG1iRzkzSUhkcGRHZ2dkR2hsSUdkcGRtVnVJR2x1Y0hWMGN5QmhibVFnYjNCMGFXOXVjeTVjYmlBZ0lDb3ZYRzRnSUdGemVXNWpJR1Y0WldOMWRHVW9YRzRnSUNBZ2QyOXlhMlpzYjNjNklFZHlZWEJvVjI5eWEyWnNiM2RFWldacGJtbDBhVzl1TEZ4dUlDQWdJR2x1Y0hWMGN6b2dSM0poY0doRmVHVmpkWFJwYjI1V1lXeDFaWE1nUFNCN2ZTeGNiaUFnSUNCdmNIUnBiMjV6T2lCSGNtRndhRVY0WldOMWRHbHZiazl3ZEdsdmJuTWdQU0I3ZlZ4dUlDQXBPaUJRY205dGFYTmxQRWR5WVhCb1JYaGxZM1YwYVc5dVVtVnpkV3gwUGlCN1hHNGdJQ0FnWTI5dWMzUWdiM0IwY3lBOUlIUm9hWE11YldWeVoyVlBjSFJwYjI1ektHOXdkR2x2Ym5NcE8xeHVJQ0FnSUdOdmJuTjBJSEoxYmtsa0lEMGdiM0IwY3k1eWRXNUpaQ0EvUHlCMGFHbHpMbWRsYm1WeVlYUmxVblZ1U1dRb0tUdGNiaUFnSUNCamIyNXpkQ0J3WVhSb0lEMGdiM0IwY3k1d1lYUm9JRDgvSUZ0ZE8xeHVJQ0FnSUdOdmJuTjBJR1YyWlc1MFJtRmpkRzl5ZVNBOUlHNWxkeUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwUm1GamRHOXllU2dwTzF4dUlDQWdJR052Ym5OMElIWmhiSFZsVTNSdmNtVWdQU0J1WlhjZ1IzSmhjR2hXWVd4MVpWTjBiM0psS0hSb2FYTXVkbUZzZFdWVGRHOXlaVUZrWVhCMFpYSXBPMXh1SUNBZ0lIWmhiSFZsVTNSdmNtVXVjMlZsWkZkdmNtdG1iRzkzU1c1d2RYUnpLR2x1Y0hWMGN5azdYRzVjYmlBZ0lDQmpiMjV6ZENCd2JHRnVJRDBnZEdocGN5NXdiR0Z1Ym1WeUxuQnNZVzRvZDI5eWEyWnNiM2NwTzF4dUlDQWdJR052Ym5OMElHWnlZVzFsSUQwZ2JtVjNJRWR5WVhCb1JYaGxZM1YwYVc5dVJuSmhiV1VvWEc0Z0lDQWdJQ0J5ZFc1SlpDeGNiaUFnSUNBZ0lIQnNZVzRzWEc0Z0lDQWdJQ0IyWVd4MVpWTjBiM0psTEZ4dUlDQWdJQ0FnWlhabGJuUkdZV04wYjNKNVhHNGdJQ0FnS1R0Y2JseHVJQ0FnSUdOdmJuTjBJR1Z0YVhSR2JpQTlJR0Z6ZVc1aklDaHdZWEowYVdGc09pQlFZWEowYVdGc1BFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUStLU0E5UGlCN1hHNGdJQ0FnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFJGZG1WdWRDaG1jbUZ0WlN3Z2UxeHVJQ0FnSUNBZ0lDQjBlWEJsT2lCd1lYSjBhV0ZzTG5SNWNHVWdQejhnUjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEZSNWNHVXVUazlFUlY5UFZWUlFWVlFzWEc0Z0lDQWdJQ0FnSUhKMWJrbGtMRnh1SUNBZ0lDQWdJQ0J3WVhKbGJuUlNkVzVKWkRvZ2IzQjBjeTV3WVhKbGJuUlNkVzVKWkN4Y2JpQWdJQ0FnSUNBZ2QyOXlhMlpzYjNkSlpEb2dkMjl5YTJac2IzY3VibUZ0WlN4Y2JpQWdJQ0FnSUNBZ2JtOWtaVWxrT2lCd1lYSjBhV0ZzTG01dlpHVkpaQ3hjYmlBZ0lDQWdJQ0FnY0dGMGFEb2djR0Z5ZEdsaGJDNXdZWFJvSUQ4L0lIQmhkR2dzWEc0Z0lDQWdJQ0FnSUM0dUxuQmhjblJwWVd3c1hHNGdJQ0FnSUNCOUtUdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwUlhabGJuUW9abkpoYldVc0lIdGNiaUFnSUNBZ0lIUjVjR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMbGRQVWt0R1RFOVhYMU5VUVZKVVJVUXNYRzRnSUNBZ0lDQnlkVzVKWkN4Y2JpQWdJQ0FnSUhCaGNtVnVkRkoxYmtsa09pQnZjSFJ6TG5CaGNtVnVkRkoxYmtsa0xGeHVJQ0FnSUNBZ2QyOXlhMlpzYjNkSlpEb2dkMjl5YTJac2IzY3VibUZ0WlN4Y2JpQWdJQ0FnSUhCaGRHZ3NYRzRnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMbEpWVGs1SlRrY3NYRzRnSUNBZ0lDQndZWGxzYjJGa09pQjdJR2x1Y0hWMGN5QjlMRnh1SUNBZ0lIMHBPMXh1WEc0Z0lDQWdZWGRoYVhRZ2RHaHBjeTVsYldsMFJYWmxiblFvWm5KaGJXVXNJSHRjYmlBZ0lDQWdJSFI1Y0dVNklFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUlVlWEJsTGxkUFVrdEdURTlYWDFCTVFVNU9SVVFzWEc0Z0lDQWdJQ0J5ZFc1SlpDeGNiaUFnSUNBZ0lIQmhjbVZ1ZEZKMWJrbGtPaUJ2Y0hSekxuQmhjbVZ1ZEZKMWJrbGtMRnh1SUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nZDI5eWEyWnNiM2N1Ym1GdFpTeGNiaUFnSUNBZ0lIQmhkR2dzWEc0Z0lDQWdJQ0J6ZEdGMGRYTTZJRWR5WVhCb1JYaGxZM1YwYVc5dVUzUmhkSFZ6TGxCTVFVNU9TVTVITEZ4dUlDQWdJQ0FnY0dGNWJHOWhaRG9nZXlCc1lYbGxjbk02SUhCc1lXNHViR0Y1WlhKekxteGxibWQwYUN3Z2JtOWtaWE02SUhCc1lXNHVibTlrWlhNdWJHVnVaM1JvSUgwc1hHNGdJQ0FnZlNrN1hHNWNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdabTl5SUNoamIyNXpkQ0JzWVhsbGNpQnZaaUJ3YkdGdUxteGhlV1Z5Y3lrZ2UxeHVJQ0FnSUNBZ0lDQmhkMkZwZENCMGFHbHpMbVY0WldOMWRHVk1ZWGxsY2lobWNtRnRaU3dnY0d4aGJpd2diR0Y1WlhJdWJtOWtaWE1zSUc5d2RITXNJR1Z0YVhSR2JpazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR1p5WVcxbExtWnBibWx6YUNncE8xeHVYRzRnSUNBZ0lDQmhkMkZwZENCMGFHbHpMbVZ0YVhSRmRtVnVkQ2htY21GdFpTd2dlMXh1SUNBZ0lDQWdJQ0IwZVhCbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBWSGx3WlM1WFQxSkxSa3hQVjE5RFQwMVFURVZVUlVRc1hHNGdJQ0FnSUNBZ0lISjFia2xrTEZ4dUlDQWdJQ0FnSUNCd1lYSmxiblJTZFc1SlpEb2diM0IwY3k1d1lYSmxiblJTZFc1SlpDeGNiaUFnSUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nZDI5eWEyWnNiM2N1Ym1GdFpTeGNiaUFnSUNBZ0lDQWdjR0YwYUN4Y2JpQWdJQ0FnSUNBZ2MzUmhkSFZ6T2lCSGNtRndhRVY0WldOMWRHbHZibE4wWVhSMWN5NVRWVU5EUlVWRVJVUXNYRzRnSUNBZ0lDQWdJSEJoZVd4dllXUTZJSHNnYjNWMGNIVjBjem9nZG1Gc2RXVlRkRzl5WlM1blpYUlhiM0pyWm14dmQxWmhiSFZsY3lncElIMHNYRzRnSUNBZ0lDQjlLVHRjYmx4dUlDQWdJQ0FnY21WMGRYSnVJR0oxYVd4a1IzSmhjR2hGZUdWamRYUnBiMjVTWlhOMWJIUW9YRzRnSUNBZ0lDQWdJR1p5WVcxbExGeHVJQ0FnSUNBZ0lDQjNiM0pyWm14dmR5eGNiaUFnSUNBZ0lDQWdhVzV3ZFhSekxGeHVJQ0FnSUNBZ0lDQkhjbUZ3YUVWNFpXTjFkR2x2YmxOMFlYUjFjeTVUVlVORFJVVkVSVVFzWEc0Z0lDQWdJQ0FnSUc5d2RITXViV1YwWVdSaGRHRmNiaUFnSUNBZ0lDazdYRzRnSUNBZ2ZTQmpZWFJqYUNBb1pYSnliM0lwSUh0Y2JpQWdJQ0FnSUdaeVlXMWxMbVpwYm1semFDZ3BPMXh1SUNBZ0lDQWdZMjl1YzNRZ1pYSnliM0pRWVhsc2IyRmtJRDBnZEdocGN5NTBiMFZ5Y205eVVHRjViRzloWkNobGNuSnZjaWs3WEc1Y2JpQWdJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkRVYyWlc1MEtHWnlZVzFsTENCN1hHNGdJQ0FnSUNBZ0lIUjVjR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMbGRQVWt0R1RFOVhYMFpCU1V4RlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRc1hHNGdJQ0FnSUNBZ0lIQmhjbVZ1ZEZKMWJrbGtPaUJ2Y0hSekxuQmhjbVZ1ZEZKMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCM2IzSnJabXh2ZHk1dVlXMWxMRnh1SUNBZ0lDQWdJQ0J3WVhSb0xGeHVJQ0FnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMa1pCU1V4RlJDeGNiaUFnSUNBZ0lDQWdaWEp5YjNJNklHVnljbTl5VUdGNWJHOWhaQ3hjYmlBZ0lDQWdJSDBwTzF4dVhHNGdJQ0FnSUNCeVpYUjFjbTRnWW5WcGJHUkhjbUZ3YUVWNFpXTjFkR2x2YmxKbGMzVnNkQ2hjYmlBZ0lDQWdJQ0FnWm5KaGJXVXNYRzRnSUNBZ0lDQWdJSGR2Y210bWJHOTNMRnh1SUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJRWR5WVhCb1JYaGxZM1YwYVc5dVUzUmhkSFZ6TGtaQlNVeEZSQ3hjYmlBZ0lDQWdJQ0FnYjNCMGN5NXRaWFJoWkdGMFlWeHVJQ0FnSUNBZ0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVR2x1Y3lCaElHNXZaR1VnWVc1a0lHbDBjeUIxY0hOMGNtVmhiU0JrWlhCbGJtUmxibU5wWlhNZ1lXWjBaWElnWVNCamIyMXdiR1YwWldRZ2NuVnVMbHh1SUNBZ0tseHVJQ0FnS2lCRVpXeGxaMkYwWlhNZ2RHOGdlMEJzYVc1cklFZHlZWEJvVUdsdWJtbHVaMU5sY25acFkyVjlMaUJVYUdVZ2NHeGhiaUJoYm1RZ2NtVnpkV3gwSUcxMWMzUWdZMjl0WlZ4dUlDQWdLaUJtY205dElHRWdjSEpwYjNJZ2MzVmpZMlZ6YzJaMWJDQmxlR1ZqZFhScGIyNGdiMllnZEdobElITmhiV1VnZDI5eWEyWnNiM2N1WEc0Z0lDQXFMMXh1SUNCaGMzbHVZeUJ3YVc1T2IyUmxLRzl3ZEdsdmJuTTZJRWR5WVhCb1VHbHVUbTlrWlU5d2RHbHZibk1wT2lCUWNtOXRhWE5sUEhadmFXUStJSHRjYmlBZ0lDQmpiMjV6ZENCelpYSjJhV05sSUQwZ2RHaHBjeTVqY21WaGRHVlFhVzV1YVc1blUyVnlkbWxqWlNncE8xeHVJQ0FnSUdGM1lXbDBJSE5sY25acFkyVXVjR2x1VG05a1pTaHZjSFJwYjI1ektUdGNiaUFnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFJRYVc1dWFXNW5SWFpsYm5Rb2IzQjBhVzl1Y3k1dWIyUmxTV1FzSUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMazVQUkVWZlVFbE9Ua1ZFS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlZibkJwYm5NZ1lTQnViMlJsSUdKNUlHbDBjeUJtYVc1blpYSndjbWx1ZEM1Y2JpQWdJQ292WEc0Z0lHRnplVzVqSUhWdWNHbHVUbTlrWlNodmNIUnBiMjV6T2lCSGNtRndhRlZ1Y0dsdVRtOWtaVTl3ZEdsdmJuTXBPaUJRY205dGFYTmxQSFp2YVdRK0lIdGNiaUFnSUNCamIyNXpkQ0J6WlhKMmFXTmxJRDBnZEdocGN5NWpjbVZoZEdWUWFXNXVhVzVuVTJWeWRtbGpaU2dwTzF4dUlDQWdJR0YzWVdsMElITmxjblpwWTJVdWRXNXdhVzVPYjJSbEtHOXdkR2x2Ym5NcE8xeHVJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkRkJwYm01cGJtZEZkbVZ1ZENodmNIUnBiMjV6TG01dlpHVkpaQ3dnUjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEZSNWNHVXVUazlFUlY5VlRsQkpUazVGUkNrN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dRM0psWVhSbGN5QmhJSHRBYkdsdWF5QkhjbUZ3YUZCcGJtNXBibWRUWlhKMmFXTmxmU0JpWVdOclpXUWdZbmtnZEdocGN5QmxibWRwYm1VbmN5QjJZV3gxWlNCemRHOXlaVnh1SUNBZ0tpQmhaR0Z3ZEdWeUxseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmpjbVZoZEdWUWFXNXVhVzVuVTJWeWRtbGpaU2dwT2lCSGNtRndhRkJwYm01cGJtZFRaWEoyYVdObElIdGNiaUFnSUNCamIyNXpkQ0J6ZEc5eVpTQTlJRzVsZHlCSGNtRndhRlpoYkhWbFUzUnZjbVVvZEdocGN5NTJZV3gxWlZOMGIzSmxRV1JoY0hSbGNpazdYRzRnSUNBZ2NtVjBkWEp1SUc1bGR5QkhjbUZ3YUZCcGJtNXBibWRUWlhKMmFXTmxLRnh1SUNBZ0lDQWdjM1J2Y21Vc1hHNGdJQ0FnSUNCdVpYY2dSM0poY0doUWFXNXVhVzVuVUc5c2FXTjVLQ2tzWEc0Z0lDQWdJQ0J1WlhjZ1IzSmhjR2hRYVc1dWFXNW5SR1Z3Wlc1a1pXNWplVkpsYzI5c2RtVnlLQ2xjYmlBZ0lDQXBPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVWdGFYUnpJR0VnY0dsdWJtbHVaeTF5Wld4aGRHVmtJR1YyWlc1MElIUnZJR0ZzYkNCdlluTmxjblpsY25NdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElHRnplVzVqSUdWdGFYUlFhVzV1YVc1blJYWmxiblFvWEc0Z0lDQWdibTlrWlVsa09pQnpkSEpwYm1jc1hHNGdJQ0FnZEhsd1pUb2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRlI1Y0dWY2JpQWdLVG9nVUhKdmJXbHpaVHgyYjJsa1BpQjdYRzRnSUNBZ1kyOXVjM1FnWm1GamRHOXllU0E5SUc1bGR5QkhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBSbUZqZEc5eWVTZ3BPMXh1SUNBZ0lHTnZibk4wSUdWMlpXNTBJRDBnWm1GamRHOXllUzVqY21WaGRHVW9lMXh1SUNBZ0lDQWdhV1E2SUZ3aVhDSXNYRzRnSUNBZ0lDQnpaWEYxWlc1alpUb2dNQ3hjYmlBZ0lDQWdJSFJwYldWemRHRnRjRG9nYm1WM0lFUmhkR1VvS1N4Y2JpQWdJQ0FnSUhKMWJrbGtPaUJjSW5CcGJtNXBibWRjSWl4Y2JpQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklGd2lYQ0lzWEc0Z0lDQWdJQ0IwZVhCbExGeHVJQ0FnSUNBZ2JtOWtaVWxrTEZ4dUlDQWdJQ0FnY0dGMGFEb2dXMTBzWEc0Z0lDQWdmU0JoY3lCUGJXbDBQRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblFzSUZ3aWFXUmNJaUI4SUZ3aWMyVnhkV1Z1WTJWY0lpQjhJRndpZEdsdFpYTjBZVzF3WENJK0tUdGNiaUFnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFIwWlhJdWRYQmtZWFJsVDJKelpYSjJaWEp6S0dWMlpXNTBLVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCRmVHVmpkWFJsY3lCaElHeGhlV1Z5SUc5bUlHNXZaR1Z6SUhkcGRHZ2dkR2hsSUdOdmJtWnBaM1Z5WldRZ1kyOXVZM1Z5Y21WdVkza3VYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJR0Z6ZVc1aklHVjRaV04xZEdWTVlYbGxjaWhjYmlBZ0lDQm1jbUZ0WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVHY21GdFpTeGNiaUFnSUNCd2JHRnVPaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzRzWEc0Z0lDQWdibTlrWlhNNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrNXZaR1ZiWFN4Y2JpQWdJQ0J2Y0hSek9pQkhjbUZ3YUVWNFpXTjFkR2x2Yms5d2RHbHZibk1zWEc0Z0lDQWdaVzFwZEVadU9pQW9aWFpsYm5RNklGQmhjblJwWVd3OFIzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRENHBJRDArSUZCeWIyMXBjMlU4ZG05cFpENWNiaUFnS1RvZ1VISnZiV2x6WlR4MmIybGtQaUI3WEc0Z0lDQWdZMjl1YzNRZ1kyOXVZM1Z5Y21WdVkza2dQU0JOWVhSb0xtMWhlQ2hjYmlBZ0lDQWdJREVzWEc0Z0lDQWdJQ0J2Y0hSekxtTnZibU4xY25KbGJtTjVJRDgvSUVkU1FWQklYMFJGUmtGVlRGUmZRMDlPUTFWU1VrVk9RMWxjYmlBZ0lDQXBPMXh1SUNBZ0lHTnZibk4wSUhGMVpYVmxJRDBnV3k0dUxtNXZaR1Z6WFR0Y2JseHVJQ0FnSUhkb2FXeGxJQ2h4ZFdWMVpTNXNaVzVuZEdnZ1BpQXdLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmlZWFJqYUNBOUlIRjFaWFZsTG5Od2JHbGpaU2d3TENCamIyNWpkWEp5Wlc1amVTazdYRzRnSUNBZ0lDQmhkMkZwZENCUWNtOXRhWE5sTG1Gc2JDaGNiaUFnSUNBZ0lDQWdZbUYwWTJndWJXRndLQ2h1YjJSbEtTQTlQaUIwYUdsekxtVjRaV04xZEdWT2IyUmxLR1p5WVcxbExDQndiR0Z1TENCdWIyUmxMQ0J2Y0hSekxDQmxiV2wwUm00cEtWeHVJQ0FnSUNBZ0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dSWGhsWTNWMFpYTWdZU0J6YVc1bmJHVWdibTlrWlM1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ1lYTjVibU1nWlhobFkzVjBaVTV2WkdVb1hHNGdJQ0FnWm5KaGJXVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJuSmhiV1VzWEc0Z0lDQWdjR3hoYmpvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdUxGeHVJQ0FnSUhCc1lXNU9iMlJsT2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxMRnh1SUNBZ0lHOXdkSE02SUVkeVlYQm9SWGhsWTNWMGFXOXVUM0IwYVc5dWN5eGNiaUFnSUNCbGJXbDBSbTQ2SUNobGRtVnVkRG9nVUdGeWRHbGhiRHhIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwUGlrZ1BUNGdVSEp2YldselpUeDJiMmxrUGx4dUlDQXBPaUJRY205dGFYTmxQSFp2YVdRK0lIdGNiaUFnSUNCamIyNXpkQ0J6ZEdGeWRHVmtRWFFnUFNCdVpYY2dSR0YwWlNncE8xeHVJQ0FnSUdOdmJuTjBJRzV2WkdWUVlYUm9JRDBnV3k0dUxpaHZjSFJ6TG5CaGRHZ2dQejhnVzEwcExDQndiR0Z1VG05a1pTNXBaRjA3WEc1Y2JpQWdJQ0JoZDJGcGRDQjBhR2x6TG1WdGFYUkZkbVZ1ZENobWNtRnRaU3dnZTF4dUlDQWdJQ0FnZEhsd1pUb2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRlI1Y0dVdVRrOUVSVjlUVkVGU1ZFVkVMRnh1SUNBZ0lDQWdjblZ1U1dRNklHWnlZVzFsTG5KMWJrbGtMRnh1SUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nY0d4aGJpNTNiM0pyWm14dmQwbGtMRnh1SUNBZ0lDQWdibTlrWlVsa09pQndiR0Z1VG05a1pTNXBaQ3hjYmlBZ0lDQWdJSEJoZEdnNklHNXZaR1ZRWVhSb0xGeHVJQ0FnSUNBZ2MzUmhkSFZ6T2lCSGNtRndhRVY0WldOMWRHbHZibE4wWVhSMWN5NVNWVTVPU1U1SExGeHVJQ0FnSUgwcE8xeHVYRzRnSUNBZ1kyOXVjM1FnYVc1d2RYUnpJRDBnZEdocGN5NXlaWE52YkhabFRtOWtaVWx1Y0hWMGN5aG1jbUZ0WlN3Z2NHeGhiaXdnY0d4aGJrNXZaR1VwTzF4dVhHNGdJQ0FnTHk4Z1EyRmphR1V0YUdsME9pQmphR1ZqYXlCbWIzSWdZU0J3YVc1dVpXUWdkbUZzZFdVZ1ltVm1iM0psSUdWNFpXTjFkR2x1WnlCMGFHVWdibTlrWlZ4dUlDQWdJR2xtSUNodmNIUnpMblZ6WlZCcGJtNWxaRlpoYkhWbGN5a2dlMXh1SUNBZ0lDQWdZMjl1YzNRZ1kyRmphR1ZrSUQwZ1lYZGhhWFFnZEdocGN5NTBjbmxRYVc1dVpXUldZV3gxWlNobWNtRnRaU3dnY0d4aGJpd2djR3hoYms1dlpHVXNJR2x1Y0hWMGN5azdYRzRnSUNBZ0lDQnBaaUFvWTJGamFHVmtLU0I3WEc0Z0lDQWdJQ0FnSUdaeVlXMWxMblpoYkhWbFUzUnZjbVV1YzJWMFRtOWtaVTkxZEhCMWRITW9jR3hoYms1dlpHVXVhV1FzSUdOaFkyaGxaQzV2ZFhSd2RYUnpLVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXliM1YwWlU5MWRHZHZhVzVuUldSblpYTW9abkpoYldVc0lIQnNZVzRzSUhCc1lXNU9iMlJsTENCallXTm9aV1F1YjNWMGNIVjBjeWs3WEc1Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnWm1sdWFYTm9aV1JCZENBOUlHNWxkeUJFWVhSbEtDazdYRzRnSUNBZ0lDQWdJR052Ym5OMElISmxjM1ZzZERvZ1IzSmhjR2hPYjJSbFJYaGxZM1YwYVc5dVVtVnpkV3gwSUQwZ2UxeHVJQ0FnSUNBZ0lDQWdJRzV2WkdWSlpEb2djR3hoYms1dlpHVXVhV1FzWEc0Z0lDQWdJQ0FnSUNBZ2MzUmhkSFZ6T2lCSGNtRndhRVY0WldOMWRHbHZibE4wWVhSMWN5NURRVU5JUlVRc1hHNGdJQ0FnSUNBZ0lDQWdhVzV3ZFhSekxGeHVJQ0FnSUNBZ0lDQWdJRzkxZEhCMWRITTZJR05oWTJobFpDNXZkWFJ3ZFhSekxGeHVJQ0FnSUNBZ0lDQWdJSE4wWVhKMFpXUkJkQ3hjYmlBZ0lDQWdJQ0FnSUNCbWFXNXBjMmhsWkVGMExGeHVJQ0FnSUNBZ0lDQWdJR1p5YjIxRFlXTm9aVG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdJQ0J3YVc1dVpXUTZJSFJ5ZFdVc1hHNGdJQ0FnSUNBZ0lDQWdaWFpsYm5Sek9pQmJYU3hjYmlBZ0lDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUNBZ1puSmhiV1V1Y21WamIzSmtUbTlrWlZKbGMzVnNkQ2h5WlhOMWJIUXBPMXh1WEc0Z0lDQWdJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkRVYyWlc1MEtHWnlZVzFsTENCN1hHNGdJQ0FnSUNBZ0lDQWdkSGx3WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VGs5RVJWOURRVU5JUlY5SVNWUXNYRzRnSUNBZ0lDQWdJQ0FnY25WdVNXUTZJR1p5WVcxbExuSjFia2xrTEZ4dUlDQWdJQ0FnSUNBZ0lIZHZjbXRtYkc5M1NXUTZJSEJzWVc0dWQyOXlhMlpzYjNkSlpDeGNiaUFnSUNBZ0lDQWdJQ0J1YjJSbFNXUTZJSEJzWVc1T2IyUmxMbWxrTEZ4dUlDQWdJQ0FnSUNBZ0lIQmhkR2c2SUc1dlpHVlFZWFJvTEZ4dUlDQWdJQ0FnSUNBZ0lITjBZWFIxY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVUZEdGMGRYTXVRMEZEU0VWRUxGeHVJQ0FnSUNBZ0lDQWdJSEJoZVd4dllXUTZJSHNnYjNWMGNIVjBjem9nWTJGamFHVmtMbTkxZEhCMWRITWdmU3hjYmlBZ0lDQWdJQ0FnZlNrN1hHNWNiaUFnSUNBZ0lDQWdZWGRoYVhRZ2RHaHBjeTVsYldsMFJYWmxiblFvWm5KaGJXVXNJSHRjYmlBZ0lDQWdJQ0FnSUNCMGVYQmxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwVkhsd1pTNU9UMFJGWDBOUFRWQk1SVlJGUkN4Y2JpQWdJQ0FnSUNBZ0lDQnlkVzVKWkRvZ1puSmhiV1V1Y25WdVNXUXNYRzRnSUNBZ0lDQWdJQ0FnZDI5eWEyWnNiM2RKWkRvZ2NHeGhiaTUzYjNKclpteHZkMGxrTEZ4dUlDQWdJQ0FnSUNBZ0lHNXZaR1ZKWkRvZ2NHeGhiazV2WkdVdWFXUXNYRzRnSUNBZ0lDQWdJQ0FnY0dGMGFEb2dibTlrWlZCaGRHZ3NYRzRnSUNBZ0lDQWdJQ0FnYzNSaGRIVnpPaUJIY21Gd2FFVjRaV04xZEdsdmJsTjBZWFIxY3k1VFZVTkRSVVZFUlVRc1hHNGdJQ0FnSUNBZ0lDQWdjR0Y1Ykc5aFpEb2dleUJ2ZFhSd2RYUnpPaUJqWVdOb1pXUXViM1YwY0hWMGN5d2dabkp2YlVOaFkyaGxPaUIwY25WbElIMHNYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUdOdmJuTjBJR1Y0WldOMWRHOXlJRDBnZEdocGN5NWpiMjVtYVdjdWNtVm5hWE4wY25rdWNtVnpiMngyWlNod2JHRnVUbTlrWlM1cmFXNWtLVHRjYmlBZ0lDQWdJR052Ym5OMElHTnZiblJsZUhRZ1BTQnVaWGNnUjNKaGNHaEZlR1ZqZFhScGIyNURiMjUwWlhoMEtGeHVJQ0FnSUNBZ0lDQm1jbUZ0WlM1eWRXNUpaQ3hjYmlBZ0lDQWdJQ0FnYjNCMGN5NXdZWEpsYm5SU2RXNUpaQ3hjYmlBZ0lDQWdJQ0FnY0d4aGJpNTNiM0pyWm14dmR5eGNiaUFnSUNBZ0lDQWdjR3hoYms1dlpHVXVaR1ZtYVc1cGRHbHZiaXhjYmlBZ0lDQWdJQ0FnYm05a1pWQmhkR2dzWEc0Z0lDQWdJQ0FnSUdWdGFYUkdiaXhjYmlBZ0lDQWdJQ0FnYjNCMGN5NXRaWFJoWkdGMFlWeHVJQ0FnSUNBZ0tUdGNibHh1SUNBZ0lDQWdZMjl1YzNRZ2IzVjBjSFYwY3lBOUlHRjNZV2wwSUdWNFpXTjFkRzl5TG1WNFpXTjFkR1VvYVc1d2RYUnpMQ0JqYjI1MFpYaDBLVHRjYmlBZ0lDQWdJR052Ym5OMElISmxjMjlzZG1Wa1QzVjBjSFYwY3lBOUlHOTFkSEIxZEhNZ1B6OGdlMzA3WEc1Y2JpQWdJQ0FnSUdaeVlXMWxMblpoYkhWbFUzUnZjbVV1YzJWMFRtOWtaVTkxZEhCMWRITW9jR3hoYms1dlpHVXVhV1FzSUhKbGMyOXNkbVZrVDNWMGNIVjBjeWs3WEc0Z0lDQWdJQ0IwYUdsekxuSnZkWFJsVDNWMFoyOXBibWRGWkdkbGN5aG1jbUZ0WlN3Z2NHeGhiaXdnY0d4aGJrNXZaR1VzSUhKbGMyOXNkbVZrVDNWMGNIVjBjeWs3WEc1Y2JpQWdJQ0FnSUdOdmJuTjBJR1pwYm1semFHVmtRWFFnUFNCdVpYY2dSR0YwWlNncE8xeHVJQ0FnSUNBZ1kyOXVjM1FnY21WemRXeDBPaUJIY21Gd2FFNXZaR1ZGZUdWamRYUnBiMjVTWlhOMWJIUWdQU0I3WEc0Z0lDQWdJQ0FnSUc1dlpHVkpaRG9nY0d4aGJrNXZaR1V1YVdRc1hHNGdJQ0FnSUNBZ0lITjBZWFIxY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVUZEdGMGRYTXVVMVZEUTBWRlJFVkVMRnh1SUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJRzkxZEhCMWRITTZJSEpsYzI5c2RtVmtUM1YwY0hWMGN5eGNiaUFnSUNBZ0lDQWdjM1JoY25SbFpFRjBMRnh1SUNBZ0lDQWdJQ0JtYVc1cGMyaGxaRUYwTEZ4dUlDQWdJQ0FnSUNCbGRtVnVkSE02SUZ0ZExGeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lHWnlZVzFsTG5KbFkyOXlaRTV2WkdWU1pYTjFiSFFvY21WemRXeDBLVHRjYmx4dUlDQWdJQ0FnWVhkaGFYUWdkR2hwY3k1bGJXbDBSWFpsYm5Rb1puSmhiV1VzSUh0Y2JpQWdJQ0FnSUNBZ2RIbHdaVG9nUjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEZSNWNHVXVUazlFUlY5RFQwMVFURVZVUlVRc1hHNGdJQ0FnSUNBZ0lISjFia2xrT2lCbWNtRnRaUzV5ZFc1SlpDeGNiaUFnSUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nY0d4aGJpNTNiM0pyWm14dmQwbGtMRnh1SUNBZ0lDQWdJQ0J1YjJSbFNXUTZJSEJzWVc1T2IyUmxMbWxrTEZ4dUlDQWdJQ0FnSUNCd1lYUm9PaUJ1YjJSbFVHRjBhQ3hjYmlBZ0lDQWdJQ0FnYzNSaGRIVnpPaUJIY21Gd2FFVjRaV04xZEdsdmJsTjBZWFIxY3k1VFZVTkRSVVZFUlVRc1hHNGdJQ0FnSUNBZ0lIQmhlV3h2WVdRNklIc2diM1YwY0hWMGN6b2djbVZ6YjJ4MlpXUlBkWFJ3ZFhSeklIMHNYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWm1sdWFYTm9aV1JCZENBOUlHNWxkeUJFWVhSbEtDazdYRzRnSUNBZ0lDQmpiMjV6ZENCbGNuSnZjbEJoZVd4dllXUWdQU0IwYUdsekxuUnZSWEp5YjNKUVlYbHNiMkZrS0dWeWNtOXlLVHRjYmlBZ0lDQWdJR052Ym5OMElISmxjM1ZzZERvZ1IzSmhjR2hPYjJSbFJYaGxZM1YwYVc5dVVtVnpkV3gwSUQwZ2UxeHVJQ0FnSUNBZ0lDQnViMlJsU1dRNklIQnNZVzVPYjJSbExtbGtMRnh1SUNBZ0lDQWdJQ0J6ZEdGMGRYTTZJRWR5WVhCb1JYaGxZM1YwYVc5dVUzUmhkSFZ6TGtaQlNVeEZSQ3hjYmlBZ0lDQWdJQ0FnYVc1d2RYUnpMRnh1SUNBZ0lDQWdJQ0JsY25KdmNqb2daWEp5YjNKUVlYbHNiMkZrTEZ4dUlDQWdJQ0FnSUNCemRHRnlkR1ZrUVhRc1hHNGdJQ0FnSUNBZ0lHWnBibWx6YUdWa1FYUXNYRzRnSUNBZ0lDQWdJR1YyWlc1MGN6b2dXMTBzWEc0Z0lDQWdJQ0I5TzF4dUlDQWdJQ0FnWm5KaGJXVXVjbVZqYjNKa1RtOWtaVkpsYzNWc2RDaHlaWE4xYkhRcE8xeHVYRzRnSUNBZ0lDQmhkMkZwZENCMGFHbHpMbVZ0YVhSRmRtVnVkQ2htY21GdFpTd2dlMXh1SUNBZ0lDQWdJQ0IwZVhCbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBWSGx3WlM1T1QwUkZYMFpCU1V4RlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRNklHWnlZVzFsTG5KMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCd2JHRnVMbmR2Y210bWJHOTNTV1FzWEc0Z0lDQWdJQ0FnSUc1dlpHVkpaRG9nY0d4aGJrNXZaR1V1YVdRc1hHNGdJQ0FnSUNBZ0lIQmhkR2c2SUc1dlpHVlFZWFJvTEZ4dUlDQWdJQ0FnSUNCemRHRjBkWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVM1JoZEhWekxrWkJTVXhGUkN4Y2JpQWdJQ0FnSUNBZ1pYSnliM0k2SUdWeWNtOXlVR0Y1Ykc5aFpDeGNiaUFnSUNBZ0lIMHBPMXh1WEc0Z0lDQWdJQ0JwWmlBb2IzQjBjeTVtWVdsc1JtRnpkQ0EvUHlCMGNuVmxLU0IwYUhKdmR5Qmxjbkp2Y2p0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1VtVnpiMngyWlhNZ1lTQnViMlJsSjNNZ2FXNXdkWFFnZG1Gc2RXVnpJR1p5YjIwZ2FXNWpiMjFwYm1jZ1pXUm5aWE11WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhKbGMyOXNkbVZPYjJSbFNXNXdkWFJ6S0Z4dUlDQWdJR1p5WVcxbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtaeVlXMWxMRnh1SUNBZ0lIQnNZVzQ2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYml4Y2JpQWdJQ0J3YkdGdVRtOWtaVG9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1VG05a1pWeHVJQ0FwT2lCSGNtRndhRVY0WldOMWRHbHZibFpoYkhWbGN5QjdYRzRnSUNBZ1kyOXVjM1FnYVc1d2RYUnpPaUJIY21Gd2FFVjRaV04xZEdsdmJsWmhiSFZsY3lBOUlIdDlPMXh1SUNBZ0lHTnZibk4wSUdsdVkyOXRhVzVuSUQwZ2NHeGhiaTVwYm1OdmJXbHVaMEo1VG05a1pTNW5aWFFvY0d4aGJrNXZaR1V1YVdRcElEOC9JRnRkTzF4dUlDQWdJR1p2Y2lBb1kyOXVjM1FnWldSblpTQnZaaUJwYm1OdmJXbHVaeWtnZTF4dUlDQWdJQ0FnYVc1d2RYUnpXMlZrWjJVdWRHRnlaMlYwVUc5eWRGMGdQU0JtY21GdFpTNTJZV3gxWlZOMGIzSmxMbWRsZEZCdmNuUW9YRzRnSUNBZ0lDQWdJR1ZrWjJVdWMyOTFjbU5sVG05a1pVbGtMRnh1SUNBZ0lDQWdJQ0JsWkdkbExuTnZkWEpqWlZCdmNuUmNiaUFnSUNBZ0lDazdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJwYm5CMWRITTdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nUVhSMFpXMXdkSE1nZEc4Z2NtVmhaQ0JoSUhCcGJtNWxaQ0IyWVd4MVpTQm1iM0lnZEdobElHNXZaR1V1SUZKbGRIVnlibk1nZEdobElHTmhZMmhsWkNCdmRYUndkWFJ6WEc0Z0lDQXFJSGRvWlc0Z1lTQjJZV3hwWkNCd2FXNXVaV1FnZG1Gc2RXVWdaWGhwYzNSekxDQnZjaUJnZFc1a1pXWnBibVZrWUNCMGJ5QndjbTlqWldWa0lIZHBkR2dnYm05eWJXRnNYRzRnSUNBcUlHVjRaV04xZEdsdmJpNWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZWE41Ym1NZ2RISjVVR2x1Ym1Wa1ZtRnNkV1VvWEc0Z0lDQWdabkpoYldVNklFZHlZWEJvUlhobFkzVjBhVzl1Um5KaGJXVXNYRzRnSUNBZ2NHeGhiam9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1TEZ4dUlDQWdJSEJzWVc1T2IyUmxPaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVPYjJSbExGeHVJQ0FnSUdsdWNIVjBjem9nUjNKaGNHaEZlR1ZqZFhScGIyNVdZV3gxWlhOY2JpQWdLVG9nVUhKdmJXbHpaVHhIY21Gd2FFTmhZMmhsWkZaaGJIVmxJSHdnZFc1a1pXWnBibVZrUGlCN1hHNGdJQ0FnWTI5dWMzUWdjRzlzYVdONUlEMGdibVYzSUVkeVlYQm9VR2x1Ym1sdVoxQnZiR2xqZVNncE8xeHVJQ0FnSUdsbUlDZ2hjRzlzYVdONUxuTm9iM1ZzWkZWelpWQnBibTVsWkZaaGJIVmxLSEJzWVc1T2IyUmxLU2tnY21WMGRYSnVJSFZ1WkdWbWFXNWxaRHRjYmx4dUlDQWdJR052Ym5OMElITmxjblpwWTJVZ1BTQjBhR2x6TG1OeVpXRjBaVkJwYm01cGJtZFRaWEoyYVdObEtDazdYRzRnSUNBZ1kyOXVjM1FnWkdWd1JtbHVaMlZ5Y0hKcGJuUnpJRDBnZEdocGN5NWpiMjF3ZFhSbFJHVndaVzVrWlc1amVVWnBibWRsY25CeWFXNTBjeWhtY21GdFpTd2djR3hoYml3Z2NHeGhiazV2WkdVdWFXUXBPMXh1SUNBZ0lISmxkSFZ5YmlCelpYSjJhV05sTG5KbFlXUlFhVzV1WldSV1lXeDFaU2hjYmlBZ0lDQWdJSEJzWVc0dWQyOXlhMlpzYjNjc1hHNGdJQ0FnSUNCd2JHRnVUbTlrWlN4Y2JpQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJR1JsY0VacGJtZGxjbkJ5YVc1MGMxeHVJQ0FnSUNrN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVbVZqZFhKemFYWmxiSGtnWTI5dGNIVjBaWE1nWm1sdVoyVnljSEpwYm5SeklHWnZjaUJoYkd3Z2RYQnpkSEpsWVcwZ1pHVndaVzVrWlc1amFXVnpJRzltSUdFZ2JtOWtaVnh1SUNBZ0tpQjFjMmx1WnlCMGFHVWdjbVZ6ZFd4MGN5QmhiSEpsWVdSNUlHRmpZM1Z0ZFd4aGRHVmtJR2x1SUhSb1pTQm1jbUZ0WlM1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ1kyOXRjSFYwWlVSbGNHVnVaR1Z1WTNsR2FXNW5aWEp3Y21sdWRITW9YRzRnSUNBZ1puSmhiV1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSbkpoYldVc1hHNGdJQ0FnY0d4aGJqb2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVMRnh1SUNBZ0lHNXZaR1ZKWkRvZ2MzUnlhVzVuWEc0Z0lDazZJRkpsWTI5eVpEeHpkSEpwYm1jc0lITjBjbWx1Wno0Z2UxeHVJQ0FnSUdOdmJuTjBJSE5sY25acFkyVWdQU0IwYUdsekxtTnlaV0YwWlZCcGJtNXBibWRUWlhKMmFXTmxLQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pHVndVbVZ6YjJ4MlpYSWdQU0J1WlhjZ1IzSmhjR2hRYVc1dWFXNW5SR1Z3Wlc1a1pXNWplVkpsYzI5c2RtVnlLQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pHVndjeUE5SUdSbGNGSmxjMjlzZG1WeUxtZGxkRVJsY0dWdVpHVnVZMmxsY3lod2JHRnVMQ0J1YjJSbFNXUXBPMXh1SUNBZ0lHTnZibk4wSUdacGJtZGxjbkJ5YVc1MGN6b2dVbVZqYjNKa1BITjBjbWx1Wnl3Z2MzUnlhVzVuUGlBOUlIdDlPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdaR1Z3SUc5bUlHUmxjSE1wSUh0Y2JpQWdJQ0FnSUdOdmJuTjBJRzV2WkdVZ1BTQndiR0Z1TG01dlpHVnpMbVpwYm1Rb0tHNHBJRDArSUc0dWFXUWdQVDA5SUdSbGNDazdYRzRnSUNBZ0lDQnBaaUFvYm05a1pTa2dlMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQmtaWEJTWlhOMWJIUWdQU0JtY21GdFpTNXViMlJsVW1WemRXeDBjeTVuWlhRb1pHVndLVHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdhVzV3ZFhSeklEMGdaR1Z3VW1WemRXeDBQeTVwYm5CMWRITWdQejhnZTMwN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUc1bGMzUmxaRVJsY0hNZ1BTQjBhR2x6TG1OdmJYQjFkR1ZFWlhCbGJtUmxibU41Um1sdVoyVnljSEpwYm5SektHWnlZVzFsTENCd2JHRnVMQ0JrWlhBcE8xeHVJQ0FnSUNBZ0lDQm1hVzVuWlhKd2NtbHVkSE5iWkdWd1hTQTlJSE5sY25acFkyVXVZMjl0Y0hWMFpVWnBibWRsY25CeWFXNTBLRnh1SUNBZ0lDQWdJQ0FnSUhCc1lXNHVkMjl5YTJac2IzY3NYRzRnSUNBZ0lDQWdJQ0FnYm05a1pTeGNiaUFnSUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJQ0FnYm1WemRHVmtSR1Z3YzF4dUlDQWdJQ0FnSUNBcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdabWx1WjJWeWNISnBiblJ6TzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlGSnZkWFJsY3lCaElHNXZaR1VuY3lCdmRYUndkWFJ6SUhSdklHUnZkMjV6ZEhKbFlXMGdhVzV3ZFhSeklHRnVaQ0IzYjNKclpteHZkeUJ2ZFhSd2RYUnpMbHh1SUNBZ0tpOWNiaUFnY0hKcGRtRjBaU0J5YjNWMFpVOTFkR2R2YVc1blJXUm5aWE1vWEc0Z0lDQWdabkpoYldVNklFZHlZWEJvUlhobFkzVjBhVzl1Um5KaGJXVXNYRzRnSUNBZ2NHeGhiam9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1TEZ4dUlDQWdJSEJzWVc1T2IyUmxPaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVPYjJSbExGeHVJQ0FnSUc5MWRIQjFkSE02SUVkeVlYQm9SWGhsWTNWMGFXOXVWbUZzZFdWelhHNGdJQ2s2SUhadmFXUWdlMXh1SUNBZ0lHTnZibk4wSUc5MWRHZHZhVzVuSUQwZ2NHeGhiaTV2ZFhSbmIybHVaMEo1VG05a1pTNW5aWFFvY0d4aGJrNXZaR1V1YVdRcElEOC9JRnRkTzF4dUlDQWdJR1p2Y2lBb1kyOXVjM1FnWldSblpTQnZaaUJ2ZFhSbmIybHVaeWtnZTF4dUlDQWdJQ0FnWTI5dWMzUWdkbUZzZFdVZ1BTQnZkWFJ3ZFhSelcyVmtaMlV1YzI5MWNtTmxVRzl5ZEYwN1hHNGdJQ0FnSUNCcFppQW9aV1JuWlM1MFlYSm5aWFJPYjJSbFNXUWdQVDA5SUVkU1FWQklYMWRQVWt0R1RFOVhYMEpQVlU1RVFWSlpLU0I3WEc0Z0lDQWdJQ0FnSUdaeVlXMWxMblpoYkhWbFUzUnZjbVV1YzJWMFYyOXlhMlpzYjNkUGRYUndkWFFvWldSblpTNTBZWEpuWlhSUWIzSjBMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQjBhR2x6TG1WdGFYUkZkbVZ1ZENobWNtRnRaU3dnZTF4dUlDQWdJQ0FnSUNCMGVYQmxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwVkhsd1pTNUZSRWRGWDFaQlRGVkZYMUpQVlZSRlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRNklHWnlZVzFsTG5KMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCd2JHRnVMbmR2Y210bWJHOTNTV1FzWEc0Z0lDQWdJQ0FnSUdWa1oyVkpaRG9nWldSblpTNXBaQ3hjYmlBZ0lDQWdJQ0FnYm05a1pVbGtPaUJ3YkdGdVRtOWtaUzVwWkN4Y2JpQWdJQ0FnSUNBZ2NHRjBhRG9nVzEwc1hHNGdJQ0FnSUNBZ0lIQmhlV3h2WVdRNklIc2daV1JuWlN3Z2RtRnNkV1VnZlN4Y2JpQWdJQ0FnSUgwcExtTmhkR05vS0NncElEMCtJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2IySnpaWEoyWlhJZ1ptRnBiSFZ5WlhNZ2JYVnpkQ0J1YjNRZ1kzSmhjMmhjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCRmJXbDBjeUJoYmlCbGRtVnVkQ3dnY21WamIzSmtjeUJwZENCcGJpQjBhR1VnWm5KaGJXVXNJR0Z1WkNCa2FYTndZWFJqYUdWeklIUnZJRzlpYzJWeWRtVnljeTVjYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnWVhONWJtTWdaVzFwZEVWMlpXNTBLRnh1SUNBZ0lHWnlZVzFsT2lCSGNtRndhRVY0WldOMWRHbHZia1p5WVcxbExGeHVJQ0FnSUhCaGNuUnBZV3c2SUZCaGNuUnBZV3c4UjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEQ0Z0ppQjdYRzRnSUNBZ0lDQjBlWEJsT2lCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaVHRjYmlBZ0lDQWdJSEoxYmtsa09pQkhjbUZ3YUZKMWJrbGtPMXh1SUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nYzNSeWFXNW5PMXh1SUNBZ0lDQWdjR0YwYURvZ2MzUnlhVzVuVzEwN1hHNGdJQ0FnZlZ4dUlDQXBPaUJRY205dGFYTmxQSFp2YVdRK0lIdGNiaUFnSUNCamIyNXpkQ0JsZG1WdWRDQTlJR1p5WVcxbExtVjJaVzUwUm1GamRHOXllUzVqY21WaGRHVW9lMXh1SUNBZ0lDQWdhV1E2SUZ3aVhDSXNYRzRnSUNBZ0lDQnpaWEYxWlc1alpUb2dNQ3hjYmlBZ0lDQWdJSFJwYldWemRHRnRjRG9nYm1WM0lFUmhkR1VvS1N4Y2JpQWdJQ0FnSUM0dUxuQmhjblJwWVd3c1hHNGdJQ0FnZlNCaGN5QlBiV2wwUEVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5Rc0lGd2lhV1JjSWlCOElGd2ljMlZ4ZFdWdVkyVmNJaUI4SUZ3aWRHbHRaWE4wWVcxd1hDSStLVHRjYmlBZ0lDQm1jbUZ0WlM1aGNIQmxibVJGZG1WdWRDaGxkbVZ1ZENrN1hHNGdJQ0FnWVhkaGFYUWdkR2hwY3k1bGJXbDBkR1Z5TG5Wd1pHRjBaVTlpYzJWeWRtVnljeWhsZG1WdWRDazdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nVFdWeVoyVnpJR1JsWm1GMWJIUWdiM0IwYVc5dWN5QjNhWFJvSUhSb1pTQm5hWFpsYmlCdmNIUnBiMjV6TGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCdFpYSm5aVTl3ZEdsdmJuTW9YRzRnSUNBZ2IzQjBhVzl1Y3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVQY0hScGIyNXpYRzRnSUNrNklFZHlZWEJvUlhobFkzVjBhVzl1VDNCMGFXOXVjeUI3WEc0Z0lDQWdjbVYwZFhKdUlIdGNiaUFnSUNBZ0lHTnZibU4xY25KbGJtTjVPaUJIVWtGUVNGOUVSVVpCVlV4VVgwTlBUa05WVWxKRlRrTlpMRnh1SUNBZ0lDQWdabUZwYkVaaGMzUTZJSFJ5ZFdVc1hHNGdJQ0FnSUNCMllXeHBaR0YwWlVsdWNIVjBjem9nZEhKMVpTeGNiaUFnSUNBZ0lIWmhiR2xrWVhSbFQzVjBjSFYwY3pvZ2RISjFaU3hjYmlBZ0lDQWdJSFZ6WlZCcGJtNWxaRlpoYkhWbGN6b2dkSEoxWlN4Y2JpQWdJQ0FnSUhkeWFYUmxWR2h5YjNWbmFFTmhZMmhsT2lCbVlXeHpaU3hjYmlBZ0lDQWdJSEJoZEdnNklGdGRMRnh1SUNBZ0lDQWdiV1YwWVdSaGRHRTZJSHQ5TEZ4dUlDQWdJQ0FnTGk0dWRHaHBjeTVrWldaaGRXeDBUM0IwYVc5dWN5eGNiaUFnSUNBZ0lDNHVMbTl3ZEdsdmJuTXNYRzRnSUNBZ2ZUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJIWlc1bGNtRjBaWE1nWVNCMWJtbHhkV1VnY25WdUlHbGtMbHh1SUNBZ0tpOWNiaUFnY0hKcGRtRjBaU0JuWlc1bGNtRjBaVkoxYmtsa0tDazZJSE4wY21sdVp5QjdYRzRnSUNBZ2NtVjBkWEp1SUNoY2JpQWdJQ0FnSUdkc2IySmhiRlJvYVhNdVkzSjVjSFJ2UHk1eVlXNWtiMjFWVlVsRVB5NG9LU0EvUDF4dUlDQWdJQ0FnWUdkeVlYQm9MWEoxYmkwa2UwUmhkR1V1Ym05M0tDbDlMU1I3VFdGMGFDNXlZVzVrYjIwb0tTNTBiMU4wY21sdVp5Z3pOaWt1YzJ4cFkyVW9NaWw5WUZ4dUlDQWdJQ2s3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1EyOXVkbVZ5ZEhNZ1lXNGdaWEp5YjNJZ2FXNTBieUJoSUhObGNtbGhiR2w2WldRZ2NHRjViRzloWkM1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ2RHOUZjbkp2Y2xCaGVXeHZZV1FvWlhKeWIzSTZJSFZ1YTI1dmQyNHBPaUJIY21Gd2FFVjRaV04xZEdsdmJrVnljbTl5VUdGNWJHOWhaQ0I3WEc0Z0lDQWdhV1lnS0dWeWNtOXlJR2x1YzNSaGJtTmxiMllnUlhKeWIzSXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQjdYRzRnSUNBZ0lDQWdJRzVoYldVNklHVnljbTl5TG01aGJXVXNYRzRnSUNBZ0lDQWdJRzFsYzNOaFoyVTZJR1Z5Y205eUxtMWxjM05oWjJVc1hHNGdJQ0FnSUNBZ0lITjBZV05yT2lCbGNuSnZjaTV6ZEdGamF5eGNiaUFnSUNBZ0lDQWdZMjlrWlRwY2JpQWdJQ0FnSUNBZ0lDQW9aWEp5YjNJZ1lYTWdZVzU1S1M1bmNtRndhRU52WkdVZ1B6OWNiaUFnSUNBZ0lDQWdJQ0FvZEhsd1pXOW1JQ2hsY25KdmNpQmhjeUJoYm5rcExtTnZaR1VnUFQwOUlGd2liblZ0WW1WeVhDSmNiaUFnSUNBZ0lDQWdJQ0FnSUQ4Z1UzUnlhVzVuS0NobGNuSnZjaUJoY3lCaGJua3BMbU52WkdVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0E2SUNobGNuSnZjaUJoY3lCaGJua3BMbU52WkdVcExGeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSHNnYm1GdFpUb2dYQ0pWYm10dWIzZHVSWEp5YjNKY0lpd2diV1Z6YzJGblpUb2dVM1J5YVc1bktHVnljbTl5S1NCOU8xeHVJQ0I5WEc1OVhHNGlYWDA9Il19