footprintjs 9.48.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -11,11 +11,11 @@
11
11
  * The execute() convenience method is intentionally omitted —
12
12
  * it belongs in the runner layer (Phase 5).
13
13
  */
14
+ import { joinPath } from 'foottrace';
14
15
  import { isDevMode } from '../devMode.js';
15
16
  import { prefixNodeTree } from '../engine/graph/prefixNodeTree.js';
16
17
  import { BRANCH_SEGMENT_MARKER, hasBranchSegmentMarker } from '../ids/branchSegment.js';
17
18
  import { refuseReservedId } from '../ids/reservedIds.js';
18
- import { joinPath } from '../ids/runtimeStageId.js';
19
19
  import { makeRunnable } from '../runner/RunnableChart.js';
20
20
  import { StructureRecorderDispatcher } from './structure/StructureRecorderDispatcher.js';
21
21
  import { createTypedScopeFactory } from './typedFlowChart.js';
@@ -1667,7 +1667,7 @@ export class FlowChartBuilder {
1667
1667
  * stages from their ids — a switch over `runtimeStageId` that parses `#` and
1668
1668
  * `/`, lives in the consumer, and silently goes stale when a stage is
1669
1669
  * renamed. Declared here, the name travels WITH the commit: a recording from
1670
- * any chart carries its own milestones, and `tagStops` (footprintjs/trace)
1670
+ * any chart carries its own milestones, and `tagStops` (foottrace)
1671
1671
  * scrubs them with no id conventions at all.
1672
1672
  *
1673
1673
  * ## What a tag is, and is not
@@ -2099,4 +2099,4 @@ export function specToStageNode(spec) {
2099
2099
  });
2100
2100
  return inflate(spec);
2101
2101
  }
2102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hGLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHcEQsT0FBTyxFQUEwQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQTJCLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFnQnZGLGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBVyxFQUFTLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLGdCQUFnQixDQUN2QixJQUF5QixFQUN6QixJQUFpQyxFQUNqQyxLQUE4QixFQUM5QixLQUFhO0lBRWIsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxR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QyxDQUFDLENBQUMsU0FBUztRQUNsRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUMzQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRCdWlsZGVyIOKAlCBGbHVlbnQgQVBJIGZvciBjb25zdHJ1Y3RpbmcgZmxvd2NoYXJ0IGV4ZWN1dGlvbiBncmFwaHMuXG4gKlxuICogQnVpbGRzIFN0YWdlTm9kZSB0cmVlcyBhbmQgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIChKU09OKSBpbiB0YW5kZW0uXG4gKiBaZXJvIGRlcGVuZGVuY2llcyBvbiBvbGQgY29kZSDigJQgb25seSBpbXBvcnRzIGZyb20gbG9jYWwgdHlwZXMuXG4gKlxuICogVGhlIGJ1aWxkZXIgY3JlYXRlcyB0d28gcGFyYWxsZWwgc3RydWN0dXJlczpcbiAqIDEuIFN0YWdlTm9kZSB0cmVlIOKAlCBydW50aW1lIGdyYXBoIHdpdGggZW1iZWRkZWQgZnVuY3Rpb25zXG4gKiAyLiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUg4oCUIEpTT04tc2FmZSBzdHJ1Y3R1cmUgZm9yIHZpc3VhbGl6YXRpb25cbiAqXG4gKiBUaGUgZXhlY3V0ZSgpIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBpbnRlbnRpb25hbGx5IG9taXR0ZWQg4oCUXG4gKiBpdCBiZWxvbmdzIGluIHRoZSBydW5uZXIgbGF5ZXIgKFBoYXNlIDUpLlxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgcHJlZml4Tm9kZVRyZWUgfSBmcm9tICcuLi9lbmdpbmUvZ3JhcGgvcHJlZml4Tm9kZVRyZWUuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbGxlbEZvckVhY2hDb25maWcsIFJldHJ5UG9saWN5LCBTY29wZUZhY3RvcnkgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgQlJBTkNIX1NFR01FTlRfTUFSS0VSLCBoYXNCcmFuY2hTZWdtZW50TWFya2VyIH0gZnJvbSAnLi4vaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBJZFBvc2l0aW9uLCByZWZ1c2VSZXNlcnZlZElkIH0gZnJvbSAnLi4vaWRzL3Jlc2VydmVkSWRzLmpzJztcbmltcG9ydCB7IGpvaW5QYXRoIH0gZnJvbSAnLi4vaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB0eXBlIHsgUGF1c2FibGVIYW5kbGVyIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBUeXBlZFNjb3BlIH0gZnJvbSAnLi4vcmVhY3RpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBSdW5uYWJsZUZsb3dDaGFydCwgbWFrZVJ1bm5hYmxlIH0gZnJvbSAnLi4vcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVFZGdlS2luZCwgU3RydWN0dXJlUmVjb3JkZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBUeXBlZFN0YWdlRnVuY3Rpb24sIGNyZWF0ZVR5cGVkU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi90eXBlZEZsb3dDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dDaGFydCxcbiAgRmxvd0NoYXJ0T3B0aW9ucyxcbiAgRmxvd0NoYXJ0U3BlYyxcbiAgSUxvZ2dlcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyLFxuICBTdHJlYW1Ub2tlbkhhbmRsZXIsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEludGVybmFsIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBmYWlsID0gKG1zZzogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke21zZ31gKTtcbn07XG5cbi8qKlxuICogQXR0YWNoIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5IHRvIGEgc3RhZ2Ugbm9kZSArIGl0cyBzcGVjIG5vZGUuXG4gKlxuICogVGhlIE9ORSBwbGFjZSBhIHBvbGljeSBsYW5kcyBvbiBhIG5vZGUsIHNoYXJlZCBieSB0aGUgYC5yZXRyeSgpYCBjdXJzb3JcbiAqIG1vZGlmaWVyIGFuZCBieSBldmVyeSBgb3B0aW9ucy5yZXRyeWAgZGVjbGFyYXRpb24gc2l0ZSwgc28gdmFsaWRhdGlvbiBhbmQgdGhlXG4gKiBzcGVjJ3MgYHJldHJ5QXR0ZW1wdHNgIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIGBhdHRlbXB0c2AgaXMgdmFsaWRhdGVkIGF0IEJVSUxEIHRpbWUgcmF0aGVyIHRoYW4gZGVmZW5kZWQgYXQgcnVudGltZTogYVxuICogdHlwbydkIGBhdHRlbXB0czogMGAgc2hvdWxkIGZhaWwgd2hpbGUgeW91IGFyZSB3cml0aW5nIHRoZSBjaGFydCwgbm90XG4gKiBzaWxlbnRseSB0dXJuIGEgc3RhZ2UgaW50byBhIG5vLW9wIHJ1biB0aHJlZSBtb250aHMgbGF0ZXIuIGBhdHRlbXB0czogMWAgaXNcbiAqIGFjY2VwdGVkIG9uIHB1cnBvc2Ug4oCUIGl0IG1lYW5zIFwicG9saWN5IGRlY2xhcmVkLCBjdXJyZW50bHkgb2ZmXCIsIHNvIGEgcG9saWN5XG4gKiBjYW4gYmUgZGlhbGxlZCBkb3duIHdpdGhvdXQgZGVsZXRpbmcgdGhlIGRlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBhcHBseVJldHJ5UG9saWN5KFxuICBub2RlOiBTdGFnZU5vZGU8YW55LCBhbnk+LFxuICBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHJldHJ5OiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoIXJldHJ5KSByZXR1cm47XG4gIGlmICh0eXBlb2YgcmV0cnkuYXR0ZW1wdHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJldHJ5LmF0dGVtcHRzKSB8fCByZXRyeS5hdHRlbXB0cyA8IDEpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiByZXRyeS5hdHRlbXB0cyBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyID49IDEgKGdvdCAke1N0cmluZyhyZXRyeS5hdHRlbXB0cyl9KS4gYCArXG4gICAgICAgICdJdCBjb3VudHMgVE9UQUwgcnVucyBpbmNsdWRpbmcgdGhlIGZpcnN0LCBzbyBgYXR0ZW1wdHM6IDNgIG1lYW5zIG9uZSBydW4gcGx1cyB1cCB0byB0d28gcmV0cmllczsgJyArXG4gICAgICAgICdgYXR0ZW1wdHM6IDFgIG1lYW5zIHRoZSBwb2xpY3kgaXMgZGVjbGFyZWQgYnV0IGN1cnJlbnRseSBvZmYuJyxcbiAgICApO1xuICB9XG4gIG5vZGUucmV0cnkgPSByZXRyeTtcbiAgc3BlYy5yZXRyeUF0dGVtcHRzID0gcmV0cnkuYXR0ZW1wdHM7XG59XG5cbi8qKlxuICogQXR0YWNoIGRlY2xhcmVkIHRhZ3MgdG8gYSBzdGFnZSBub2RlICsgaXRzIHNwZWMgbm9kZS5cbiAqXG4gKiBUaGUgT05FIHBsYWNlIHRhZ3MgbGFuZCBvbiBhIG5vZGUg4oCUIHRoZSB0d2luIG9mIHtAbGluayBhcHBseVJldHJ5UG9saWN5fSDigJRcbiAqIHNoYXJlZCBieSB0aGUgYC50YWcoKWAgY3Vyc29yIG1vZGlmaWVyIGFuZCBldmVyeSBgb3B0aW9ucy50YWdzYCBkZWNsYXJhdGlvblxuICogc2l0ZSwgc28gdGhlIHJlZnVzYWxzIGFuZCB0aGUgc3BlYydzIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lLCBuZXZlciBhIHZhbHVlLCBzbyBldmVyeSByZWZ1c2FsIGlzXG4gKiBhYm91dCB0aGUgbmFtZSdzIHNoYXBlOiBhbiBlbXB0eSBzdHJpbmcgbmFtZXMgbm90aGluZzsgYSBub24tc3RyaW5nIGlzIGFcbiAqIHZhbHVlLCBhbmQgYSB2YWx1ZSBvbiBhIHN0YWdlIHdvdWxkIHJpZGUgdGhlIGNvbW1pdCBsb2cgcGFzdCBldmVyeVxuICogcmVkYWN0aW9uIHBvaW50OyB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIGlzIHRoZSBydW50aW1lU3RhZ2VJZCBncmFtbWFyJ3NcbiAqIG9uZSByZXNlcnZlZCBieXRlLCBhbmQgYSBjb25zdW1lciB0aGF0IHB1dHMgYSB0YWcgaW50byBhIHBhdGggKGEgVVJMLCBhXG4gKiBzdG9yZSBrZXkpIHdvdWxkIGluaGVyaXQgZXhhY3RseSB0aGUgYW1iaWd1aXR5IHRoZSByZXNlcnZhdGlvbiBleGlzdHMgdG9cbiAqIHByZXZlbnQ7IGEgbmFtZSBkZWNsYXJlZCB0d2ljZSBpcyB0aGUgdHlwbyBpdCB1c3VhbGx5IGlzLiBSZWZ1c2VkIGF0IEJVSUxEXG4gKiB0aW1lLCBsaWtlIGByZXRyeS5hdHRlbXB0c2AsIHNvIHRoZSBtaXN0YWtlIGZhaWxzIHdoaWxlIHRoZSBjaGFydCBpcyBiZWluZ1xuICogd3JpdHRlbi4gQW4gRU1QVFkgbGlzdCBsYW5kcyBub3RoaW5nOiBcImFic2VudCB3aGVuIGVtcHR5XCIgaXMgdGhlIGxhdyB0aGVcbiAqIGNvbW1pdCBidW5kbGUga2VlcHMsIGFuZCB0aGUgc3BlYyBrZWVwcyBpdCB0b28uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGFncyhcbiAgbm9kZTogU3RhZ2VOb2RlPGFueSwgYW55PixcbiAgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAodGFncyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSkgZmFpbChgJHt3aGVyZX06IHRhZ3MgbXVzdCBiZSBhbiBhcnJheSBvZiBuYW1lcyAoZ290ICR7dHlwZW9mIHRhZ3N9KWApO1xuICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgJHt3aGVyZX06IGEgdGFnIG11c3QgYmUgYSBzdHJpbmcgbmFtZSAoZ290ICR7dGFnID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHRhZ30pLiBBIHRhZyBpcyBhIE5BTUUgYCArXG4gICAgICAgICAgJ2RlY2xhcmVkIGF0IGJ1aWxkIHRpbWUg4oCUIGEgdmFsdWUgYmVsb25ncyBpbiBzdGF0ZSBvciBpbiAkZW1pdCwgbmV2ZXIgb24gdGhlIHN0YWdlLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGFnLnRyaW0oKS5sZW5ndGggPT09IDApIGZhaWwoYCR7d2hlcmV9OiBhIHRhZyBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nYCk7XG4gICAgaWYgKGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIodGFnKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgY29udGFpbnMgdGhlIHJlc2VydmVkIGNoYXJhY3RlciAnJHtCUkFOQ0hfU0VHTUVOVF9NQVJLRVJ9Jy4gYCArXG4gICAgICAgICAgYCcke0JSQU5DSF9TRUdNRU5UX01BUktFUn0nIGlzIHJlc2VydmVkIGZvciB0aGUgc3ViZmxvdyBwYXRoIHNlZ21lbnRzIGFkZFBhcmFsbGVsRm9yRWFjaCgpIGdlbmVyYXRlcywgYCArXG4gICAgICAgICAgJ2FuZCBhIHRhZyB0aGF0IGEgY29uc3VtZXIgcHV0cyBpbnRvIGEgcGF0aCBvciBhIGtleSB3b3VsZCBpbmhlcml0IHRoYXQgYW1iaWd1aXR5LiBSZW5hbWUgdGhlIHRhZyAnICtcbiAgICAgICAgICAnKGEgZGFzaCBvciBhIGNvbG9uIHJlYWRzIHRoZSBzYW1lKS4gU2VlIGRvY3MvZGVzaWduLzIwMjYtMDktZGVjbGFyZWQtdGFncy5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKHRhZykpIGZhaWwoYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgaXMgZGVjbGFyZWQgdHdpY2VgKTtcbiAgICBzZWVuLmFkZCh0YWcpO1xuICB9XG4gIGlmIChub2RlLnRhZ3MpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiB0YWdzIGFscmVhZHkgZGVjbGFyZWQgYXQgJyR7bm9kZS5uYW1lfScgKCR7bm9kZS50YWdzLmpvaW4oJywgJyl9KSDigJQgZGVjbGFyZSBldmVyeSB0YWcgZm9yIGEgYCArXG4gICAgICAgICdzdGFnZSBpbiBPTkUgcGxhY2UsIHNvIHRoZSBNYXAgYWR2ZXJ0aXNlcyB0aGUgd2hvbGUgdm9jYWJ1bGFyeSBmcm9tIGEgc2luZ2xlIHNpdGUuJyxcbiAgICApO1xuICB9XG4gIC8vIFRoZSBub2RlJ3MgY29weSBpcyBmcm96ZW46IGNvbW1pdCBidW5kbGVzIHNoYXJlIGl0IGJ5IHJlZmVyZW5jZSBhbmQgdGhlXG4gIC8vIGxpYnJhcnkncyByZWFkcyBhcmUgYm9ycm93ZWQsIG5ldmVyIG11dGF0ZWQuIFRoZSBzcGVjJ3MgY29weSBpcyBpdHMgb3duXG4gIC8vIHBsYWluIGFycmF5LCBKU09OLXNhZmUgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3BlYy5cbiAgbm9kZS50YWdzID0gT2JqZWN0LmZyZWV6ZShbLi4udGFnc10pO1xuICBzcGVjLnRhZ3MgPSBbLi4udGFnc107XG59XG5cbi8qKlxuICogVGhlIGJ1aWxkZXIncyBPTkUgaWQgcmVmdXNhbCAoRjcsIFI1KTogZXZlcnkgaWQgZG9vciBjYWxscyBpdCBvbmNlLCBiZWZvcmVcbiAqIHRoZSBpZCBsYW5kcyBhbnl3aGVyZS4gVGhlIHJ1bGUgbGl2ZXMgYmVzaWRlIHRoZSBncmFtbWFyIOKAlFxuICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYDogYCNgIGFuZCBgL2AgYXJlIHJlZnVzZWQgaW5cbiAqIGV2ZXJ5IGlkICh0aGV5IGFyZSB0aGUgcnVudGltZVN0YWdlSWQgZ3JhbW1hcidzIGRlbGltaXRlcnMpLCBgfmAgaW4gYVxuICogYCdzZWdtZW50J2AgaWQgKGEgc3ViZmxvdyBpZCBvciBhIGBwYXJhbGxlbEZvckVhY2hgIGlkIOKAlCBzZWUgYmVsb3cpLlxuICpcbiAqIERvb3JzIChvbmUgY2FsbCBlYWNoKTogYHN0YXJ0YCwgYHN0YXJ0U2VsZWN0b3JgLCBgYWRkRnVuY3Rpb25gLFxuICogYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCwgYGFkZFBhdXNhYmxlRnVuY3Rpb25gLCBgYWRkRGVjaWRlckZ1bmN0aW9uYCxcbiAqIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCwgYGFkZExpc3RPZkZ1bmN0aW9uYCAoZWFjaCBjaGlsZCksIGBhZGRQYXJhbGxlbEZvckVhY2hgLFxuICogZXZlcnkgc3ViZmxvdyBtb3VudCAoYGFzc2VydFN1YmZsb3dJZEFsbG93ZWRgKSBhbmQgZXZlcnkgZGVjaWRlci9zZWxlY3RvclxuICogYnJhbmNoIChgQnJhbmNoQ3Vyc29yIMK3IGFkbWl0YCkuIGBhZGREZXRhY2hBbmRGb3JnZXRgIC9cbiAqIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBgYWRkQnJhbmNoTGlzdGAgZGVsZWdhdGUgdG8gb25lIG9mIHRoZXNlLlxuICogTmV2ZXIgY2FsbGVkIGJ5IHRoZSBwcmVmaXhlciBvciBhIHN0b3JlIOKAlCB0aG9zZSBob2xkIGlkcyB0aGF0IGNhcnJ5IHRoZVxuICogZGVsaW1pdGVycyBvbiBwdXJwb3NlLlxuICovXG5jb25zdCBhZG1pdElkID0gKHdoYXQ6IHN0cmluZywgaWQ6IHN0cmluZywgcG9zaXRpb246IElkUG9zaXRpb24pOiB2b2lkID0+IHtcbiAgY29uc3QgcmVmdXNhbCA9IHJlZnVzZVJlc2VydmVkSWQod2hhdCwgaWQsIHBvc2l0aW9uKTtcbiAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkgZmFpbChyZWZ1c2FsKTtcbn07XG5cbi8qKlxuICogUmVmdXNlIHRoZSByZXNlcnZlZCBjaGFyYWN0ZXJzIGluIGEgdXNlci1hdXRob3JlZCBTVUJGTE9XIGlkLlxuICpcbiAqIEEgc3ViZmxvdyBpZCBJUyBhIHBhdGggc2VnbWVudCBpbiBgcnVudGltZVN0YWdlSWRgLCB3aGljaCBpcyB0aGUgc2FtZVxuICogcG9zaXRpb24gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZ2VuZXJhdGVzIGl0cyBicmFuY2ggc2VnbWVudHMgaW50by4gQVxuICogaGFuZC1hdXRob3JlZCBpZCBjYXJyeWluZyB0aGUgbWFya2VyIGNvdWxkIHRoZXJlZm9yZSBjb2xsaWRlIHdpdGggYVxuICogZ2VuZXJhdGVkIGJyYW5jaCDigJQgYW5kLCBiZWNhdXNlIHRoaXMgY29kZWJhc2UgZGVsaWJlcmF0ZWx5IHRvbGVyYXRlc1xuICogaWQtY29sbGlzaW9uIGNsYXNzZXMgKGxvb3AtcmVmIHN0dWJzKSwgc3VjaCBhIGNvbGxpc2lvbiB3b3VsZCBub3QgY3Jhc2guIEl0XG4gKiB3b3VsZCBzaWxlbnRseSBtaXMtYXR0cmlidXRlIGEgdHJhY2UsIHdoaWNoIGlzIHdvcnNlLiBTbyB0aGUgbWFya2VyIGlzXG4gKiByZWZ1c2VkIGF0IEJVSUxEIHRpbWUsIG9uIE5FVyBjaGFydHMgb25seTogYSBjaGFydCB0aGF0IHdhcyBsZWdhbCBiZWZvcmVcbiAqIDkuMTQuMCBhbmQgZG9lcyBub3QgdXNlIHRoZSBtYXJrZXIgYmVoYXZlcyBieXRlLWlkZW50aWNhbGx5LlxuICpcbiAqIENhbGxlZCBhdCBldmVyeSB1c2VyLWF1dGhvcmVkIHN1YmZsb3ctaWQgZW50cnkgcG9pbnQuIFN0YWdlIGlkcyBlbHNld2hlcmVcbiAqIGtlZXAgYH5gICh0aGV5IG9jY3VweSB0aGUgYHN0YWdlSWRgIHBvc2l0aW9uLCBuZXZlciB0aGUgYHN1YmZsb3dQYXRoYFxuICogcG9zaXRpb24sIHNvIHRoZXkgY2Fubm90IGNvbGxpZGUgd2l0aCBhIHNlZ21lbnQpIGJ1dCwgc2luY2UgOS4zNy4wLCBub3QgYCNgXG4gKiBvciBgL2Ag4oCUIHNlZSBgYWRtaXRJZGAuIChgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIG93biBpZCBpcyB0aGUgb25lIG90aGVyXG4gKiBgJ3NlZ21lbnQnYCBpZCwgcmVmdXNlZCBhdCB0aGF0IG1ldGhvZC4pIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gKi9cbmNvbnN0IGFzc2VydFN1YmZsb3dJZEFsbG93ZWQgPSAoaWQ6IHN0cmluZyk6IHZvaWQgPT4gYWRtaXRJZCgnc3ViZmxvdyBpZCcsIGlkLCAnc2VnbWVudCcpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJyYW5jaEN1cnNvciDigJQgd2hhdCBEZWNpZGVyTGlzdCBhbmQgU2VsZWN0b3JGbkxpc3Qgc2hhcmUgKEY3KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBXaGljaCBkaXNwYXRjaGVyIGEge0BsaW5rIEJyYW5jaEN1cnNvcn0gYWRkcyBicmFuY2hlcyB1bmRlci4gKi9cbnR5cGUgQnJhbmNoS2luZCA9ICdkZWNpZGVyJyB8ICdzZWxlY3Rvcic7XG5cbi8qKlxuICogVGhlIGJyYW5jaC1hZGRpbmcgbWVjaGFuaWNzIG9mIGEgZGVjaWRlciBvciBhIHNlbGVjdG9yIOKAlCBPTkUgaW1wbGVtZW50YXRpb24sXG4gKiBjb21wb3NlZCBieSB7QGxpbmsgRGVjaWRlckxpc3R9IGFuZCB7QGxpbmsgU2VsZWN0b3JGbkxpc3R9ICh1bnRpbCA5LjM2LjAgZWFjaFxuICogbGlzdCBjYXJyaWVkIGl0cyBvd24gY29weSBvZiBhbGwgZm91ciBicmFuY2gga2luZHMgYW5kIGBlbmQoKWApLlxuICpcbiAqIE93bnM6IHRoZSBicmFuY2gtaWQgbGVkZ2VyIChkdXBsaWNhdGUgKyByZXNlcnZlZC1jaGFyYWN0ZXIgcmVmdXNhbCBpbiBvbmVcbiAqIGBhZG1pdGApLCB0aGUgbm9kZS9zcGVjIHBhaXIgZWFjaCBicmFuY2gga2luZCBidWlsZHMsIHRoZSBzdHJ1Y3R1cmUgZXZlbnRzLFxuICogYW5kIHRoZSBjbG9zaW5nIGBmaW5pc2hgLiBUaGUgbGlzdHMga2VlcCBvbmx5IHdoYXQgZGlmZmVyczogYSBkZWNpZGVyJ3NcbiAqIGB7IGxvb3BUbyB9YCAvIGBsb29wVG8oKWAgLyBgc2V0RGVmYXVsdGAsIGFuZCB0aGUgdHlwZSBlYWNoIG1ldGhvZCByZXR1cm5zLlxuICovXG5jbGFzcyBCcmFuY2hDdXJzb3I8VE91dCwgVFNjb3BlPiB7XG4gIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaERlc2NJbmZvOiBBcnJheTx7IGlkOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBraW5kOiBCcmFuY2hLaW5kLFxuICAgIHJlYWRvbmx5IGI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2VydmVkU3RlcE51bWJlcjogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge31cblxuICAvKiogVGhlIG9uZSBicmFuY2gtaWQgZG9vcjogZHVwbGljYXRlIHJlZnVzYWwsIHRoZW4gdGhlIHJlc2VydmVkIGNoYXJhY3RlcnMgKFI1KS4gKi9cbiAgcHJpdmF0ZSBhZG1pdChpZDogc3RyaW5nLCBwb3NpdGlvbjogSWRQb3NpdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgJHt0aGlzLmtpbmR9IGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBpZiAocG9zaXRpb24gPT09ICdzZWdtZW50JykgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG4gICAgZWxzZSBhZG1pdElkKCdicmFuY2ggaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIC8qKiBBcHBlbmQgdGhlIGJyYW5jaCdzIG5vZGUgKyBzcGVjIGFuZCBmaXJlIGl0cyBzdGFnZSBhbmQgZGVjaXNpb24tYnJhbmNoIGVkZ2UuICovXG4gIHByaXZhdGUgYXR0YWNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIGJyYW5jaDogc3RhZ2UgKyBkZWNpc2lvbi1icmFuY2ggZWRnZSBrZXllZCBieSBpZC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICB9XG5cbiAgZnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQsXG4gICk6IHsgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB9IHtcbiAgICB0aGlzLmFkbWl0KGlkLCAnc3RhZ2UnKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgYnJhbmNoSWQ6IGlkIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgfVxuICAgIHRoaXMuYi5fcmVnaXN0ZXJTdGFnZShpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgcmV0dXJuIHsgbm9kZSwgc3BlYyB9O1xuICB9XG5cbiAgcGF1c2FibGVCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkLFxuICApOiB7IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+OyBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfSB7XG4gICAgdGhpcy5hZG1pdChpZCwgJ3N0YWdlJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuYi5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJywgaXNQYXVzYWJsZTogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmF0dGFjaChub2RlLCBzcGVjLCBpZCk7XG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB7IG5vZGUsIHNwZWMgfTtcbiAgfVxuXG4gIHN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICB0aGlzLmIuX21vdW50U3ViZmxvdyhpZCwgc3ViZmxvdywgKCkgPT4gdGhpcy5wbGFjZVN1YmZsb3dCcmFuY2goaWQsIHN1YmZsb3csIHN1YmZsb3dOYW1lLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKiogVGhlIGJyYW5jaCBtb3VudCdzIG93biBub2RlICsgc3BlYywgcGxhY2VkIHVuZGVyIHRoZSBkZWNpZGVyL3NlbGVjdG9yIChzZWUgYF9tb3VudFN1YmZsb3dgKS4gKi9cbiAgcHJpdmF0ZSBwbGFjZVN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU3ViZmxvd01vdW50T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICAvLyBTVFJVQ1RVUkUtT05MWSBjb252ZXJnZW5jZSBvdmVycmlkZSAoc2VlIGBfZmlyZU5leHRFZGdlRnJvbVBhcmVudGAgK1xuICAgIC8vIGBTdWJmbG93TW91bnRPcHRpb25zLmNvbnZlcmdlQXRgKTogdGhpcyBicmFuY2gncyBjb252ZXJnZW5jZSBlZGdlIHBvaW50cyBhdFxuICAgIC8vIGBjb252ZXJnZUF0YCAoYSBET1dOU1RSRUFNIHN0YWdlKSBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgbmV4dCBzdGFnZSDigJQgZS5nLiBhXG4gICAgLy8gYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgYG1lc3NhZ2VBUElgIHRvIHBhaXIgd2l0aCBpdHMgb3V0cHV0IGF0XG4gICAgLy8gYGNhbGwtbGxtYC4gVmlzdWFsaXphdGlvbi1vbmx5OiBOTyBydW50aW1lIGpvaW4gYmFycmllciAoZGF0YSByaWRlcyBzY29wZSkuXG4gICAgLy8gQ2FycmllZCBvbiB0aGUgc3BlYyBzbyB0aGUgZWRnZS1maXJpbmcgY2hva2Vwb2ludCBjYW4gcmVhZCBpdC5cbiAgICBpZiAob3B0aW9ucz8uY29udmVyZ2VBdCkgc3BlYy5jb252ZXJnZUF0ID0gb3B0aW9ucy5jb252ZXJnZUF0O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gIH1cblxuICBsYXp5U3ViZmxvd0JyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG4gICAgdGhpcy5iLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIC8vIFN0b3JlIHJlc29sdmVyIG9uIHRoZSBub2RlIOKAlCBOTyBlYWdlciB0cmVlIGNsb25pbmdcbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIFNwZWMgc3R1YiDigJQgbm8gc3ViZmxvd1N0cnVjdHVyZSAobGF6eSkuIFRoZSBsYXp5IHN1YmZsb3cnc1xuICAgIC8vIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdCByZXNvbHV0aW9uIHRpbWUuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBkaXNwYXRjaGVyOiB2YWxpZGF0ZSB0aGUgYnJhbmNoZXMsIGZsYWcgdGhlIG5vZGUsIGRlc2NyaWJlIGl0LFxuICAgKiBhbmQgZmlyZSBgb25EZWNpZGVyQ29tcGxldGVgLiBBIGRlY2lkZXIgcGFzc2VzIGl0cyBgc2V0RGVmYXVsdGAgaWQgKHRoZVxuICAgKiBzeW50aGV0aWMgYCdkZWZhdWx0J2AgY2xvbmUgaXMgYXBwZW5kZWQgQUZURVIgYGJyYW5jaElkc2AgaXMgdGFrZW4sIHNvIG9ubHlcbiAgICogdXNlci1zcGVjaWZpZWQgYnJhbmNoZXMgYXJlIGxpc3RlZCk7IGEgc2VsZWN0b3IgaGFzIG5vIGRlZmF1bHQuXG4gICAqL1xuICBmaW5pc2goZGVmYXVsdElkPzogc3RyaW5nKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBraW5kID0gdGhpcy5raW5kO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke2tpbmR9IGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZXZlcnkgYnJhbmNoIHdpdGggbm8gZW1iZWRkZWQgZm4gaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBzdGFnZU1hcFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuZm4gJiYgY2hpbGQuaWQgJiYgIWNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgIWNoaWxkLnN1YmZsb3dSZXNvbHZlcikge1xuICAgICAgICBjb25zdCBoYXNJbk1hcCA9IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQuaWQpIHx8IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQubmFtZSk7XG4gICAgICAgIGlmICghaGFzSW5NYXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdICR7a2luZH0gYnJhbmNoICcke2NoaWxkLmlkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyBoYXMgbm8gZnVuY3Rpb24g4oCUIGAgK1xuICAgICAgICAgICAgICBgcHJvdmlkZSBhIGZuIGFyZ3VtZW50IHRvIGFkZEZ1bmN0aW9uQnJhbmNoKCcke2NoaWxkLmlkfScsIC4uLilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2luZCA9PT0gJ2RlY2lkZXInKSB0aGlzLmN1ck5vZGUuZGVjaWRlckZuID0gdHJ1ZTtcbiAgICBlbHNlIHRoaXMuY3VyTm9kZS5zZWxlY3RvckZuID0gdHJ1ZTtcblxuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSBraW5kO1xuICAgIGlmIChraW5kID09PSAnc2VsZWN0b3InKSB0aGlzLmN1clNwZWMuaGFzU2VsZWN0b3IgPSB0cnVlO1xuXG4gICAgaWYgKGRlZmF1bHRJZCkge1xuICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZCA9PT0gZGVmYXVsdElkKTtcbiAgICAgIGlmIChkZWZhdWx0Q2hpbGQpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh7IC4uLmRlZmF1bHRDaGlsZCwgaWQ6ICdkZWZhdWx0JywgYnJhbmNoSWQ6ICdkZWZhdWx0JyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPiAwKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuY3VyTm9kZS5uYW1lO1xuICAgICAgY29uc3QgYnJhbmNoSWRMaXN0ID0gdGhpcy5icmFuY2hEZXNjSW5mby5tYXAoKGIpID0+IGIuaWQpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtYWluTGluZSA9XG4gICAgICAgIGtpbmQgPT09ICdkZWNpZGVyJ1xuICAgICAgICAgID8gdGhpcy5kZXNjcmlwdGlvblxuICAgICAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCAke3RoaXMuZGVzY3JpcHRpb259IChicmFuY2hlczogJHticmFuY2hJZExpc3R9KWBcbiAgICAgICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gXG4gICAgICAgICAgOiB0aGlzLmRlc2NyaXB0aW9uXG4gICAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCAke3RoaXMuZGVzY3JpcHRpb259YFxuICAgICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgU2VsZWN0cyBmcm9tOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHRoaXMuYnJhbmNoRGVzY0luZm8pIHtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiAke2JyYW5jaC5pZH06ICR7YnJhbmNoLmRlc2NyaXB0aW9ufWApO1xuICAgICAgICBpZiAoYnJhbmNoLmRlc2NyaXB0aW9uKSB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldChicmFuY2guaWQsIGJyYW5jaC5kZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgZmlyZSBgb25EZWNpZGVyQ29tcGxldGVgIHNvIGNvbnN1bWVycyBjYW4gdHJ1c3Qgbm8gbW9yZVxuICAgIC8vIGJyYW5jaGVzIHdpbGwgYXJyaXZlLiBCcmFuY2ggaXRlcmF0aW9uIG9yZGVyID0gYWRkaXRpb24gb3JkZXIgPSBTZXRcbiAgICAvLyBpbnNlcnRpb24gb3JkZXIuIFNlbGVjdG9ycyBoYXZlIG5vIGRlZmF1bHQgYnJhbmNoLlxuICAgIGlmIChraW5kID09PSAnZGVjaWRlcicpIHtcbiAgICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ2RlY2lkZXInLCBbLi4udGhpcy5icmFuY2hJZHNdLCBkZWZhdWx0SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmIuX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsICdzZWxlY3RvcicsIFsuLi50aGlzLmJyYW5jaElkc10pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGVjaWRlckxpc3Rcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsdWVudCBoZWxwZXIgcmV0dXJuZWQgYnkgYWRkRGVjaWRlckZ1bmN0aW9uIHRvIGFkZCBicmFuY2hlcy5cbiAqIGBlbmQoKWAgc2V0cyBgZGVjaWRlckZuID0gdHJ1ZWAg4oCUIHRoZSBmbiBJUyB0aGUgZGVjaWRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2lkZXJMaXN0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnNvcjogQnJhbmNoQ3Vyc29yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgZGVmYXVsdElkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5jdXJzb3IgPSBuZXcgQnJhbmNoQ3Vyc29yKFxuICAgICAgJ2RlY2lkZXInLFxuICAgICAgYnVpbGRlcixcbiAgICAgIGN1ck5vZGUsXG4gICAgICBjdXJTcGVjLFxuICAgICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgcmVzZXJ2ZWRTdGVwTnVtYmVyLFxuICAgICAgZGVjaWRlckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgbG9vcFRvIH1gIGRlY2xhcmVzIHRoaXMgYnJhbmNoIGxvb3BzIGJhY2sgdG8gYW4gYWxyZWFkeS1kZWNsYXJlZFxuICAgICAqICBzdGFnZSDigJQgdGhlIGxvb3AgaXMgU09VUkNFRCBGUk9NIFRISVMgQlJBTkNIIChub3QgdGhlIGRlY2lkZXIpLlxuICAgICAqICBgeyByZXRyeSB9YCBnaXZlcyBUSElTIEJSQU5DSCdzIHN0YWdlIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5O1xuICAgICAqICBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdCAoc2VlIGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2ApLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IGxvb3BUbz86IHN0cmluZzsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHsgbm9kZSwgc3BlYyB9ID0gdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIGRlY2lkZXIgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIGNob3NlbiwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5XG4gICAqIChjb25kaXRpb25hbCBwYXVzZSkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuXG4gICAgICogIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nOyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyBub2RlLCBzcGVjIH0gPSB0aGlzLmN1cnNvci5wYXVzYWJsZUJyYW5jaChpZCwgbmFtZSwgaGFuZGxlciwgZGVzY3JpcHRpb24sIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zPy5sb29wVG8pIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChub2RlLCBzcGVjLCBvcHRpb25zLmxvb3BUbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5kZWZhdWx0SWQgPSBpZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBsb29wLWJhY2sgZWRnZSB0byB0aGUgTEFTVC1hZGRlZCBicmFuY2gsIHNvIHRoZSBsb29wIGlzIHNvdXJjZWRcbiAgICogZnJvbSBUSEFUIGJyYW5jaCBub2RlIChlLmcuIGAndG9vbC1jYWxscycg4oaSIGxvb3BUbygnY29udGV4dCcpYCkgcmF0aGVyIHRoYW5cbiAgICogZnJvbSB0aGUgZGVjaWRlci4gVGhlIGNoYXJ0IHRoZW4gcmVhZHMgaG9uZXN0bHk6IHRoZSBkZWNpZGVyIHNwbGl0cyBpbnRvIGFcbiAgICogbG9vcGluZyBicmFuY2ggYFtUb29sQ2FsbHMg4oaSIGJhY2sgdG8gQ29udGV4dF1gIGFuZCBhIHRlcm1pbmF0aW5nIGJyYW5jaFxuICAgKiBgW0ZpbmFsIOKGkiBlbmRdYCwgaW5zdGVhZCBvZiBhIHNpbmdsZSBsb29wIGhhbmdpbmcgb2ZmIHRoZSBkZWNpZGVyLlxuICAgKlxuICAgKiBObyBlbmdpbmUgY2hhbmdlIGlzIG5lZWRlZDogdGhlIHJ1bnRpbWUgcnVucyB0aGUgY2hvc2VuIGJyYW5jaCBhbmQgdGhlblxuICAgKiBmb2xsb3dzIHRoYXQgYnJhbmNoIG5vZGUncyBPV04gYG5leHRgIOKAlCBhbmQgYSBgbmV4dGAgZmxhZ2dlZCBgaXNMb29wUmVmYFxuICAgKiByb3V0ZXMgYmFjayB0byB0aGUgdGFyZ2V0IGV4YWN0bHkgbGlrZSB0aGUgZGVjaWRlcidzIG93biBsb29wIGRvZXMuIFRoaXNcbiAgICogbWV0aG9kIGp1c3QgbGV0cyB0aGUgYnVpbGRlciBleHByZXNzIHdoYXQgdGhlIGVuZ2luZSBhbHJlYWR5IHN1cHBvcnRzLlxuICAgKlxuICAgKiBUYXJnZXRzIHRoZSBicmFuY2ggYWRkZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY2FsbCAoY2hhaW4gaXQgcmlnaHQgYWZ0ZXJcbiAgICogdGhlIGJyYW5jaCdzIGBhZGRGdW5jdGlvbkJyYW5jaGAvYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgL1xuICAgKiBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYCkuIE1pcnJvcnMgYEZsb3dDaGFydEJ1aWxkZXIubG9vcFRvYCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBXb3JrcyBvbiBhIFNVQkZMT1cgYnJhbmNoIHRvbzogdGhlIGJyYW5jaCBub2RlIGNhcnJpZXMgYm90aCBpdHMgc3ViZmxvd1xuICAgKiByZXNvbHZlciBBTkQgdGhlIGxvb3AtYmFjayBgbmV4dGAg4oCUIHRoZXkgY29leGlzdCBzYWZlbHkgKHRoZSBydW50aW1lIHJ1bnNcbiAgICogdGhlIHN1YmZsb3csIHRoZW4gZm9sbG93cyB0aGUgbG9vcCByZWYpLiBUaGUgdGFyZ2V0IG11c3QgYmUgYSBzdGFnZSBhbHJlYWR5XG4gICAqIGRlY2xhcmVkIEJFRk9SRSB0aGUgZGVjaWRlciAoZS5nLiBhbiB1cHN0cmVhbSBgY29udGV4dGApOyBicmFuY2ggaWRzIGFuZCB0aGVcbiAgICogc3ludGhldGljIGAnZGVmYXVsdCdgIGNsb25lIGFyZSBOT1QgdmFsaWQgbG9vcCB0YXJnZXRzLlxuICAgKi9cbiAgbG9vcFRvKHN0YWdlSWQ6IHN0cmluZyk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJzb3IuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBzcGVjQ2hpbGRyZW4gPSB0aGlzLmN1cnNvci5jdXJTcGVjLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8ICFzcGVjQ2hpbGRyZW4gfHwgc3BlY0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgY2FsbGVkIGJlZm9yZSBhbnkgYnJhbmNoIHdhcyBhZGRlZCB1bmRlciAnJHt0aGlzLmN1cnNvci5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIH1cbiAgICAvLyBmYWlsKCkgdGhyb3dzLCBzbyBjaGlsZHJlbi9zcGVjQ2hpbGRyZW4gYXJlIG5vbi1lbXB0eSBoZXJlLlxuICAgIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChjaGlsZHJlbiFbY2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3BlY0NoaWxkcmVuIVtzcGVjQ2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb3JhdGUgT05FIGJyYW5jaCBub2RlL3NwZWMgd2l0aCBhIGxvb3AtYmFjayBlZGdlIHRvIGBzdGFnZUlkYC4gU2hhcmVkIGJ5XG4gICAqIHRoZSBwb3NpdGlvbmFsIGBsb29wVG8oKWAgKHdoaWNoIHRhcmdldHMgdGhlIGxhc3QtYWRkZWQgYnJhbmNoKSBBTkQgdGhlXG4gICAqIHBlci1icmFuY2ggYHsgbG9vcFRvIH1gIG9wdGlvbiBvbiBgYWRkRnVuY3Rpb25CcmFuY2hgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgIC8gYGFkZFN1YkZsb3dDaGFydEJyYW5jaGAuIEVpdGhlciB3YXkgdGhlIGxvb3BcbiAgICogU09VUkNFIGlzIHRoZSBicmFuY2gg4oCUIHNvIHZpc3VhbGl6ZXJzIHJlYWQgYHRvb2wtY2FsbHMg4oaSIGNvbnRleHRgLCBuZXZlclxuICAgKiBgUm91dGUg4oaSIGNvbnRleHRgLiBWYWxpZGF0ZXMgdGhlIHRhcmdldCBpcyBhIHN0YWdlIGRlY2xhcmVkIEJFRk9SRSB0aGVcbiAgICogZGVjaWRlciAoYnJhbmNoIGlkcyAvIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGNsb25lIGFyZSBub3QgdmFsaWQgdGFyZ2V0cykuXG4gICAqL1xuICBwcml2YXRlIF9hcHBseUJyYW5jaExvb3AoXG4gICAgYnJhbmNoTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGJyYW5jaFNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nYCk7XG4gICAgaWYgKGJyYW5jaE5vZGUubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IHNldCBsb29wVG8gb24gYnJhbmNoICcke2JyYW5jaFNwZWMuaWR9JyDigJQgaXQgYWxyZWFkeSBoYXMgYSBjb250aW51YXRpb25gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmN1cnNvci5iLl9rbm93blN0YWdlSWRzSGFzKHN0YWdlSWQpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgYSBicmFuY2ggbG9vcCBtdXN0IHRhcmdldCBhIHN0YWdlIGAgK1xuICAgICAgICAgIFwiZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChicmFuY2ggaWRzIGFuZCB0aGUgc3ludGhldGljICdkZWZhdWx0JyBicmFuY2ggXCIgK1xuICAgICAgICAgICdhcmUgbm90IHZhbGlkIGxvb3AgdGFyZ2V0czsgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGFuIGlkPyknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBicmFuY2hOb2RlLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCBpc0xvb3BSZWY6IHRydWUgfTtcbiAgICBicmFuY2hTcGVjLmxvb3BUYXJnZXQgPSBzdGFnZUlkO1xuICAgIGJyYW5jaFNwZWMubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIHR5cGU6ICdsb29wJywgaXNMb29wUmVmZXJlbmNlOiB0cnVlIH07XG5cbiAgICAvLyBCcmFuY2gtc2NvcGVkIGRlc2NyaXB0aW9uIOKAlCBhdHRyaWJ1dGUgdGhlIGxvb3AgdG8gdGhlIGJyYW5jaCwgbm90IHRoZVxuICAgIC8vIGRlY2lkZXIgKHBhcmVudERlc2NyaXB0aW9uUGFydHMgaXMgdGhlIGRlY2lkZXIncyBkZXNjcmlwdGlvbiBjb250ZXh0KS5cbiAgICB0aGlzLmN1cnNvci5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuXG4gICAgLy8gRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIFRIRSBCUkFOQ0ggc28gdmlzdWFsaXplcnMgcmVhZFxuICAgIC8vIGB0b29sLWNhbGxzIOKGkiBjb250ZXh0YCwgbm90IGBSb3V0ZSDihpIgY29udGV4dGAuXG4gICAgdGhpcy5jdXJzb3IuYi5fZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihicmFuY2hTcGVjLmlkLCBzdGFnZUlkKTtcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnNvci5maW5pc2godGhpcy5kZWZhdWx0SWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJzb3I6IEJyYW5jaEN1cnNvcjxUT3V0LCBUU2NvcGU+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuY3Vyc29yID0gbmV3IEJyYW5jaEN1cnNvcihcbiAgICAgICdzZWxlY3RvcicsXG4gICAgICBidWlsZGVyLFxuICAgICAgY3VyTm9kZSxcbiAgICAgIGN1clNwZWMsXG4gICAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzLFxuICAgICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICByZXNlcnZlZFN0ZXBOdW1iZXIsXG4gICAgICBzZWxlY3RvckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBzdGFnZSBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeTtcbiAgICAgKiAgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQgKHNlZSBgRmxvd0NoYXJ0QnVpbGRlci50YWdgKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2UgYXMgYSBzZWxlY3RvciBicmFuY2guXG4gICAqXG4gICAqIFdoZW4gdGhpcyBicmFuY2ggaXMgc2VsZWN0ZWQsIHRoZSBoYW5kbGVyJ3MgYGV4ZWN1dGVgIHJ1bnMuIElmIGl0IHJldHVybnNcbiAgICogZGF0YSwgdGhlIHBpcGVsaW5lIHBhdXNlcy4gT24gcmVzdW1lLCBgaGFuZGxlci5yZXN1bWVgIHJ1bnMgd2l0aCB0aGVcbiAgICogaHVtYW4ncyBpbnB1dC4gSWYgYGV4ZWN1dGVgIHJldHVybnMgdm9pZCwgdGhlIHN0YWdlIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLnBhdXNhYmxlQnJhbmNoKGlkLCBuYW1lLCBoYW5kbGVyLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yLmZpbmlzaCgpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmxvd0NoYXJ0QnVpbGRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIF9yb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX3Jvb3RTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9jdXJzb3I/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfY3Vyc29yU3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfc3RhZ2VNYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PigpO1xuICBfc3ViZmxvd0RlZnMgPSBuZXcgTWFwPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PigpO1xuICBwcml2YXRlIF9zdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgPSB7fTtcbiAgLyoqXG4gICAqIEw3LjMg4oCUIEJ1aWxkLXRpbWUgb2JzZXJ2ZXIgZmFuLW91dC4gT3duZWQgYnkgdGhlIGJ1aWxkZXIgc28gZXZlcnlcbiAgICogYGFkZFgoKWAgbWV0aG9kIGNhbiBmaXJlIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZXZlbnRzIGF0IHRoZSBuYXR1cmFsXG4gICAqIG1vbWVudCBvZiB0aGUgY29ycmVzcG9uZGluZyBtdXRhdGlvbi4gRGlzcGF0Y2hlciBpcyBhbGxvY2F0ZWRcbiAgICogbGF6aWx5IG9uIGZpcnN0IGF0dGFjaCB0byBrZWVwIHRoZSB6ZXJvLXJlY29yZGVyIHBhdGggYWxsb2NhdGlvbi1cbiAgICogZnJlZS5cbiAgICovXG4gIHByaXZhdGUgX3N0cnVjdHVyZURpc3BhdGNoZXI/OiBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXI7XG4gIC8qKlxuICAgKiBMNy4zIOKAlCBTZWFsZWQtYWZ0ZXItYnVpbGQgZmxhZyAoUGFuZWwgMiBwaGFzZSBpbnZhcmlhbnQpLiBGbGlwc1xuICAgKiB0byBgdHJ1ZWAgd2hlbiBgLmJ1aWxkKClgIHJldHVybnM7IHN1YnNlcXVlbnQgYGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyYFxuICAgKiB0aHJvd3MuIFByZXZlbnRzIHRoZSBmb290Z3VuIHdoZXJlIGEgY29uc3VtZXIgYXR0YWNoZXMgYSByZWNvcmRlclxuICAgKiBtaWQtZXhlY3V0aW9uIGFuZCBnZXRzIHBhcnRpYWwgc3RydWN0dXJlIGRhdGEgKG1pc3NlZCBldmVyeSBldmVudFxuICAgKiBhbHJlYWR5IGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2VuYWJsZU5hcnJhdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dnZXI/OiBJTG9nZ2VyO1xuICBwcml2YXRlIF9kZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9zdGVwQ291bnRlciA9IDA7XG4gIC8vIE5PVEU6IGtleWVkIGJ5IHN0YWdlIG5hbWUgKGZvciBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbnMpLCB3aGlsZSBzdGFnZU1hcFxuICAvLyBhbmQga25vd25TdGFnZUlkcyB1c2UgaWQgKHN0YWJsZSBpZGVudGlmaWVyKS4gVGhlc2UgYXJlIGludGVudGlvbmFsbHkgZGlmZmVyZW50XG4gIC8vIG5hbWVzcGFjZXMg4oCUIGRlc2NyaXB0aW9ucyBhcmUgcHJlc2VudGF0aW9uYWwsIGxvb2t1cHMgYXJlIHN0cnVjdHVyYWwuXG4gIHByaXZhdGUgX3N0YWdlRGVzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfc3RhZ2VTdGVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBfa25vd25TdGFnZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbnB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dE1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgcHJpdmF0ZSBfc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgLy8g4pSA4pSAIEw3LjMg4oCUIFN0cnVjdHVyZVJlY29yZGVyIGF0dGFjaCArIGRpc3BhdGNoIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZm9yIGJ1aWxkLXBoYXNlIG9ic2VydmF0aW9uLiBNdWx0aXBsZVxuICAgKiByZWNvcmRlcnMgY29leGlzdCAoc2FtZSBpZCBhbGxvd2VkOyBpdGVyYXRpb24gb3JkZXIgPSBhdHRhY2hcbiAgICogb3JkZXIpLiBUaHJvd3MgaWYgY2FsbGVkIGFmdGVyIGAuYnVpbGQoKWAg4oCUIHRoZSBjaGFydCBpcyBzZWFsZWQgYXRcbiAgICogdGhhdCBwb2ludCBhbmQgYW55IHJlY29yZGVyIGF0dGFjaGVkIGxhdGUgd291bGQgbWlzcyBldmVyeSBldmVudFxuICAgKiBmaXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICAgKlxuICAgKiAqKlNlZWQgcmVwbGF5Kio6IHdoZW4gdGhpcyBpcyBjYWxsZWQgQUZURVIgYHN0YXJ0KClgIGhhcyBhbHJlYWR5XG4gICAqIGZpcmVkIChpLmUuLCBhZnRlciB0aGUgYGZsb3dDaGFydCgpYCBmYWN0b3J5IHJldHVybnMpLCB0aGVcbiAgICoganVzdC1hdHRhY2hlZCByZWNvcmRlciByZWNlaXZlcyBhIG9uZS10aW1lIGBvblN0YWdlQWRkZWRgIGZvciB0aGVcbiAgICogcm9vdCBzdGFnZSBzbyBpdCBvYnNlcnZlcyB0aGUgc2VlZC4gT25seSB0aGUgbmV3IHJlY29yZGVyIHNlZXNcbiAgICogdGhlIHJlcGxheTsgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgYXJlIG5vdCByZS1maXJlZC5cbiAgICpcbiAgICogKipNaWQtY2hhaW4gYXR0YWNoIGNhdmVhdCoqOiBhIHJlY29yZGVyIGF0dGFjaGVkIEFGVEVSIG9uZSBvciBtb3JlXG4gICAqIGBhZGRYKClgIGNhbGxzIHJlY2VpdmVzIHRoZSBzZWVkIHJlcGxheSBidXQgTUlTU0VTIGV2ZXJ5XG4gICAqIGludGVybWVkaWF0ZSBldmVudC4gQXR0YWNoIEJFRk9SRSB0aGUgZmlyc3QgYGFkZFgoKWAgZm9yIGNvbXBsZXRlXG4gICAqIGNhcHR1cmUuXG4gICAqXG4gICAqIFB1YmxpYyBmb3Igbm93IHRvIGVuYWJsZSBkaXJlY3QgYXR0YWNoIGluIHRlc3RzICsgZWFybHkgY29uc3VtZXJzLlxuICAgKiBMNy40IHdpbGwgd2lyZSBgZmxvd0NoYXJ0KC4uLiwgeyBzdHJ1Y3R1cmVSZWNvcmRlcnM6IFsuLi5dIH0pYCBhc1xuICAgKiBhbiBhZGRpdGlvbmFsIHJlZ2lzdHJhdGlvbiBzaXRlOyB0aGlzIG1ldGhvZCB3aWxsIHJlbWFpbi5cbiAgICovXG4gIGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlY29yZGVyOiBTdHJ1Y3R1cmVSZWNvcmRlcik6IHRoaXMge1xuICAgIGlmICh0aGlzLl9zZWFsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtGbG93Q2hhcnRCdWlsZGVyXSBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcignJHtyZWNvcmRlci5pZH0nKSBjYWxsZWQgYWZ0ZXIgLmJ1aWxkKCkg4oCUIGNoYXJ0IGlzIHNlYWxlZDsgYCArXG4gICAgICAgICAgJ3RoZSByZWNvcmRlciB3b3VsZCBtaXNzIGV2ZXJ5IHN0cnVjdHVyZSBldmVudCBmcm9tIGNvbnN0cnVjdGlvbi4gQXR0YWNoIEJFRk9SRSAuYnVpbGQoKS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyID0gbmV3IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgIH1cbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgLy8gVGhlIHNlZWQgZmlyZXMgaW5zaWRlIGBzdGFydCgpYCDigJQgdGhhdCBydW5zIEJFRk9SRSB0aGUgY29uc3VtZXJcbiAgICAvLyBjYW4gcG9zdC1jb25zdHJ1Y3QgYXR0YWNoLiBSZXBsYXkgdGhlIHNlZWQgZXZlbnQgT05MWSBpbnRvIHRoZVxuICAgIC8vIGp1c3QtYXR0YWNoZWQgcmVjb3JkZXIgc28gb3RoZXIgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgZG9uJ3RcbiAgICAvLyBzZWUgYSBkdXBsaWNhdGUuIEVycm9ycyBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGRpc3BhdGNoZXInc1xuICAgIC8vIGFjY3VtdWxhdG9yIHNvIHRoZSBjb250cmFjdCBzdGF5cyB1bmlmb3JtLlxuICAgIGlmICh0aGlzLl9yb290U3BlYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3JkZXIub25TdGFnZUFkZGVkPy4oe1xuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3Jvb3RTcGVjLmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuX3Jvb3RTcGVjLm5hbWUsXG4gICAgICAgICAgdHlwZTogdGhpcy5fcm9vdFNwZWMudHlwZSA/PyAnc3RhZ2UnLFxuICAgICAgICAgIC4uLih0aGlzLl9yb290U3BlYy5pc1BhdXNhYmxlID09PSB0cnVlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgICAuLi4odGhpcy5fcm9vdFNwZWMudGFncyAhPT0gdW5kZWZpbmVkICYmIHsgdGFnczogWy4uLnRoaXMuX3Jvb3RTcGVjLnRhZ3NdIH0pLFxuICAgICAgICAgIHNwZWM6IHRoaXMuX3Jvb3RTcGVjIGFzIHVua25vd24gYXMgRmxvd0NoYXJ0U3BlYyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5yZWNvcmRFcnJvckZvclJlcGxheShyZWNvcmRlci5pZCwgJ29uU3RhZ2VBZGRlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3BlY3QgYWNjdW11bGF0ZWQgYFN0cnVjdHVyZUJ1aWxkRXJyb3Jgcy4gUmV0dXJucyBlbXB0eSBhcnJheVxuICAgKiB3aGVuIG5vIHJlY29yZGVycyBhdHRhY2hlZCBPUiBubyBlcnJvcnMgb2NjdXJyZWQuIFJldHVybnMgYVxuICAgKiBkZWZlbnNpdmUgY29weSDigJQgY2FsbGVyIG11dGF0aW9ucyBkbyBub3QgYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMuXG4gICAqXG4gICAqICoqQ2FsbCBvbiB0aGUgQlVJTERFUiwgbm90IHRoZSBjaGFydCByZXR1cm5lZCBieSBgLmJ1aWxkKClgLioqXG4gICAqIENhcHR1cmUgdGhlIGJ1aWxkZXIgcmVmZXJlbmNlIGJlZm9yZSBgLmJ1aWxkKClgIGlmIHlvdSBuZWVkXG4gICAqIHBvc3QtYnVpbGQgYWNjZXNzOlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBidWlsZGVyID0gZmxvd0NoYXJ0KC4uLikuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICogY29uc3QgY2hhcnQgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAqIGNvbnN0IGVycm9ycyA9IGJ1aWxkZXIuZ2V0U3RydWN0dXJlQnVpbGRFcnJvcnMoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpOiBSZXR1cm5UeXBlPFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlclsnZ2V0RXJyb3JzJ10+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcj8uZ2V0RXJyb3JzKCkgPz8gW107XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBmaXJlIGhlbHBlcnMg4oCUIG5vLW9wIHdoZW4gbm8gZGlzcGF0Y2hlciBhdHRhY2hlZC4gS2VlcHNcbiAgLy8gZXZlcnkgY2FsbCBzaXRlIGEgb25lLWxpbmVyIHdpdGhvdXQgdGhlIGBpZiAodGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcilgXG4gIC8vIGJvaWxlcnBsYXRlIGV2ZXJ5d2hlcmUuXG4gIHByaXZhdGUgX2ZpcmVTdGFnZUFkZGVkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIC8vIFJlYWQgYGlzUGF1c2FibGVgIGRpcmVjdGx5IGZyb20gdGhlIHNwZWMg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgLy8gVGhlIHByZXZpb3VzIGBleHRyYXNgIGFyZ3VtZW50IHdhcyBhIHN1Yi1idWlsZGVyIGZvb3RndW46IGJyYW5jaFxuICAgIC8vIGhlbHBlcnMgaW4gRGVjaWRlckxpc3QvU2VsZWN0b3JGbkxpc3Qgd2VudCB0aHJvdWdoXG4gICAgLy8gYF9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyYCB3aGljaCBkcm9wcGVkIHRoZSBleHRyYXMsIHNpbGVudGx5XG4gICAgLy8gbG9zaW5nIGBpc1BhdXNhYmxlOiB0cnVlYCBvbiBwYXVzYWJsZSBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLlxuICAgIGNvbnN0IGlzUGF1c2FibGUgPSBzcGVjLmlzUGF1c2FibGUgPT09IHRydWU7XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlU3RhZ2VBZGRlZCh7XG4gICAgICBzdGFnZUlkOiBzcGVjLmlkLFxuICAgICAgbmFtZTogc3BlYy5uYW1lLFxuICAgICAgdHlwZTogc3BlYy50eXBlID8/ICdzdGFnZScsXG4gICAgICAuLi4oaXNQYXVzYWJsZSAmJiB7IGlzUGF1c2FibGU6IHRydWUgfSksXG4gICAgICAuLi4oc3BlYy50YWdzICE9PSB1bmRlZmluZWQgJiYgeyB0YWdzOiBbLi4uc3BlYy50YWdzXSB9KSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlVGFnZ2VkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlciB8fCBzcGVjLnRhZ3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZVN0YWdlVGFnZ2VkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0YWdzOiBbLi4uc3BlYy50YWdzXSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUVkZ2VBZGRlZChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUVkZ2VBZGRlZCh7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICBraW5kLFxuICAgICAgLi4uKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVMb29wRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUxvb3BFZGdlQWRkZWQoeyBmcm9tLCB0byB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBgbmV4dGAgZWRnZShzKSBmcm9tIGEgcGFyZW50IHNwZWMgdG8gYSBmcmVzaGx5LWFkZGVkXG4gICAqIG5vZGUg4oCUIHdpdGggY29udmVyZ2VuY2UgZXhwYW5zaW9uIHdoZW4gdGhlIHBhcmVudCBpcyBhXG4gICAqIGZvcmsgLyBkZWNpZGVyIC8gc2VsZWN0b3Igd2l0aCBicmFuY2hlcy5cbiAgICpcbiAgICogQSBmb3JrIGF0IGBwYXJlbnRgIGlzIHNlbWFudGljYWxseSBgcGFyZW50IOKUgOKUgGZvcmstYnJhbmNo4pSA4pSA4pa6IGNoaWxkW2ldYFxuICAgKiBmb3IgZWFjaCBjaGlsZCwgYW5kIHRoZSBjaGFpbmVkIGAuYWRkRnVuY3Rpb24oWClgIGNvbnRpbnVlc1xuICAgKiBBRlRFUiB0aGUgZm9yayBjb252ZXJnZXMuIFRoZSBydW50aW1lIHNlbWFudGljcyBhcmUgdGhhdCBlYWNoXG4gICAqIGNoaWxkIElOREVQRU5ERU5UTFkgZmVlZHMgYFhgIChwYXJhbGxlbCBjb21wbGV0aW9uIOKGkiBqb2luKS4gVGhlXG4gICAqIGxpdGVyYWwgXCJlZGdlIGZyb20gcGFyZW50IHRvIFhcIiB3b3VsZCBtaXNyZXByZXNlbnQgdGhpcyDigJRcbiAgICogdmlzdWFsaXplcnMgYW5kIHRvcG9sb2dpY2FsIGFsZ29yaXRobXMgd291bGQgc2VlIG9uZSBlZGdlIHdoZXJlXG4gICAqIHRoZXJlIHNob3VsZCBiZSBOIGNvbnZlcmdlbmNlIGVkZ2VzLlxuICAgKlxuICAgKiBGaXg6IHdoZW4gYHBhcmVudFNwZWNgIGhhcyBicmFuY2ggY2hpbGRyZW4gKGZvcmsgb3IgYnJhbmNoZWRcbiAgICogZGVjaWRlci9zZWxlY3RvciksIGZpcmUgb25lIGBuZXh0YCBlZGdlIGZyb20gRUFDSCBjaGlsZCB0byB0aGVcbiAgICogdGFyZ2V0LiBPdGhlcndpc2UgZmlyZSB0aGUgc2luZ2xlIGVkZ2UgZnJvbSBgcGFyZW50U3BlY2AgaXRzZWxmLlxuICAgKlxuICAgKiBMb29wLXJlZmVyZW5jZSBjaGlsZHJlbiAoc3ludGhldGljIHNwZWMgbm9kZXMgY3JlYXRlZCBieVxuICAgKiBgLmxvb3BUbygpYCkgYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGJhY2stZWRnZSBtYXJrZXJzLCBub3RcbiAgICogY29udmVyZ2VuY2Ugc291cmNlcy4gQSBicmFuY2ggdGhhdCBjYXJyaWVzIGFuIE9XTiBsb29wLWJhY2sgYG5leHRgXG4gICAqIChhIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBpcyBsaWtld2lzZSBza2lwcGVkIOKAlCBpdCBsb29wcywgaXQgZG9lc1xuICAgKiBub3QgY29udmVyZ2UgYXQgdGhlIGxpbmVhciBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBBIGJyYW5jaCBjYXJyeWluZyBgY29udmVyZ2VBdGAgaXMgUkVESVJFQ1RFRDogaXRzIHNpbmdsZSBjb252ZXJnZW5jZVxuICAgKiBlZGdlIGZpcmVzIHRvIGl0cyBuYW1lZCB0YXJnZXQgaW5zdGVhZCBvZiBgdGFyZ2V0SWRgIOKAlCBleHByZXNzaW5nIGFuXG4gICAqIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gYHRvb2xzIOKGkiBjYWxsLWxsbWAsIGJ5cGFzc2luZyBgbWVzc2FnZS1hcGlgKS5cbiAgICogVGhlIG5hbWVkIHRhcmdldCBpcyBhIGZvcndhcmQgc3RhZ2UsIHNvIGl0IGlzIE5PVCB2YWxpZGF0ZWQgaGVyZS5cbiAgICpcbiAgICogQ2FsbCBPUkRFUiBjb25zdHJhaW50OiBtdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGhlIGN1cnNvciBhZHZhbmNlc1xuICAgKiB0byB0aGUgbmV3IHRhcmdldC4gVGhlIGNhbGxlciBwYXNzZXMgdGhlIFBSRS1BRFZBTkNFIHBhcmVudCBzcGVjLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIHRhcmdldElkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRTcGVjcyA9IHBhcmVudFNwZWMuY2hpbGRyZW47XG4gICAgY29uc3QgaXNCcmFuY2hpbmdQYXJlbnQgPVxuICAgICAgKHBhcmVudFNwZWMudHlwZSA9PT0gJ2ZvcmsnIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ2RlY2lkZXInIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ3NlbGVjdG9yJykgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hpbGRTcGVjcykgJiZcbiAgICAgIGNoaWxkU3BlY3MubGVuZ3RoID4gMDtcbiAgICBpZiAoIWlzQnJhbmNoaW5nUGFyZW50KSB7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKHBhcmVudFNwZWMuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFNwZWNzISkge1xuICAgICAgaWYgKGNoaWxkLmlzTG9vcFJlZmVyZW5jZSkgY29udGludWU7XG4gICAgICAvLyBBIGJyYW5jaCB3aXRoIGl0cyBvd24gbG9vcC1iYWNrIG5leHQgKGJyYW5jaC1zb3VyY2VkIGxvb3BUbykgbG9vcHMg4oCUXG4gICAgICAvLyBpdCBkb2VzIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAgICBpZiAoY2hpbGQubmV4dD8uaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZC5jb252ZXJnZUF0KSB7XG4gICAgICAgIC8vIFJlZGlyZWN0ZWQgY29udmVyZ2VuY2U6IHRoaXMgYnJhbmNoIHJlam9pbnMgYXQgaXRzIG5hbWVkIHRhcmdldC5cbiAgICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjaGlsZC5pZCwgY2hpbGQuY29udmVyZ2VBdCwgJ25leHQnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCB0YXJnZXRJZCwgJ25leHQnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZURlY2lkZXJDb21wbGV0ZShcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZURlY2lkZXJDb21wbGV0ZSh7XG4gICAgICBkZWNpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIGJyYW5jaElkcyxcbiAgICAgIC4uLihkZWZhdWx0QnJhbmNoICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0QnJhbmNoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN1YmZsb3dNb3VudGVkKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgcm9vdFN0YWdlSWQ6IHN0cmluZyxcbiAgICBpc0xhenk/OiBib29sZWFuLFxuICAgIHN1YmZsb3dTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN1YmZsb3dQYXRoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICAvLyBzdWJmbG93UGF0aCBkZWZhdWx0cyB0byBzdWJmbG93SWQgd2hlbiB0aGUgcmVjb3JkZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaW1tZWRpYXRlIHBhcmVudCAodG9wLWxldmVsIG1vdW50KTsgY29tcG9zZWQgcGF0aHMgYXBwbHlcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBidWlsZGVyIGlzIGl0c2VsZiBhIG5lc3RlZCBzdWJmbG93IGJlaW5nXG4gICAgLy8gb2JzZXJ2ZWQgYnkgdGhlIGdyYW5kcGFyZW50J3MgcmVjb3JkZXIuXG4gICAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoID8/IHN1YmZsb3dJZDtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdWJmbG93TW91bnRlZCh7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHJvb3RTdGFnZUlkLFxuICAgICAgLi4uKGlzTGF6eSA9PT0gdHJ1ZSAmJiB7IGlzTGF6eSB9KSxcbiAgICAgIC4uLihzdWJmbG93U3BlYyAhPT0gdW5kZWZpbmVkICYmIHsgc3ViZmxvd1NwZWMgfSksXG4gICAgICBzdWJmbG93UGF0aDogcGF0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWItYnVpbGRlciBhY2Nlc3MgKGAuYi5fZmlyZVh4eGApIGlzIG5lZWRlZCBieSBEZWNpZGVyTGlzdCAvXG4gICAqICBTZWxlY3RvckZuTGlzdDsgZXhwb3NlIHRoZSBkaXNwYXRjaGVyIHRocm91Z2ggaW50ZXJuYWwgaGVscGVyc1xuICAgKiAgdGhhdCBnbyB0aHJvdWdoIHRoZSBzYW1lIG5vLW9wLXdoZW4tYWJzZW50IGd1YXJkLlxuICAgKlxuICAgKiAgQGludGVybmFsIOKAlCB0aGVzZSBtZXRob2RzIGFyZSBleHBvc2VkIGJlY2F1c2UgVHlwZVNjcmlwdCBgcHJpdmF0ZWBcbiAgICogIGRvZXNuJ3QgdHJhdmVyc2UgY2xhc3MgYm91bmRhcmllcy4gQ29uc3VtZXIgY29kZSBNVVNUIE5PVCBjYWxsXG4gICAqICB0aGVtOyBjYWxsaW5nIHRoZW0gcG9zdC1jb25zdHJ1Y3Rpb24gbGV0cyBhIGhvc3RpbGUgY2FsbGVyXG4gICAqICBmYWJyaWNhdGUgc3RydWN0dXJlIGV2ZW50cyBhbmQgY29ycnVwdCBkb3duc3RyZWFtIHZpc3VhbGl6YXRpb25zXG4gICAqICBvciBhdWRpdCB0cmFpbHMuIFRoZSBgX2AgcHJlZml4IGlzIGludGVudGlvbmFsIGNvbnZlbnRpb24uICovXG4gIF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBraW5kOiBTdHJ1Y3R1cmVFZGdlS2luZCwgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGZyb20sIHRvLCBraW5kLCBsYWJlbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIoXG4gICAgZGVjaWRlcjogc3RyaW5nLFxuICAgIHR5cGU6ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicsXG4gICAgYnJhbmNoSWRzOiBzdHJpbmdbXSxcbiAgICBkZWZhdWx0QnJhbmNoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRGVjaWRlckNvbXBsZXRlKGRlY2lkZXIsIHR5cGUsIGJyYW5jaElkcywgZGVmYXVsdEJyYW5jaCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChzdWJmbG93SWQsIHN1YmZsb3dOYW1lLCByb290U3RhZ2VJZCwgaXNMYXp5LCBzdWJmbG93U3BlYywgc3ViZmxvd1BhdGgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gdmFsaWRhdGUgYSBicmFuY2gtc291cmNlZCBsb29wIHRhcmdldCBhZ2FpbnN0IHRoZSBrbm93biBzdGFnZSBpZHNcbiAgICogIChtaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AncyBgX2tub3duU3RhZ2VJZHMuaGFzYCBndWFyZCkuICovXG4gIF9rbm93blN0YWdlSWRzSGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gZmlyZSBhIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBBIEJSQU5DSCBub2RlIChub3QgdGhlIGRlY2lkZXIpLiAqL1xuICBfZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChmcm9tLCB0byk7XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgLy8gQnVpbGRlci1jb21wb3NlZCBkZXNjcmlwdGlvbiAoYEZsb3dDaGFydDogWFxcblN0ZXBzOlxcbi4uLmApLlxuICAgICAgICAvLyBJbmxpbmUgT05MWSB0aGUgc3VtbWFyeSBhYm92ZSBgU3RlcHM6YCBvbiB0aGUgbW91bnQgbGluZSwgdGhlblxuICAgICAgICAvLyByZS1saXN0IHRoZSBzdGVwIGxpbmVzIG9uY2UsIGluZGVudGVkLiBFbWJlZGRpbmcgdGhlIEZVTEwgaW5uZXJcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaGVyZSBBTkQgcmUtbGlzdGluZyBpdHMgc3RlcHMgZG91YmxlZCB0aGUgdGV4dCBwZXJcbiAgICAgICAgLy8gbmVzdGluZyBsZXZlbCDigJQgZXhwb25lbnRpYWwgZ3Jvd3RoLCBSYW5nZUVycm9yIChcIkludmFsaWQgc3RyaW5nXG4gICAgICAgIC8vIGxlbmd0aFwiKSBhdCB+MjIgbmVzdGluZyBsZXZlbHMgb2YgbmVzdGVkIGJ1aWxkKCkuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBsaW5lcy5zbGljZSgwLCBzdGVwc0lkeCkuam9pbignICcpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKFxuICAgICAgICAgIHN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGcmVlLWZvcm0gKHNpbmdsZS1ibG9jaykgZGVzY3JpcHRpb24g4oCUIGlubGluZSBpdCB3aG9sZSwgdW5jaGFuZ2VkLlxuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3ViZmxvdy5kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSAXG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBBUEkgY29udHJhY3Qg4oCUIGlucHV0IHZhbGlkYXRpb24sIG91dHB1dCBzaGFwZSwgYW5kIG91dHB1dCBtYXBwZXIuXG4gICAqIFJlcGxhY2VzIHNldElucHV0U2NoZW1hKCkgKyBzZXRPdXRwdXRTY2hlbWEoKSArIHNldE91dHB1dE1hcHBlcigpIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqXG4gICAqIElmIGEgY29udHJhY3Qgd2l0aCBpbnB1dCBzY2hlbWEgaXMgZGVjbGFyZWQsIGNoYXJ0LnJ1bigpIHZhbGlkYXRlcyBpbnB1dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBDb250cmFjdCBkYXRhIGlzIHVzZWQgYnkgY2hhcnQudG9PcGVuQVBJKCkgYW5kIGNoYXJ0LnRvTUNQVG9vbCgpLlxuICAgKi9cbiAgY29udHJhY3Qob3B0czoge1xuICAgIGlucHV0PzogdW5rbm93bjtcbiAgICBvdXRwdXQ/OiB1bmtub3duO1xuICAgIG1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgfSk6IHRoaXMge1xuICAgIGlmIChvcHRzLmlucHV0KSB0aGlzLl9pbnB1dFNjaGVtYSA9IG9wdHMuaW5wdXQ7XG4gICAgaWYgKG9wdHMub3V0cHV0KSB0aGlzLl9vdXRwdXRTY2hlbWEgPSBvcHRzLm91dHB1dDtcbiAgICBpZiAob3B0cy5tYXBwZXIpIHRoaXMuX291dHB1dE1hcHBlciA9IG9wdHMubWFwcGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpbmVhciBDaGFpbmluZyDilIDilIBcblxuICBzdGFydChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIC8vIERldGVjdCBQYXVzYWJsZUhhbmRsZXIgYnkgZHVjay10eXBpbmcgKGhhcyAuZXhlY3V0ZSBwcm9wZXJ0eSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBjb25zdCBpc1BhdXNhYmxlID0gdHlwZW9mIGZuID09PSAnb2JqZWN0JyAmJiBmbiAhPT0gbnVsbCAmJiAnZXhlY3V0ZScgaW4gZm47XG4gICAgY29uc3Qgc3RhZ2VGbiA9IGlzUGF1c2FibGVcbiAgICAgID8gKChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pXG4gICAgICA6IChmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogc3RhZ2VGbiB9O1xuICAgIGlmIChpc1BhdXNhYmxlKSB7XG4gICAgICBub2RlLmlzUGF1c2FibGUgPSB0cnVlO1xuICAgICAgbm9kZS5yZXN1bWVGbiA9IChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikucmVzdW1lO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgc3RhZ2VGbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHNwZWMuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0KCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBzdGFydCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5fcm9vdCA9IG5vZGU7XG4gICAgdGhpcy5fcm9vdFNwZWMgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VlZCBub2RlIGZpcmVzIGBvblN0YWdlQWRkZWRgIChubyBlZGdlIOKAlCBubyBwcmVkZWNlc3NvcikuXG4gICAgLy8gYGlzUGF1c2FibGVgIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyBieSBgX2ZpcmVTdGFnZUFkZGVkYC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSBjaGFydCB3aG9zZSBST09UIHN0YWdlIElTIGEgc2VsZWN0b3Ig4oCUIGl0IHJ1bnMgZmlyc3QgKHJlYWRpbmdcbiAgICogYXJncywgc2VlZGluZyBzdGF0ZSwgcmV0dXJuaW5nIHRoZSBjaG9zZW4gYnJhbmNoIGlkcyB2aWEgYHNlbGVjdCgpYCksXG4gICAqIGFuZCBpdHMgYnJhbmNoZXMgYXR0YWNoIGRpcmVjdGx5IHRvIHRoZSByb290LiBNaXJyb3JzIGBzdGFydCgpYCBmb3IgdGhlXG4gICAqIHJvb3Qtbm9kZSBzZXR1cCwgdGhlbiByZXR1cm5zIGEgYFNlbGVjdG9yRm5MaXN0YCBib3VuZCB0byB0aGUgcm9vdCBzb1xuICAgKiBgLmFkZEZ1bmN0aW9uQnJhbmNoKClgIC8gYC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goKWAgLyBgLmVuZCgpYCB3b3JrXG4gICAqIGV4YWN0bHkgYXMgdGhleSBkbyBhZnRlciBgYWRkU2VsZWN0b3JGdW5jdGlvbigpYC5cbiAgICpcbiAgICogVXNlIHdoZW4gdGhlIGZpcnN0IHRoaW5nIGEgY2hhcnQgZG9lcyBpcyBjaG9vc2UgYW1vbmcgYnJhbmNoZXMg4oCUIGUuZy4gYVxuICAgKiBgQ29udGV4dGAgc2VsZWN0b3IgdGhhdCBpbml0cyArIHBpY2tzIHdoaWNoIGNvbnRleHQgc2xvdHMgdG8gZW5naW5lZXIsXG4gICAqIHdpdGggbm8gc2VwYXJhdGUgc2VlZCBzdGFnZSBiZWZvcmUgaXQuXG4gICAqL1xuICBzdGFydFNlbGVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW47IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBTZWUgYGFkZFNlbGVjdG9yRnVuY3Rpb25gIOKAlCBgZmFpbEZhc3Q6IHRydWVgIG1ha2VzIGEgbXVsdGktYnJhbmNoXG4gICAgLy8gc2VsZWN0aW9uIGZhbiBvdXQgdmlhIGBQcm9taXNlLmFsbGAgKGZpcnN0IGVycm9yIGFib3J0cykgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBkZWZhdWx0IGBQcm9taXNlLmFsbFNldHRsZWRgIChiZXN0LWVmZm9ydCkuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0U2VsZWN0b3IoJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYHN0YXJ0U2VsZWN0b3IoJyR7aWR9JylgKTtcblxuICAgIHRoaXMuX3Jvb3QgPSBub2RlO1xuICAgIHRoaXMuX3Jvb3RTcGVjID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIFJvb3Qgc2VsZWN0b3Igbm9kZSBmaXJlcyBvblN0YWdlQWRkZWQgd2l0aCBOTyBwcmVkZWNlc3NvciBlZGdlIChpdCdzXG4gICAgLy8gdGhlIHJvb3QpLiBCcmFuY2hlcyArIG9uRGVjaWRlckNvbXBsZXRlIGNvbWUgZnJvbSB0aGUgU2VsZWN0b3JGbkxpc3QuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sIGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIC8vIENhcHR1cmUgdGhlIHBhcmVudCBTUEVDIHJlZmVyZW5jZSAobm90IGp1c3QgaWQpIEJFRk9SRSB0aGVcbiAgICAvLyBjdXJzb3IgYWR2YW5jZXMg4oCUIHdlIG5lZWQgaXRzIGBjaGlsZHJlbmAgKyBgdHlwZWAgdG8gZGVjaWRlXG4gICAgLy8gd2hldGhlciB0aGUgYG5leHRgIGVkZ2UgaXMgYSBmb3JrIGNvbnZlcmdlbmNlIChOIGVkZ2VzIGZyb21cbiAgICAvLyBlYWNoIGJyYW5jaCBjaGlsZCkgdnMgYSBwbGFpbiBsaW5lYXIgY2hhaW4gKDEgZWRnZSBmcm9tIHBhcmVudCkuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgTGluZWFyIG5vZGU6IGFubm91bmNlIHRoZSBub2RlIGZpcnN0LCB0aGVuIHRoZSBlZGdlXG4gICAgLy8gZnJvbSB0aGUgcHJpb3IgY3Vyc29yLiBPcmRlciBtYXR0ZXJzOiBlbmRwb2ludHMgYW5ub3VuY2VkXG4gICAgLy8gYmVmb3JlIGFueSBlZGdlIHJlZmVyZW5jaW5nIHRoZW0gKFN0cnVjdHVyZVJlY29yZGVyIGNvbnRyYWN0KS5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdHJlYW1pbmdGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmVhbUlkPzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGZuLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICB0eXBlOiAnc3RyZWFtaW5nJyxcbiAgICAgIGlzU3RyZWFtaW5nOiB0cnVlLFxuICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkID8/IG5hbWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU3RyZWFtaW5nIHN0YWdlOiBzYW1lIHNoYXBlIGFzIGxpbmVhciBhZGRGdW5jdGlvbi5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2Ug4oCUIGNhbiBwYXVzZSBleGVjdXRpb24gYW5kIHJlc3VtZSBsYXRlciB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBUaGUgaGFuZGxlciBoYXMgdHdvIHBoYXNlczpcbiAgICogLSBgZXhlY3V0ZWA6IHJ1bnMgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAoaXQgYmVjb21lc1xuICAgKiAgIHRoZSBjaGVja3BvaW50J3MgYHBhdXNlRGF0YWApOyByZXR1cm4gdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gICAqIC0gYHJlc3VtZWA6IHJ1bnMgd2hlbiB0aGUgZmxvd2NoYXJ0IGlzIHJlc3VtZWQgd2l0aCBpbnB1dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAuYWRkUGF1c2FibGVGdW5jdGlvbignQXBwcm92ZU9yZGVyJywge1xuICAgKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICAgKiAgICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICAgKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246ICdBcHByb3ZlPycgfTtcbiAgICogICB9LFxuICAgKiAgIHJlc3VtZTogYXN5bmMgKHNjb3BlLCBpbnB1dCkgPT4ge1xuICAgKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAgICogICB9LFxuICAgKiB9LCAnYXBwcm92ZS1vcmRlcicsICdNYW5hZ2VyIGFwcHJvdmFsIGdhdGUnKVxuICAgKiBgYGBcbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb24obmFtZTogc3RyaW5nLCBoYW5kbGVyOiBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPiwgaWQ6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIHN0YWdlOiBgX2ZpcmVTdGFnZUFkZGVkYCByZWFkcyBgaXNQYXVzYWJsZWBcbiAgICAvLyBkaXJlY3RseSBmcm9tIGBzcGVjLmlzUGF1c2FibGVgIChzZXQgYWJvdmUpLCBzbyB2aXN1YWxpc2Vyc1xuICAgIC8vIHNlZSBpdCBvbiB0aGUgZXZlbnQgcGF5bG9hZCB3aXRob3V0IGEgc2VwYXJhdGUgdGhyZWFkaW5nIGFyZy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGV0YWNoIChidWlsZGVyLW5hdGl2ZSBjb21wb3NpdGlvbikg4pSA4pSAXG4gIC8vXG4gIC8vIFN1Z2FyIG92ZXIgYGFkZEZ1bmN0aW9uYCB0aGF0IGdlbmVyYXRlcyBhIHN0YWdlIHdoaWNoIGNhbGxzXG4gIC8vIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgIG9yIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGF0IHJ1bnRpbWUuIFpFUk8gZW5naW5lIGNoYW5nZXMg4oCUIHB1cmUgY29tcG9zaXRpb24gb3ZlciB0aGVcbiAgLy8gZXhpc3Rpbmcgc2NvcGUtbWV0aG9kIHByaW1pdGl2ZXMuXG4gIC8vXG4gIC8vIEZvciBgYWRkRGV0YWNoQW5kSm9pbkxhdGVyYCwgdGhlIHJldHVybmVkIGhhbmRsZSBpcyBzdG9yZWQgaW5cbiAgLy8gc2hhcmVkIHN0YXRlIHZpYSBgJHNldFZhbHVlYCAod2hpY2ggYnlwYXNzZXMgdGhlIHR5cGVkLXByb3h5XG4gIC8vIHVud3JhcCB0aGF0IHdvdWxkIG90aGVyd2lzZSBzdHJpcCB0aGUgaGFuZGxlJ3MgY2xhc3MgbWV0aG9kcykuXG4gIC8vIERvd25zdHJlYW0gc3RhZ2VzIHJlYWQgaXQgdmlhIGBzY29wZVtvcHRpb25zLmhhbmRsZUtleV1gIG9yXG4gIC8vIGBzY29wZS4kZ2V0VmFsdWUob3B0aW9ucy5oYW5kbGVLZXkpYCDigJQgYm90aCBwcmVzZXJ2ZSBtZXRob2RzXG4gIC8vIGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBzdG9yZWQgcmF3LlxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdGFnZSB0aGF0IGZpcmVzIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kXG4gICAqIERJU0NBUkRTIHRoZSBoYW5kbGUuIFB1cmUgZmlyZS1hbmQtZm9yZ2V0IOKAlCB1c2VmdWwgZm9yIHRlbGVtZXRyeVxuICAgKiBleHBvcnRzLCBhdWRpdCBsb2cgc2hpcHBpbmcsIGNhY2hlIHdhcm0tdXAuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBTdGFibGUgaWQgZm9yIHRoaXMgc3RhZ2UgKGFsc28gdGhlIHN0YWdlTWFwIGtleSkuXG4gICAqIEBwYXJhbSBjaGlsZCBUaGUgY2hpbGQgZmxvd2NoYXJ0IHRvIGRldGFjaC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZHJpdmVyIFRoZSBkcml2ZXIgdG8gc2NoZWR1bGUgb24gKGUuZy4gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCkuXG4gICAqIEBwYXJhbSBvcHRpb25zLmlucHV0TWFwcGVyIE1hcHMgdGhlIHBhcmVudCdzIHNjb3BlIHRvIHRoZSBjaGlsZCdzIGlucHV0LlxuICAgKiAgIERlZmF1bHRzIHRvIHBhc3NpbmcgYHVuZGVmaW5lZGAuXG4gICAqIEBwYXJhbSBvcHRpb25zLm1vdW50TmFtZSBEaXNwbGF5IG5hbWU7IGRlZmF1bHRzIHRvIGBpZGAuXG4gICAqIEBwYXJhbSBvcHRpb25zLmRlc2NyaXB0aW9uIFN0YWdlIGRlc2NyaXB0aW9uIGZvciBuYXJyYXRpdmUgKyB0b29scy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBmbG93Q2hhcnQoJ3Byb2Nlc3MnLCBwcm9jZXNzRm4sICdwcm9jZXNzJylcbiAgICogICAuYWRkRGV0YWNoQW5kRm9yZ2V0KCd0ZWxlbWV0cnknLCB0ZWxlbWV0cnlDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+ICh7IGV2ZW50OiAncHJvY2Vzc2VkJywgb3JkZXJJZDogc2NvcGUub3JkZXJJZCB9KSxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignbmV4dCcsIG5leHRGbiwgJ25leHQnKVxuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZERldGFjaEFuZEZvcmdldChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5GbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXI7XG4gICAgICBpbnB1dE1hcHBlcj86IChzY29wZTogVFNjb3BlKSA9PiB1bmtub3duO1xuICAgICAgbW91bnROYW1lPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubW91bnROYW1lID8/IGlkO1xuICAgIHJldHVybiB0aGlzLmFkZEZ1bmN0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgICgoc2NvcGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIgPyBvcHRpb25zLmlucHV0TWFwcGVyKHNjb3BlIGFzIFRTY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQob3B0aW9ucy5kcml2ZXIsIGNoaWxkLCBpbnB1dCk7XG4gICAgICB9KSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpZCxcbiAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdGFnZSB0aGF0IGZpcmVzIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kXG4gICAqIGRlbGl2ZXJzIHRoZSByZXN1bHRpbmcgYERldGFjaEhhbmRsZWAgdG8gYSBjb25zdW1lci1zdXBwbGllZFxuICAgKiBgb25IYW5kbGVgIGNhbGxiYWNrLiBUaGUgaGFuZGxlIENBTk5PVCBiZSBzdG9yZWQgaW4gc2hhcmVkIHN0YXRlXG4gICAqIOKAlCBgU3RhZ2VDb250ZXh0LnNldFZhbHVlYCBjYWxscyBgc3RydWN0dXJlZENsb25lYCB3aGljaCBkcm9wc1xuICAgKiBjbGFzcyBwcm90b3R5cGVzIChhbmQgdGhlcmVmb3JlIHRoZSBoYW5kbGUncyBgLndhaXQoKWAgbWV0aG9kKS5cbiAgICpcbiAgICogVGhlIGNhbGxiYWNrIHBhdHRlcm4gaXMgdGhlIGV4cGxpY2l0IGFsdGVybmF0aXZlOiBrZWVwIGhhbmRsZXMgaW5cbiAgICogYSBjbG9zdXJlLWxvY2FsIGFycmF5IChvciB3aGF0ZXZlciBzaGFwZSBzdWl0cykgYW5kIGhhdmUgYVxuICAgKiBkb3duc3RyZWFtIHN0YWdlIGBhd2FpdCBQcm9taXNlLmFsbCguLi4pYCBvdmVyIHRoZW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICogaW1wb3J0IHR5cGUgeyBEZXRhY2hIYW5kbGUgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBoYW5kbGVzOiBEZXRhY2hIYW5kbGVbXSA9IFtdO1xuICAgKlxuICAgKiBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnc2VlZCcsIHNlZWRGbiwgJ3NlZWQnKVxuICAgKiAgIC5hZGREZXRhY2hBbmRKb2luTGF0ZXIoJ2V2YWwtYScsIGV2YWxDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+IHNjb3BlLmNvbmZpZ0EsXG4gICAqICAgICBvbkhhbmRsZTogKGgpID0+IGhhbmRsZXMucHVzaChoKSxcbiAgICogICB9KVxuICAgKiAgIC5hZGREZXRhY2hBbmRKb2luTGF0ZXIoJ2V2YWwtYicsIGV2YWxDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+IHNjb3BlLmNvbmZpZ0IsXG4gICAqICAgICBvbkhhbmRsZTogKGgpID0+IGhhbmRsZXMucHVzaChoKSxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignam9pbicsIGFzeW5jIChzY29wZSkgPT4ge1xuICAgKiAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsKGhhbmRsZXMubWFwKChoKSA9PiBoLndhaXQoKSkpO1xuICAgKiAgICAgc2NvcGUucmVzdWx0cyA9IHNldHRsZWQ7XG4gICAqICAgfSwgJ2pvaW4nKVxuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogTm90ZTogcHV0dGluZyBgaGFuZGxlc2AgaW4gYSBtb2R1bGUtbGV2ZWwgY2xvc3VyZSBpcyBmaW5lIGZvclxuICAgKiBzaW5nbGUtcnVuIHNjcmlwdHMuIEZvciBzZXJ2ZXIgY29kZSB0aGF0IHJ1bnMgdGhlIHNhbWUgY2hhcnRcbiAgICogY29uY3VycmVudGx5IGFjcm9zcyByZXF1ZXN0cywgYWxsb2NhdGUgYSBuZXcgY2xvc3VyZSBwZXIgcnVuXG4gICAqIChlLmcuLCB3cmFwIGNoYXJ0IGNvbnN0cnVjdGlvbiBpbiBhIGZhY3RvcnkgZnVuY3Rpb24pIHNvIGhhbmRsZXNcbiAgICogZnJvbSBkaWZmZXJlbnQgcnVucyBkb24ndCBibGVlZCBpbnRvIGVhY2ggb3RoZXIuXG4gICAqL1xuICBhZGREZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjaGlsZDogaW1wb3J0KCcuL3R5cGVzLmpzJykuRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBvcHRpb25zOiB7XG4gICAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyO1xuICAgICAgb25IYW5kbGU6IChoYW5kbGU6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlKSA9PiB2b2lkO1xuICAgICAgaW5wdXRNYXBwZXI/OiAoc2NvcGU6IFRTY29wZSkgPT4gdW5rbm93bjtcbiAgICAgIG1vdW50TmFtZT86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm1vdW50TmFtZSA/PyBpZDtcbiAgICByZXR1cm4gdGhpcy5hZGRGdW5jdGlvbihcbiAgICAgIG5hbWUsXG4gICAgICAoKHNjb3BlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBvcHRpb25zLmlucHV0TWFwcGVyID8gb3B0aW9ucy5pbnB1dE1hcHBlcihzY29wZSBhcyBUU2NvcGUpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKG9wdGlvbnMuZHJpdmVyLCBjaGlsZCwgaW5wdXQpO1xuICAgICAgICBvcHRpb25zLm9uSGFuZGxlKGhhbmRsZSk7XG4gICAgICB9KSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpZCxcbiAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBCcmFuY2hpbmcg4pSA4pSAXG5cbiAgYWRkRGVjaWRlckZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgdGhlIERFQ0lERVIgU1RBR0UgYSByZXRyeSBwb2xpY3kuIERlY2xhcmVkIGhlcmUgcmF0aGVyXG4gICAgICogIHRoYW4gdmlhIGAucmV0cnkoKWAgYmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgYERlY2lkZXJMaXN0YCwgd2hlcmUgYVxuICAgICAqICBjaGFpbmVkIG1vZGlmaWVyIGNvdWxkIG1lYW4gdGhlIGRlY2lkZXIgT1IgdGhlIGJyYW5jaCBqdXN0IGFkZGVkO1xuICAgICAqICBgeyB0YWdzIH1gIGxpa2V3aXNlLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBpZiAoY3VyLmRlY2lkZXJGbikgZmFpbChgZGVjaWRlciBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnLCBoYXNEZWNpZGVyOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYGFkZERlY2lkZXJGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRGVjaWRlckZ1bmN0aW9uKCcke2lkfScpYCk7XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIERlY2lkZXIgbm9kZSBpcyByZWFjaGVkIHZpYSBhIGBuZXh0YCBlZGdlIGZyb20gdGhlIHByaW9yXG4gICAgLy8gY3Vyc29yLiBCcmFuY2hlcyB0aGVtc2VsdmVzIGZpcmUgdmlhIGBhZGRGdW5jdGlvbkJyYW5jaGAgZXRjLlxuICAgIC8vIGBvbkRlY2lkZXJDb21wbGV0ZWAgZmlyZXMgZnJvbSBzdWItYnVpbGRlciBgLmVuZCgpYC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRTZWxlY3RvckZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgdGhlIFNFTEVDVE9SIFNUQUdFIGEgcmV0cnkgcG9saWN5IOKAlCBzYW1lIHJlYXNvbmluZyBhc1xuICAgICAqICBgYWRkRGVjaWRlckZ1bmN0aW9uYDogdGhpcyBtZXRob2QgcmV0dXJucyBhIHN1Yi1idWlsZGVyLCBzbyBhIGNoYWluZWRcbiAgICAgKiAgYC5yZXRyeSgpYCB3b3VsZCBiZSBhbWJpZ3VvdXM7IGB7IHRhZ3MgfWAgbGlrZXdpc2UuICovXG4gICAgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuOyByZXRyeT86IFJldHJ5UG9saWN5OyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgaWYgKGN1ci5zZWxlY3RvckZuKSBmYWlsKGBzZWxlY3RvciBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFuZCBzZWxlY3RvciBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBgZmFpbEZhc3RgOiB3aGVuIHRoZSBzZWxlY3RvciBwaWNrcyDiiaUyIGJyYW5jaGVzIHRoZXkgZmFuIG91dCBpbiBwYXJhbGxlbFxuICAgIC8vIHZpYSBDaGlsZHJlbkV4ZWN1dG9yLiBEZWZhdWx0ID0gYFByb21pc2UuYWxsU2V0dGxlZGAgKGJlc3QtZWZmb3J0OiBldmVyeVxuICAgIC8vIGJyYW5jaCBydW5zIHRvIGNvbXBsZXRpb24gZXZlbiBpZiBzb21lIGZhaWwpLiBgZmFpbEZhc3Q6IHRydWVgID0gYFByb21pc2UuYWxsYFxuICAgIC8vICh0aGUgZmlyc3QgYnJhbmNoIGVycm9yIHJlamVjdHMgKyBhYm9ydHMpIOKAlCB1c2Ugd2hlbiBBTEwgc2VsZWN0ZWQgYnJhbmNoZXNcbiAgICAvLyBhcmUgUkVRVUlSRUQgKGUuZy4gYXNzZW1ibGluZyBhIHJlcXVlc3QgZnJvbSBpbmRlcGVuZGVudC1idXQtcmVxdWlyZWQgcGFydHMpLFxuICAgIC8vIG5vdCBiZXN0LWVmZm9ydCBmYW4tb3V0LiBTYW1lIGZsYWcgYGFkZExpc3RPZkZ1bmN0aW9uYCBleHBvc2VzLlxuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgbm9kZS5mYWlsRmFzdCA9IHRydWU7XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYGFkZFNlbGVjdG9yRnVuY3Rpb24oJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFNlbGVjdG9yRnVuY3Rpb24oJyR7aWR9JylgKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VsZWN0b3Igbm9kZTogc2FtZSBhcyBkZWNpZGVyLiBCcmFuY2hlcyArIGNvbXBsZXRlIGV2ZW50XG4gICAgLy8gY29tZSBmcm9tIHRoZSBTZWxlY3RvckZuTGlzdCBzdWItYnVpbGRlci5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgUGFyYWxsZWwgKEZvcmspIOKUgOKUgFxuXG4gIGFkZExpc3RPZkZ1bmN0aW9uKGNoaWxkcmVuOiBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjPFRPdXQsIFRTY29wZT5bXSwgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuIH0pOiB0aGlzIHtcbiAgICBjb25zdCB7IGN1ciwgY3VyU3BlYyB9ID0gdGhpcy5fbmVlZEZvcmtQYXJlbnQoKTtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBjdXIuZmFpbEZhc3QgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiwgcmV0cnksIHRhZ3MgfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgYWRtaXRJZCgnZm9yayBjaGlsZCBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgICBmYWlsKGBkdXBsaWNhdGUgY2hpbGQgaWQgJyR7aWR9JyB1bmRlciAnJHtjdXIubmFtZX0nYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCB9O1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlZ2lzdGVyU3RhZ2UoaWQsIGZuKTtcblxuICAgICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgICBpZCxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgaXNQYXJhbGxlbENoaWxkOiB0cnVlLFxuICAgICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIH07XG4gICAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIHJldHJ5LCBgYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQgJyR7aWR9J2ApO1xuICAgICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIHRhZ3MsIGBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZCAnJHtpZH0nYCk7XG5cbiAgICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgICAvLyBMNy4zIOKAlCBmaXJlIHN0cnVjdHVyZSBldmVudHMgZm9yIHRoZSBjaGlsZCArIHRoZSBmb3JrIGVkZ2UuXG4gICAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2ZvcmstYnJhbmNoJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lIHx8IGMuaWQpLmpvaW4oJywgJyk7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBSdW5zIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBwYXJhbGxlbCBjaGlsZHJlbiAoJHtjaGlsZE5hbWVzfSlgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBPTkUgQlJBTkNIIFBFUiBJVEVNLCBpbiBwYXJhbGxlbCDigJQgd2l0aCB0aGUgbnVtYmVyIG9mIGJyYW5jaGVzIGRlY2lkZWRcbiAgICogYXQgUlVOIHRpbWUgZnJvbSB0aGUgcGF5bG9hZCByYXRoZXIgdGhhbiBhdCBidWlsZCB0aW1lLlxuICAgKlxuICAgKiBgYWRkTGlzdE9mRnVuY3Rpb25gIGZhbnMgb3V0IGEgZml4ZWQgc2V0IG9mIGJyYW5jaGVzIHlvdSBuYW1lIGluIHRoZSBjaGFydC5cbiAgICogVGhpcyBmYW5zIG91dCBvdmVyIGRhdGEgdGhlIGNoYXJ0IGhhcyBub3Qgc2VlbiB5ZXQ6IHRocmVlIGNodW5rcyBtYWtlIHRocmVlXG4gICAqIGJyYW5jaGVzLCB0ZW4gbWFrZSB0ZW4uIEVhY2ggYnJhbmNoIHJ1bnMgYXMgaXRzIG93biBpc29sYXRlZCBzdWJmbG93IOKAlCBpdHNcbiAgICogb3duIG1lbW9yeSwgaXRzIG93biBjb21taXQgbG9nLCBhZGRyZXNzYWJsZSBpbiBldmVyeSB0cmFjZSBxdWVyeSBhdFxuICAgKiBgPHN0YWdlSWQ+fjxpbmRleD5gIOKAlCBzbyBicmFuY2hlcyBjYW5ub3QgY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0XG4gICAqIHN0YXRlLCBhbmQgYSBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIGEgYnJhbmNoIHJlc3VsdCB3b3JrcyB3aXRoIG5vIHNwZWNpYWxcbiAgICogaGFuZGxpbmcuIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lICAgRGlzcGxheSBsYWJlbCBmb3IgdGhlIGZhbi1vdXQgc3RhZ2UuXG4gICAqIEBwYXJhbSBpZCAgICAgU3RhYmxlIHN0YWdlIGlkLiBNYXkgbm90IGNvbnRhaW4gYH5gIChyZXNlcnZlZCDigJQgdGhlIGJyYW5jaFxuICAgKiAgICAgICAgICAgICAgIHNlZ21lbnRzIGFyZSBidWlsdCBmcm9tIHRoaXMgaWQpLlxuICAgKiBAcGFyYW0gY29uZmlnIGB7IGl0ZW1zLCBicmFuY2gsIG1heEJyYW5jaGVzLCBpbnRvLCBmYWlsRmFzdD8gfWA6XG4gICAqICAgLSBgaXRlbXMoc2NvcGUpYCBwaWNrcyB3aGF0IHRvIGZhbiBvdXQgb3ZlciAocmVhZHMgYXJlIHRyYWNrZWQpO1xuICAgKiAgIC0gYGJyYW5jaChpdGVtLCBpbmRleClgIGJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtIChlYWNoIGJyYW5jaCdzXG4gICAqICAgICBzY29wZSBpcyBhbHNvIHNlZWRlZCB3aXRoIGBpdGVtYCBhbmQgYGluZGV4YCwgc28gdGhlIGlucHV0IGlzIGluIHRoZVxuICAgKiAgICAgdHJhY2UgcmF0aGVyIHRoYW4gaGlkZGVuIGluIGEgY2xvc3VyZSk7XG4gICAqICAgLSBgbWF4QnJhbmNoZXNgIGlzIFJFUVVJUkVEIOKAlCBhbiB1bmJvdW5kZWQgZmFuLW91dCBkcml2ZW4gYnkgbW9kZWwgb3V0cHV0XG4gICAqICAgICBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0byBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvXG4gICAqICAgICBub3QgcnVuIGFuZCB0aGUgdHJ1bmNhdGlvbiBpcyByZWNvcmRlZDtcbiAgICogICAtIGBpbnRvYCBpcyBSRVFVSVJFRCDigJQgdGhlIHN0YXRlIGtleSB0aGUgb3JkZXJlZCByZXN1bHRzIGFycmF5IGlzIHdyaXR0ZW5cbiAgICogICAgIHRvLiBgaW50b1tpXWAgaXMgYnJhbmNoIGBpYCdzIHJlc3VsdCwgaW4gSVRFTVMgb3JkZXIsIHdoYXRldmVyIG9yZGVyXG4gICAqICAgICB0aGUgYnJhbmNoZXMgZmluaXNoZWQgaW47XG4gICAqICAgLSBgZmFpbEZhc3RgIGlzIHRoZSBzYW1lIHBvbGljeSB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSdzIHBhcmFsbGVsaXNtXG4gICAqICAgICB1c2VzOiBgdHJ1ZWAgcmVqZWN0cyBvbiB0aGUgZmlyc3QgZmFpbGluZyBicmFuY2gsIG9taXR0ZWQgcnVucyB0aGVtIGFsbFxuICAgKiAgICAgYmVzdC1lZmZvcnQgKGEgZmFpbGVkIGJyYW5jaCdzIHNsb3QgaXMgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdTcGxpdCcsIHNwbGl0Rm4sICdzcGxpdCcpXG4gICAqICAgLmFkZFBhcmFsbGVsRm9yRWFjaCgnUmV2aWV3IGVhY2ggY2h1bmsnLCAncmV2aWV3LWNodW5rcycsIHtcbiAgICogICAgIGl0ZW1zOiAoc2NvcGUpID0+IHNjb3BlLmNodW5rcyxcbiAgICogICAgIGJyYW5jaDogKGNodW5rLCBpKSA9PiBidWlsZFJldmlld0NoYXJ0KGNodW5rLCBpKSxcbiAgICogICAgIG1heEJyYW5jaGVzOiA4LFxuICAgKiAgICAgaW50bzogJ3Jldmlld3MnLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdNZXJnZScsIG1lcmdlRm4sICdtZXJnZScpICAgLy8gcmVhZHMgc2NvcGUucmV2aWV3c1xuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFBhcmFsbGVsRm9yRWFjaDxUSXRlbSA9IGFueT4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBQYXJhbGxlbEZvckVhY2hDb25maWc8VEl0ZW0sIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIC8vIFRoZSBnZW5lcmF0ZWQgYnJhbmNoIHNlZ21lbnRzIGVtYmVkIHRoaXMgaWQgdmVyYmF0aW1cbiAgICAvLyAoYDxpZD5+PGluZGV4PmApLCBzbyBhIG1hcmtlciBpbnNpZGUgaXQgd291bGQgbWFrZSB0aGUgc2VnbWVudFxuICAgIC8vIGFtYmlndW91cyB0byBwYXJzZS4gUmVmdXNpbmcgaXQgaGVyZSDigJQgb24gYSBicmFuZC1uZXcgbWV0aG9kLCBhdCB6ZXJvXG4gICAgLy8gYmFjay1jb21wYXQgY29zdCDigJQga2lsbHMgdGhlIGFtYmlndWl0eSBjbGFzcyBvdXRyaWdodCBhbmQga2VlcHNcbiAgICAvLyBgcGFyc2VCcmFuY2hTZWdtZW50YCBhIHNwbGl0IGF0IHRoZSBsYXN0IG1hcmtlciBpbnN0ZWFkIG9mIGEgaGV1cmlzdGljLlxuICAgIGFkbWl0SWQoJ3BhcmFsbGVsRm9yRWFjaCBzdGFnZSBpZCcsIGlkLCAnc2VnbWVudCcpO1xuICAgIHRoaXMuX2NsYWltRnJlc2hJZChpZCwgYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKWApO1xuICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcuaXRlbXMgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGNvbmZpZy5icmFuY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZhaWwoYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBpdGVtcyhzY29wZSkgYW5kIGJyYW5jaChpdGVtLCBpbmRleCkgZnVuY3Rpb25zLmApO1xuICAgIH1cbiAgICAvLyBSRVFVSVJFRCwgYm90aCBvZiB0aGVtIOKAlCBzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQgKEQyKS5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5tYXhCcmFuY2hlcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29uZmlnLm1heEJyYW5jaGVzKSB8fCBjb25maWcubWF4QnJhbmNoZXMgPCAxKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIG1heEJyYW5jaGVzIOKAlCBhIHBvc2l0aXZlIGludGVnZXIgY2VpbGluZyBvbiBob3cgbWFueSBgICtcbiAgICAgICAgICAnYnJhbmNoZXMgb25lIGV4ZWN1dGlvbiBtYXkgc3RhcnQuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBkZWZhdWx0OiBhbiB1bmJvdW5kZWQgZmFuLW91dCAnICtcbiAgICAgICAgICAnZHJpdmVuIGJ5IHJ1bnRpbWUgZGF0YSAobW9kZWwgb3V0cHV0LCBhbiB1cHN0cmVhbSBBUEkpIGlzIGEgcmVzb3VyY2UgYXR0YWNrLiBQaWNrIHRoZSAnICtcbiAgICAgICAgICAnbGFyZ2VzdCBudW1iZXIgdGhpcyBmbG93IGNhbiBhZmZvcmQuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuaW50byAhPT0gJ3N0cmluZycgfHwgY29uZmlnLmludG8gPT09ICcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIGludG8g4oCUIHRoZSBzdGF0ZSBrZXkgaXRzIG9yZGVyZWQgcmVzdWx0cyBhcnJheSBpcyBgICtcbiAgICAgICAgICAnd3JpdHRlbiB0by4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIGRlZmF1bHQgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZDogYSBkZXJpdmVkIGtleSAnICtcbiAgICAgICAgICAnY291bGQgc2lsZW50bHkgb3ZlcndyaXRlIHN0YXRlIHRoZSBjaGFydCBhbHJlYWR5IG93bnMuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzRHluYW1pY1BhcmFsbGVsOiB0cnVlLFxuICAgICAgcGFyYWxsZWxGb3JFYWNoOiBjb25maWcgYXMgUGFyYWxsZWxGb3JFYWNoQ29uZmlnPGFueSwgVFNjb3BlPixcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChjb25maWcuZmFpbEZhc3QgIT09IHVuZGVmaW5lZCkgbm9kZS5mYWlsRmFzdCA9IGNvbmZpZy5mYWlsRmFzdDtcblxuICAgIC8vIGB0eXBlOiAnZm9yaydgIOKAlCBhIGZhbi1vdXQgaXMgd2hhdCB0aGlzIGlzLCBhbmQgZXZlcnkgZXhpc3RpbmcgY29uc3VtZXJcbiAgICAvLyBhbHJlYWR5IGtub3dzIGhvdyB0byBkcmF3IG9uZS4gVGhlIFwiYnJhbmNoZXMgYXJlIGRlY2lkZWQgYXQgcnVudGltZVwiXG4gICAgLy8gZGV0YWlsIHJpZGVzIGBpc0R5bmFtaWNQYXJhbGxlbGAgcmF0aGVyIHRoYW4gYSBuZXcgbm9kZSB0eXBlLCBzbyBub3RoaW5nXG4gICAgLy8gZG93bnN0cmVhbSBoYXMgdG8gbGVhcm4gYSBuZXcgd29yZCB0byBrZWVwIHdvcmtpbmcuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ2ZvcmsnLCBpc0R5bmFtaWNQYXJhbGxlbDogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbiA/PyBgUnVucyBvbmUgYnJhbmNoIHBlciBpdGVtIGludG8gJyR7Y29uZmlnLmludG99J2ApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN1YmZsb3cgTW91bnRpbmcg4pSA4pSAXG5cbiAgYWRkU3ViRmxvd0NoYXJ0KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIG1vdW50TmFtZT86IHN0cmluZywgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMpOiB0aGlzIHtcbiAgICBjb25zdCB7IGN1ciwgY3VyU3BlYyB9ID0gdGhpcy5fbmVlZEZvcmtQYXJlbnQoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcbiAgICB0aGlzLl9tb3VudFN1YmZsb3coaWQsIHN1YmZsb3csICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgICAgaWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpZCxcbiAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhlIG1vdW50J3MgT05MWSB0YWcgc2l0ZTogdGhlIGN1cnNvciBzdGF5cyBvbiB0aGUgcGFyZW50IChzZWVcbiAgICAgIC8vIGBfY3Vyc29yVGFpbGApLCBzbyBgLnRhZygpYCBhZnRlciB0aGlzIGNhbGwgcmVmdXNlcy5cbiAgICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU3ViRmxvd0NoYXJ0KCcke2lkfScpYCk7XG5cbiAgICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG4gICAgICAvLyBMNy4zIOKAlCBTdWJmbG93IG1vdW50OiBzdGFnZSBldmVudCArIGZvcmsgZWRnZSArIG1vdW50IGxpZmVjeWNsZVxuICAgICAgLy8gZXZlbnQuIE1vdW50LW9ubHkgc2VtYW50aWNzOiBwYXJlbnQgcmVjb3JkZXJzIGRvIE5PVCByZXBsYXkgdGhlXG4gICAgICAvLyBzdWJmbG93J3Mgb3duIGludGVybmFsIHN0cnVjdHVyZSBldmVudHMuXG4gICAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBzdWJmbG93IG1vdW50ICcke3N1YmZsb3dOYW1lfSdgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgY3VyLCBjdXJTcGVjIH0gPSB0aGlzLl9uZWVkRm9ya1BhcmVudCgpO1xuXG4gICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICBmYWlsKGBkdXBsaWNhdGUgY2hpbGQgaWQgJyR7aWR9JyB1bmRlciAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuICAgIHRoaXMuX2NsYWltRnJlc2hJZChpZCwgYGFkZExhenlTdWJGbG93Q2hhcnQoJyR7aWR9JylgKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnQoJyR7aWR9JylgKTtcblxuICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgc3ViZmxvdyBwYXJhbGxlbCBtb3VudC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIGlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB0aGlzLl9maXJlU3ViZmxvd01vdW50ZWQoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbTGF6eSBTdWItRXhlY3V0aW9uOiAke3N1YmZsb3dOYW1lfV1gKTtcblxuICAgIHRoaXMuX2N1cnNvclRhaWwgPSBgdGhlIGxhenkgc3ViZmxvdyBtb3VudCAnJHtzdWJmbG93TmFtZX0nYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzb2x2ZXI6ICgpID0+IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3QgYWRkIHN1YmZsb3cgYXMgbmV4dCB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG4gICAgdGhpcy5fY2xhaW1GcmVzaElkKGlkLCBgYWRkTGF6eVN1YkZsb3dDaGFydE5leHQoJyR7aWR9JylgKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dSZXNvbHZlcjogcmVzb2x2ZXIgYXMgYW55LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAvLyBMYXp5IG1vdW50IHN0dWIuIFRoZSBsYXp5IHN1YmZsb3cncyBpbnRlcm5hbHMgd2lsbCBiZSBzaGFwZWQgYXRcbiAgICAvLyByZXNvbHV0aW9uIHRpbWUuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnROZXh0KCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgbGluZWFyLW1vdW50IHN1YmZsb3cuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KGlkLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW0xhenkgU3ViLUV4ZWN1dGlvbjogJHtzdWJmbG93TmFtZX1dYCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydE5leHQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3QgYWRkIHN1YmZsb3cgYXMgbmV4dCB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICB0aGlzLl9tb3VudFN1YmZsb3coaWQsIHN1YmZsb3csICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgICAgaWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICBjb25zdCBhdHRhY2hlZFNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICAgIGlkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICB9O1xuXG4gICAgICAvLyBBIGxpbmVhciBtb3VudCBtb3ZlcyB0aGUgY3Vyc29yLCBzbyBgLnRhZygpYCBhZnRlciBpdCBhbHNvIHdvcmtzIOKAlFxuICAgICAgLy8gYGFwcGx5VGFnc2AgcmVmdXNlcyBhIHNlY29uZCBkZWNsYXJhdGlvbiBpZiBib3RoIHNpdGVzIGFyZSB1c2VkLlxuICAgICAgYXBwbHlUYWdzKG5vZGUsIGF0dGFjaGVkU3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydE5leHQoJyR7aWR9JylgKTtcblxuICAgICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgICBjdXJTcGVjLm5leHQgPSBhdHRhY2hlZFNwZWM7XG4gICAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoYXR0YWNoZWRTcGVjKTtcbiAgICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcbiAgICAgIC8vIEw3LjMg4oCUIExpbmVhci1tb3VudCBzdWJmbG93LlxuICAgICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoYXR0YWNoZWRTcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXRyeSDilIDilIBcblxuICAvKipcbiAgICogR2l2ZSB0aGUgc3RhZ2UgeW91IEpVU1QgYWRkZWQgYSBkZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3kuXG4gICAqXG4gICAqICMjIFdoeSBkZWNsYXJlIGl0IGluc3RlYWQgb2Ygd3JpdGluZyBhIGxvb3AgaW5zaWRlIHRoZSBzdGFnZVxuICAgKlxuICAgKiBBIHJldHJ5IGhhbmQtcm9sbGVkIGluc2lkZSBhIHN0YWdlIGZ1bmN0aW9uIGlzIGludmlzaWJsZSB0byB0aGUgdHJhY2UuIFRoZVxuICAgKiBuYXJyYXRpdmUgc2hvd3Mgb25lIHN0YWdlLCB0aGUgY29tbWl0IGxvZyBzaG93cyBvbmUgZW50cnksIGFuZCB0aGUgdHdvXG4gICAqIGZhaWxlZCBjYWxscyB0aGF0IGNhbWUgYmVmb3JlIHRoZSBzdWNjZXNzZnVsIG9uZSBsZWZ0IG5vIG1hcmsgYW55d2hlcmUg4oCUXG4gICAqIGFuIHVuZXhwbGFpbmVkIGJlaGF2aW91ciBpbiBhIGxpYnJhcnkgd2hvc2Ugd2hvbGUgcG9pbnQgaXMgdGhhdCBub3RoaW5nXG4gICAqIGludmlzaWJsZSBoYXBwZW5zLiBEZWNsYXJlZCBoZXJlLCBldmVyeSBhdHRlbXB0IGlzIHBhcnQgb2YgdGhlIHJlY29yZDogZWFjaFxuICAgKiBmYWlsZWQgYXR0ZW1wdCBmaXJlcyBgRmxvd1JlY29yZGVyLm9uU3RhZ2VSZXRyeWAgYW5kIGFwcGVhcnMgaW4gdGhlXG4gICAqIG5hcnJhdGl2ZSwgaW4gb3JkZXIsIGJldHdlZW4gdGhlIGF0dGVtcHRzJyBvd24gcmVhZHMgYW5kIHdyaXRlcy5cbiAgICpcbiAgICogIyMgV2hhdCBhbiBhdHRlbXB0IGlzXG4gICAqXG4gICAqIEEgZmFpbGVkIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzIGFyZSBESVNDQVJERUQg4oCUIHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzXG4gICAqIGZyb20gY29tbWl0dGVkIHN0YXRlLCBuZXZlciBmcm9tIHRoZSB3cmVja2FnZSBvZiB0aGUgbGFzdCB0cnkuIFRoZSBmaW5hbFxuICAgKiBhdHRlbXB0IGJlaGF2ZXMgZXhhY3RseSBhcyBhIHN0YWdlIHdpdGggbm8gcG9saWN5IGRvZXM6IG9uIHN1Y2Nlc3MgaXRcbiAgICogY29tbWl0czsgb24gZmFpbHVyZSBpdCBjb21taXRzIHdoYXQgaXQgd3JvdGUgYW5kIHJldGhyb3dzIChmb290cHJpbnQgaGFzXG4gICAqIG5ldmVyIGhhZCByb2xsYmFjaywgYW5kIHJldHJ5IGRvZXMgbm90IGludHJvZHVjZSBvbmUpLlxuICAgKlxuICAgKiBBIHBhdXNlIGlzIG5vdCBhIGZhaWx1cmU6IG5laXRoZXIgYGFkZFBhdXNhYmxlRnVuY3Rpb25gJ3MgcGF1c2Ugbm9yXG4gICAqIGBpbnRlcnJ1cHQoKWAgaXMgZXZlciByZXRyaWVkLiBOb3IgaXMgYSBjYW5jZWxsZWQgcnVuLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdGZXRjaCB1c2VyJywgZmV0Y2hGbiwgJ2ZldGNoLXVzZXInKVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ2hhcmdlIGNhcmQnLCBjaGFyZ2VGbiwgJ2NoYXJnZScpXG4gICAqICAgLnJldHJ5KHsgYXR0ZW1wdHM6IDMsIGJhY2tvZmZNczogKG4pID0+IDEwMCAqIDIgKiogKG4gLSAxKSB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ29uZmlybScsIGNvbmZpcm1GbiwgJ2NvbmZpcm0nKVxuICAgKiBgYGBcbiAgICpcbiAgICogQXBwbGllcyB0byB0aGUgQ1VSUkVOVCBjdXJzb3Ig4oCUIHRoZSBzdGFnZSBhZGRlZCBieSB0aGUgaW1tZWRpYXRlbHlcbiAgICogcHJlY2VkaW5nIGBzdGFydCgpYCAvIGBhZGRGdW5jdGlvbigpYCAvIGBhZGRTdHJlYW1pbmdGdW5jdGlvbigpYCAvXG4gICAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uKClgLiBXaGVyZSB0aGUgY3Vyc29yIHdvdWxkIGJlIGFtYmlndW91cyAoYSBkZWNpZGVyLFxuICAgKiBzZWxlY3RvciwgYnJhbmNoLCBvciBmb3JrIGNoaWxkKSwgZGVjbGFyZSB0aGUgcG9saWN5IGluIHRoYXQgbWV0aG9kJ3Mgb3duXG4gICAqIGByZXRyeWAgb3B0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZXRyeShwb2xpY3k6IFJldHJ5UG9saWN5KTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgLy8gQSBzdWJmbG93IG1vdW50IC8gcGFyYWxsZWwgZm9yayBoYW5ncyBDSElMRFJFTiBvZmYgdGhlIGN1cnJlbnQgc3RhZ2UgYW5kXG4gICAgLy8gbGVhdmVzIHRoZSBjdXJzb3Igb24gdGhhdCBzdGFnZS4gQXR0YWNoaW5nIHRoZSBwb2xpY3kgdG8gdGhlIGN1cnNvciBoZXJlXG4gICAgLy8gd291bGQgc2lsZW50bHkgcmV0cnkgdGhlIHN0YWdlIEJFRk9SRSB0aGUgdGhpbmcgeW91IGp1c3Qgd3JvdGUuXG4gICAgaWYgKHRoaXMuX2N1cnNvclRhaWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBmb2xsb3cgJHt0aGlzLl9jdXJzb3JUYWlsfSDigJQgdGhhdCBhdHRhY2hlcyB0byAnJHtjdXIubmFtZX0nIHdpdGhvdXQgbW92aW5nIHRoZSBjdXJzb3IsIHNvIGAgK1xuICAgICAgICAgIGB0aGUgcG9saWN5IHdvdWxkIGxhbmQgb24gJyR7Y3VyLm5hbWV9JyByYXRoZXIgdGhhbiBvbiB3aGF0IHlvdSBqdXN0IGFkZGVkLiBEZWNsYXJlIHRoZSBwb2xpY3kgYXQgaXRzIG93biBgICtcbiAgICAgICAgICAnc2l0ZSBpbnN0ZWFkOiBvbiB0aGUgc3RhZ2VzIElOU0lERSBhIHN1YmZsb3cgY2hhcnQsIG9yIHZpYSB0aGUgYHJldHJ5YCBmaWVsZCBvbiBhbiBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5yZXRyeSkgZmFpbChgcmV0cnkgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLmlzU3ViZmxvd1Jvb3QpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBzdWJmbG93IG1vdW50ICcke2N1ci5uYW1lfScg4oCUIGEgbW91bnQgaGFzIG5vIHN0YWdlIGZ1bmN0aW9uIG9mIGl0cyBvd24uIGAgK1xuICAgICAgICAgICdEZWNsYXJlIHRoZSBwb2xpY3kgb24gdGhlIHN0YWdlcyBJTlNJREUgdGhlIHN1YmZsb3cgY2hhcnQgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0R5bmFtaWNQYXJhbGxlbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmFsbGVsLWZvci1lYWNoIHN0YWdlICcke2N1ci5uYW1lfScg4oCUIGl0IGhhcyBubyBzdGFnZSBmdW5jdGlvbiBvZiBpdHMgYCArXG4gICAgICAgICAgJ293bi4gRGVjbGFyZSB0aGUgcG9saWN5IG9uIHRoZSBzdGFnZXMgaW5zaWRlIHRoZSBicmFuY2ggY2hhcnQgaXRzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0xvb3BSZWYpIGZhaWwoYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGxvb3AgcmVmZXJlbmNlICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGFwcGx5UmV0cnlQb2xpY3koY3VyLCBjdXJTcGVjLCBwb2xpY3ksIGByZXRyeSgpIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWNsYXJlZCB0YWdzIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBQdXQgTkFNRVMgb24gdGhlIHN0YWdlIHlvdSBKVVNUIGFkZGVkLiBUaGUgZmlyc3QgY29tbWl0IGJ1bmRsZSBvZiBlYWNoXG4gICAqIGV4ZWN1dGlvbiBvZiB0aGF0IHN0YWdlIGNhcnJpZXMgdGhlbSAoYENvbW1pdEJ1bmRsZS50YWdzYCDigJQgdGhlIGJ1bmRsZVxuICAgKiBgY29tbWl0U3RvcHNgIGtleXMgb24pLCBhbmQgdGhlIGJ1aWx0IHNwZWMgYWR2ZXJ0aXNlcyB0aGVtXG4gICAqIChgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLnRhZ3NgKS5cbiAgICpcbiAgICogIyMgV2h5IGRlY2xhcmUgaXQgaW5zdGVhZCBvZiBkZXJpdmluZyBpdCBmcm9tIGlkc1xuICAgKlxuICAgKiBBIHJlYWRlciB0aGF0IHdhbnRzIFwidGhlIExMTSB0dXJuc1wiIG9mIGEgc3RvcmVkIHJlY29yZGluZyBoYWQgdG8gY2xhc3NpZnlcbiAgICogc3RhZ2VzIGZyb20gdGhlaXIgaWRzIOKAlCBhIHN3aXRjaCBvdmVyIGBydW50aW1lU3RhZ2VJZGAgdGhhdCBwYXJzZXMgYCNgIGFuZFxuICAgKiBgL2AsIGxpdmVzIGluIHRoZSBjb25zdW1lciwgYW5kIHNpbGVudGx5IGdvZXMgc3RhbGUgd2hlbiBhIHN0YWdlIGlzXG4gICAqIHJlbmFtZWQuIERlY2xhcmVkIGhlcmUsIHRoZSBuYW1lIHRyYXZlbHMgV0lUSCB0aGUgY29tbWl0OiBhIHJlY29yZGluZyBmcm9tXG4gICAqIGFueSBjaGFydCBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcywgYW5kIGB0YWdTdG9wc2AgKGZvb3RwcmludGpzL3RyYWNlKVxuICAgKiBzY3J1YnMgdGhlbSB3aXRoIG5vIGlkIGNvbnZlbnRpb25zIGF0IGFsbC5cbiAgICpcbiAgICogIyMgV2hhdCBhIHRhZyBpcywgYW5kIGlzIG5vdFxuICAgKlxuICAgKiBBIHRhZyBpcyBhIE5BTUUgZGVjbGFyZWQgYXQgYnVpbGQgdGltZSDigJQgbmV2ZXIgYSB2YWx1ZS4gVGhlcmUgaXMgbm9cbiAgICogcnVuLXRpbWUgYCR0YWcoKWA6IGEgcnVudGltZSBzdHJpbmcgY291bGQgY2FycnkgZGF0YSAoYCd1c2VyOicgKyBlbWFpbGApXG4gICAqIHBhc3QgZXZlcnkgcmVkYWN0aW9uIHBvaW50LiBEYXRhLWRlcGVuZGVudCBtYXJrcyBhcmUgYSBrZWVwIHJ1bGUgb3ZlclxuICAgKiB0aGUgZm9sZCBhdCByZWFkIHRpbWUsIG9yIHRlbGVtZXRyeSB2aWEgYCRlbWl0YC4gRnJlZSBzdHJpbmdzOiBmb290cHJpbnRqc1xuICAgKiBvd25zIG5vIHZvY2FidWxhcnk7IGEgY29uc3VtZXIgZGVjbGFyZXMgaXRzIG93biAoYCdtaWxlc3RvbmU6PGtpbmQ+J2ApLlxuICAgKlxuICAgKiBTdGFtcGVkIE9OQ0UgcGVyIGV4ZWN1dGlvbiBvZiB0aGUgc3RhZ2U6IHJldHJ5IGF0dGVtcHRzIHNoYXJlIG9uZSBzdGFtcCxcbiAgICogYSBmYWlsZWQgc3RhZ2Uga2VlcHMgaXRzIHRhZyAodGhlIGVycm9yIHBhdGggY29tbWl0cyBiZWZvcmUgaXQgcmV0aHJvd3MpLFxuICAgKiBhIHN0YWdlIHRoYXQgYGludGVycnVwdCgpYHMgYW5kIGlzIHJlc3VtZWQgaXMgdHdvIHRhZ2dlZCBzdG9wcyBvbiBhIGNoYWluXG4gICAqIGJlY2F1c2UgaXQgcmFuIHR3aWNlLCBhbmQgYW4gRU1QVFkgY29tbWl0IGlzIGEgdGFnZ2VkIHN0b3AgdG9vLiBBIHN1YmZsb3dcbiAgICogbW91bnQgb3IgYSBwYXJhbGxlbC1mb3ItZWFjaCBzdGFnZSBjYW4gYmUgdGFnZ2VkOyB0aGUgdGFnIGxhbmRzIG9uIHRoZVxuICAgKiBidW5kbGUgdGhhdCByZWNvcmRzIGl0cyByZXN1bHQg4oCUIGZvciBhIG1vdW50LCBpdHMgRklSU1QgYnVuZGxlIGluIHRoZVxuICAgKiBwYXJlbnQgbG9nICh0aGUgZXhpdCBidW5kbGUgY2FycmllcyBub25lKSwgd2hpbGUgdGhlIHN1YmZsb3cncyBvd24gbG9nXG4gICAqIGlzIHVudG91Y2hlZDogaXRzIGlubmVyIHN0YWdlcyBkZWNsYXJlIHRoZWlyIG93bi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZmxvd0NoYXJ0PFN0YXRlPignU2VlZCcsIHNlZWRGbiwgJ3NlZWQnKVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ2FsbCBtb2RlbCcsIGNhbGxGbiwgJ2NhbGwtbGxtJylcbiAgICogICAudGFnKCdtaWxlc3RvbmU6bGxtLXR1cm4nKVxuICAgKiAgIC5hZGRGdW5jdGlvbignUm91dGUnLCByb3V0ZUZuLCAncm91dGUnKVxuICAgKiAgIC50YWcoJ21pbGVzdG9uZTpkZWNpc2lvbicsICdhdWRpdCcpXG4gICAqIGBgYFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHRoZSBDVVJSRU5UIGN1cnNvciDigJQgdGhlIHN0YWdlIGFkZGVkIGJ5IHRoZSBpbW1lZGlhdGVseVxuICAgKiBwcmVjZWRpbmcgYHN0YXJ0KClgIC8gYGFkZEZ1bmN0aW9uKClgIC8gYGFkZFN0cmVhbWluZ0Z1bmN0aW9uKClgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb24oKWAgLyBgYWRkU3ViRmxvd0NoYXJ0TmV4dCgpYCAvIGBhZGRQYXJhbGxlbEZvckVhY2goKWAuXG4gICAqIFdoZXJlIHRoZSBjdXJzb3Igd291bGQgYmUgYW1iaWd1b3VzIChhIGRlY2lkZXIsIHNlbGVjdG9yLCBicmFuY2gsIG9yIGZvcmtcbiAgICogY2hpbGQpLCBkZWNsYXJlIHRoZSB0YWdzIGluIHRoYXQgbWV0aG9kJ3Mgb3duIGB0YWdzYCBvcHRpb24gaW5zdGVhZC4gQVxuICAgKiBzdWJmbG93IE1PVU5UIGhhcyB0aGF0IG9wdGlvbiB0b28gKGBTdWJmbG93TW91bnRPcHRpb25zLnRhZ3NgLCA5LjIxLjEpXG4gICAqIOKAlCBhbmQgZm9yIGEgZm9yay1jaGlsZCBtb3VudCAoYGFkZFN1YkZsb3dDaGFydGApIG9yIGEgYnJhbmNoIG1vdW50XG4gICAqIChgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYCkgaXQgaXMgdGhlIE9OTFkgc2l0ZTogdGhvc2UgbGVhdmUgdGhlIGN1cnNvciBvblxuICAgKiB0aGUgcGFyZW50LCBzbyBgLnRhZygpYCBhZnRlciB0aGVtIHJlZnVzZXMgcmF0aGVyIHRoYW4gbWlzLWF0dHJpYnV0ZS5cbiAgICpcbiAgICogUmVmdXNlZCBhdCBidWlsZCB0aW1lOiBhbiBlbXB0eSBuYW1lLCBhIG5vbi1zdHJpbmcsIHRoZSByZXNlcnZlZFxuICAgKiBicmFuY2gtc2VnbWVudCBtYXJrZXIgYH5gIGluc2lkZSBhIG5hbWUsIGEgbmFtZSBkZWNsYXJlZCB0d2ljZSwgYW5kIGFcbiAgICogc2Vjb25kIGRlY2xhcmF0aW9uIG9uIHRoZSBzYW1lIHN0YWdlLlxuICAgKi9cbiAgdGFnKC4uLm5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIC8vIFNhbWUgbWlzLWF0dHJpYnV0aW9uIGd1YXJkIGFzIGAucmV0cnkoKWA6IGFmdGVyIGEgbW91bnQgb3IgYSBmb3JrIHRoZVxuICAgIC8vIGN1cnNvciBzdGlsbCBwb2ludHMgYXQgdGhlIHN0YWdlIEJFRk9SRSB3aGF0IHlvdSBqdXN0IHdyb3RlLlxuICAgIGlmICh0aGlzLl9jdXJzb3JUYWlsKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgdGFnKCkgY2Fubm90IGZvbGxvdyAke3RoaXMuX2N1cnNvclRhaWx9IOKAlCB0aGF0IGF0dGFjaGVzIHRvICcke2N1ci5uYW1lfScgd2l0aG91dCBtb3ZpbmcgdGhlIGN1cnNvciwgc28gYCArXG4gICAgICAgICAgYHRoZSBuYW1lcyB3b3VsZCBsYW5kIG9uICcke2N1ci5uYW1lfScgcmF0aGVyIHRoYW4gb24gd2hhdCB5b3UganVzdCBhZGRlZC4gRGVjbGFyZSB0aGUgdGFncyBhdCB0aGVpciBvd24gYCArXG4gICAgICAgICAgXCJzaXRlIGluc3RlYWQ6IHZpYSB0aGUgYHRhZ3NgIGZpZWxkIGluIHRoZSBtb3VudCdzIG93biBvcHRpb25zIChgU3ViZmxvd01vdW50T3B0aW9ucy50YWdzYCwgOS4yMS4xKSwgb3IgXCIgK1xuICAgICAgICAgICd2aWEgdGhlIGB0YWdzYCBmaWVsZCBvbiBhbiBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZC4gVGhlIHN0YWdlcyBJTlNJREUgYSBzdWJmbG93IGNoYXJ0IGRlY2xhcmUgdGhlaXIgb3duLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzTG9vcFJlZikgZmFpbChgdGFnKCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGxvb3AgcmVmZXJlbmNlICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSBmYWlsKGB0YWcoKSBhdCAnJHtjdXIubmFtZX0nOiBhdCBsZWFzdCBvbmUgbmFtZSBpcyByZXF1aXJlZGApO1xuXG4gICAgYXBwbHlUYWdzKGN1ciwgY3VyU3BlYywgbmFtZXMsIGB0YWcoKSBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgLy8gVGhlIHN0YWdlJ3MgYG9uU3RhZ2VBZGRlZGAgaGFzIGFscmVhZHkgZmlyZWQgKHRoZSBkb29yIGNvbWVzIGFmdGVyXG4gICAgLy8gdGhlIGFkZCksIHNvIHRoZSBuYW1lcyBnbyBvdXQgYXMgdGhlaXIgb3duIGV2ZW50IOKAlCBhIHJlY29yZGVyIHRoYXRcbiAgICAvLyBjb3BpZWQgZmllbGRzIGF0IGFkZCB0aW1lIHdvdWxkIG90aGVyd2lzZSBuZXZlciBzZWUgdGhlbSAoOS4yNC4wKS5cbiAgICB0aGlzLl9maXJlU3RhZ2VUYWdnZWQoY3VyU3BlYyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgTG9vcCDilIDilIBcblxuICBsb29wVG8oc3RhZ2VJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1clNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5uZXh0KSBmYWlsKGBjYW5ub3Qgc2V0IGxvb3BUbyB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGlmICghdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoc3RhZ2VJZCkpIHtcbiAgICAgIGZhaWwoYGxvb3BUbygnJHtzdGFnZUlkfScpIHRhcmdldCBub3QgZm91bmQg4oCUIGRpZCB5b3UgcGFzcyBhIHN0YWdlIG5hbWUgaW5zdGVhZCBvZiBpZD9gKTtcbiAgICB9XG5cbiAgICBjdXIubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIGlzTG9vcFJlZjogdHJ1ZSB9O1xuICAgIGN1clNwZWMubG9vcFRhcmdldCA9IHN0YWdlSWQ7XG4gICAgY3VyU3BlYy5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgdHlwZTogJ2xvb3AnLCBpc0xvb3BSZWZlcmVuY2U6IHRydWUgfTtcblxuICAgIGNvbnN0IHRhcmdldFN0ZXAgPSB0aGlzLl9zdGFnZVN0ZXBNYXAuZ2V0KHN0YWdlSWQpO1xuICAgIGlmICh0YXJnZXRTdGVwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChg4oaSIGxvb3BzIGJhY2sgdG8gc3RlcCAke3RhcmdldFN0ZXB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChg4oaSIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIEZpcmUgdGhlIGxvb3AgYmFjay1lZGdlIGV2ZW50LiBEaXN0aW5jdCBmcm9tIGBvbkVkZ2VBZGRlZGBcbiAgICAvLyBiZWNhdXNlIHJ1bnRpbWUgYG9uTG9vcGAgY2FycmllcyBgaXRlcmF0aW9uOiBudW1iZXJgIHdoaWNoIGhhcyBub1xuICAgIC8vIGJ1aWxkIG1lYW5pbmcg4oCUIHNlcGFyYXRlIGV2ZW50IGtlZXBzIHBheWxvYWRzIGhvbmVzdC5cbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChjdXIuaWQsIHN0YWdlSWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0cmVhbWluZyDilIDilIBcblxuICBvblN0cmVhbShoYW5kbGVyOiBTdHJlYW1Ub2tlbkhhbmRsZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zdHJlYW1IYW5kbGVycy5vblRva2VuID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uU3RyZWFtU3RhcnQoaGFuZGxlcjogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uU3RhcnQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1FbmQoaGFuZGxlcjogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uRW5kID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBPdXRwdXQg4pSA4pSAXG5cbiAgYnVpbGQoKTogUnVubmFibGVGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gTDcuMyDigJQgc2VhbCB0aGUgY2hhcnQgc28gcG9zdC1idWlsZCBhdHRhY2hlcyB0aHJvdy4gUHJldmVudHNcbiAgICAvLyByZWNvcmRlcnMgYXR0YWNoZWQgbWlkLWV4ZWN1dGlvbiBmcm9tIGdldHRpbmcgcGFydGlhbCBkYXRhLlxuICAgIHRoaXMuX3NlYWxlZCA9IHRydWU7XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgICBjb25zdCByb290U3BlYyA9IHRoaXMuX3Jvb3RTcGVjID8/IGZhaWwoJ2VtcHR5IHNwZWM7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuXG4gICAgY29uc3Qgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgdGhpcy5fc3ViZmxvd0RlZnMpIHtcbiAgICAgIHN1YmZsb3dzW2tleV0gPSBkZWY7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdE5hbWUgPSB0aGlzLl9yb290Py5uYW1lID8/ICdGbG93Q2hhcnQnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID1cbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMubGVuZ3RoID4gMCA/IGBGbG93Q2hhcnQ6ICR7cm9vdE5hbWV9XFxuU3RlcHM6XFxuJHt0aGlzLl9kZXNjcmlwdGlvblBhcnRzLmpvaW4oJ1xcbicpfWAgOiAnJztcblxuICAgIGNvbnN0IGNoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIHJvb3QsXG4gICAgICBzdGFnZU1hcDogdGhpcy5fc3RhZ2VNYXAsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IHJvb3RTcGVjLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHN1YmZsb3dzKS5sZW5ndGggPiAwID8geyBzdWJmbG93cyB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX2VuYWJsZU5hcnJhdGl2ZSA/IHsgZW5hYmxlTmFycmF0aXZlOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fbG9nZ2VyID8geyBsb2dnZXI6IHRoaXMuX2xvZ2dlciB9IDoge30pLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBzdGFnZURlc2NyaXB0aW9uczogbmV3IE1hcCh0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyksXG4gICAgICAuLi4odGhpcy5faW5wdXRTY2hlbWEgPyB7IGlucHV0U2NoZW1hOiB0aGlzLl9pbnB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dFNjaGVtYSA/IHsgb3V0cHV0U2NoZW1hOiB0aGlzLl9vdXRwdXRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9vdXRwdXRNYXBwZXIgPyB7IG91dHB1dE1hcHBlcjogdGhpcy5fb3V0cHV0TWFwcGVyIH0gOiB7fSksXG4gICAgICAvLyBBdXRvLWVtYmVkIFR5cGVkU2NvcGUgZmFjdG9yeSBpZiBub25lIHdhcyBleHBsaWNpdGx5IHNldC5cbiAgICAgIC8vIFRoaXMgbWVhbnMgQU5ZIHdheSBvZiBjcmVhdGluZyBhIEZsb3dDaGFydEJ1aWxkZXIgKGZsb3dDaGFydCgpLCBuZXcgRmxvd0NoYXJ0QnVpbGRlcigpLFxuICAgICAgLy8gb3IgYW55IHN1YmNsYXNzKSBhdXRvbWF0aWNhbGx5IGdldHMgVHlwZWRTY29wZSDigJQgbm8gbWFudWFsIHNldFNjb3BlRmFjdG9yeSBuZWVkZWQuXG4gICAgICBzY29wZUZhY3Rvcnk6IHRoaXMuX3Njb3BlRmFjdG9yeSA/PyAoY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkoKSBhcyB1bmtub3duIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1ha2VSdW5uYWJsZShjaGFydCk7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdGhlIHNjb3BlIGZhY3RvcnkuIFJhcmVseSBuZWVkZWQg4oCUIGF1dG8tZW1iZWRzIFR5cGVkU2NvcGUgYnkgZGVmYXVsdC4gKi9cbiAgc2V0U2NvcGVGYWN0b3J5KGZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+KTogdGhpcyB7XG4gICAgdGhpcy5fc2NvcGVGYWN0b3J5ID0gZmFjdG9yeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3BlYzxUUmVzdWx0ID0gU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlPigpOiBUUmVzdWx0IHtcbiAgICBjb25zdCByb290U3BlYyA9IHRoaXMuX3Jvb3RTcGVjID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIHJldHVybiByb290U3BlYyBhcyBUUmVzdWx0O1xuICB9XG5cbiAgdG9NZXJtYWlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gWydmbG93Y2hhcnQgVEQnXTtcbiAgICBjb25zdCBpZE9mID0gKGs6IHN0cmluZykgPT4gKGsgfHwgJycpLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgJ18nKSB8fCAnXyc7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuX3Jvb3QgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCB3YWxrID0gKG46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KSA9PiB7XG4gICAgICBjb25zdCBuaWQgPSBpZE9mKG4uaWQpO1xuICAgICAgbGluZXMucHVzaChgJHtuaWR9W1wiJHtuLm5hbWV9XCJdYCk7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygbi5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAgICBjb25zdCBjaWQgPSBpZE9mKGMuaWQpO1xuICAgICAgICBsaW5lcy5wdXNoKGAke25pZH0gLS0+ICR7Y2lkfWApO1xuICAgICAgICB3YWxrKGMpO1xuICAgICAgfVxuICAgICAgaWYgKG4ubmV4dCkge1xuICAgICAgICBjb25zdCBtaWQgPSBpZE9mKG4ubmV4dC5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHttaWR9YCk7XG4gICAgICAgIHdhbGsobi5uZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsocm9vdCk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFscyAoZXhwb3NlZCBmb3IgaGVscGVyIGNsYXNzZXMpIOKUgOKUgFxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3IoKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLl9jdXJzb3IgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICBwcml2YXRlIF9uZWVkQ3Vyc29yU3BlYygpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUge1xuICAgIHJldHVybiB0aGlzLl9jdXJzb3JTcGVjID8/IGZhaWwoJ2N1cnNvciB1bmRlZmluZWQ7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBub2RlIGEgZmFuLW91dCAoYGFkZExpc3RPZkZ1bmN0aW9uYCwgYGFkZFN1YkZsb3dDaGFydGAsXG4gICAqIGBhZGRMYXp5U3ViRmxvd0NoYXJ0YCkgaGFuZ3MgaXRzIGNoaWxkcmVuIG9uIOKAlCB0aGUgY3Vyc29yLCB1bmxlc3MgdGhlXG4gICAqIGN1cnNvcidzIGBjaGlsZHJlbmAgYWxyZWFkeSBNRUFOIHNvbWV0aGluZyBlbHNlOlxuICAgKlxuICAgKiAtIGEgc3ViZmxvdyBNT1VOVCDigJQgdGhlIGVuZ2luZSByZWFkcyBhIG1vdW50IHRoYXQgY2FycmllcyBjaGlsZHJlbiBhcyB0aGVcbiAgICogICBtb3VudGVkIGNoYXJ0J3MgT1dOIGNvbnRlbnQgKGBOb2RlUmVzb2x2ZXIgwrcgcmVzb2x2ZVN1YmZsb3dSZWZlcmVuY2VgKSxcbiAgICogICBzbyBhIGZvcmsgaHVuZyB0aGVyZSByYW4gSU5TSURFIHRoZSBzdWJmbG93OiB0aGUgc3ViZmxvdydzIHJlYWwgY2hhcnRcbiAgICogICBuZXZlciByYW4sIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZvcmsgcmFuIHR3aWNlLCBhbmQgYSBwYXVzZSBhZnRlciBpdCB3YXNcbiAgICogICBjaGVja3BvaW50ZWQgdW5kZXIgdGhlIHdyb25nIHN1YmZsb3cgcGF0aCAoYW5kIHJlZnVzZWQgb24gcmVzdW1lKTtcbiAgICogLSBhIERFQ0lERVIgb3IgYSBTRUxFQ1RPUiAodGhlIGN1cnNvciBhZnRlciBgLmVuZCgpYCkg4oCUIGl0cyBjaGlsZHJlbiBhcmVcbiAgICogICBpdHMgYnJhbmNoZXMsIHNvIGEgZm9yayBjaGlsZCBiZWNhbWUgYSBicmFuY2ggbm9ib2R5IHBpY2tzO1xuICAgKiAtIGEgYHBhcmFsbGVsRm9yRWFjaGAg4oCUIGl0cyBicmFuY2hlcyBjb21lIGZyb20gYGl0ZW1zYCBhdCBydW4gdGltZSBhbmRcbiAgICogICBidWlsdCBjaGlsZHJlbiBhcmUgbmV2ZXIgZGlzcGF0Y2hlZCwgc28gdGhlIGZvcmsgbmV2ZXIgcmFuLlxuICAgKlxuICAgKiBUaHJvdWdoIDkuMzcuMCB0aGUgYnVpbGRlciBodW5nIHRoZSBmb3JrIHRoZXJlIGFueXdheS4gU28gYWZ0ZXIgc3VjaCBhXG4gICAqIG5vZGUgdGhlIGZvcmsgY29udGludWVzIEFGVEVSIGl0OiBhIGZ1bmN0aW9uLWxlc3MgZm9yayBub2RlXG4gICAqIGA8bm9kZUlkPi1mb3JrYCBiZWNvbWVzIHRoZSBub2RlJ3MgYG5leHRgIGFuZCB0aGUgbmV3IGN1cnNvciDigJQgdGhlIHNoYXBlXG4gICAqIGBhZGRGdW5jdGlvbiguLi4pLmFkZExpc3RPZkZ1bmN0aW9uKC4uLilgIGFscmVhZHkgYnVpbGRzLCB3aGljaCBldmVyeVxuICAgKiByZWFkZXIgKGVuZ2luZSwgcmVzdW1lLCBzdHJ1Y3R1cmUsIHNwZWMpIGhhbmRsZXMuIEEgc2Vjb25kIGZhbi1vdXQgY2FsbFxuICAgKiByZXVzZXMgdGhhdCBub2RlLCBhcyBpdCB3b3VsZCBhbnkgY3Vyc29yLiBUaGUgaWQgaXMgcmVzZXJ2ZWQgYm90aCB3YXlzOlxuICAgKiByZWZ1c2VkIGhlcmUgd2hlbiBhIHN0YWdlIGFscmVhZHkgaGFzIGl0LCBhbmQgYnkgc3RhZ2UgYWRtaXNzaW9uIC9cbiAgICogYF9yZWdpc3RlclN1YmZsb3dEZWZgIHdoZW4gYSBsYXRlciBzdGFnZSBvciBtb3VudCBhc2tzIGZvciBpdC5cbiAgICovXG4gIHByaXZhdGUgX25lZWRGb3JrUGFyZW50KCk6IHsgY3VyOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIH0ge1xuICAgIGNvbnN0IG93bmVyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IG93bmVyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgY2hpbGRyZW5NZWFuU29tZXRoaW5nRWxzZSA9XG4gICAgICBvd25lci5pc1N1YmZsb3dSb290IHx8IG93bmVyLmlzRHluYW1pY1BhcmFsbGVsIHx8IG93bmVyLmRlY2lkZXJGbiB8fCBvd25lci5zZWxlY3RvckZuO1xuICAgIGlmICghY2hpbGRyZW5NZWFuU29tZXRoaW5nRWxzZSkgcmV0dXJuIHsgY3VyOiBvd25lciwgY3VyU3BlYzogb3duZXJTcGVjIH07XG5cbiAgICBjb25zdCBpZCA9IGAke293bmVyLmlkfS1mb3JrYDtcbiAgICBpZiAodGhpcy5faWRUYWtlbihpZCkpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGBjYW5ub3QgZmFuIG91dCBhZnRlciAnJHtvd25lci5uYW1lfSc6IHRoZSBmb3JrIG5vZGUgaXQgbmVlZHMsICcke2lkfScsIGAgK1xuICAgICAgICAgIGBpcyBhbHJlYWR5IGEgc3RhZ2UgaWQuIEFkZCBhIHN0YWdlIGFmdGVyICcke293bmVyLm5hbWV9JyBhbmQgZmFuIG91dCBmcm9tIGl0LmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZTogaWQsIGlkIH07XG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBpZCwgaWQsIHR5cGU6ICdmb3JrJyB9O1xuICAgIG93bmVyLm5leHQgPSBub2RlO1xuICAgIG93bmVyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcbiAgICB0aGlzLl9mb3JrTm9kZUlkcy5hZGQoaWQpO1xuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQob3duZXJTcGVjLCBpZCk7XG4gICAgcmV0dXJuIHsgY3VyOiBub2RlLCBjdXJTcGVjOiBzcGVjIH07XG4gIH1cblxuICAvKiogSWRzIGBfbmVlZEZvcmtQYXJlbnRgIGdlbmVyYXRlZCDigJQgbm8gbGF0ZXIgc3RhZ2Ugb3IgbW91bnQgbWF5IHRha2Ugb25lLiAqL1xuICBwcml2YXRlIF9mb3JrTm9kZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBTaGFyZWQgYnkgc3RhZ2UgYWRtaXNzaW9uIGFuZCBzdWJmbG93IHJlZ2lzdHJhdGlvbjogcmVzZXJ2ZWQgc3RydWN0dXJhbCBpZHMgY2Fubm90IGJlIHJldXNlZC4gKi9cbiAgcHJpdmF0ZSBfcmVmdXNlRm9ya05vZGVJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NsYWltZWRJZHMuaGFzKGlkKSkge1xuICAgICAgZmFpbChgaWQgJyR7aWR9JyBpcyBhbHJlYWR5IHVzZWQgYnkgYSBsYXp5IHN1YmZsb3cgbW91bnQgb3IgYSBwYXJhbGxlbEZvckVhY2ggaW4gdGhpcyBjaGFydC4gUmVuYW1lIHRoZSBzdGFnZS5gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9mb3JrTm9kZUlkcy5oYXMoaWQpKSByZXR1cm47XG4gICAgZmFpbChcbiAgICAgIGBpZCAnJHtpZH0nIGlzIHRha2VuOiBpdCBpcyB0aGUgZm9yayBub2RlIHRoZSBidWlsZGVyIHBsYWNlZCBhZnRlciAnJHtpZC5zbGljZSgwLCAtJy1mb3JrJy5sZW5ndGgpfScgYCArXG4gICAgICAgICcoYSBmYW4tb3V0IHJpZ2h0IGFmdGVyIGEgc3ViZmxvdyBtb3VudCwgZGVjaWRlciwgc2VsZWN0b3Igb3IgcGFyYWxsZWxGb3JFYWNoIGNvbnRpbnVlcyBvbiBpdCkuICcgK1xuICAgICAgICAnUmVuYW1lIHRoZSBzdGFnZS4nLFxuICAgICk7XG4gIH1cblxuICAvKiogSWRzIHRoZSBsYXp5LW1vdW50IGFuZCBwYXJhbGxlbEZvckVhY2ggZG9vcnMgY2xhaW1lZCAodGhleSByZWdpc3RlciBpbiBubyBtYXApLiAqL1xuICBwcml2YXRlIF9jbGFpbWVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIFN0cnVjdHVyYWwgZGVjbGFyYXRpb25zIHdpdGhvdXQgYW4gZW1iZWRkZWQgZnVuY3Rpb247IG5vdCBmdW5jdGlvbiBlbnRyaWVzIG9yIGxvb3AgdGFyZ2V0cy4gKi9cbiAgcHJpdmF0ZSBfZnVuY3Rpb25sZXNzU3RhZ2VJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogVHJ1ZSB3aGVuIGFuIGVhcmxpZXIgc3RhZ2UsIGJyYW5jaCwgZm9yayBjaGlsZCwgbW91bnQgb3IgZ2VuZXJhdGVkIGZvcmsgbm9kZSBob2xkcyBgaWRgLiAqL1xuICBwcml2YXRlIF9pZFRha2VuKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpIHx8XG4gICAgICB0aGlzLl9zdGFnZU1hcC5oYXMoaWQpIHx8XG4gICAgICB0aGlzLl9mdW5jdGlvbmxlc3NTdGFnZUlkcy5oYXMoaWQpIHx8XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpIHx8XG4gICAgICB0aGlzLl9jbGFpbWVkSWRzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX2ZvcmtOb2RlSWRzLmhhcyhpZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBUaGUgbGF6eS1tb3VudCBkb29ycyBhbmQgYGFkZFBhcmFsbGVsRm9yRWFjaGAgcmVnaXN0ZXIgdGhlaXIgaWRcbiAgICogaW4gbm8gbWFwLCBzbyB0aHJvdWdoIDkuMzcuMCB0aGV5IGFjY2VwdGVkIGFuIGlkIGFub3RoZXIgc3RhZ2Ugb3IgbW91bnRcbiAgICogYWxyZWFkeSBoYWQgKGFuZCBhIGxhdGVyIHN0YWdlIGNvdWxkIHRha2UgdGhlaXJzKS4gVGhleSBjbGFpbSBpdCBoZXJlOlxuICAgKiByZWZ1c2VkIHdoZW4gdGFrZW4sIHJlY29yZGVkIHdoZW4gZnJlc2guIExvb3AtcmVmIHN0dWJzIHJlZmVyZW5jZSBhblxuICAgKiBleGlzdGluZyBzdGFnZSByYXRoZXIgdGhhbiBjbGFpbWluZyBhIG5ldyBpZC4gUmV1c2FibGUgZnVuY3Rpb24gc3RhZ2VzXG4gICAqIHJldGFpbiB0aGVpciBzZXBhcmF0ZSBgX2FkZFRvTWFwYCBydWxlLlxuICAgKi9cbiAgX2NsYWltRnJlc2hJZChpZDogc3RyaW5nLCBkb29yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faWRUYWtlbihpZCkpIHtcbiAgICAgIGZhaWwoYCR7ZG9vcn06IGlkICcke2lkfScgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgc3RhZ2Ugb3IgbW91bnQgaW4gdGhpcyBjaGFydC4gR2l2ZSBpdCBpdHMgb3duIGlkLmApO1xuICAgIH1cbiAgICB0aGlzLl9jbGFpbWVkSWRzLmFkZChpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgc3BlYyBjdXJzb3IuIFJldGFpbmVkIGFzIGEgbWV0aG9kIHNvIGNhbGwgc2l0ZXMgc3RheVxuICAgKiBvbmUtbGluZXJzIGFuZCBmdXR1cmUgY3Vyc29yLXJlbGF0ZWQgc2lkZSBlZmZlY3RzIGhhdmUgYSBob29rLlxuICAgKi9cbiAgLyoqXG4gICAqIFdoYXQgd2FzIGF0dGFjaGVkIHRvIHRoZSBDVVJTT1Igd2l0aG91dCBhZHZhbmNpbmcgaXQg4oCUIGEgc3ViZmxvdyBtb3VudCwgYVxuICAgKiBwYXJhbGxlbCBmb3JrJ3MgY2hpbGRyZW4uIENsZWFyZWQgYnkge0BsaW5rIF9hZHZhbmNlQ3Vyc29yU3BlY30sIHRoZSBzaW5nbGVcbiAgICogY2hva2UgcG9pbnQgZXZlcnkgY3Vyc29yLWFkdmFuY2luZyBtZXRob2QgYWxyZWFkeSBnb2VzIHRocm91Z2gsIHNvIHRoaXNcbiAgICogbWFya2VyIGNhbm5vdCBkcmlmdCBhcyBuZXcgYnVpbGRlciBtZXRob2RzIGFyZSBhZGRlZC5cbiAgICpcbiAgICogRXhpc3RzIGZvciBgLnJldHJ5KClgLiBUaG9zZSBtZXRob2RzIGhhbmcgY2hpbGRyZW4gb2ZmIHRoZSBjdXJyZW50IHN0YWdlXG4gICAqIGFuZCBsZWF2ZSB0aGUgY3Vyc29yIHBvaW50aW5nIGF0IHRoYXQgc3RhZ2UsIHNvIGEgY2hhaW5lZCBgLnJldHJ5KClgIHdvdWxkXG4gICAqIHNpbGVudGx5IGF0dGFjaCB0aGUgcG9saWN5IHRvIHRoZSBzdGFnZSBCRUZPUkUgdGhlIHRoaW5nIHlvdSBqdXN0IHdyb3RlIOKAlFxuICAgKiBleGFjdGx5IHRoZSBzaWxlbnQgbWlzLWF0dHJpYnV0aW9uIHRoaXMgY29kZWJhc2UgcmVmdXNlcyBlbHNld2hlcmUgKHNlZVxuICAgKiB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIHJ1bGVzKS4gTmFtaW5nIHdoYXQgd2FzIGxhc3QgYWRkZWQgbGV0cyB0aGVcbiAgICogcmVmdXNhbCBzYXkgc29tZXRoaW5nIHVzZWZ1bC5cbiAgICovXG4gIHByaXZhdGUgX2N1cnNvclRhaWw/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYWR2YW5jZUN1cnNvclNwZWMobmV3U3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gbmV3U3BlYztcbiAgfVxuXG4gIF9zdGFnZU1hcEhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgUmVnaXN0ZXIgYSBtb3VudGVkIHN1YmZsb3cncyBkZWZpbml0aW9uIOKAlCBmaXJzdCBtb3VudCB3aW5zLFxuICAgKiBhdCBldmVyeSBlYWdlciBtb3VudCBzaXRlIChsaW5lYXIsIGZvcmsgY2hpbGQsIGRlY2lkZXIgYW5kIHNlbGVjdG9yXG4gICAqIGJyYW5jaCkuIEEgU0VDT05EIG1vdW50IHVuZGVyIHRoZSBzYW1lIGlkIGlzIGFsbG93ZWQgKGV4aXN0aW5nIGNoYXJ0cyBkb1xuICAgKiBpdCkgYW5kIHNoYXJlcyB0aGUgZmlyc3Qgb25lJ3MgZGVmaW5pdGlvbiDigJQgYnV0IGEgcGF1c2UgaW5zaWRlIGVpdGhlclxuICAgKiBjYW5ub3QgYmUgcmVzdW1lZDogYSBjaGVja3BvaW50J3MgYHN1YmZsb3dQYXRoYCBuYW1lcyB0aGUgc3ViZmxvdyBpZCwgbm90XG4gICAqIHRoZSBtb3VudCwgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZSBhbWJpZ3VvdXMgcGF0aC4gRGV2IG1vZGUgc2F5cyBzb1xuICAgKiBoZXJlLCBhdCBidWlsZCB0aW1lLCB3aGVyZSB0aGUgaWQgY2FuIHN0aWxsIGJlIGNoYW5nZWQuXG4gICAqL1xuICBfcmVnaXN0ZXJTdWJmbG93RGVmKGlkOiBzdHJpbmcsIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogdm9pZCB7XG4gICAgdGhpcy5fcmVmdXNlRm9ya05vZGVJZChpZCk7XG4gICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gc3ViZmxvdyBpZCAnJHtpZH0nIGlzIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhpcyBjaGFydC4gVGhlIG1vdW50cyBzaGFyZSBvbmUgYCArXG4gICAgICAgICAgJ2RlZmluaXRpb24sIGFuZCBhIHBhdXNlIGluc2lkZSBlaXRoZXIgY2Fubm90IGJlIHJlc3VtZWQg4oCUIHRoZSBjaGVja3BvaW50IGNhbm5vdCBzYXkgd2hpY2ggbW91bnQgJyArXG4gICAgICAgICAgJ3BhdXNlZC4gR2l2ZSBlYWNoIG1vdW50IGl0cyBvd24gaWQuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBPbmUgYWRtaXNzaW9uIHBhdGggZm9yIG9wdGlvbmFsLWZ1bmN0aW9uIGNoaWxkcmVuIGFuZCBicmFuY2hlcy5cbiAgICogQSBtaXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IGVyYXNlIHRoZSBncmFwaCBpZGVudGl0eTogY2hlY2sgcmVzZXJ2YXRpb25zXG4gICAqIGFuZCByZWNvcmQgaXQgZm9yIGZ1dHVyZSBmcmVzaC1pZCBjbGFpbXMsIHdpdGhvdXQgYWRkaW5nIGEgZnVuY3Rpb24gb3IgYVxuICAgKiBsb29wIHRhcmdldC4gRXhpc3RpbmcgZnVuY3Rpb24gcmVmZXJlbmNlcyBieSBpZC9uYW1lIHJlbWFpbiBsZWdhbC5cbiAgICovXG4gIF9yZWdpc3RlclN0YWdlKGlkOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlZnVzZUZvcmtOb2RlSWQoaWQpO1xuICAgIHRoaXMuX2Z1bmN0aW9ubGVzc1N0YWdlSWRzLmFkZChpZCk7XG4gIH1cblxuICBfYWRkVG9NYXAoaWQ6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPikge1xuICAgIHRoaXMuX3JlZnVzZUZvcmtOb2RlSWQoaWQpO1xuICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChpZCk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IGZuKSBmYWlsKGBzdGFnZU1hcCBjb2xsaXNpb24gZm9yIGlkICcke2lkfSdgKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGlkLCBmbik7XG4gIH1cblxuICBfbWVyZ2VTdGFnZU1hcChvdGhlcjogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PiwgcHJlZml4Pzogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2Ygb3RoZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGpvaW5QYXRoKHByZWZpeCwgaykgOiBrO1xuICAgICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChleGlzdGluZyAhPT0gdikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIHdoaWxlIG1vdW50aW5nIGZsb3djaGFydCBhdCAnJHtrZXl9J2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGtleSwgdik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeCBhIG5vZGUgdHJlZSB3aXRoIGEgc3ViZmxvdyBwYXRoIHNlZ21lbnQgYXQgTU9VTlQgdGltZSDigJQgdGhlIG9uZVxuICAgKiBwcmVmaXhlciwgYGVuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50c2AgKHRoZSB0cmF2ZXJzZXIgY2FsbHMgdGhlIHNhbWVcbiAgICogZnVuY3Rpb24gYXQgUlVOIHRpbWUpLiBLZXB0IGFzIHRoZSBidWlsZGVyJ3MgZG9vciBmb3IgaXRzIG1vdW50IHNpdGVzLlxuICAgKi9cbiAgX3ByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gcHJlZml4Tm9kZVRyZWUobm9kZSwgcHJlZml4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgbW91bnQgb2YgYSBzdWJmbG93IGNoYXJ0IHVuZGVyIGBpZGAgKEYxMCkg4oCUIGV2ZXJ5IGVhZ2VyIG1vdW50IHNpdGVcbiAgICogKGBhZGRTdWJGbG93Q2hhcnRgLCBgYWRkU3ViRmxvd0NoYXJ0TmV4dGAsIGEgZGVjaWRlci9zZWxlY3RvclxuICAgKiBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYCkgZ29lcyB0aHJvdWdoIGl0LCBhbmQgaXQgaXMgdGhlIG9uZSBjYWxsZXIgb2YgdGhlXG4gICAqIHByZWZpeGVyLiBJbiBvcmRlcjogcmVnaXN0ZXIgdGhlIGNoYXJ0J3MgcHJlZml4ZWQgcm9vdCB1bmRlciBgaWRgO1xuICAgKiBgcGxhY2VgIHRoZSBtb3VudCdzIG93biBub2RlICsgc3BlYyBhbmQgZmlyZSBpdHMgc3RydWN0dXJlIGV2ZW50czsgbWVyZ2VcbiAgICogdGhlIGNoYXJ0J3Mgc3RhZ2UgbWFwIHVuZGVyIGBpZGA7IHJlZ2lzdGVyIGl0cyBuZXN0ZWQgc3ViZmxvd3MgdW5kZXJcbiAgICogYGlkLzxrZXk+YCAoYSBrZXkgYWxyZWFkeSByZWdpc3RlcmVkIGlzIGtlcHQpLlxuICAgKi9cbiAgX21vdW50U3ViZmxvdyhpZDogc3RyaW5nLCBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LCBwbGFjZTogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHByZWZpeGVkID0gKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KSA9PiB0aGlzLl9wcmVmaXhOb2RlVHJlZShyb290LCBpZCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJTdWJmbG93RGVmKGlkLCBwcmVmaXhlZChzdWJmbG93LnJvb3QpKTtcbiAgICBwbGFjZSgpO1xuICAgIHRoaXMuX21lcmdlU3RhZ2VNYXAoc3ViZmxvdy5zdGFnZU1hcCwgaWQpO1xuICAgIGlmICghc3ViZmxvdy5zdWJmbG93cykgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93LnN1YmZsb3dzKSkge1xuICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBqb2luUGF0aChpZCwga2V5KTtcbiAgICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQocHJlZml4ZWRLZXksIHsgcm9vdDogcHJlZml4ZWQoZGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZhY3RvcnkgRnVuY3Rpb25cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFN0YXJ0IGEgZmxvd2NoYXJ0IHdpdGggaXRzIGZpcnN0IHN0YWdlOyByZXR1cm5zIGEgZmx1ZW50IGJ1aWxkZXIuXG4gKlxuICogQ2hhaW4gYC5hZGRGdW5jdGlvbigpYCAvIGAuYWRkRGVjaWRlckZ1bmN0aW9uKClgIC8gYC5hZGRTZWxlY3RvckZ1bmN0aW9uKClgIC9cbiAqIGAuYWRkU3ViRmxvd0NoYXJ0KClgIGV0Yy4gdG8gYWRkIG1vcmUgc3RhZ2VzLCB0aGVuIGZpbmlzaCB3aXRoIGAuYnVpbGQoKWAuXG4gKlxuICogQHBhcmFtIG5hbWUgICAgSHVtYW4tcmVhZGFibGUgZGlzcGxheSBsYWJlbCBmb3IgdGhlIHN0YWdlIChzaG93biBpbiB0aGUgbmFycmF0aXZlL3RyYWNlKS5cbiAqIEBwYXJhbSBmbiAgICAgIFRoZSBzdGFnZSdzIHdvcmsg4oCUIGEgYChzY29wZSkgPT4g4oCmYCBmdW5jdGlvbiwgb3IgYSBgUGF1c2FibGVIYW5kbGVyYCBmb3IgaHVtYW4taW4tdGhlLWxvb3AgcGF1c2VzLlxuICogQHBhcmFtIGlkICAgICAgU3RhYmxlIHN0YWdlIGlkIHVzZWQgaW4gdHJhY2VzLCB0aGUgY29tbWl0IGxvZywgYW5kIGBydW50aW1lU3RhZ2VJZGAuIEtlZXAgaXQgdW5pcXVlIHdpdGhpbiB0aGUgY2hhcnQuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBgeyBkZXNjcmlwdGlvbj8sIHN0cnVjdHVyZVJlY29yZGVycz8gfWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0PFN0YXRlPignRmV0Y2hVc2VyJywgYXN5bmMgKHNjb3BlKSA9PiB7XG4gKiAgIHNjb3BlLnVzZXIgPSBhd2FpdCBnZXRVc2VyKCk7XG4gKiB9LCAnZmV0Y2gtdXNlcicpXG4gKiAgIC5hZGRGdW5jdGlvbignUHJvY2VzcycsIHByb2Nlc3NGbiwgJ3Byb2Nlc3MnKVxuICogICAuYnVpbGQoKTtcbiAqXG4gKiBjb25zdCB0cmFjZSA9IG5hcnJhdGl2ZSgpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hhcnQucmVjb3JkZXIodHJhY2UpLnJ1bigpO1xuICogY29uc29sZS5sb2codHJhY2UuZ2V0RW50cmllcygpLm1hcCgoZSkgPT4gZS50ZXh0KS5qb2luKCdcXG4nKSk7XG4gKi9cbi8vIE92ZXJsb2FkIDE6IHR5cGVkIHN0YXRlIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRTdGF0ZSBleHRlbmRzIG9iamVjdD4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFR5cGVkU3RhZ2VGdW5jdGlvbjxUU3RhdGU+IHwgUGF1c2FibGVIYW5kbGVyPFR5cGVkU2NvcGU8VFN0YXRlPj4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxhbnksIFR5cGVkU2NvcGU8VFN0YXRlPj47XG5cbi8vIE92ZXJsb2FkIDI6IGV4cGxpY2l0IGdlbmVyaWNzIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPjtcblxuLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIOKAlCBhY2NlcHRzIHRoZSBvcHRpb25zIGJhZyAob3IgdW5kZWZpbmVkKS5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgLy8gQXR0YWNoIFN0cnVjdHVyZVJlY29yZGVycyBCRUZPUkUgc3RhcnQoKSBzbyB0aGUgc2VlZCBldmVudCBmaXJlcyB0aHJvdWdoXG4gIC8vIHRoZSBub3JtYWwgZGlzcGF0Y2hlciBwYXRoIChubyByZXBsYXkgbmVlZGVkKS4gSXRlcmF0aW9uIG9yZGVyIG1hdGNoZXNcbiAgLy8gYXJyYXkgb3JkZXIsIG1hdGNoaW5nIHRoZSBmbHVlbnQgYC5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcigpYCBjaGFpblxuICAvLyBzZW1hbnRpY3MuXG4gIGlmIChvcHRpb25zPy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlYyBvZiBvcHRpb25zLnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgICAgYnVpbGRlci5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVpbGRlci5zdGFydChuYW1lLCBmbiBhcyBhbnksIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbiwge1xuICAgIC4uLihvcHRpb25zPy5yZXRyeSAmJiB7IHJldHJ5OiBvcHRpb25zLnJldHJ5IH0pLFxuICAgIC4uLihvcHRpb25zPy50YWdzICYmIHsgdGFnczogb3B0aW9ucy50YWdzIH0pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBMaWtlIGBmbG93Q2hhcnQoKWAsIGJ1dCB0aGUgUk9PVCBzdGFnZSBpcyBhIFNFTEVDVE9SIOKAlCBpdCBydW5zIGZpcnN0IGFuZFxuICogaXRzIGJyYW5jaGVzIGF0dGFjaCBkaXJlY3RseSB0byBpdCAobm8gc2VwYXJhdGUgc2VlZCBzdGFnZSkuIFJldHVybnMgYVxuICogYFNlbGVjdG9yRm5MaXN0YDsgZGVjbGFyZSBicmFuY2hlcyB0aGVuIGNhbGwgYC5lbmQoKWAgdG8gZ2V0IHRoZSBidWlsZGVyXG4gKiBiYWNrIGZvciBhbnkgc3Vic2VxdWVudCBzdGFnZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgZmxvd0NoYXJ0U2VsZWN0b3I8TXlTdGF0ZT4oJ0NvbnRleHQnLCBjb250ZXh0U2VsZWN0b3JGbiwgJ2NvbnRleHQnKVxuICogICAgIC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goJ3NmLXN5c3RlbS1wcm9tcHQnLCBzeXNTbG90LCAnU3lzdGVtIFByb21wdCcsIHsuLi59KVxuICogICAgIC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goJ3NmLW1lc3NhZ2VzJywgbXNnU2xvdCwgJ01lc3NhZ2VzJywgey4uLn0pXG4gKiAgICAgLmVuZCgpXG4gKiAgICAgLmFkZEZ1bmN0aW9uKCdtZXNzYWdlQVBJJywgYXNzZW1ibGVGbiwgJ21lc3NhZ2UtYXBpJylcbiAqICAgICAuYnVpbGQoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydFNlbGVjdG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248YW55LCBUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBidWlsZGVyID0gbmV3IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPigpO1xuICBpZiAob3B0aW9ucz8uc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgZm9yIChjb25zdCByZWMgb2Ygb3B0aW9ucy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICAgIGJ1aWxkZXIuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1aWxkZXIuc3RhcnRTZWxlY3RvcihuYW1lLCBmbiwgaWQsIG9wdGlvbnM/LmRlc2NyaXB0aW9uLCB7XG4gICAgLi4uKG9wdGlvbnM/LmZhaWxGYXN0ICE9PSB1bmRlZmluZWQgJiYgeyBmYWlsRmFzdDogb3B0aW9ucy5mYWlsRmFzdCB9KSxcbiAgICAuLi4ob3B0aW9ucz8ucmV0cnkgJiYgeyByZXRyeTogb3B0aW9ucy5yZXRyeSB9KSxcbiAgICAuLi4ob3B0aW9ucz8udGFncyAmJiB7IHRhZ3M6IG9wdGlvbnMudGFncyB9KSxcbiAgfSk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU3BlYyB0byBTdGFnZU5vZGUgQ29udmVydGVyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGZ1bmN0aW9uIHNwZWNUb1N0YWdlTm9kZShzcGVjOiBGbG93Q2hhcnRTcGVjKTogU3RhZ2VOb2RlPGFueSwgYW55PiB7XG4gIGNvbnN0IGluZmxhdGUgPSAoczogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4gPT4gKHtcbiAgICBuYW1lOiBzLm5hbWUsXG4gICAgaWQ6IHMuaWQsXG4gICAgY2hpbGRyZW46IHMuY2hpbGRyZW4/Lmxlbmd0aCA/IHMuY2hpbGRyZW4ubWFwKGluZmxhdGUpIDogdW5kZWZpbmVkLFxuICAgIG5leHQ6IHMubmV4dCA/IGluZmxhdGUocy5uZXh0KSA6IHVuZGVmaW5lZCxcbiAgfSk7XG4gIHJldHVybiBpbmZsYXRlKHNwZWMpO1xufVxuIl19
2102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFFLE9BQU8sRUFBMEIsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUEyQix1QkFBdUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBZ0J2RixnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBUyxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsSUFBeUIsRUFDekIsSUFBaUMsRUFDakMsS0FBOEIsRUFDOUIsS0FBYTtJQUViLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTztJQUNuQixJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsUUFB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Q0FBQyxDQUFDLFNBQVM7UUFDbEUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0QnVpbGRlciDigJQgRmx1ZW50IEFQSSBmb3IgY29uc3RydWN0aW5nIGZsb3djaGFydCBleGVjdXRpb24gZ3JhcGhzLlxuICpcbiAqIEJ1aWxkcyBTdGFnZU5vZGUgdHJlZXMgYW5kIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSAoSlNPTikgaW4gdGFuZGVtLlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUg4oCUIG9ubHkgaW1wb3J0cyBmcm9tIGxvY2FsIHR5cGVzLlxuICpcbiAqIFRoZSBidWlsZGVyIGNyZWF0ZXMgdHdvIHBhcmFsbGVsIHN0cnVjdHVyZXM6XG4gKiAxLiBTdGFnZU5vZGUgdHJlZSDigJQgcnVudGltZSBncmFwaCB3aXRoIGVtYmVkZGVkIGZ1bmN0aW9uc1xuICogMi4gU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIOKAlCBKU09OLXNhZmUgc3RydWN0dXJlIGZvciB2aXN1YWxpemF0aW9uXG4gKlxuICogVGhlIGV4ZWN1dGUoKSBjb252ZW5pZW5jZSBtZXRob2QgaXMgaW50ZW50aW9uYWxseSBvbWl0dGVkIOKAlFxuICogaXQgYmVsb25ncyBpbiB0aGUgcnVubmVyIGxheWVyIChQaGFzZSA1KS5cbiAqL1xuXG5pbXBvcnQgeyBqb2luUGF0aCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgcHJlZml4Tm9kZVRyZWUgfSBmcm9tICcuLi9lbmdpbmUvZ3JhcGgvcHJlZml4Tm9kZVRyZWUuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbGxlbEZvckVhY2hDb25maWcsIFJldHJ5UG9saWN5LCBTY29wZUZhY3RvcnkgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgQlJBTkNIX1NFR01FTlRfTUFSS0VSLCBoYXNCcmFuY2hTZWdtZW50TWFya2VyIH0gZnJvbSAnLi4vaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBJZFBvc2l0aW9uLCByZWZ1c2VSZXNlcnZlZElkIH0gZnJvbSAnLi4vaWRzL3Jlc2VydmVkSWRzLmpzJztcbmltcG9ydCB0eXBlIHsgUGF1c2FibGVIYW5kbGVyIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBUeXBlZFNjb3BlIH0gZnJvbSAnLi4vcmVhY3RpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBSdW5uYWJsZUZsb3dDaGFydCwgbWFrZVJ1bm5hYmxlIH0gZnJvbSAnLi4vcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVFZGdlS2luZCwgU3RydWN0dXJlUmVjb3JkZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBUeXBlZFN0YWdlRnVuY3Rpb24sIGNyZWF0ZVR5cGVkU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi90eXBlZEZsb3dDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dDaGFydCxcbiAgRmxvd0NoYXJ0T3B0aW9ucyxcbiAgRmxvd0NoYXJ0U3BlYyxcbiAgSUxvZ2dlcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyLFxuICBTdHJlYW1Ub2tlbkhhbmRsZXIsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEludGVybmFsIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBmYWlsID0gKG1zZzogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke21zZ31gKTtcbn07XG5cbi8qKlxuICogQXR0YWNoIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5IHRvIGEgc3RhZ2Ugbm9kZSArIGl0cyBzcGVjIG5vZGUuXG4gKlxuICogVGhlIE9ORSBwbGFjZSBhIHBvbGljeSBsYW5kcyBvbiBhIG5vZGUsIHNoYXJlZCBieSB0aGUgYC5yZXRyeSgpYCBjdXJzb3JcbiAqIG1vZGlmaWVyIGFuZCBieSBldmVyeSBgb3B0aW9ucy5yZXRyeWAgZGVjbGFyYXRpb24gc2l0ZSwgc28gdmFsaWRhdGlvbiBhbmQgdGhlXG4gKiBzcGVjJ3MgYHJldHJ5QXR0ZW1wdHNgIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIGBhdHRlbXB0c2AgaXMgdmFsaWRhdGVkIGF0IEJVSUxEIHRpbWUgcmF0aGVyIHRoYW4gZGVmZW5kZWQgYXQgcnVudGltZTogYVxuICogdHlwbydkIGBhdHRlbXB0czogMGAgc2hvdWxkIGZhaWwgd2hpbGUgeW91IGFyZSB3cml0aW5nIHRoZSBjaGFydCwgbm90XG4gKiBzaWxlbnRseSB0dXJuIGEgc3RhZ2UgaW50byBhIG5vLW9wIHJ1biB0aHJlZSBtb250aHMgbGF0ZXIuIGBhdHRlbXB0czogMWAgaXNcbiAqIGFjY2VwdGVkIG9uIHB1cnBvc2Ug4oCUIGl0IG1lYW5zIFwicG9saWN5IGRlY2xhcmVkLCBjdXJyZW50bHkgb2ZmXCIsIHNvIGEgcG9saWN5XG4gKiBjYW4gYmUgZGlhbGxlZCBkb3duIHdpdGhvdXQgZGVsZXRpbmcgdGhlIGRlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBhcHBseVJldHJ5UG9saWN5KFxuICBub2RlOiBTdGFnZU5vZGU8YW55LCBhbnk+LFxuICBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHJldHJ5OiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoIXJldHJ5KSByZXR1cm47XG4gIGlmICh0eXBlb2YgcmV0cnkuYXR0ZW1wdHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJldHJ5LmF0dGVtcHRzKSB8fCByZXRyeS5hdHRlbXB0cyA8IDEpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiByZXRyeS5hdHRlbXB0cyBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyID49IDEgKGdvdCAke1N0cmluZyhyZXRyeS5hdHRlbXB0cyl9KS4gYCArXG4gICAgICAgICdJdCBjb3VudHMgVE9UQUwgcnVucyBpbmNsdWRpbmcgdGhlIGZpcnN0LCBzbyBgYXR0ZW1wdHM6IDNgIG1lYW5zIG9uZSBydW4gcGx1cyB1cCB0byB0d28gcmV0cmllczsgJyArXG4gICAgICAgICdgYXR0ZW1wdHM6IDFgIG1lYW5zIHRoZSBwb2xpY3kgaXMgZGVjbGFyZWQgYnV0IGN1cnJlbnRseSBvZmYuJyxcbiAgICApO1xuICB9XG4gIG5vZGUucmV0cnkgPSByZXRyeTtcbiAgc3BlYy5yZXRyeUF0dGVtcHRzID0gcmV0cnkuYXR0ZW1wdHM7XG59XG5cbi8qKlxuICogQXR0YWNoIGRlY2xhcmVkIHRhZ3MgdG8gYSBzdGFnZSBub2RlICsgaXRzIHNwZWMgbm9kZS5cbiAqXG4gKiBUaGUgT05FIHBsYWNlIHRhZ3MgbGFuZCBvbiBhIG5vZGUg4oCUIHRoZSB0d2luIG9mIHtAbGluayBhcHBseVJldHJ5UG9saWN5fSDigJRcbiAqIHNoYXJlZCBieSB0aGUgYC50YWcoKWAgY3Vyc29yIG1vZGlmaWVyIGFuZCBldmVyeSBgb3B0aW9ucy50YWdzYCBkZWNsYXJhdGlvblxuICogc2l0ZSwgc28gdGhlIHJlZnVzYWxzIGFuZCB0aGUgc3BlYydzIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lLCBuZXZlciBhIHZhbHVlLCBzbyBldmVyeSByZWZ1c2FsIGlzXG4gKiBhYm91dCB0aGUgbmFtZSdzIHNoYXBlOiBhbiBlbXB0eSBzdHJpbmcgbmFtZXMgbm90aGluZzsgYSBub24tc3RyaW5nIGlzIGFcbiAqIHZhbHVlLCBhbmQgYSB2YWx1ZSBvbiBhIHN0YWdlIHdvdWxkIHJpZGUgdGhlIGNvbW1pdCBsb2cgcGFzdCBldmVyeVxuICogcmVkYWN0aW9uIHBvaW50OyB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIGlzIHRoZSBydW50aW1lU3RhZ2VJZCBncmFtbWFyJ3NcbiAqIG9uZSByZXNlcnZlZCBieXRlLCBhbmQgYSBjb25zdW1lciB0aGF0IHB1dHMgYSB0YWcgaW50byBhIHBhdGggKGEgVVJMLCBhXG4gKiBzdG9yZSBrZXkpIHdvdWxkIGluaGVyaXQgZXhhY3RseSB0aGUgYW1iaWd1aXR5IHRoZSByZXNlcnZhdGlvbiBleGlzdHMgdG9cbiAqIHByZXZlbnQ7IGEgbmFtZSBkZWNsYXJlZCB0d2ljZSBpcyB0aGUgdHlwbyBpdCB1c3VhbGx5IGlzLiBSZWZ1c2VkIGF0IEJVSUxEXG4gKiB0aW1lLCBsaWtlIGByZXRyeS5hdHRlbXB0c2AsIHNvIHRoZSBtaXN0YWtlIGZhaWxzIHdoaWxlIHRoZSBjaGFydCBpcyBiZWluZ1xuICogd3JpdHRlbi4gQW4gRU1QVFkgbGlzdCBsYW5kcyBub3RoaW5nOiBcImFic2VudCB3aGVuIGVtcHR5XCIgaXMgdGhlIGxhdyB0aGVcbiAqIGNvbW1pdCBidW5kbGUga2VlcHMsIGFuZCB0aGUgc3BlYyBrZWVwcyBpdCB0b28uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGFncyhcbiAgbm9kZTogU3RhZ2VOb2RlPGFueSwgYW55PixcbiAgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAodGFncyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSkgZmFpbChgJHt3aGVyZX06IHRhZ3MgbXVzdCBiZSBhbiBhcnJheSBvZiBuYW1lcyAoZ290ICR7dHlwZW9mIHRhZ3N9KWApO1xuICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgJHt3aGVyZX06IGEgdGFnIG11c3QgYmUgYSBzdHJpbmcgbmFtZSAoZ290ICR7dGFnID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHRhZ30pLiBBIHRhZyBpcyBhIE5BTUUgYCArXG4gICAgICAgICAgJ2RlY2xhcmVkIGF0IGJ1aWxkIHRpbWUg4oCUIGEgdmFsdWUgYmVsb25ncyBpbiBzdGF0ZSBvciBpbiAkZW1pdCwgbmV2ZXIgb24gdGhlIHN0YWdlLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGFnLnRyaW0oKS5sZW5ndGggPT09IDApIGZhaWwoYCR7d2hlcmV9OiBhIHRhZyBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nYCk7XG4gICAgaWYgKGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIodGFnKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgY29udGFpbnMgdGhlIHJlc2VydmVkIGNoYXJhY3RlciAnJHtCUkFOQ0hfU0VHTUVOVF9NQVJLRVJ9Jy4gYCArXG4gICAgICAgICAgYCcke0JSQU5DSF9TRUdNRU5UX01BUktFUn0nIGlzIHJlc2VydmVkIGZvciB0aGUgc3ViZmxvdyBwYXRoIHNlZ21lbnRzIGFkZFBhcmFsbGVsRm9yRWFjaCgpIGdlbmVyYXRlcywgYCArXG4gICAgICAgICAgJ2FuZCBhIHRhZyB0aGF0IGEgY29uc3VtZXIgcHV0cyBpbnRvIGEgcGF0aCBvciBhIGtleSB3b3VsZCBpbmhlcml0IHRoYXQgYW1iaWd1aXR5LiBSZW5hbWUgdGhlIHRhZyAnICtcbiAgICAgICAgICAnKGEgZGFzaCBvciBhIGNvbG9uIHJlYWRzIHRoZSBzYW1lKS4gU2VlIGRvY3MvZGVzaWduLzIwMjYtMDktZGVjbGFyZWQtdGFncy5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKHRhZykpIGZhaWwoYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgaXMgZGVjbGFyZWQgdHdpY2VgKTtcbiAgICBzZWVuLmFkZCh0YWcpO1xuICB9XG4gIGlmIChub2RlLnRhZ3MpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiB0YWdzIGFscmVhZHkgZGVjbGFyZWQgYXQgJyR7bm9kZS5uYW1lfScgKCR7bm9kZS50YWdzLmpvaW4oJywgJyl9KSDigJQgZGVjbGFyZSBldmVyeSB0YWcgZm9yIGEgYCArXG4gICAgICAgICdzdGFnZSBpbiBPTkUgcGxhY2UsIHNvIHRoZSBNYXAgYWR2ZXJ0aXNlcyB0aGUgd2hvbGUgdm9jYWJ1bGFyeSBmcm9tIGEgc2luZ2xlIHNpdGUuJyxcbiAgICApO1xuICB9XG4gIC8vIFRoZSBub2RlJ3MgY29weSBpcyBmcm96ZW46IGNvbW1pdCBidW5kbGVzIHNoYXJlIGl0IGJ5IHJlZmVyZW5jZSBhbmQgdGhlXG4gIC8vIGxpYnJhcnkncyByZWFkcyBhcmUgYm9ycm93ZWQsIG5ldmVyIG11dGF0ZWQuIFRoZSBzcGVjJ3MgY29weSBpcyBpdHMgb3duXG4gIC8vIHBsYWluIGFycmF5LCBKU09OLXNhZmUgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3BlYy5cbiAgbm9kZS50YWdzID0gT2JqZWN0LmZyZWV6ZShbLi4udGFnc10pO1xuICBzcGVjLnRhZ3MgPSBbLi4udGFnc107XG59XG5cbi8qKlxuICogVGhlIGJ1aWxkZXIncyBPTkUgaWQgcmVmdXNhbCAoRjcsIFI1KTogZXZlcnkgaWQgZG9vciBjYWxscyBpdCBvbmNlLCBiZWZvcmVcbiAqIHRoZSBpZCBsYW5kcyBhbnl3aGVyZS4gVGhlIHJ1bGUgbGl2ZXMgYmVzaWRlIHRoZSBncmFtbWFyIOKAlFxuICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYDogYCNgIGFuZCBgL2AgYXJlIHJlZnVzZWQgaW5cbiAqIGV2ZXJ5IGlkICh0aGV5IGFyZSB0aGUgcnVudGltZVN0YWdlSWQgZ3JhbW1hcidzIGRlbGltaXRlcnMpLCBgfmAgaW4gYVxuICogYCdzZWdtZW50J2AgaWQgKGEgc3ViZmxvdyBpZCBvciBhIGBwYXJhbGxlbEZvckVhY2hgIGlkIOKAlCBzZWUgYmVsb3cpLlxuICpcbiAqIERvb3JzIChvbmUgY2FsbCBlYWNoKTogYHN0YXJ0YCwgYHN0YXJ0U2VsZWN0b3JgLCBgYWRkRnVuY3Rpb25gLFxuICogYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCwgYGFkZFBhdXNhYmxlRnVuY3Rpb25gLCBgYWRkRGVjaWRlckZ1bmN0aW9uYCxcbiAqIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCwgYGFkZExpc3RPZkZ1bmN0aW9uYCAoZWFjaCBjaGlsZCksIGBhZGRQYXJhbGxlbEZvckVhY2hgLFxuICogZXZlcnkgc3ViZmxvdyBtb3VudCAoYGFzc2VydFN1YmZsb3dJZEFsbG93ZWRgKSBhbmQgZXZlcnkgZGVjaWRlci9zZWxlY3RvclxuICogYnJhbmNoIChgQnJhbmNoQ3Vyc29yIMK3IGFkbWl0YCkuIGBhZGREZXRhY2hBbmRGb3JnZXRgIC9cbiAqIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBgYWRkQnJhbmNoTGlzdGAgZGVsZWdhdGUgdG8gb25lIG9mIHRoZXNlLlxuICogTmV2ZXIgY2FsbGVkIGJ5IHRoZSBwcmVmaXhlciBvciBhIHN0b3JlIOKAlCB0aG9zZSBob2xkIGlkcyB0aGF0IGNhcnJ5IHRoZVxuICogZGVsaW1pdGVycyBvbiBwdXJwb3NlLlxuICovXG5jb25zdCBhZG1pdElkID0gKHdoYXQ6IHN0cmluZywgaWQ6IHN0cmluZywgcG9zaXRpb246IElkUG9zaXRpb24pOiB2b2lkID0+IHtcbiAgY29uc3QgcmVmdXNhbCA9IHJlZnVzZVJlc2VydmVkSWQod2hhdCwgaWQsIHBvc2l0aW9uKTtcbiAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkgZmFpbChyZWZ1c2FsKTtcbn07XG5cbi8qKlxuICogUmVmdXNlIHRoZSByZXNlcnZlZCBjaGFyYWN0ZXJzIGluIGEgdXNlci1hdXRob3JlZCBTVUJGTE9XIGlkLlxuICpcbiAqIEEgc3ViZmxvdyBpZCBJUyBhIHBhdGggc2VnbWVudCBpbiBgcnVudGltZVN0YWdlSWRgLCB3aGljaCBpcyB0aGUgc2FtZVxuICogcG9zaXRpb24gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZ2VuZXJhdGVzIGl0cyBicmFuY2ggc2VnbWVudHMgaW50by4gQVxuICogaGFuZC1hdXRob3JlZCBpZCBjYXJyeWluZyB0aGUgbWFya2VyIGNvdWxkIHRoZXJlZm9yZSBjb2xsaWRlIHdpdGggYVxuICogZ2VuZXJhdGVkIGJyYW5jaCDigJQgYW5kLCBiZWNhdXNlIHRoaXMgY29kZWJhc2UgZGVsaWJlcmF0ZWx5IHRvbGVyYXRlc1xuICogaWQtY29sbGlzaW9uIGNsYXNzZXMgKGxvb3AtcmVmIHN0dWJzKSwgc3VjaCBhIGNvbGxpc2lvbiB3b3VsZCBub3QgY3Jhc2guIEl0XG4gKiB3b3VsZCBzaWxlbnRseSBtaXMtYXR0cmlidXRlIGEgdHJhY2UsIHdoaWNoIGlzIHdvcnNlLiBTbyB0aGUgbWFya2VyIGlzXG4gKiByZWZ1c2VkIGF0IEJVSUxEIHRpbWUsIG9uIE5FVyBjaGFydHMgb25seTogYSBjaGFydCB0aGF0IHdhcyBsZWdhbCBiZWZvcmVcbiAqIDkuMTQuMCBhbmQgZG9lcyBub3QgdXNlIHRoZSBtYXJrZXIgYmVoYXZlcyBieXRlLWlkZW50aWNhbGx5LlxuICpcbiAqIENhbGxlZCBhdCBldmVyeSB1c2VyLWF1dGhvcmVkIHN1YmZsb3ctaWQgZW50cnkgcG9pbnQuIFN0YWdlIGlkcyBlbHNld2hlcmVcbiAqIGtlZXAgYH5gICh0aGV5IG9jY3VweSB0aGUgYHN0YWdlSWRgIHBvc2l0aW9uLCBuZXZlciB0aGUgYHN1YmZsb3dQYXRoYFxuICogcG9zaXRpb24sIHNvIHRoZXkgY2Fubm90IGNvbGxpZGUgd2l0aCBhIHNlZ21lbnQpIGJ1dCwgc2luY2UgOS4zNy4wLCBub3QgYCNgXG4gKiBvciBgL2Ag4oCUIHNlZSBgYWRtaXRJZGAuIChgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIG93biBpZCBpcyB0aGUgb25lIG90aGVyXG4gKiBgJ3NlZ21lbnQnYCBpZCwgcmVmdXNlZCBhdCB0aGF0IG1ldGhvZC4pIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gKi9cbmNvbnN0IGFzc2VydFN1YmZsb3dJZEFsbG93ZWQgPSAoaWQ6IHN0cmluZyk6IHZvaWQgPT4gYWRtaXRJZCgnc3ViZmxvdyBpZCcsIGlkLCAnc2VnbWVudCcpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJyYW5jaEN1cnNvciDigJQgd2hhdCBEZWNpZGVyTGlzdCBhbmQgU2VsZWN0b3JGbkxpc3Qgc2hhcmUgKEY3KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBXaGljaCBkaXNwYXRjaGVyIGEge0BsaW5rIEJyYW5jaEN1cnNvcn0gYWRkcyBicmFuY2hlcyB1bmRlci4gKi9cbnR5cGUgQnJhbmNoS2luZCA9ICdkZWNpZGVyJyB8ICdzZWxlY3Rvcic7XG5cbi8qKlxuICogVGhlIGJyYW5jaC1hZGRpbmcgbWVjaGFuaWNzIG9mIGEgZGVjaWRlciBvciBhIHNlbGVjdG9yIOKAlCBPTkUgaW1wbGVtZW50YXRpb24sXG4gKiBjb21wb3NlZCBieSB7QGxpbmsgRGVjaWRlckxpc3R9IGFuZCB7QGxpbmsgU2VsZWN0b3JGbkxpc3R9ICh1bnRpbCA5LjM2LjAgZWFjaFxuICogbGlzdCBjYXJyaWVkIGl0cyBvd24gY29weSBvZiBhbGwgZm91ciBicmFuY2gga2luZHMgYW5kIGBlbmQoKWApLlxuICpcbiAqIE93bnM6IHRoZSBicmFuY2gtaWQgbGVkZ2VyIChkdXBsaWNhdGUgKyByZXNlcnZlZC1jaGFyYWN0ZXIgcmVmdXNhbCBpbiBvbmVcbiAqIGBhZG1pdGApLCB0aGUgbm9kZS9zcGVjIHBhaXIgZWFjaCBicmFuY2gga2luZCBidWlsZHMsIHRoZSBzdHJ1Y3R1cmUgZXZlbnRzLFxuICogYW5kIHRoZSBjbG9zaW5nIGBmaW5pc2hgLiBUaGUgbGlzdHMga2VlcCBvbmx5IHdoYXQgZGlmZmVyczogYSBkZWNpZGVyJ3NcbiAqIGB7IGxvb3BUbyB9YCAvIGBsb29wVG8oKWAgLyBgc2V0RGVmYXVsdGAsIGFuZCB0aGUgdHlwZSBlYWNoIG1ldGhvZCByZXR1cm5zLlxuICovXG5jbGFzcyBCcmFuY2hDdXJzb3I8VE91dCwgVFNjb3BlPiB7XG4gIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaERlc2NJbmZvOiBBcnJheTx7IGlkOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBraW5kOiBCcmFuY2hLaW5kLFxuICAgIHJlYWRvbmx5IGI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2VydmVkU3RlcE51bWJlcjogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge31cblxuICAvKiogVGhlIG9uZSBicmFuY2gtaWQgZG9vcjogZHVwbGljYXRlIHJlZnVzYWwsIHRoZW4gdGhlIHJlc2VydmVkIGNoYXJhY3RlcnMgKFI1KS4gKi9cbiAgcHJpdmF0ZSBhZG1pdChpZDogc3RyaW5nLCBwb3NpdGlvbjogSWRQb3NpdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgJHt0aGlzLmtpbmR9IGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBpZiAocG9zaXRpb24gPT09ICdzZWdtZW50JykgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG4gICAgZWxzZSBhZG1pdElkKCdicmFuY2ggaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIC8qKiBBcHBlbmQgdGhlIGJyYW5jaCdzIG5vZGUgKyBzcGVjIGFuZCBmaXJlIGl0cyBzdGFnZSBhbmQgZGVjaXNpb24tYnJhbmNoIGVkZ2UuICovXG4gIHByaXZhdGUgYXR0YWNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIGJyYW5jaDogc3RhZ2UgKyBkZWNpc2lvbi1icmFuY2ggZWRnZSBrZXllZCBieSBpZC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICB9XG5cbiAgZnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQsXG4gICk6IHsgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB9IHtcbiAgICB0aGlzLmFkbWl0KGlkLCAnc3RhZ2UnKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgYnJhbmNoSWQ6IGlkIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgfVxuICAgIHRoaXMuYi5fcmVnaXN0ZXJTdGFnZShpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgcmV0dXJuIHsgbm9kZSwgc3BlYyB9O1xuICB9XG5cbiAgcGF1c2FibGVCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkLFxuICApOiB7IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+OyBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfSB7XG4gICAgdGhpcy5hZG1pdChpZCwgJ3N0YWdlJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuYi5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJywgaXNQYXVzYWJsZTogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmF0dGFjaChub2RlLCBzcGVjLCBpZCk7XG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB7IG5vZGUsIHNwZWMgfTtcbiAgfVxuXG4gIHN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICB0aGlzLmIuX21vdW50U3ViZmxvdyhpZCwgc3ViZmxvdywgKCkgPT4gdGhpcy5wbGFjZVN1YmZsb3dCcmFuY2goaWQsIHN1YmZsb3csIHN1YmZsb3dOYW1lLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKiogVGhlIGJyYW5jaCBtb3VudCdzIG93biBub2RlICsgc3BlYywgcGxhY2VkIHVuZGVyIHRoZSBkZWNpZGVyL3NlbGVjdG9yIChzZWUgYF9tb3VudFN1YmZsb3dgKS4gKi9cbiAgcHJpdmF0ZSBwbGFjZVN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU3ViZmxvd01vdW50T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICAvLyBTVFJVQ1RVUkUtT05MWSBjb252ZXJnZW5jZSBvdmVycmlkZSAoc2VlIGBfZmlyZU5leHRFZGdlRnJvbVBhcmVudGAgK1xuICAgIC8vIGBTdWJmbG93TW91bnRPcHRpb25zLmNvbnZlcmdlQXRgKTogdGhpcyBicmFuY2gncyBjb252ZXJnZW5jZSBlZGdlIHBvaW50cyBhdFxuICAgIC8vIGBjb252ZXJnZUF0YCAoYSBET1dOU1RSRUFNIHN0YWdlKSBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgbmV4dCBzdGFnZSDigJQgZS5nLiBhXG4gICAgLy8gYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgYG1lc3NhZ2VBUElgIHRvIHBhaXIgd2l0aCBpdHMgb3V0cHV0IGF0XG4gICAgLy8gYGNhbGwtbGxtYC4gVmlzdWFsaXphdGlvbi1vbmx5OiBOTyBydW50aW1lIGpvaW4gYmFycmllciAoZGF0YSByaWRlcyBzY29wZSkuXG4gICAgLy8gQ2FycmllZCBvbiB0aGUgc3BlYyBzbyB0aGUgZWRnZS1maXJpbmcgY2hva2Vwb2ludCBjYW4gcmVhZCBpdC5cbiAgICBpZiAob3B0aW9ucz8uY29udmVyZ2VBdCkgc3BlYy5jb252ZXJnZUF0ID0gb3B0aW9ucy5jb252ZXJnZUF0O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gIH1cblxuICBsYXp5U3ViZmxvd0JyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG4gICAgdGhpcy5iLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIC8vIFN0b3JlIHJlc29sdmVyIG9uIHRoZSBub2RlIOKAlCBOTyBlYWdlciB0cmVlIGNsb25pbmdcbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIFNwZWMgc3R1YiDigJQgbm8gc3ViZmxvd1N0cnVjdHVyZSAobGF6eSkuIFRoZSBsYXp5IHN1YmZsb3cnc1xuICAgIC8vIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdCByZXNvbHV0aW9uIHRpbWUuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBkaXNwYXRjaGVyOiB2YWxpZGF0ZSB0aGUgYnJhbmNoZXMsIGZsYWcgdGhlIG5vZGUsIGRlc2NyaWJlIGl0LFxuICAgKiBhbmQgZmlyZSBgb25EZWNpZGVyQ29tcGxldGVgLiBBIGRlY2lkZXIgcGFzc2VzIGl0cyBgc2V0RGVmYXVsdGAgaWQgKHRoZVxuICAgKiBzeW50aGV0aWMgYCdkZWZhdWx0J2AgY2xvbmUgaXMgYXBwZW5kZWQgQUZURVIgYGJyYW5jaElkc2AgaXMgdGFrZW4sIHNvIG9ubHlcbiAgICogdXNlci1zcGVjaWZpZWQgYnJhbmNoZXMgYXJlIGxpc3RlZCk7IGEgc2VsZWN0b3IgaGFzIG5vIGRlZmF1bHQuXG4gICAqL1xuICBmaW5pc2goZGVmYXVsdElkPzogc3RyaW5nKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBraW5kID0gdGhpcy5raW5kO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke2tpbmR9IGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZXZlcnkgYnJhbmNoIHdpdGggbm8gZW1iZWRkZWQgZm4gaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBzdGFnZU1hcFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuZm4gJiYgY2hpbGQuaWQgJiYgIWNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgIWNoaWxkLnN1YmZsb3dSZXNvbHZlcikge1xuICAgICAgICBjb25zdCBoYXNJbk1hcCA9IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQuaWQpIHx8IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQubmFtZSk7XG4gICAgICAgIGlmICghaGFzSW5NYXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdICR7a2luZH0gYnJhbmNoICcke2NoaWxkLmlkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyBoYXMgbm8gZnVuY3Rpb24g4oCUIGAgK1xuICAgICAgICAgICAgICBgcHJvdmlkZSBhIGZuIGFyZ3VtZW50IHRvIGFkZEZ1bmN0aW9uQnJhbmNoKCcke2NoaWxkLmlkfScsIC4uLilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2luZCA9PT0gJ2RlY2lkZXInKSB0aGlzLmN1ck5vZGUuZGVjaWRlckZuID0gdHJ1ZTtcbiAgICBlbHNlIHRoaXMuY3VyTm9kZS5zZWxlY3RvckZuID0gdHJ1ZTtcblxuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSBraW5kO1xuICAgIGlmIChraW5kID09PSAnc2VsZWN0b3InKSB0aGlzLmN1clNwZWMuaGFzU2VsZWN0b3IgPSB0cnVlO1xuXG4gICAgaWYgKGRlZmF1bHRJZCkge1xuICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZCA9PT0gZGVmYXVsdElkKTtcbiAgICAgIGlmIChkZWZhdWx0Q2hpbGQpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh7IC4uLmRlZmF1bHRDaGlsZCwgaWQ6ICdkZWZhdWx0JywgYnJhbmNoSWQ6ICdkZWZhdWx0JyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPiAwKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuY3VyTm9kZS5uYW1lO1xuICAgICAgY29uc3QgYnJhbmNoSWRMaXN0ID0gdGhpcy5icmFuY2hEZXNjSW5mby5tYXAoKGIpID0+IGIuaWQpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtYWluTGluZSA9XG4gICAgICAgIGtpbmQgPT09ICdkZWNpZGVyJ1xuICAgICAgICAgID8gdGhpcy5kZXNjcmlwdGlvblxuICAgICAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCAke3RoaXMuZGVzY3JpcHRpb259IChicmFuY2hlczogJHticmFuY2hJZExpc3R9KWBcbiAgICAgICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gXG4gICAgICAgICAgOiB0aGlzLmRlc2NyaXB0aW9uXG4gICAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCAke3RoaXMuZGVzY3JpcHRpb259YFxuICAgICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgU2VsZWN0cyBmcm9tOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHRoaXMuYnJhbmNoRGVzY0luZm8pIHtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiAke2JyYW5jaC5pZH06ICR7YnJhbmNoLmRlc2NyaXB0aW9ufWApO1xuICAgICAgICBpZiAoYnJhbmNoLmRlc2NyaXB0aW9uKSB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldChicmFuY2guaWQsIGJyYW5jaC5kZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgZmlyZSBgb25EZWNpZGVyQ29tcGxldGVgIHNvIGNvbnN1bWVycyBjYW4gdHJ1c3Qgbm8gbW9yZVxuICAgIC8vIGJyYW5jaGVzIHdpbGwgYXJyaXZlLiBCcmFuY2ggaXRlcmF0aW9uIG9yZGVyID0gYWRkaXRpb24gb3JkZXIgPSBTZXRcbiAgICAvLyBpbnNlcnRpb24gb3JkZXIuIFNlbGVjdG9ycyBoYXZlIG5vIGRlZmF1bHQgYnJhbmNoLlxuICAgIGlmIChraW5kID09PSAnZGVjaWRlcicpIHtcbiAgICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ2RlY2lkZXInLCBbLi4udGhpcy5icmFuY2hJZHNdLCBkZWZhdWx0SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmIuX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsICdzZWxlY3RvcicsIFsuLi50aGlzLmJyYW5jaElkc10pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGVjaWRlckxpc3Rcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsdWVudCBoZWxwZXIgcmV0dXJuZWQgYnkgYWRkRGVjaWRlckZ1bmN0aW9uIHRvIGFkZCBicmFuY2hlcy5cbiAqIGBlbmQoKWAgc2V0cyBgZGVjaWRlckZuID0gdHJ1ZWAg4oCUIHRoZSBmbiBJUyB0aGUgZGVjaWRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2lkZXJMaXN0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnNvcjogQnJhbmNoQ3Vyc29yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgZGVmYXVsdElkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5jdXJzb3IgPSBuZXcgQnJhbmNoQ3Vyc29yKFxuICAgICAgJ2RlY2lkZXInLFxuICAgICAgYnVpbGRlcixcbiAgICAgIGN1ck5vZGUsXG4gICAgICBjdXJTcGVjLFxuICAgICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgcmVzZXJ2ZWRTdGVwTnVtYmVyLFxuICAgICAgZGVjaWRlckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgbG9vcFRvIH1gIGRlY2xhcmVzIHRoaXMgYnJhbmNoIGxvb3BzIGJhY2sgdG8gYW4gYWxyZWFkeS1kZWNsYXJlZFxuICAgICAqICBzdGFnZSDigJQgdGhlIGxvb3AgaXMgU09VUkNFRCBGUk9NIFRISVMgQlJBTkNIIChub3QgdGhlIGRlY2lkZXIpLlxuICAgICAqICBgeyByZXRyeSB9YCBnaXZlcyBUSElTIEJSQU5DSCdzIHN0YWdlIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5O1xuICAgICAqICBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdCAoc2VlIGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2ApLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IGxvb3BUbz86IHN0cmluZzsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHsgbm9kZSwgc3BlYyB9ID0gdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIGRlY2lkZXIgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIGNob3NlbiwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5XG4gICAqIChjb25kaXRpb25hbCBwYXVzZSkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuXG4gICAgICogIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nOyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyBub2RlLCBzcGVjIH0gPSB0aGlzLmN1cnNvci5wYXVzYWJsZUJyYW5jaChpZCwgbmFtZSwgaGFuZGxlciwgZGVzY3JpcHRpb24sIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zPy5sb29wVG8pIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChub2RlLCBzcGVjLCBvcHRpb25zLmxvb3BUbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5kZWZhdWx0SWQgPSBpZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBsb29wLWJhY2sgZWRnZSB0byB0aGUgTEFTVC1hZGRlZCBicmFuY2gsIHNvIHRoZSBsb29wIGlzIHNvdXJjZWRcbiAgICogZnJvbSBUSEFUIGJyYW5jaCBub2RlIChlLmcuIGAndG9vbC1jYWxscycg4oaSIGxvb3BUbygnY29udGV4dCcpYCkgcmF0aGVyIHRoYW5cbiAgICogZnJvbSB0aGUgZGVjaWRlci4gVGhlIGNoYXJ0IHRoZW4gcmVhZHMgaG9uZXN0bHk6IHRoZSBkZWNpZGVyIHNwbGl0cyBpbnRvIGFcbiAgICogbG9vcGluZyBicmFuY2ggYFtUb29sQ2FsbHMg4oaSIGJhY2sgdG8gQ29udGV4dF1gIGFuZCBhIHRlcm1pbmF0aW5nIGJyYW5jaFxuICAgKiBgW0ZpbmFsIOKGkiBlbmRdYCwgaW5zdGVhZCBvZiBhIHNpbmdsZSBsb29wIGhhbmdpbmcgb2ZmIHRoZSBkZWNpZGVyLlxuICAgKlxuICAgKiBObyBlbmdpbmUgY2hhbmdlIGlzIG5lZWRlZDogdGhlIHJ1bnRpbWUgcnVucyB0aGUgY2hvc2VuIGJyYW5jaCBhbmQgdGhlblxuICAgKiBmb2xsb3dzIHRoYXQgYnJhbmNoIG5vZGUncyBPV04gYG5leHRgIOKAlCBhbmQgYSBgbmV4dGAgZmxhZ2dlZCBgaXNMb29wUmVmYFxuICAgKiByb3V0ZXMgYmFjayB0byB0aGUgdGFyZ2V0IGV4YWN0bHkgbGlrZSB0aGUgZGVjaWRlcidzIG93biBsb29wIGRvZXMuIFRoaXNcbiAgICogbWV0aG9kIGp1c3QgbGV0cyB0aGUgYnVpbGRlciBleHByZXNzIHdoYXQgdGhlIGVuZ2luZSBhbHJlYWR5IHN1cHBvcnRzLlxuICAgKlxuICAgKiBUYXJnZXRzIHRoZSBicmFuY2ggYWRkZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY2FsbCAoY2hhaW4gaXQgcmlnaHQgYWZ0ZXJcbiAgICogdGhlIGJyYW5jaCdzIGBhZGRGdW5jdGlvbkJyYW5jaGAvYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgL1xuICAgKiBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYCkuIE1pcnJvcnMgYEZsb3dDaGFydEJ1aWxkZXIubG9vcFRvYCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBXb3JrcyBvbiBhIFNVQkZMT1cgYnJhbmNoIHRvbzogdGhlIGJyYW5jaCBub2RlIGNhcnJpZXMgYm90aCBpdHMgc3ViZmxvd1xuICAgKiByZXNvbHZlciBBTkQgdGhlIGxvb3AtYmFjayBgbmV4dGAg4oCUIHRoZXkgY29leGlzdCBzYWZlbHkgKHRoZSBydW50aW1lIHJ1bnNcbiAgICogdGhlIHN1YmZsb3csIHRoZW4gZm9sbG93cyB0aGUgbG9vcCByZWYpLiBUaGUgdGFyZ2V0IG11c3QgYmUgYSBzdGFnZSBhbHJlYWR5XG4gICAqIGRlY2xhcmVkIEJFRk9SRSB0aGUgZGVjaWRlciAoZS5nLiBhbiB1cHN0cmVhbSBgY29udGV4dGApOyBicmFuY2ggaWRzIGFuZCB0aGVcbiAgICogc3ludGhldGljIGAnZGVmYXVsdCdgIGNsb25lIGFyZSBOT1QgdmFsaWQgbG9vcCB0YXJnZXRzLlxuICAgKi9cbiAgbG9vcFRvKHN0YWdlSWQ6IHN0cmluZyk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJzb3IuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBzcGVjQ2hpbGRyZW4gPSB0aGlzLmN1cnNvci5jdXJTcGVjLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8ICFzcGVjQ2hpbGRyZW4gfHwgc3BlY0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgY2FsbGVkIGJlZm9yZSBhbnkgYnJhbmNoIHdhcyBhZGRlZCB1bmRlciAnJHt0aGlzLmN1cnNvci5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIH1cbiAgICAvLyBmYWlsKCkgdGhyb3dzLCBzbyBjaGlsZHJlbi9zcGVjQ2hpbGRyZW4gYXJlIG5vbi1lbXB0eSBoZXJlLlxuICAgIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChjaGlsZHJlbiFbY2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3BlY0NoaWxkcmVuIVtzcGVjQ2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb3JhdGUgT05FIGJyYW5jaCBub2RlL3NwZWMgd2l0aCBhIGxvb3AtYmFjayBlZGdlIHRvIGBzdGFnZUlkYC4gU2hhcmVkIGJ5XG4gICAqIHRoZSBwb3NpdGlvbmFsIGBsb29wVG8oKWAgKHdoaWNoIHRhcmdldHMgdGhlIGxhc3QtYWRkZWQgYnJhbmNoKSBBTkQgdGhlXG4gICAqIHBlci1icmFuY2ggYHsgbG9vcFRvIH1gIG9wdGlvbiBvbiBgYWRkRnVuY3Rpb25CcmFuY2hgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgIC8gYGFkZFN1YkZsb3dDaGFydEJyYW5jaGAuIEVpdGhlciB3YXkgdGhlIGxvb3BcbiAgICogU09VUkNFIGlzIHRoZSBicmFuY2gg4oCUIHNvIHZpc3VhbGl6ZXJzIHJlYWQgYHRvb2wtY2FsbHMg4oaSIGNvbnRleHRgLCBuZXZlclxuICAgKiBgUm91dGUg4oaSIGNvbnRleHRgLiBWYWxpZGF0ZXMgdGhlIHRhcmdldCBpcyBhIHN0YWdlIGRlY2xhcmVkIEJFRk9SRSB0aGVcbiAgICogZGVjaWRlciAoYnJhbmNoIGlkcyAvIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGNsb25lIGFyZSBub3QgdmFsaWQgdGFyZ2V0cykuXG4gICAqL1xuICBwcml2YXRlIF9hcHBseUJyYW5jaExvb3AoXG4gICAgYnJhbmNoTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGJyYW5jaFNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nYCk7XG4gICAgaWYgKGJyYW5jaE5vZGUubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IHNldCBsb29wVG8gb24gYnJhbmNoICcke2JyYW5jaFNwZWMuaWR9JyDigJQgaXQgYWxyZWFkeSBoYXMgYSBjb250aW51YXRpb25gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmN1cnNvci5iLl9rbm93blN0YWdlSWRzSGFzKHN0YWdlSWQpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgYSBicmFuY2ggbG9vcCBtdXN0IHRhcmdldCBhIHN0YWdlIGAgK1xuICAgICAgICAgIFwiZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChicmFuY2ggaWRzIGFuZCB0aGUgc3ludGhldGljICdkZWZhdWx0JyBicmFuY2ggXCIgK1xuICAgICAgICAgICdhcmUgbm90IHZhbGlkIGxvb3AgdGFyZ2V0czsgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGFuIGlkPyknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBicmFuY2hOb2RlLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCBpc0xvb3BSZWY6IHRydWUgfTtcbiAgICBicmFuY2hTcGVjLmxvb3BUYXJnZXQgPSBzdGFnZUlkO1xuICAgIGJyYW5jaFNwZWMubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIHR5cGU6ICdsb29wJywgaXNMb29wUmVmZXJlbmNlOiB0cnVlIH07XG5cbiAgICAvLyBCcmFuY2gtc2NvcGVkIGRlc2NyaXB0aW9uIOKAlCBhdHRyaWJ1dGUgdGhlIGxvb3AgdG8gdGhlIGJyYW5jaCwgbm90IHRoZVxuICAgIC8vIGRlY2lkZXIgKHBhcmVudERlc2NyaXB0aW9uUGFydHMgaXMgdGhlIGRlY2lkZXIncyBkZXNjcmlwdGlvbiBjb250ZXh0KS5cbiAgICB0aGlzLmN1cnNvci5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuXG4gICAgLy8gRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIFRIRSBCUkFOQ0ggc28gdmlzdWFsaXplcnMgcmVhZFxuICAgIC8vIGB0b29sLWNhbGxzIOKGkiBjb250ZXh0YCwgbm90IGBSb3V0ZSDihpIgY29udGV4dGAuXG4gICAgdGhpcy5jdXJzb3IuYi5fZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihicmFuY2hTcGVjLmlkLCBzdGFnZUlkKTtcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnNvci5maW5pc2godGhpcy5kZWZhdWx0SWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJzb3I6IEJyYW5jaEN1cnNvcjxUT3V0LCBUU2NvcGU+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuY3Vyc29yID0gbmV3IEJyYW5jaEN1cnNvcihcbiAgICAgICdzZWxlY3RvcicsXG4gICAgICBidWlsZGVyLFxuICAgICAgY3VyTm9kZSxcbiAgICAgIGN1clNwZWMsXG4gICAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzLFxuICAgICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICByZXNlcnZlZFN0ZXBOdW1iZXIsXG4gICAgICBzZWxlY3RvckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBzdGFnZSBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeTtcbiAgICAgKiAgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQgKHNlZSBgRmxvd0NoYXJ0QnVpbGRlci50YWdgKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2UgYXMgYSBzZWxlY3RvciBicmFuY2guXG4gICAqXG4gICAqIFdoZW4gdGhpcyBicmFuY2ggaXMgc2VsZWN0ZWQsIHRoZSBoYW5kbGVyJ3MgYGV4ZWN1dGVgIHJ1bnMuIElmIGl0IHJldHVybnNcbiAgICogZGF0YSwgdGhlIHBpcGVsaW5lIHBhdXNlcy4gT24gcmVzdW1lLCBgaGFuZGxlci5yZXN1bWVgIHJ1bnMgd2l0aCB0aGVcbiAgICogaHVtYW4ncyBpbnB1dC4gSWYgYGV4ZWN1dGVgIHJldHVybnMgdm9pZCwgdGhlIHN0YWdlIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLnBhdXNhYmxlQnJhbmNoKGlkLCBuYW1lLCBoYW5kbGVyLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yLmZpbmlzaCgpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmxvd0NoYXJ0QnVpbGRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIF9yb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX3Jvb3RTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9jdXJzb3I/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfY3Vyc29yU3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfc3RhZ2VNYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PigpO1xuICBfc3ViZmxvd0RlZnMgPSBuZXcgTWFwPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PigpO1xuICBwcml2YXRlIF9zdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgPSB7fTtcbiAgLyoqXG4gICAqIEw3LjMg4oCUIEJ1aWxkLXRpbWUgb2JzZXJ2ZXIgZmFuLW91dC4gT3duZWQgYnkgdGhlIGJ1aWxkZXIgc28gZXZlcnlcbiAgICogYGFkZFgoKWAgbWV0aG9kIGNhbiBmaXJlIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZXZlbnRzIGF0IHRoZSBuYXR1cmFsXG4gICAqIG1vbWVudCBvZiB0aGUgY29ycmVzcG9uZGluZyBtdXRhdGlvbi4gRGlzcGF0Y2hlciBpcyBhbGxvY2F0ZWRcbiAgICogbGF6aWx5IG9uIGZpcnN0IGF0dGFjaCB0byBrZWVwIHRoZSB6ZXJvLXJlY29yZGVyIHBhdGggYWxsb2NhdGlvbi1cbiAgICogZnJlZS5cbiAgICovXG4gIHByaXZhdGUgX3N0cnVjdHVyZURpc3BhdGNoZXI/OiBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXI7XG4gIC8qKlxuICAgKiBMNy4zIOKAlCBTZWFsZWQtYWZ0ZXItYnVpbGQgZmxhZyAoUGFuZWwgMiBwaGFzZSBpbnZhcmlhbnQpLiBGbGlwc1xuICAgKiB0byBgdHJ1ZWAgd2hlbiBgLmJ1aWxkKClgIHJldHVybnM7IHN1YnNlcXVlbnQgYGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyYFxuICAgKiB0aHJvd3MuIFByZXZlbnRzIHRoZSBmb290Z3VuIHdoZXJlIGEgY29uc3VtZXIgYXR0YWNoZXMgYSByZWNvcmRlclxuICAgKiBtaWQtZXhlY3V0aW9uIGFuZCBnZXRzIHBhcnRpYWwgc3RydWN0dXJlIGRhdGEgKG1pc3NlZCBldmVyeSBldmVudFxuICAgKiBhbHJlYWR5IGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2VuYWJsZU5hcnJhdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dnZXI/OiBJTG9nZ2VyO1xuICBwcml2YXRlIF9kZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9zdGVwQ291bnRlciA9IDA7XG4gIC8vIE5PVEU6IGtleWVkIGJ5IHN0YWdlIG5hbWUgKGZvciBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbnMpLCB3aGlsZSBzdGFnZU1hcFxuICAvLyBhbmQga25vd25TdGFnZUlkcyB1c2UgaWQgKHN0YWJsZSBpZGVudGlmaWVyKS4gVGhlc2UgYXJlIGludGVudGlvbmFsbHkgZGlmZmVyZW50XG4gIC8vIG5hbWVzcGFjZXMg4oCUIGRlc2NyaXB0aW9ucyBhcmUgcHJlc2VudGF0aW9uYWwsIGxvb2t1cHMgYXJlIHN0cnVjdHVyYWwuXG4gIHByaXZhdGUgX3N0YWdlRGVzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfc3RhZ2VTdGVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBfa25vd25TdGFnZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbnB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dE1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgcHJpdmF0ZSBfc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgLy8g4pSA4pSAIEw3LjMg4oCUIFN0cnVjdHVyZVJlY29yZGVyIGF0dGFjaCArIGRpc3BhdGNoIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZm9yIGJ1aWxkLXBoYXNlIG9ic2VydmF0aW9uLiBNdWx0aXBsZVxuICAgKiByZWNvcmRlcnMgY29leGlzdCAoc2FtZSBpZCBhbGxvd2VkOyBpdGVyYXRpb24gb3JkZXIgPSBhdHRhY2hcbiAgICogb3JkZXIpLiBUaHJvd3MgaWYgY2FsbGVkIGFmdGVyIGAuYnVpbGQoKWAg4oCUIHRoZSBjaGFydCBpcyBzZWFsZWQgYXRcbiAgICogdGhhdCBwb2ludCBhbmQgYW55IHJlY29yZGVyIGF0dGFjaGVkIGxhdGUgd291bGQgbWlzcyBldmVyeSBldmVudFxuICAgKiBmaXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICAgKlxuICAgKiAqKlNlZWQgcmVwbGF5Kio6IHdoZW4gdGhpcyBpcyBjYWxsZWQgQUZURVIgYHN0YXJ0KClgIGhhcyBhbHJlYWR5XG4gICAqIGZpcmVkIChpLmUuLCBhZnRlciB0aGUgYGZsb3dDaGFydCgpYCBmYWN0b3J5IHJldHVybnMpLCB0aGVcbiAgICoganVzdC1hdHRhY2hlZCByZWNvcmRlciByZWNlaXZlcyBhIG9uZS10aW1lIGBvblN0YWdlQWRkZWRgIGZvciB0aGVcbiAgICogcm9vdCBzdGFnZSBzbyBpdCBvYnNlcnZlcyB0aGUgc2VlZC4gT25seSB0aGUgbmV3IHJlY29yZGVyIHNlZXNcbiAgICogdGhlIHJlcGxheTsgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgYXJlIG5vdCByZS1maXJlZC5cbiAgICpcbiAgICogKipNaWQtY2hhaW4gYXR0YWNoIGNhdmVhdCoqOiBhIHJlY29yZGVyIGF0dGFjaGVkIEFGVEVSIG9uZSBvciBtb3JlXG4gICAqIGBhZGRYKClgIGNhbGxzIHJlY2VpdmVzIHRoZSBzZWVkIHJlcGxheSBidXQgTUlTU0VTIGV2ZXJ5XG4gICAqIGludGVybWVkaWF0ZSBldmVudC4gQXR0YWNoIEJFRk9SRSB0aGUgZmlyc3QgYGFkZFgoKWAgZm9yIGNvbXBsZXRlXG4gICAqIGNhcHR1cmUuXG4gICAqXG4gICAqIFB1YmxpYyBmb3Igbm93IHRvIGVuYWJsZSBkaXJlY3QgYXR0YWNoIGluIHRlc3RzICsgZWFybHkgY29uc3VtZXJzLlxuICAgKiBMNy40IHdpbGwgd2lyZSBgZmxvd0NoYXJ0KC4uLiwgeyBzdHJ1Y3R1cmVSZWNvcmRlcnM6IFsuLi5dIH0pYCBhc1xuICAgKiBhbiBhZGRpdGlvbmFsIHJlZ2lzdHJhdGlvbiBzaXRlOyB0aGlzIG1ldGhvZCB3aWxsIHJlbWFpbi5cbiAgICovXG4gIGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlY29yZGVyOiBTdHJ1Y3R1cmVSZWNvcmRlcik6IHRoaXMge1xuICAgIGlmICh0aGlzLl9zZWFsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtGbG93Q2hhcnRCdWlsZGVyXSBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcignJHtyZWNvcmRlci5pZH0nKSBjYWxsZWQgYWZ0ZXIgLmJ1aWxkKCkg4oCUIGNoYXJ0IGlzIHNlYWxlZDsgYCArXG4gICAgICAgICAgJ3RoZSByZWNvcmRlciB3b3VsZCBtaXNzIGV2ZXJ5IHN0cnVjdHVyZSBldmVudCBmcm9tIGNvbnN0cnVjdGlvbi4gQXR0YWNoIEJFRk9SRSAuYnVpbGQoKS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyID0gbmV3IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgIH1cbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgLy8gVGhlIHNlZWQgZmlyZXMgaW5zaWRlIGBzdGFydCgpYCDigJQgdGhhdCBydW5zIEJFRk9SRSB0aGUgY29uc3VtZXJcbiAgICAvLyBjYW4gcG9zdC1jb25zdHJ1Y3QgYXR0YWNoLiBSZXBsYXkgdGhlIHNlZWQgZXZlbnQgT05MWSBpbnRvIHRoZVxuICAgIC8vIGp1c3QtYXR0YWNoZWQgcmVjb3JkZXIgc28gb3RoZXIgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgZG9uJ3RcbiAgICAvLyBzZWUgYSBkdXBsaWNhdGUuIEVycm9ycyBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGRpc3BhdGNoZXInc1xuICAgIC8vIGFjY3VtdWxhdG9yIHNvIHRoZSBjb250cmFjdCBzdGF5cyB1bmlmb3JtLlxuICAgIGlmICh0aGlzLl9yb290U3BlYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3JkZXIub25TdGFnZUFkZGVkPy4oe1xuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3Jvb3RTcGVjLmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuX3Jvb3RTcGVjLm5hbWUsXG4gICAgICAgICAgdHlwZTogdGhpcy5fcm9vdFNwZWMudHlwZSA/PyAnc3RhZ2UnLFxuICAgICAgICAgIC4uLih0aGlzLl9yb290U3BlYy5pc1BhdXNhYmxlID09PSB0cnVlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgICAuLi4odGhpcy5fcm9vdFNwZWMudGFncyAhPT0gdW5kZWZpbmVkICYmIHsgdGFnczogWy4uLnRoaXMuX3Jvb3RTcGVjLnRhZ3NdIH0pLFxuICAgICAgICAgIHNwZWM6IHRoaXMuX3Jvb3RTcGVjIGFzIHVua25vd24gYXMgRmxvd0NoYXJ0U3BlYyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5yZWNvcmRFcnJvckZvclJlcGxheShyZWNvcmRlci5pZCwgJ29uU3RhZ2VBZGRlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3BlY3QgYWNjdW11bGF0ZWQgYFN0cnVjdHVyZUJ1aWxkRXJyb3Jgcy4gUmV0dXJucyBlbXB0eSBhcnJheVxuICAgKiB3aGVuIG5vIHJlY29yZGVycyBhdHRhY2hlZCBPUiBubyBlcnJvcnMgb2NjdXJyZWQuIFJldHVybnMgYVxuICAgKiBkZWZlbnNpdmUgY29weSDigJQgY2FsbGVyIG11dGF0aW9ucyBkbyBub3QgYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMuXG4gICAqXG4gICAqICoqQ2FsbCBvbiB0aGUgQlVJTERFUiwgbm90IHRoZSBjaGFydCByZXR1cm5lZCBieSBgLmJ1aWxkKClgLioqXG4gICAqIENhcHR1cmUgdGhlIGJ1aWxkZXIgcmVmZXJlbmNlIGJlZm9yZSBgLmJ1aWxkKClgIGlmIHlvdSBuZWVkXG4gICAqIHBvc3QtYnVpbGQgYWNjZXNzOlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBidWlsZGVyID0gZmxvd0NoYXJ0KC4uLikuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICogY29uc3QgY2hhcnQgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAqIGNvbnN0IGVycm9ycyA9IGJ1aWxkZXIuZ2V0U3RydWN0dXJlQnVpbGRFcnJvcnMoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpOiBSZXR1cm5UeXBlPFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlclsnZ2V0RXJyb3JzJ10+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcj8uZ2V0RXJyb3JzKCkgPz8gW107XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBmaXJlIGhlbHBlcnMg4oCUIG5vLW9wIHdoZW4gbm8gZGlzcGF0Y2hlciBhdHRhY2hlZC4gS2VlcHNcbiAgLy8gZXZlcnkgY2FsbCBzaXRlIGEgb25lLWxpbmVyIHdpdGhvdXQgdGhlIGBpZiAodGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcilgXG4gIC8vIGJvaWxlcnBsYXRlIGV2ZXJ5d2hlcmUuXG4gIHByaXZhdGUgX2ZpcmVTdGFnZUFkZGVkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIC8vIFJlYWQgYGlzUGF1c2FibGVgIGRpcmVjdGx5IGZyb20gdGhlIHNwZWMg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgLy8gVGhlIHByZXZpb3VzIGBleHRyYXNgIGFyZ3VtZW50IHdhcyBhIHN1Yi1idWlsZGVyIGZvb3RndW46IGJyYW5jaFxuICAgIC8vIGhlbHBlcnMgaW4gRGVjaWRlckxpc3QvU2VsZWN0b3JGbkxpc3Qgd2VudCB0aHJvdWdoXG4gICAgLy8gYF9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyYCB3aGljaCBkcm9wcGVkIHRoZSBleHRyYXMsIHNpbGVudGx5XG4gICAgLy8gbG9zaW5nIGBpc1BhdXNhYmxlOiB0cnVlYCBvbiBwYXVzYWJsZSBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLlxuICAgIGNvbnN0IGlzUGF1c2FibGUgPSBzcGVjLmlzUGF1c2FibGUgPT09IHRydWU7XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlU3RhZ2VBZGRlZCh7XG4gICAgICBzdGFnZUlkOiBzcGVjLmlkLFxuICAgICAgbmFtZTogc3BlYy5uYW1lLFxuICAgICAgdHlwZTogc3BlYy50eXBlID8/ICdzdGFnZScsXG4gICAgICAuLi4oaXNQYXVzYWJsZSAmJiB7IGlzUGF1c2FibGU6IHRydWUgfSksXG4gICAgICAuLi4oc3BlYy50YWdzICE9PSB1bmRlZmluZWQgJiYgeyB0YWdzOiBbLi4uc3BlYy50YWdzXSB9KSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlVGFnZ2VkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlciB8fCBzcGVjLnRhZ3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZVN0YWdlVGFnZ2VkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0YWdzOiBbLi4uc3BlYy50YWdzXSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUVkZ2VBZGRlZChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUVkZ2VBZGRlZCh7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICBraW5kLFxuICAgICAgLi4uKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVMb29wRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUxvb3BFZGdlQWRkZWQoeyBmcm9tLCB0byB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBgbmV4dGAgZWRnZShzKSBmcm9tIGEgcGFyZW50IHNwZWMgdG8gYSBmcmVzaGx5LWFkZGVkXG4gICAqIG5vZGUg4oCUIHdpdGggY29udmVyZ2VuY2UgZXhwYW5zaW9uIHdoZW4gdGhlIHBhcmVudCBpcyBhXG4gICAqIGZvcmsgLyBkZWNpZGVyIC8gc2VsZWN0b3Igd2l0aCBicmFuY2hlcy5cbiAgICpcbiAgICogQSBmb3JrIGF0IGBwYXJlbnRgIGlzIHNlbWFudGljYWxseSBgcGFyZW50IOKUgOKUgGZvcmstYnJhbmNo4pSA4pSA4pa6IGNoaWxkW2ldYFxuICAgKiBmb3IgZWFjaCBjaGlsZCwgYW5kIHRoZSBjaGFpbmVkIGAuYWRkRnVuY3Rpb24oWClgIGNvbnRpbnVlc1xuICAgKiBBRlRFUiB0aGUgZm9yayBjb252ZXJnZXMuIFRoZSBydW50aW1lIHNlbWFudGljcyBhcmUgdGhhdCBlYWNoXG4gICAqIGNoaWxkIElOREVQRU5ERU5UTFkgZmVlZHMgYFhgIChwYXJhbGxlbCBjb21wbGV0aW9uIOKGkiBqb2luKS4gVGhlXG4gICAqIGxpdGVyYWwgXCJlZGdlIGZyb20gcGFyZW50IHRvIFhcIiB3b3VsZCBtaXNyZXByZXNlbnQgdGhpcyDigJRcbiAgICogdmlzdWFsaXplcnMgYW5kIHRvcG9sb2dpY2FsIGFsZ29yaXRobXMgd291bGQgc2VlIG9uZSBlZGdlIHdoZXJlXG4gICAqIHRoZXJlIHNob3VsZCBiZSBOIGNvbnZlcmdlbmNlIGVkZ2VzLlxuICAgKlxuICAgKiBGaXg6IHdoZW4gYHBhcmVudFNwZWNgIGhhcyBicmFuY2ggY2hpbGRyZW4gKGZvcmsgb3IgYnJhbmNoZWRcbiAgICogZGVjaWRlci9zZWxlY3RvciksIGZpcmUgb25lIGBuZXh0YCBlZGdlIGZyb20gRUFDSCBjaGlsZCB0byB0aGVcbiAgICogdGFyZ2V0LiBPdGhlcndpc2UgZmlyZSB0aGUgc2luZ2xlIGVkZ2UgZnJvbSBgcGFyZW50U3BlY2AgaXRzZWxmLlxuICAgKlxuICAgKiBMb29wLXJlZmVyZW5jZSBjaGlsZHJlbiAoc3ludGhldGljIHNwZWMgbm9kZXMgY3JlYXRlZCBieVxuICAgKiBgLmxvb3BUbygpYCkgYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGJhY2stZWRnZSBtYXJrZXJzLCBub3RcbiAgICogY29udmVyZ2VuY2Ugc291cmNlcy4gQSBicmFuY2ggdGhhdCBjYXJyaWVzIGFuIE9XTiBsb29wLWJhY2sgYG5leHRgXG4gICAqIChhIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBpcyBsaWtld2lzZSBza2lwcGVkIOKAlCBpdCBsb29wcywgaXQgZG9lc1xuICAgKiBub3QgY29udmVyZ2UgYXQgdGhlIGxpbmVhciBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBBIGJyYW5jaCBjYXJyeWluZyBgY29udmVyZ2VBdGAgaXMgUkVESVJFQ1RFRDogaXRzIHNpbmdsZSBjb252ZXJnZW5jZVxuICAgKiBlZGdlIGZpcmVzIHRvIGl0cyBuYW1lZCB0YXJnZXQgaW5zdGVhZCBvZiBgdGFyZ2V0SWRgIOKAlCBleHByZXNzaW5nIGFuXG4gICAqIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gYHRvb2xzIOKGkiBjYWxsLWxsbWAsIGJ5cGFzc2luZyBgbWVzc2FnZS1hcGlgKS5cbiAgICogVGhlIG5hbWVkIHRhcmdldCBpcyBhIGZvcndhcmQgc3RhZ2UsIHNvIGl0IGlzIE5PVCB2YWxpZGF0ZWQgaGVyZS5cbiAgICpcbiAgICogQ2FsbCBPUkRFUiBjb25zdHJhaW50OiBtdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGhlIGN1cnNvciBhZHZhbmNlc1xuICAgKiB0byB0aGUgbmV3IHRhcmdldC4gVGhlIGNhbGxlciBwYXNzZXMgdGhlIFBSRS1BRFZBTkNFIHBhcmVudCBzcGVjLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIHRhcmdldElkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRTcGVjcyA9IHBhcmVudFNwZWMuY2hpbGRyZW47XG4gICAgY29uc3QgaXNCcmFuY2hpbmdQYXJlbnQgPVxuICAgICAgKHBhcmVudFNwZWMudHlwZSA9PT0gJ2ZvcmsnIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ2RlY2lkZXInIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ3NlbGVjdG9yJykgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hpbGRTcGVjcykgJiZcbiAgICAgIGNoaWxkU3BlY3MubGVuZ3RoID4gMDtcbiAgICBpZiAoIWlzQnJhbmNoaW5nUGFyZW50KSB7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKHBhcmVudFNwZWMuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFNwZWNzISkge1xuICAgICAgaWYgKGNoaWxkLmlzTG9vcFJlZmVyZW5jZSkgY29udGludWU7XG4gICAgICAvLyBBIGJyYW5jaCB3aXRoIGl0cyBvd24gbG9vcC1iYWNrIG5leHQgKGJyYW5jaC1zb3VyY2VkIGxvb3BUbykgbG9vcHMg4oCUXG4gICAgICAvLyBpdCBkb2VzIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAgICBpZiAoY2hpbGQubmV4dD8uaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZC5jb252ZXJnZUF0KSB7XG4gICAgICAgIC8vIFJlZGlyZWN0ZWQgY29udmVyZ2VuY2U6IHRoaXMgYnJhbmNoIHJlam9pbnMgYXQgaXRzIG5hbWVkIHRhcmdldC5cbiAgICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjaGlsZC5pZCwgY2hpbGQuY29udmVyZ2VBdCwgJ25leHQnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCB0YXJnZXRJZCwgJ25leHQnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZURlY2lkZXJDb21wbGV0ZShcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZURlY2lkZXJDb21wbGV0ZSh7XG4gICAgICBkZWNpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIGJyYW5jaElkcyxcbiAgICAgIC4uLihkZWZhdWx0QnJhbmNoICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0QnJhbmNoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN1YmZsb3dNb3VudGVkKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgcm9vdFN0YWdlSWQ6IHN0cmluZyxcbiAgICBpc0xhenk/OiBib29sZWFuLFxuICAgIHN1YmZsb3dTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN1YmZsb3dQYXRoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICAvLyBzdWJmbG93UGF0aCBkZWZhdWx0cyB0byBzdWJmbG93SWQgd2hlbiB0aGUgcmVjb3JkZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaW1tZWRpYXRlIHBhcmVudCAodG9wLWxldmVsIG1vdW50KTsgY29tcG9zZWQgcGF0aHMgYXBwbHlcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBidWlsZGVyIGlzIGl0c2VsZiBhIG5lc3RlZCBzdWJmbG93IGJlaW5nXG4gICAgLy8gb2JzZXJ2ZWQgYnkgdGhlIGdyYW5kcGFyZW50J3MgcmVjb3JkZXIuXG4gICAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoID8/IHN1YmZsb3dJZDtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdWJmbG93TW91bnRlZCh7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHJvb3RTdGFnZUlkLFxuICAgICAgLi4uKGlzTGF6eSA9PT0gdHJ1ZSAmJiB7IGlzTGF6eSB9KSxcbiAgICAgIC4uLihzdWJmbG93U3BlYyAhPT0gdW5kZWZpbmVkICYmIHsgc3ViZmxvd1NwZWMgfSksXG4gICAgICBzdWJmbG93UGF0aDogcGF0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWItYnVpbGRlciBhY2Nlc3MgKGAuYi5fZmlyZVh4eGApIGlzIG5lZWRlZCBieSBEZWNpZGVyTGlzdCAvXG4gICAqICBTZWxlY3RvckZuTGlzdDsgZXhwb3NlIHRoZSBkaXNwYXRjaGVyIHRocm91Z2ggaW50ZXJuYWwgaGVscGVyc1xuICAgKiAgdGhhdCBnbyB0aHJvdWdoIHRoZSBzYW1lIG5vLW9wLXdoZW4tYWJzZW50IGd1YXJkLlxuICAgKlxuICAgKiAgQGludGVybmFsIOKAlCB0aGVzZSBtZXRob2RzIGFyZSBleHBvc2VkIGJlY2F1c2UgVHlwZVNjcmlwdCBgcHJpdmF0ZWBcbiAgICogIGRvZXNuJ3QgdHJhdmVyc2UgY2xhc3MgYm91bmRhcmllcy4gQ29uc3VtZXIgY29kZSBNVVNUIE5PVCBjYWxsXG4gICAqICB0aGVtOyBjYWxsaW5nIHRoZW0gcG9zdC1jb25zdHJ1Y3Rpb24gbGV0cyBhIGhvc3RpbGUgY2FsbGVyXG4gICAqICBmYWJyaWNhdGUgc3RydWN0dXJlIGV2ZW50cyBhbmQgY29ycnVwdCBkb3duc3RyZWFtIHZpc3VhbGl6YXRpb25zXG4gICAqICBvciBhdWRpdCB0cmFpbHMuIFRoZSBgX2AgcHJlZml4IGlzIGludGVudGlvbmFsIGNvbnZlbnRpb24uICovXG4gIF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBraW5kOiBTdHJ1Y3R1cmVFZGdlS2luZCwgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGZyb20sIHRvLCBraW5kLCBsYWJlbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIoXG4gICAgZGVjaWRlcjogc3RyaW5nLFxuICAgIHR5cGU6ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicsXG4gICAgYnJhbmNoSWRzOiBzdHJpbmdbXSxcbiAgICBkZWZhdWx0QnJhbmNoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRGVjaWRlckNvbXBsZXRlKGRlY2lkZXIsIHR5cGUsIGJyYW5jaElkcywgZGVmYXVsdEJyYW5jaCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChzdWJmbG93SWQsIHN1YmZsb3dOYW1lLCByb290U3RhZ2VJZCwgaXNMYXp5LCBzdWJmbG93U3BlYywgc3ViZmxvd1BhdGgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gdmFsaWRhdGUgYSBicmFuY2gtc291cmNlZCBsb29wIHRhcmdldCBhZ2FpbnN0IHRoZSBrbm93biBzdGFnZSBpZHNcbiAgICogIChtaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AncyBgX2tub3duU3RhZ2VJZHMuaGFzYCBndWFyZCkuICovXG4gIF9rbm93blN0YWdlSWRzSGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gZmlyZSBhIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBBIEJSQU5DSCBub2RlIChub3QgdGhlIGRlY2lkZXIpLiAqL1xuICBfZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChmcm9tLCB0byk7XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgLy8gQnVpbGRlci1jb21wb3NlZCBkZXNjcmlwdGlvbiAoYEZsb3dDaGFydDogWFxcblN0ZXBzOlxcbi4uLmApLlxuICAgICAgICAvLyBJbmxpbmUgT05MWSB0aGUgc3VtbWFyeSBhYm92ZSBgU3RlcHM6YCBvbiB0aGUgbW91bnQgbGluZSwgdGhlblxuICAgICAgICAvLyByZS1saXN0IHRoZSBzdGVwIGxpbmVzIG9uY2UsIGluZGVudGVkLiBFbWJlZGRpbmcgdGhlIEZVTEwgaW5uZXJcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaGVyZSBBTkQgcmUtbGlzdGluZyBpdHMgc3RlcHMgZG91YmxlZCB0aGUgdGV4dCBwZXJcbiAgICAgICAgLy8gbmVzdGluZyBsZXZlbCDigJQgZXhwb25lbnRpYWwgZ3Jvd3RoLCBSYW5nZUVycm9yIChcIkludmFsaWQgc3RyaW5nXG4gICAgICAgIC8vIGxlbmd0aFwiKSBhdCB+MjIgbmVzdGluZyBsZXZlbHMgb2YgbmVzdGVkIGJ1aWxkKCkuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBsaW5lcy5zbGljZSgwLCBzdGVwc0lkeCkuam9pbignICcpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKFxuICAgICAgICAgIHN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGcmVlLWZvcm0gKHNpbmdsZS1ibG9jaykgZGVzY3JpcHRpb24g4oCUIGlubGluZSBpdCB3aG9sZSwgdW5jaGFuZ2VkLlxuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3ViZmxvdy5kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSAXG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBBUEkgY29udHJhY3Qg4oCUIGlucHV0IHZhbGlkYXRpb24sIG91dHB1dCBzaGFwZSwgYW5kIG91dHB1dCBtYXBwZXIuXG4gICAqIFJlcGxhY2VzIHNldElucHV0U2NoZW1hKCkgKyBzZXRPdXRwdXRTY2hlbWEoKSArIHNldE91dHB1dE1hcHBlcigpIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqXG4gICAqIElmIGEgY29udHJhY3Qgd2l0aCBpbnB1dCBzY2hlbWEgaXMgZGVjbGFyZWQsIGNoYXJ0LnJ1bigpIHZhbGlkYXRlcyBpbnB1dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBDb250cmFjdCBkYXRhIGlzIHVzZWQgYnkgY2hhcnQudG9PcGVuQVBJKCkgYW5kIGNoYXJ0LnRvTUNQVG9vbCgpLlxuICAgKi9cbiAgY29udHJhY3Qob3B0czoge1xuICAgIGlucHV0PzogdW5rbm93bjtcbiAgICBvdXRwdXQ/OiB1bmtub3duO1xuICAgIG1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgfSk6IHRoaXMge1xuICAgIGlmIChvcHRzLmlucHV0KSB0aGlzLl9pbnB1dFNjaGVtYSA9IG9wdHMuaW5wdXQ7XG4gICAgaWYgKG9wdHMub3V0cHV0KSB0aGlzLl9vdXRwdXRTY2hlbWEgPSBvcHRzLm91dHB1dDtcbiAgICBpZiAob3B0cy5tYXBwZXIpIHRoaXMuX291dHB1dE1hcHBlciA9IG9wdHMubWFwcGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpbmVhciBDaGFpbmluZyDilIDilIBcblxuICBzdGFydChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIC8vIERldGVjdCBQYXVzYWJsZUhhbmRsZXIgYnkgZHVjay10eXBpbmcgKGhhcyAuZXhlY3V0ZSBwcm9wZXJ0eSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBjb25zdCBpc1BhdXNhYmxlID0gdHlwZW9mIGZuID09PSAnb2JqZWN0JyAmJiBmbiAhPT0gbnVsbCAmJiAnZXhlY3V0ZScgaW4gZm47XG4gICAgY29uc3Qgc3RhZ2VGbiA9IGlzUGF1c2FibGVcbiAgICAgID8gKChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pXG4gICAgICA6IChmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogc3RhZ2VGbiB9O1xuICAgIGlmIChpc1BhdXNhYmxlKSB7XG4gICAgICBub2RlLmlzUGF1c2FibGUgPSB0cnVlO1xuICAgICAgbm9kZS5yZXN1bWVGbiA9IChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikucmVzdW1lO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgc3RhZ2VGbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHNwZWMuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0KCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBzdGFydCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5fcm9vdCA9IG5vZGU7XG4gICAgdGhpcy5fcm9vdFNwZWMgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VlZCBub2RlIGZpcmVzIGBvblN0YWdlQWRkZWRgIChubyBlZGdlIOKAlCBubyBwcmVkZWNlc3NvcikuXG4gICAgLy8gYGlzUGF1c2FibGVgIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyBieSBgX2ZpcmVTdGFnZUFkZGVkYC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSBjaGFydCB3aG9zZSBST09UIHN0YWdlIElTIGEgc2VsZWN0b3Ig4oCUIGl0IHJ1bnMgZmlyc3QgKHJlYWRpbmdcbiAgICogYXJncywgc2VlZGluZyBzdGF0ZSwgcmV0dXJuaW5nIHRoZSBjaG9zZW4gYnJhbmNoIGlkcyB2aWEgYHNlbGVjdCgpYCksXG4gICAqIGFuZCBpdHMgYnJhbmNoZXMgYXR0YWNoIGRpcmVjdGx5IHRvIHRoZSByb290LiBNaXJyb3JzIGBzdGFydCgpYCBmb3IgdGhlXG4gICAqIHJvb3Qtbm9kZSBzZXR1cCwgdGhlbiByZXR1cm5zIGEgYFNlbGVjdG9yRm5MaXN0YCBib3VuZCB0byB0aGUgcm9vdCBzb1xuICAgKiBgLmFkZEZ1bmN0aW9uQnJhbmNoKClgIC8gYC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goKWAgLyBgLmVuZCgpYCB3b3JrXG4gICAqIGV4YWN0bHkgYXMgdGhleSBkbyBhZnRlciBgYWRkU2VsZWN0b3JGdW5jdGlvbigpYC5cbiAgICpcbiAgICogVXNlIHdoZW4gdGhlIGZpcnN0IHRoaW5nIGEgY2hhcnQgZG9lcyBpcyBjaG9vc2UgYW1vbmcgYnJhbmNoZXMg4oCUIGUuZy4gYVxuICAgKiBgQ29udGV4dGAgc2VsZWN0b3IgdGhhdCBpbml0cyArIHBpY2tzIHdoaWNoIGNvbnRleHQgc2xvdHMgdG8gZW5naW5lZXIsXG4gICAqIHdpdGggbm8gc2VwYXJhdGUgc2VlZCBzdGFnZSBiZWZvcmUgaXQuXG4gICAqL1xuICBzdGFydFNlbGVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW47IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBTZWUgYGFkZFNlbGVjdG9yRnVuY3Rpb25gIOKAlCBgZmFpbEZhc3Q6IHRydWVgIG1ha2VzIGEgbXVsdGktYnJhbmNoXG4gICAgLy8gc2VsZWN0aW9uIGZhbiBvdXQgdmlhIGBQcm9taXNlLmFsbGAgKGZpcnN0IGVycm9yIGFib3J0cykgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBkZWZhdWx0IGBQcm9taXNlLmFsbFNldHRsZWRgIChiZXN0LWVmZm9ydCkuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0U2VsZWN0b3IoJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYHN0YXJ0U2VsZWN0b3IoJyR7aWR9JylgKTtcblxuICAgIHRoaXMuX3Jvb3QgPSBub2RlO1xuICAgIHRoaXMuX3Jvb3RTcGVjID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIFJvb3Qgc2VsZWN0b3Igbm9kZSBmaXJlcyBvblN0YWdlQWRkZWQgd2l0aCBOTyBwcmVkZWNlc3NvciBlZGdlIChpdCdzXG4gICAgLy8gdGhlIHJvb3QpLiBCcmFuY2hlcyArIG9uRGVjaWRlckNvbXBsZXRlIGNvbWUgZnJvbSB0aGUgU2VsZWN0b3JGbkxpc3QuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sIGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIC8vIENhcHR1cmUgdGhlIHBhcmVudCBTUEVDIHJlZmVyZW5jZSAobm90IGp1c3QgaWQpIEJFRk9SRSB0aGVcbiAgICAvLyBjdXJzb3IgYWR2YW5jZXMg4oCUIHdlIG5lZWQgaXRzIGBjaGlsZHJlbmAgKyBgdHlwZWAgdG8gZGVjaWRlXG4gICAgLy8gd2hldGhlciB0aGUgYG5leHRgIGVkZ2UgaXMgYSBmb3JrIGNvbnZlcmdlbmNlIChOIGVkZ2VzIGZyb21cbiAgICAvLyBlYWNoIGJyYW5jaCBjaGlsZCkgdnMgYSBwbGFpbiBsaW5lYXIgY2hhaW4gKDEgZWRnZSBmcm9tIHBhcmVudCkuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgTGluZWFyIG5vZGU6IGFubm91bmNlIHRoZSBub2RlIGZpcnN0LCB0aGVuIHRoZSBlZGdlXG4gICAgLy8gZnJvbSB0aGUgcHJpb3IgY3Vyc29yLiBPcmRlciBtYXR0ZXJzOiBlbmRwb2ludHMgYW5ub3VuY2VkXG4gICAgLy8gYmVmb3JlIGFueSBlZGdlIHJlZmVyZW5jaW5nIHRoZW0gKFN0cnVjdHVyZVJlY29yZGVyIGNvbnRyYWN0KS5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdHJlYW1pbmdGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmVhbUlkPzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGZuLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICB0eXBlOiAnc3RyZWFtaW5nJyxcbiAgICAgIGlzU3RyZWFtaW5nOiB0cnVlLFxuICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkID8/IG5hbWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU3RyZWFtaW5nIHN0YWdlOiBzYW1lIHNoYXBlIGFzIGxpbmVhciBhZGRGdW5jdGlvbi5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2Ug4oCUIGNhbiBwYXVzZSBleGVjdXRpb24gYW5kIHJlc3VtZSBsYXRlciB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBUaGUgaGFuZGxlciBoYXMgdHdvIHBoYXNlczpcbiAgICogLSBgZXhlY3V0ZWA6IHJ1bnMgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAoaXQgYmVjb21lc1xuICAgKiAgIHRoZSBjaGVja3BvaW50J3MgYHBhdXNlRGF0YWApOyByZXR1cm4gdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gICAqIC0gYHJlc3VtZWA6IHJ1bnMgd2hlbiB0aGUgZmxvd2NoYXJ0IGlzIHJlc3VtZWQgd2l0aCBpbnB1dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAuYWRkUGF1c2FibGVGdW5jdGlvbignQXBwcm92ZU9yZGVyJywge1xuICAgKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICAgKiAgICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICAgKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246ICdBcHByb3ZlPycgfTtcbiAgICogICB9LFxuICAgKiAgIHJlc3VtZTogYXN5bmMgKHNjb3BlLCBpbnB1dCkgPT4ge1xuICAgKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAgICogICB9LFxuICAgKiB9LCAnYXBwcm92ZS1vcmRlcicsICdNYW5hZ2VyIGFwcHJvdmFsIGdhdGUnKVxuICAgKiBgYGBcbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb24obmFtZTogc3RyaW5nLCBoYW5kbGVyOiBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPiwgaWQ6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIHN0YWdlOiBgX2ZpcmVTdGFnZUFkZGVkYCByZWFkcyBgaXNQYXVzYWJsZWBcbiAgICAvLyBkaXJlY3RseSBmcm9tIGBzcGVjLmlzUGF1c2FibGVgIChzZXQgYWJvdmUpLCBzbyB2aXN1YWxpc2Vyc1xuICAgIC8vIHNlZSBpdCBvbiB0aGUgZXZlbnQgcGF5bG9hZCB3aXRob3V0IGEgc2VwYXJhdGUgdGhyZWFkaW5nIGFyZy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGV0YWNoIChidWlsZGVyLW5hdGl2ZSBjb21wb3NpdGlvbikg4pSA4pSAXG4gIC8vXG4gIC8vIFN1Z2FyIG92ZXIgYGFkZEZ1bmN0aW9uYCB0aGF0IGdlbmVyYXRlcyBhIHN0YWdlIHdoaWNoIGNhbGxzXG4gIC8vIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgIG9yIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGF0IHJ1bnRpbWUuIFpFUk8gZW5naW5lIGNoYW5nZXMg4oCUIHB1cmUgY29tcG9zaXRpb24gb3ZlciB0aGVcbiAgLy8gZXhpc3Rpbmcgc2NvcGUtbWV0aG9kIHByaW1pdGl2ZXMuXG4gIC8vXG4gIC8vIEZvciBgYWRkRGV0YWNoQW5kSm9pbkxhdGVyYCwgdGhlIHJldHVybmVkIGhhbmRsZSBpcyBzdG9yZWQgaW5cbiAgLy8gc2hhcmVkIHN0YXRlIHZpYSBgJHNldFZhbHVlYCAod2hpY2ggYnlwYXNzZXMgdGhlIHR5cGVkLXByb3h5XG4gIC8vIHVud3JhcCB0aGF0IHdvdWxkIG90aGVyd2lzZSBzdHJpcCB0aGUgaGFuZGxlJ3MgY2xhc3MgbWV0aG9kcykuXG4gIC8vIERvd25zdHJlYW0gc3RhZ2VzIHJlYWQgaXQgdmlhIGBzY29wZVtvcHRpb25zLmhhbmRsZUtleV1gIG9yXG4gIC8vIGBzY29wZS4kZ2V0VmFsdWUob3B0aW9ucy5oYW5kbGVLZXkpYCDigJQgYm90aCBwcmVzZXJ2ZSBtZXRob2RzXG4gIC8vIGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBzdG9yZWQgcmF3LlxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdGFnZSB0aGF0IGZpcmVzIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kXG4gICAqIERJU0NBUkRTIHRoZSBoYW5kbGUuIFB1cmUgZmlyZS1hbmQtZm9yZ2V0IOKAlCB1c2VmdWwgZm9yIHRlbGVtZXRyeVxuICAgKiBleHBvcnRzLCBhdWRpdCBsb2cgc2hpcHBpbmcsIGNhY2hlIHdhcm0tdXAuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBTdGFibGUgaWQgZm9yIHRoaXMgc3RhZ2UgKGFsc28gdGhlIHN0YWdlTWFwIGtleSkuXG4gICAqIEBwYXJhbSBjaGlsZCBUaGUgY2hpbGQgZmxvd2NoYXJ0IHRvIGRldGFjaC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZHJpdmVyIFRoZSBkcml2ZXIgdG8gc2NoZWR1bGUgb24gKGUuZy4gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCkuXG4gICAqIEBwYXJhbSBvcHRpb25zLmlucHV0TWFwcGVyIE1hcHMgdGhlIHBhcmVudCdzIHNjb3BlIHRvIHRoZSBjaGlsZCdzIGlucHV0LlxuICAgKiAgIERlZmF1bHRzIHRvIHBhc3NpbmcgYHVuZGVmaW5lZGAuXG4gICAqIEBwYXJhbSBvcHRpb25zLm1vdW50TmFtZSBEaXNwbGF5IG5hbWU7IGRlZmF1bHRzIHRvIGBpZGAuXG4gICAqIEBwYXJhbSBvcHRpb25zLmRlc2NyaXB0aW9uIFN0YWdlIGRlc2NyaXB0aW9uIGZvciBuYXJyYXRpdmUgKyB0b29scy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBmbG93Q2hhcnQoJ3Byb2Nlc3MnLCBwcm9jZXNzRm4sICdwcm9jZXNzJylcbiAgICogICAuYWRkRGV0YWNoQW5kRm9yZ2V0KCd0ZWxlbWV0cnknLCB0ZWxlbWV0cnlDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+ICh7IGV2ZW50OiAncHJvY2Vzc2VkJywgb3JkZXJJZDogc2NvcGUub3JkZXJJZCB9KSxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignbmV4dCcsIG5leHRGbiwgJ25leHQnKVxuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZERldGFjaEFuZEZvcmdldChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5GbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXI7XG4gICAgICBpbnB1dE1hcHBlcj86IChzY29wZTogVFNjb3BlKSA9PiB1bmtub3duO1xuICAgICAgbW91bnROYW1lPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubW91bnROYW1lID8/IGlkO1xuICAgIHJldHVybiB0aGlzLmFkZEZ1bmN0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgICgoc2NvcGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIgPyBvcHRpb25zLmlucHV0TWFwcGVyKHNjb3BlIGFzIFRTY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQob3B0aW9ucy5kcml2ZXIsIGNoaWxkLCBpbnB1dCk7XG4gICAgICB9KSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpZCxcbiAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdGFnZSB0aGF0IGZpcmVzIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kXG4gICAqIGRlbGl2ZXJzIHRoZSByZXN1bHRpbmcgYERldGFjaEhhbmRsZWAgdG8gYSBjb25zdW1lci1zdXBwbGllZFxuICAgKiBgb25IYW5kbGVgIGNhbGxiYWNrLiBUaGUgaGFuZGxlIENBTk5PVCBiZSBzdG9yZWQgaW4gc2hhcmVkIHN0YXRlXG4gICAqIOKAlCBgU3RhZ2VDb250ZXh0LnNldFZhbHVlYCBjYWxscyBgc3RydWN0dXJlZENsb25lYCB3aGljaCBkcm9wc1xuICAgKiBjbGFzcyBwcm90b3R5cGVzIChhbmQgdGhlcmVmb3JlIHRoZSBoYW5kbGUncyBgLndhaXQoKWAgbWV0aG9kKS5cbiAgICpcbiAgICogVGhlIGNhbGxiYWNrIHBhdHRlcm4gaXMgdGhlIGV4cGxpY2l0IGFsdGVybmF0aXZlOiBrZWVwIGhhbmRsZXMgaW5cbiAgICogYSBjbG9zdXJlLWxvY2FsIGFycmF5IChvciB3aGF0ZXZlciBzaGFwZSBzdWl0cykgYW5kIGhhdmUgYVxuICAgKiBkb3duc3RyZWFtIHN0YWdlIGBhd2FpdCBQcm9taXNlLmFsbCguLi4pYCBvdmVyIHRoZW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICogaW1wb3J0IHR5cGUgeyBEZXRhY2hIYW5kbGUgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBoYW5kbGVzOiBEZXRhY2hIYW5kbGVbXSA9IFtdO1xuICAgKlxuICAgKiBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnc2VlZCcsIHNlZWRGbiwgJ3NlZWQnKVxuICAgKiAgIC5hZGREZXRhY2hBbmRKb2luTGF0ZXIoJ2V2YWwtYScsIGV2YWxDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+IHNjb3BlLmNvbmZpZ0EsXG4gICAqICAgICBvbkhhbmRsZTogKGgpID0+IGhhbmRsZXMucHVzaChoKSxcbiAgICogICB9KVxuICAgKiAgIC5hZGREZXRhY2hBbmRKb2luTGF0ZXIoJ2V2YWwtYicsIGV2YWxDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+IHNjb3BlLmNvbmZpZ0IsXG4gICAqICAgICBvbkhhbmRsZTogKGgpID0+IGhhbmRsZXMucHVzaChoKSxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignam9pbicsIGFzeW5jIChzY29wZSkgPT4ge1xuICAgKiAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsKGhhbmRsZXMubWFwKChoKSA9PiBoLndhaXQoKSkpO1xuICAgKiAgICAgc2NvcGUucmVzdWx0cyA9IHNldHRsZWQ7XG4gICAqICAgfSwgJ2pvaW4nKVxuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogTm90ZTogcHV0dGluZyBgaGFuZGxlc2AgaW4gYSBtb2R1bGUtbGV2ZWwgY2xvc3VyZSBpcyBmaW5lIGZvclxuICAgKiBzaW5nbGUtcnVuIHNjcmlwdHMuIEZvciBzZXJ2ZXIgY29kZSB0aGF0IHJ1bnMgdGhlIHNhbWUgY2hhcnRcbiAgICogY29uY3VycmVudGx5IGFjcm9zcyByZXF1ZXN0cywgYWxsb2NhdGUgYSBuZXcgY2xvc3VyZSBwZXIgcnVuXG4gICAqIChlLmcuLCB3cmFwIGNoYXJ0IGNvbnN0cnVjdGlvbiBpbiBhIGZhY3RvcnkgZnVuY3Rpb24pIHNvIGhhbmRsZXNcbiAgICogZnJvbSBkaWZmZXJlbnQgcnVucyBkb24ndCBibGVlZCBpbnRvIGVhY2ggb3RoZXIuXG4gICAqL1xuICBhZGREZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjaGlsZDogaW1wb3J0KCcuL3R5cGVzLmpzJykuRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBvcHRpb25zOiB7XG4gICAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyO1xuICAgICAgb25IYW5kbGU6IChoYW5kbGU6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlKSA9PiB2b2lkO1xuICAgICAgaW5wdXRNYXBwZXI/OiAoc2NvcGU6IFRTY29wZSkgPT4gdW5rbm93bjtcbiAgICAgIG1vdW50TmFtZT86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm1vdW50TmFtZSA/PyBpZDtcbiAgICByZXR1cm4gdGhpcy5hZGRGdW5jdGlvbihcbiAgICAgIG5hbWUsXG4gICAgICAoKHNjb3BlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBvcHRpb25zLmlucHV0TWFwcGVyID8gb3B0aW9ucy5pbnB1dE1hcHBlcihzY29wZSBhcyBUU2NvcGUpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKG9wdGlvbnMuZHJpdmVyLCBjaGlsZCwgaW5wdXQpO1xuICAgICAgICBvcHRpb25zLm9uSGFuZGxlKGhhbmRsZSk7XG4gICAgICB9KSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpZCxcbiAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBCcmFuY2hpbmcg4pSA4pSAXG5cbiAgYWRkRGVjaWRlckZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgdGhlIERFQ0lERVIgU1RBR0UgYSByZXRyeSBwb2xpY3kuIERlY2xhcmVkIGhlcmUgcmF0aGVyXG4gICAgICogIHRoYW4gdmlhIGAucmV0cnkoKWAgYmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgYERlY2lkZXJMaXN0YCwgd2hlcmUgYVxuICAgICAqICBjaGFpbmVkIG1vZGlmaWVyIGNvdWxkIG1lYW4gdGhlIGRlY2lkZXIgT1IgdGhlIGJyYW5jaCBqdXN0IGFkZGVkO1xuICAgICAqICBgeyB0YWdzIH1gIGxpa2V3aXNlLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBpZiAoY3VyLmRlY2lkZXJGbikgZmFpbChgZGVjaWRlciBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnLCBoYXNEZWNpZGVyOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYGFkZERlY2lkZXJGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRGVjaWRlckZ1bmN0aW9uKCcke2lkfScpYCk7XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIERlY2lkZXIgbm9kZSBpcyByZWFjaGVkIHZpYSBhIGBuZXh0YCBlZGdlIGZyb20gdGhlIHByaW9yXG4gICAgLy8gY3Vyc29yLiBCcmFuY2hlcyB0aGVtc2VsdmVzIGZpcmUgdmlhIGBhZGRGdW5jdGlvbkJyYW5jaGAgZXRjLlxuICAgIC8vIGBvbkRlY2lkZXJDb21wbGV0ZWAgZmlyZXMgZnJvbSBzdWItYnVpbGRlciBgLmVuZCgpYC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRTZWxlY3RvckZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgdGhlIFNFTEVDVE9SIFNUQUdFIGEgcmV0cnkgcG9saWN5IOKAlCBzYW1lIHJlYXNvbmluZyBhc1xuICAgICAqICBgYWRkRGVjaWRlckZ1bmN0aW9uYDogdGhpcyBtZXRob2QgcmV0dXJucyBhIHN1Yi1idWlsZGVyLCBzbyBhIGNoYWluZWRcbiAgICAgKiAgYC5yZXRyeSgpYCB3b3VsZCBiZSBhbWJpZ3VvdXM7IGB7IHRhZ3MgfWAgbGlrZXdpc2UuICovXG4gICAgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuOyByZXRyeT86IFJldHJ5UG9saWN5OyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgaWYgKGN1ci5zZWxlY3RvckZuKSBmYWlsKGBzZWxlY3RvciBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFuZCBzZWxlY3RvciBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBgZmFpbEZhc3RgOiB3aGVuIHRoZSBzZWxlY3RvciBwaWNrcyDiiaUyIGJyYW5jaGVzIHRoZXkgZmFuIG91dCBpbiBwYXJhbGxlbFxuICAgIC8vIHZpYSBDaGlsZHJlbkV4ZWN1dG9yLiBEZWZhdWx0ID0gYFByb21pc2UuYWxsU2V0dGxlZGAgKGJlc3QtZWZmb3J0OiBldmVyeVxuICAgIC8vIGJyYW5jaCBydW5zIHRvIGNvbXBsZXRpb24gZXZlbiBpZiBzb21lIGZhaWwpLiBgZmFpbEZhc3Q6IHRydWVgID0gYFByb21pc2UuYWxsYFxuICAgIC8vICh0aGUgZmlyc3QgYnJhbmNoIGVycm9yIHJlamVjdHMgKyBhYm9ydHMpIOKAlCB1c2Ugd2hlbiBBTEwgc2VsZWN0ZWQgYnJhbmNoZXNcbiAgICAvLyBhcmUgUkVRVUlSRUQgKGUuZy4gYXNzZW1ibGluZyBhIHJlcXVlc3QgZnJvbSBpbmRlcGVuZGVudC1idXQtcmVxdWlyZWQgcGFydHMpLFxuICAgIC8vIG5vdCBiZXN0LWVmZm9ydCBmYW4tb3V0LiBTYW1lIGZsYWcgYGFkZExpc3RPZkZ1bmN0aW9uYCBleHBvc2VzLlxuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgbm9kZS5mYWlsRmFzdCA9IHRydWU7XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYGFkZFNlbGVjdG9yRnVuY3Rpb24oJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFNlbGVjdG9yRnVuY3Rpb24oJyR7aWR9JylgKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VsZWN0b3Igbm9kZTogc2FtZSBhcyBkZWNpZGVyLiBCcmFuY2hlcyArIGNvbXBsZXRlIGV2ZW50XG4gICAgLy8gY29tZSBmcm9tIHRoZSBTZWxlY3RvckZuTGlzdCBzdWItYnVpbGRlci5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgUGFyYWxsZWwgKEZvcmspIOKUgOKUgFxuXG4gIGFkZExpc3RPZkZ1bmN0aW9uKGNoaWxkcmVuOiBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjPFRPdXQsIFRTY29wZT5bXSwgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuIH0pOiB0aGlzIHtcbiAgICBjb25zdCB7IGN1ciwgY3VyU3BlYyB9ID0gdGhpcy5fbmVlZEZvcmtQYXJlbnQoKTtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBjdXIuZmFpbEZhc3QgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiwgcmV0cnksIHRhZ3MgfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgYWRtaXRJZCgnZm9yayBjaGlsZCBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgICBmYWlsKGBkdXBsaWNhdGUgY2hpbGQgaWQgJyR7aWR9JyB1bmRlciAnJHtjdXIubmFtZX0nYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCB9O1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlZ2lzdGVyU3RhZ2UoaWQsIGZuKTtcblxuICAgICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgICBpZCxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgaXNQYXJhbGxlbENoaWxkOiB0cnVlLFxuICAgICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIH07XG4gICAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIHJldHJ5LCBgYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQgJyR7aWR9J2ApO1xuICAgICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIHRhZ3MsIGBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZCAnJHtpZH0nYCk7XG5cbiAgICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgICAvLyBMNy4zIOKAlCBmaXJlIHN0cnVjdHVyZSBldmVudHMgZm9yIHRoZSBjaGlsZCArIHRoZSBmb3JrIGVkZ2UuXG4gICAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2ZvcmstYnJhbmNoJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lIHx8IGMuaWQpLmpvaW4oJywgJyk7XG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBSdW5zIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBwYXJhbGxlbCBjaGlsZHJlbiAoJHtjaGlsZE5hbWVzfSlgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBPTkUgQlJBTkNIIFBFUiBJVEVNLCBpbiBwYXJhbGxlbCDigJQgd2l0aCB0aGUgbnVtYmVyIG9mIGJyYW5jaGVzIGRlY2lkZWRcbiAgICogYXQgUlVOIHRpbWUgZnJvbSB0aGUgcGF5bG9hZCByYXRoZXIgdGhhbiBhdCBidWlsZCB0aW1lLlxuICAgKlxuICAgKiBgYWRkTGlzdE9mRnVuY3Rpb25gIGZhbnMgb3V0IGEgZml4ZWQgc2V0IG9mIGJyYW5jaGVzIHlvdSBuYW1lIGluIHRoZSBjaGFydC5cbiAgICogVGhpcyBmYW5zIG91dCBvdmVyIGRhdGEgdGhlIGNoYXJ0IGhhcyBub3Qgc2VlbiB5ZXQ6IHRocmVlIGNodW5rcyBtYWtlIHRocmVlXG4gICAqIGJyYW5jaGVzLCB0ZW4gbWFrZSB0ZW4uIEVhY2ggYnJhbmNoIHJ1bnMgYXMgaXRzIG93biBpc29sYXRlZCBzdWJmbG93IOKAlCBpdHNcbiAgICogb3duIG1lbW9yeSwgaXRzIG93biBjb21taXQgbG9nLCBhZGRyZXNzYWJsZSBpbiBldmVyeSB0cmFjZSBxdWVyeSBhdFxuICAgKiBgPHN0YWdlSWQ+fjxpbmRleD5gIOKAlCBzbyBicmFuY2hlcyBjYW5ub3QgY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0XG4gICAqIHN0YXRlLCBhbmQgYSBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIGEgYnJhbmNoIHJlc3VsdCB3b3JrcyB3aXRoIG5vIHNwZWNpYWxcbiAgICogaGFuZGxpbmcuIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lICAgRGlzcGxheSBsYWJlbCBmb3IgdGhlIGZhbi1vdXQgc3RhZ2UuXG4gICAqIEBwYXJhbSBpZCAgICAgU3RhYmxlIHN0YWdlIGlkLiBNYXkgbm90IGNvbnRhaW4gYH5gIChyZXNlcnZlZCDigJQgdGhlIGJyYW5jaFxuICAgKiAgICAgICAgICAgICAgIHNlZ21lbnRzIGFyZSBidWlsdCBmcm9tIHRoaXMgaWQpLlxuICAgKiBAcGFyYW0gY29uZmlnIGB7IGl0ZW1zLCBicmFuY2gsIG1heEJyYW5jaGVzLCBpbnRvLCBmYWlsRmFzdD8gfWA6XG4gICAqICAgLSBgaXRlbXMoc2NvcGUpYCBwaWNrcyB3aGF0IHRvIGZhbiBvdXQgb3ZlciAocmVhZHMgYXJlIHRyYWNrZWQpO1xuICAgKiAgIC0gYGJyYW5jaChpdGVtLCBpbmRleClgIGJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtIChlYWNoIGJyYW5jaCdzXG4gICAqICAgICBzY29wZSBpcyBhbHNvIHNlZWRlZCB3aXRoIGBpdGVtYCBhbmQgYGluZGV4YCwgc28gdGhlIGlucHV0IGlzIGluIHRoZVxuICAgKiAgICAgdHJhY2UgcmF0aGVyIHRoYW4gaGlkZGVuIGluIGEgY2xvc3VyZSk7XG4gICAqICAgLSBgbWF4QnJhbmNoZXNgIGlzIFJFUVVJUkVEIOKAlCBhbiB1bmJvdW5kZWQgZmFuLW91dCBkcml2ZW4gYnkgbW9kZWwgb3V0cHV0XG4gICAqICAgICBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0byBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvXG4gICAqICAgICBub3QgcnVuIGFuZCB0aGUgdHJ1bmNhdGlvbiBpcyByZWNvcmRlZDtcbiAgICogICAtIGBpbnRvYCBpcyBSRVFVSVJFRCDigJQgdGhlIHN0YXRlIGtleSB0aGUgb3JkZXJlZCByZXN1bHRzIGFycmF5IGlzIHdyaXR0ZW5cbiAgICogICAgIHRvLiBgaW50b1tpXWAgaXMgYnJhbmNoIGBpYCdzIHJlc3VsdCwgaW4gSVRFTVMgb3JkZXIsIHdoYXRldmVyIG9yZGVyXG4gICAqICAgICB0aGUgYnJhbmNoZXMgZmluaXNoZWQgaW47XG4gICAqICAgLSBgZmFpbEZhc3RgIGlzIHRoZSBzYW1lIHBvbGljeSB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSdzIHBhcmFsbGVsaXNtXG4gICAqICAgICB1c2VzOiBgdHJ1ZWAgcmVqZWN0cyBvbiB0aGUgZmlyc3QgZmFpbGluZyBicmFuY2gsIG9taXR0ZWQgcnVucyB0aGVtIGFsbFxuICAgKiAgICAgYmVzdC1lZmZvcnQgKGEgZmFpbGVkIGJyYW5jaCdzIHNsb3QgaXMgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdTcGxpdCcsIHNwbGl0Rm4sICdzcGxpdCcpXG4gICAqICAgLmFkZFBhcmFsbGVsRm9yRWFjaCgnUmV2aWV3IGVhY2ggY2h1bmsnLCAncmV2aWV3LWNodW5rcycsIHtcbiAgICogICAgIGl0ZW1zOiAoc2NvcGUpID0+IHNjb3BlLmNodW5rcyxcbiAgICogICAgIGJyYW5jaDogKGNodW5rLCBpKSA9PiBidWlsZFJldmlld0NoYXJ0KGNodW5rLCBpKSxcbiAgICogICAgIG1heEJyYW5jaGVzOiA4LFxuICAgKiAgICAgaW50bzogJ3Jldmlld3MnLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdNZXJnZScsIG1lcmdlRm4sICdtZXJnZScpICAgLy8gcmVhZHMgc2NvcGUucmV2aWV3c1xuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFBhcmFsbGVsRm9yRWFjaDxUSXRlbSA9IGFueT4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBQYXJhbGxlbEZvckVhY2hDb25maWc8VEl0ZW0sIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIC8vIFRoZSBnZW5lcmF0ZWQgYnJhbmNoIHNlZ21lbnRzIGVtYmVkIHRoaXMgaWQgdmVyYmF0aW1cbiAgICAvLyAoYDxpZD5+PGluZGV4PmApLCBzbyBhIG1hcmtlciBpbnNpZGUgaXQgd291bGQgbWFrZSB0aGUgc2VnbWVudFxuICAgIC8vIGFtYmlndW91cyB0byBwYXJzZS4gUmVmdXNpbmcgaXQgaGVyZSDigJQgb24gYSBicmFuZC1uZXcgbWV0aG9kLCBhdCB6ZXJvXG4gICAgLy8gYmFjay1jb21wYXQgY29zdCDigJQga2lsbHMgdGhlIGFtYmlndWl0eSBjbGFzcyBvdXRyaWdodCBhbmQga2VlcHNcbiAgICAvLyBgcGFyc2VCcmFuY2hTZWdtZW50YCBhIHNwbGl0IGF0IHRoZSBsYXN0IG1hcmtlciBpbnN0ZWFkIG9mIGEgaGV1cmlzdGljLlxuICAgIGFkbWl0SWQoJ3BhcmFsbGVsRm9yRWFjaCBzdGFnZSBpZCcsIGlkLCAnc2VnbWVudCcpO1xuICAgIHRoaXMuX2NsYWltRnJlc2hJZChpZCwgYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKWApO1xuICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcuaXRlbXMgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGNvbmZpZy5icmFuY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZhaWwoYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBpdGVtcyhzY29wZSkgYW5kIGJyYW5jaChpdGVtLCBpbmRleCkgZnVuY3Rpb25zLmApO1xuICAgIH1cbiAgICAvLyBSRVFVSVJFRCwgYm90aCBvZiB0aGVtIOKAlCBzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQgKEQyKS5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5tYXhCcmFuY2hlcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29uZmlnLm1heEJyYW5jaGVzKSB8fCBjb25maWcubWF4QnJhbmNoZXMgPCAxKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIG1heEJyYW5jaGVzIOKAlCBhIHBvc2l0aXZlIGludGVnZXIgY2VpbGluZyBvbiBob3cgbWFueSBgICtcbiAgICAgICAgICAnYnJhbmNoZXMgb25lIGV4ZWN1dGlvbiBtYXkgc3RhcnQuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBkZWZhdWx0OiBhbiB1bmJvdW5kZWQgZmFuLW91dCAnICtcbiAgICAgICAgICAnZHJpdmVuIGJ5IHJ1bnRpbWUgZGF0YSAobW9kZWwgb3V0cHV0LCBhbiB1cHN0cmVhbSBBUEkpIGlzIGEgcmVzb3VyY2UgYXR0YWNrLiBQaWNrIHRoZSAnICtcbiAgICAgICAgICAnbGFyZ2VzdCBudW1iZXIgdGhpcyBmbG93IGNhbiBhZmZvcmQuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuaW50byAhPT0gJ3N0cmluZycgfHwgY29uZmlnLmludG8gPT09ICcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgYWRkUGFyYWxsZWxGb3JFYWNoKCcke2lkfScpIHJlcXVpcmVzIGludG8g4oCUIHRoZSBzdGF0ZSBrZXkgaXRzIG9yZGVyZWQgcmVzdWx0cyBhcnJheSBpcyBgICtcbiAgICAgICAgICAnd3JpdHRlbiB0by4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIGRlZmF1bHQgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZDogYSBkZXJpdmVkIGtleSAnICtcbiAgICAgICAgICAnY291bGQgc2lsZW50bHkgb3ZlcndyaXRlIHN0YXRlIHRoZSBjaGFydCBhbHJlYWR5IG93bnMuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzRHluYW1pY1BhcmFsbGVsOiB0cnVlLFxuICAgICAgcGFyYWxsZWxGb3JFYWNoOiBjb25maWcgYXMgUGFyYWxsZWxGb3JFYWNoQ29uZmlnPGFueSwgVFNjb3BlPixcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChjb25maWcuZmFpbEZhc3QgIT09IHVuZGVmaW5lZCkgbm9kZS5mYWlsRmFzdCA9IGNvbmZpZy5mYWlsRmFzdDtcblxuICAgIC8vIGB0eXBlOiAnZm9yaydgIOKAlCBhIGZhbi1vdXQgaXMgd2hhdCB0aGlzIGlzLCBhbmQgZXZlcnkgZXhpc3RpbmcgY29uc3VtZXJcbiAgICAvLyBhbHJlYWR5IGtub3dzIGhvdyB0byBkcmF3IG9uZS4gVGhlIFwiYnJhbmNoZXMgYXJlIGRlY2lkZWQgYXQgcnVudGltZVwiXG4gICAgLy8gZGV0YWlsIHJpZGVzIGBpc0R5bmFtaWNQYXJhbGxlbGAgcmF0aGVyIHRoYW4gYSBuZXcgbm9kZSB0eXBlLCBzbyBub3RoaW5nXG4gICAgLy8gZG93bnN0cmVhbSBoYXMgdG8gbGVhcm4gYSBuZXcgd29yZCB0byBrZWVwIHdvcmtpbmcuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ2ZvcmsnLCBpc0R5bmFtaWNQYXJhbGxlbDogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbiA/PyBgUnVucyBvbmUgYnJhbmNoIHBlciBpdGVtIGludG8gJyR7Y29uZmlnLmludG99J2ApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN1YmZsb3cgTW91bnRpbmcg4pSA4pSAXG5cbiAgYWRkU3ViRmxvd0NoYXJ0KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIG1vdW50TmFtZT86IHN0cmluZywgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMpOiB0aGlzIHtcbiAgICBjb25zdCB7IGN1ciwgY3VyU3BlYyB9ID0gdGhpcy5fbmVlZEZvcmtQYXJlbnQoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcbiAgICB0aGlzLl9tb3VudFN1YmZsb3coaWQsIHN1YmZsb3csICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgICAgaWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpZCxcbiAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhlIG1vdW50J3MgT05MWSB0YWcgc2l0ZTogdGhlIGN1cnNvciBzdGF5cyBvbiB0aGUgcGFyZW50IChzZWVcbiAgICAgIC8vIGBfY3Vyc29yVGFpbGApLCBzbyBgLnRhZygpYCBhZnRlciB0aGlzIGNhbGwgcmVmdXNlcy5cbiAgICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU3ViRmxvd0NoYXJ0KCcke2lkfScpYCk7XG5cbiAgICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG4gICAgICAvLyBMNy4zIOKAlCBTdWJmbG93IG1vdW50OiBzdGFnZSBldmVudCArIGZvcmsgZWRnZSArIG1vdW50IGxpZmVjeWNsZVxuICAgICAgLy8gZXZlbnQuIE1vdW50LW9ubHkgc2VtYW50aWNzOiBwYXJlbnQgcmVjb3JkZXJzIGRvIE5PVCByZXBsYXkgdGhlXG4gICAgICAvLyBzdWJmbG93J3Mgb3duIGludGVybmFsIHN0cnVjdHVyZSBldmVudHMuXG4gICAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBzdWJmbG93IG1vdW50ICcke3N1YmZsb3dOYW1lfSdgO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgY3VyLCBjdXJTcGVjIH0gPSB0aGlzLl9uZWVkRm9ya1BhcmVudCgpO1xuXG4gICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICBmYWlsKGBkdXBsaWNhdGUgY2hpbGQgaWQgJyR7aWR9JyB1bmRlciAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuICAgIHRoaXMuX2NsYWltRnJlc2hJZChpZCwgYGFkZExhenlTdWJGbG93Q2hhcnQoJyR7aWR9JylgKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnQoJyR7aWR9JylgKTtcblxuICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgc3ViZmxvdyBwYXJhbGxlbCBtb3VudC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIGlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB0aGlzLl9maXJlU3ViZmxvd01vdW50ZWQoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbTGF6eSBTdWItRXhlY3V0aW9uOiAke3N1YmZsb3dOYW1lfV1gKTtcblxuICAgIHRoaXMuX2N1cnNvclRhaWwgPSBgdGhlIGxhenkgc3ViZmxvdyBtb3VudCAnJHtzdWJmbG93TmFtZX0nYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzb2x2ZXI6ICgpID0+IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3QgYWRkIHN1YmZsb3cgYXMgbmV4dCB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG4gICAgdGhpcy5fY2xhaW1GcmVzaElkKGlkLCBgYWRkTGF6eVN1YkZsb3dDaGFydE5leHQoJyR7aWR9JylgKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dSZXNvbHZlcjogcmVzb2x2ZXIgYXMgYW55LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAvLyBMYXp5IG1vdW50IHN0dWIuIFRoZSBsYXp5IHN1YmZsb3cncyBpbnRlcm5hbHMgd2lsbCBiZSBzaGFwZWQgYXRcbiAgICAvLyByZXNvbHV0aW9uIHRpbWUuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnROZXh0KCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIExhenkgbGluZWFyLW1vdW50IHN1YmZsb3cuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KGlkLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW0xhenkgU3ViLUV4ZWN1dGlvbjogJHtzdWJmbG93TmFtZX1dYCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydE5leHQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3QgYWRkIHN1YmZsb3cgYXMgbmV4dCB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICB0aGlzLl9tb3VudFN1YmZsb3coaWQsIHN1YmZsb3csICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgICAgaWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICBjb25zdCBhdHRhY2hlZFNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICAgIGlkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICB9O1xuXG4gICAgICAvLyBBIGxpbmVhciBtb3VudCBtb3ZlcyB0aGUgY3Vyc29yLCBzbyBgLnRhZygpYCBhZnRlciBpdCBhbHNvIHdvcmtzIOKAlFxuICAgICAgLy8gYGFwcGx5VGFnc2AgcmVmdXNlcyBhIHNlY29uZCBkZWNsYXJhdGlvbiBpZiBib3RoIHNpdGVzIGFyZSB1c2VkLlxuICAgICAgYXBwbHlUYWdzKG5vZGUsIGF0dGFjaGVkU3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydE5leHQoJyR7aWR9JylgKTtcblxuICAgICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgICBjdXJTcGVjLm5leHQgPSBhdHRhY2hlZFNwZWM7XG4gICAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoYXR0YWNoZWRTcGVjKTtcbiAgICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcbiAgICAgIC8vIEw3LjMg4oCUIExpbmVhci1tb3VudCBzdWJmbG93LlxuICAgICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoYXR0YWNoZWRTcGVjKTtcbiAgICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXRyeSDilIDilIBcblxuICAvKipcbiAgICogR2l2ZSB0aGUgc3RhZ2UgeW91IEpVU1QgYWRkZWQgYSBkZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3kuXG4gICAqXG4gICAqICMjIFdoeSBkZWNsYXJlIGl0IGluc3RlYWQgb2Ygd3JpdGluZyBhIGxvb3AgaW5zaWRlIHRoZSBzdGFnZVxuICAgKlxuICAgKiBBIHJldHJ5IGhhbmQtcm9sbGVkIGluc2lkZSBhIHN0YWdlIGZ1bmN0aW9uIGlzIGludmlzaWJsZSB0byB0aGUgdHJhY2UuIFRoZVxuICAgKiBuYXJyYXRpdmUgc2hvd3Mgb25lIHN0YWdlLCB0aGUgY29tbWl0IGxvZyBzaG93cyBvbmUgZW50cnksIGFuZCB0aGUgdHdvXG4gICAqIGZhaWxlZCBjYWxscyB0aGF0IGNhbWUgYmVmb3JlIHRoZSBzdWNjZXNzZnVsIG9uZSBsZWZ0IG5vIG1hcmsgYW55d2hlcmUg4oCUXG4gICAqIGFuIHVuZXhwbGFpbmVkIGJlaGF2aW91ciBpbiBhIGxpYnJhcnkgd2hvc2Ugd2hvbGUgcG9pbnQgaXMgdGhhdCBub3RoaW5nXG4gICAqIGludmlzaWJsZSBoYXBwZW5zLiBEZWNsYXJlZCBoZXJlLCBldmVyeSBhdHRlbXB0IGlzIHBhcnQgb2YgdGhlIHJlY29yZDogZWFjaFxuICAgKiBmYWlsZWQgYXR0ZW1wdCBmaXJlcyBgRmxvd1JlY29yZGVyLm9uU3RhZ2VSZXRyeWAgYW5kIGFwcGVhcnMgaW4gdGhlXG4gICAqIG5hcnJhdGl2ZSwgaW4gb3JkZXIsIGJldHdlZW4gdGhlIGF0dGVtcHRzJyBvd24gcmVhZHMgYW5kIHdyaXRlcy5cbiAgICpcbiAgICogIyMgV2hhdCBhbiBhdHRlbXB0IGlzXG4gICAqXG4gICAqIEEgZmFpbGVkIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzIGFyZSBESVNDQVJERUQg4oCUIHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzXG4gICAqIGZyb20gY29tbWl0dGVkIHN0YXRlLCBuZXZlciBmcm9tIHRoZSB3cmVja2FnZSBvZiB0aGUgbGFzdCB0cnkuIFRoZSBmaW5hbFxuICAgKiBhdHRlbXB0IGJlaGF2ZXMgZXhhY3RseSBhcyBhIHN0YWdlIHdpdGggbm8gcG9saWN5IGRvZXM6IG9uIHN1Y2Nlc3MgaXRcbiAgICogY29tbWl0czsgb24gZmFpbHVyZSBpdCBjb21taXRzIHdoYXQgaXQgd3JvdGUgYW5kIHJldGhyb3dzIChmb290cHJpbnQgaGFzXG4gICAqIG5ldmVyIGhhZCByb2xsYmFjaywgYW5kIHJldHJ5IGRvZXMgbm90IGludHJvZHVjZSBvbmUpLlxuICAgKlxuICAgKiBBIHBhdXNlIGlzIG5vdCBhIGZhaWx1cmU6IG5laXRoZXIgYGFkZFBhdXNhYmxlRnVuY3Rpb25gJ3MgcGF1c2Ugbm9yXG4gICAqIGBpbnRlcnJ1cHQoKWAgaXMgZXZlciByZXRyaWVkLiBOb3IgaXMgYSBjYW5jZWxsZWQgcnVuLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdGZXRjaCB1c2VyJywgZmV0Y2hGbiwgJ2ZldGNoLXVzZXInKVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ2hhcmdlIGNhcmQnLCBjaGFyZ2VGbiwgJ2NoYXJnZScpXG4gICAqICAgLnJldHJ5KHsgYXR0ZW1wdHM6IDMsIGJhY2tvZmZNczogKG4pID0+IDEwMCAqIDIgKiogKG4gLSAxKSB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ29uZmlybScsIGNvbmZpcm1GbiwgJ2NvbmZpcm0nKVxuICAgKiBgYGBcbiAgICpcbiAgICogQXBwbGllcyB0byB0aGUgQ1VSUkVOVCBjdXJzb3Ig4oCUIHRoZSBzdGFnZSBhZGRlZCBieSB0aGUgaW1tZWRpYXRlbHlcbiAgICogcHJlY2VkaW5nIGBzdGFydCgpYCAvIGBhZGRGdW5jdGlvbigpYCAvIGBhZGRTdHJlYW1pbmdGdW5jdGlvbigpYCAvXG4gICAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uKClgLiBXaGVyZSB0aGUgY3Vyc29yIHdvdWxkIGJlIGFtYmlndW91cyAoYSBkZWNpZGVyLFxuICAgKiBzZWxlY3RvciwgYnJhbmNoLCBvciBmb3JrIGNoaWxkKSwgZGVjbGFyZSB0aGUgcG9saWN5IGluIHRoYXQgbWV0aG9kJ3Mgb3duXG4gICAqIGByZXRyeWAgb3B0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZXRyeShwb2xpY3k6IFJldHJ5UG9saWN5KTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgLy8gQSBzdWJmbG93IG1vdW50IC8gcGFyYWxsZWwgZm9yayBoYW5ncyBDSElMRFJFTiBvZmYgdGhlIGN1cnJlbnQgc3RhZ2UgYW5kXG4gICAgLy8gbGVhdmVzIHRoZSBjdXJzb3Igb24gdGhhdCBzdGFnZS4gQXR0YWNoaW5nIHRoZSBwb2xpY3kgdG8gdGhlIGN1cnNvciBoZXJlXG4gICAgLy8gd291bGQgc2lsZW50bHkgcmV0cnkgdGhlIHN0YWdlIEJFRk9SRSB0aGUgdGhpbmcgeW91IGp1c3Qgd3JvdGUuXG4gICAgaWYgKHRoaXMuX2N1cnNvclRhaWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBmb2xsb3cgJHt0aGlzLl9jdXJzb3JUYWlsfSDigJQgdGhhdCBhdHRhY2hlcyB0byAnJHtjdXIubmFtZX0nIHdpdGhvdXQgbW92aW5nIHRoZSBjdXJzb3IsIHNvIGAgK1xuICAgICAgICAgIGB0aGUgcG9saWN5IHdvdWxkIGxhbmQgb24gJyR7Y3VyLm5hbWV9JyByYXRoZXIgdGhhbiBvbiB3aGF0IHlvdSBqdXN0IGFkZGVkLiBEZWNsYXJlIHRoZSBwb2xpY3kgYXQgaXRzIG93biBgICtcbiAgICAgICAgICAnc2l0ZSBpbnN0ZWFkOiBvbiB0aGUgc3RhZ2VzIElOU0lERSBhIHN1YmZsb3cgY2hhcnQsIG9yIHZpYSB0aGUgYHJldHJ5YCBmaWVsZCBvbiBhbiBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5yZXRyeSkgZmFpbChgcmV0cnkgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLmlzU3ViZmxvd1Jvb3QpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBzdWJmbG93IG1vdW50ICcke2N1ci5uYW1lfScg4oCUIGEgbW91bnQgaGFzIG5vIHN0YWdlIGZ1bmN0aW9uIG9mIGl0cyBvd24uIGAgK1xuICAgICAgICAgICdEZWNsYXJlIHRoZSBwb2xpY3kgb24gdGhlIHN0YWdlcyBJTlNJREUgdGhlIHN1YmZsb3cgY2hhcnQgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0R5bmFtaWNQYXJhbGxlbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmFsbGVsLWZvci1lYWNoIHN0YWdlICcke2N1ci5uYW1lfScg4oCUIGl0IGhhcyBubyBzdGFnZSBmdW5jdGlvbiBvZiBpdHMgYCArXG4gICAgICAgICAgJ293bi4gRGVjbGFyZSB0aGUgcG9saWN5IG9uIHRoZSBzdGFnZXMgaW5zaWRlIHRoZSBicmFuY2ggY2hhcnQgaXRzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0xvb3BSZWYpIGZhaWwoYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGxvb3AgcmVmZXJlbmNlICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGFwcGx5UmV0cnlQb2xpY3koY3VyLCBjdXJTcGVjLCBwb2xpY3ksIGByZXRyeSgpIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWNsYXJlZCB0YWdzIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBQdXQgTkFNRVMgb24gdGhlIHN0YWdlIHlvdSBKVVNUIGFkZGVkLiBUaGUgZmlyc3QgY29tbWl0IGJ1bmRsZSBvZiBlYWNoXG4gICAqIGV4ZWN1dGlvbiBvZiB0aGF0IHN0YWdlIGNhcnJpZXMgdGhlbSAoYENvbW1pdEJ1bmRsZS50YWdzYCDigJQgdGhlIGJ1bmRsZVxuICAgKiBgY29tbWl0U3RvcHNgIGtleXMgb24pLCBhbmQgdGhlIGJ1aWx0IHNwZWMgYWR2ZXJ0aXNlcyB0aGVtXG4gICAqIChgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLnRhZ3NgKS5cbiAgICpcbiAgICogIyMgV2h5IGRlY2xhcmUgaXQgaW5zdGVhZCBvZiBkZXJpdmluZyBpdCBmcm9tIGlkc1xuICAgKlxuICAgKiBBIHJlYWRlciB0aGF0IHdhbnRzIFwidGhlIExMTSB0dXJuc1wiIG9mIGEgc3RvcmVkIHJlY29yZGluZyBoYWQgdG8gY2xhc3NpZnlcbiAgICogc3RhZ2VzIGZyb20gdGhlaXIgaWRzIOKAlCBhIHN3aXRjaCBvdmVyIGBydW50aW1lU3RhZ2VJZGAgdGhhdCBwYXJzZXMgYCNgIGFuZFxuICAgKiBgL2AsIGxpdmVzIGluIHRoZSBjb25zdW1lciwgYW5kIHNpbGVudGx5IGdvZXMgc3RhbGUgd2hlbiBhIHN0YWdlIGlzXG4gICAqIHJlbmFtZWQuIERlY2xhcmVkIGhlcmUsIHRoZSBuYW1lIHRyYXZlbHMgV0lUSCB0aGUgY29tbWl0OiBhIHJlY29yZGluZyBmcm9tXG4gICAqIGFueSBjaGFydCBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcywgYW5kIGB0YWdTdG9wc2AgKGZvb3R0cmFjZSlcbiAgICogc2NydWJzIHRoZW0gd2l0aCBubyBpZCBjb252ZW50aW9ucyBhdCBhbGwuXG4gICAqXG4gICAqICMjIFdoYXQgYSB0YWcgaXMsIGFuZCBpcyBub3RcbiAgICpcbiAgICogQSB0YWcgaXMgYSBOQU1FIGRlY2xhcmVkIGF0IGJ1aWxkIHRpbWUg4oCUIG5ldmVyIGEgdmFsdWUuIFRoZXJlIGlzIG5vXG4gICAqIHJ1bi10aW1lIGAkdGFnKClgOiBhIHJ1bnRpbWUgc3RyaW5nIGNvdWxkIGNhcnJ5IGRhdGEgKGAndXNlcjonICsgZW1haWxgKVxuICAgKiBwYXN0IGV2ZXJ5IHJlZGFjdGlvbiBwb2ludC4gRGF0YS1kZXBlbmRlbnQgbWFya3MgYXJlIGEga2VlcCBydWxlIG92ZXJcbiAgICogdGhlIGZvbGQgYXQgcmVhZCB0aW1lLCBvciB0ZWxlbWV0cnkgdmlhIGAkZW1pdGAuIEZyZWUgc3RyaW5nczogZm9vdHByaW50anNcbiAgICogb3ducyBubyB2b2NhYnVsYXJ5OyBhIGNvbnN1bWVyIGRlY2xhcmVzIGl0cyBvd24gKGAnbWlsZXN0b25lOjxraW5kPidgKS5cbiAgICpcbiAgICogU3RhbXBlZCBPTkNFIHBlciBleGVjdXRpb24gb2YgdGhlIHN0YWdlOiByZXRyeSBhdHRlbXB0cyBzaGFyZSBvbmUgc3RhbXAsXG4gICAqIGEgZmFpbGVkIHN0YWdlIGtlZXBzIGl0cyB0YWcgKHRoZSBlcnJvciBwYXRoIGNvbW1pdHMgYmVmb3JlIGl0IHJldGhyb3dzKSxcbiAgICogYSBzdGFnZSB0aGF0IGBpbnRlcnJ1cHQoKWBzIGFuZCBpcyByZXN1bWVkIGlzIHR3byB0YWdnZWQgc3RvcHMgb24gYSBjaGFpblxuICAgKiBiZWNhdXNlIGl0IHJhbiB0d2ljZSwgYW5kIGFuIEVNUFRZIGNvbW1pdCBpcyBhIHRhZ2dlZCBzdG9wIHRvby4gQSBzdWJmbG93XG4gICAqIG1vdW50IG9yIGEgcGFyYWxsZWwtZm9yLWVhY2ggc3RhZ2UgY2FuIGJlIHRhZ2dlZDsgdGhlIHRhZyBsYW5kcyBvbiB0aGVcbiAgICogYnVuZGxlIHRoYXQgcmVjb3JkcyBpdHMgcmVzdWx0IOKAlCBmb3IgYSBtb3VudCwgaXRzIEZJUlNUIGJ1bmRsZSBpbiB0aGVcbiAgICogcGFyZW50IGxvZyAodGhlIGV4aXQgYnVuZGxlIGNhcnJpZXMgbm9uZSksIHdoaWxlIHRoZSBzdWJmbG93J3Mgb3duIGxvZ1xuICAgKiBpcyB1bnRvdWNoZWQ6IGl0cyBpbm5lciBzdGFnZXMgZGVjbGFyZSB0aGVpciBvd24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGZsb3dDaGFydDxTdGF0ZT4oJ1NlZWQnLCBzZWVkRm4sICdzZWVkJylcbiAgICogICAuYWRkRnVuY3Rpb24oJ0NhbGwgbW9kZWwnLCBjYWxsRm4sICdjYWxsLWxsbScpXG4gICAqICAgLnRhZygnbWlsZXN0b25lOmxsbS10dXJuJylcbiAgICogICAuYWRkRnVuY3Rpb24oJ1JvdXRlJywgcm91dGVGbiwgJ3JvdXRlJylcbiAgICogICAudGFnKCdtaWxlc3RvbmU6ZGVjaXNpb24nLCAnYXVkaXQnKVxuICAgKiBgYGBcbiAgICpcbiAgICogQXBwbGllcyB0byB0aGUgQ1VSUkVOVCBjdXJzb3Ig4oCUIHRoZSBzdGFnZSBhZGRlZCBieSB0aGUgaW1tZWRpYXRlbHlcbiAgICogcHJlY2VkaW5nIGBzdGFydCgpYCAvIGBhZGRGdW5jdGlvbigpYCAvIGBhZGRTdHJlYW1pbmdGdW5jdGlvbigpYCAvXG4gICAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uKClgIC8gYGFkZFN1YkZsb3dDaGFydE5leHQoKWAgLyBgYWRkUGFyYWxsZWxGb3JFYWNoKClgLlxuICAgKiBXaGVyZSB0aGUgY3Vyc29yIHdvdWxkIGJlIGFtYmlndW91cyAoYSBkZWNpZGVyLCBzZWxlY3RvciwgYnJhbmNoLCBvciBmb3JrXG4gICAqIGNoaWxkKSwgZGVjbGFyZSB0aGUgdGFncyBpbiB0aGF0IG1ldGhvZCdzIG93biBgdGFnc2Agb3B0aW9uIGluc3RlYWQuIEFcbiAgICogc3ViZmxvdyBNT1VOVCBoYXMgdGhhdCBvcHRpb24gdG9vIChgU3ViZmxvd01vdW50T3B0aW9ucy50YWdzYCwgOS4yMS4xKVxuICAgKiDigJQgYW5kIGZvciBhIGZvcmstY2hpbGQgbW91bnQgKGBhZGRTdWJGbG93Q2hhcnRgKSBvciBhIGJyYW5jaCBtb3VudFxuICAgKiAoYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIGl0IGlzIHRoZSBPTkxZIHNpdGU6IHRob3NlIGxlYXZlIHRoZSBjdXJzb3Igb25cbiAgICogdGhlIHBhcmVudCwgc28gYC50YWcoKWAgYWZ0ZXIgdGhlbSByZWZ1c2VzIHJhdGhlciB0aGFuIG1pcy1hdHRyaWJ1dGUuXG4gICAqXG4gICAqIFJlZnVzZWQgYXQgYnVpbGQgdGltZTogYW4gZW1wdHkgbmFtZSwgYSBub24tc3RyaW5nLCB0aGUgcmVzZXJ2ZWRcbiAgICogYnJhbmNoLXNlZ21lbnQgbWFya2VyIGB+YCBpbnNpZGUgYSBuYW1lLCBhIG5hbWUgZGVjbGFyZWQgdHdpY2UsIGFuZCBhXG4gICAqIHNlY29uZCBkZWNsYXJhdGlvbiBvbiB0aGUgc2FtZSBzdGFnZS5cbiAgICovXG4gIHRhZyguLi5uYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICAvLyBTYW1lIG1pcy1hdHRyaWJ1dGlvbiBndWFyZCBhcyBgLnJldHJ5KClgOiBhZnRlciBhIG1vdW50IG9yIGEgZm9yayB0aGVcbiAgICAvLyBjdXJzb3Igc3RpbGwgcG9pbnRzIGF0IHRoZSBzdGFnZSBCRUZPUkUgd2hhdCB5b3UganVzdCB3cm90ZS5cbiAgICBpZiAodGhpcy5fY3Vyc29yVGFpbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHRhZygpIGNhbm5vdCBmb2xsb3cgJHt0aGlzLl9jdXJzb3JUYWlsfSDigJQgdGhhdCBhdHRhY2hlcyB0byAnJHtjdXIubmFtZX0nIHdpdGhvdXQgbW92aW5nIHRoZSBjdXJzb3IsIHNvIGAgK1xuICAgICAgICAgIGB0aGUgbmFtZXMgd291bGQgbGFuZCBvbiAnJHtjdXIubmFtZX0nIHJhdGhlciB0aGFuIG9uIHdoYXQgeW91IGp1c3QgYWRkZWQuIERlY2xhcmUgdGhlIHRhZ3MgYXQgdGhlaXIgb3duIGAgK1xuICAgICAgICAgIFwic2l0ZSBpbnN0ZWFkOiB2aWEgdGhlIGB0YWdzYCBmaWVsZCBpbiB0aGUgbW91bnQncyBvd24gb3B0aW9ucyAoYFN1YmZsb3dNb3VudE9wdGlvbnMudGFnc2AsIDkuMjEuMSksIG9yIFwiICtcbiAgICAgICAgICAndmlhIHRoZSBgdGFnc2AgZmllbGQgb24gYW4gYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQuIFRoZSBzdGFnZXMgSU5TSURFIGEgc3ViZmxvdyBjaGFydCBkZWNsYXJlIHRoZWlyIG93bi4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0xvb3BSZWYpIGZhaWwoYHRhZygpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBsb29wIHJlZmVyZW5jZSAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkgZmFpbChgdGFnKCkgYXQgJyR7Y3VyLm5hbWV9JzogYXQgbGVhc3Qgb25lIG5hbWUgaXMgcmVxdWlyZWRgKTtcblxuICAgIGFwcGx5VGFncyhjdXIsIGN1clNwZWMsIG5hbWVzLCBgdGFnKCkgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIC8vIFRoZSBzdGFnZSdzIGBvblN0YWdlQWRkZWRgIGhhcyBhbHJlYWR5IGZpcmVkICh0aGUgZG9vciBjb21lcyBhZnRlclxuICAgIC8vIHRoZSBhZGQpLCBzbyB0aGUgbmFtZXMgZ28gb3V0IGFzIHRoZWlyIG93biBldmVudCDigJQgYSByZWNvcmRlciB0aGF0XG4gICAgLy8gY29waWVkIGZpZWxkcyBhdCBhZGQgdGltZSB3b3VsZCBvdGhlcndpc2UgbmV2ZXIgc2VlIHRoZW0gKDkuMjQuMCkuXG4gICAgdGhpcy5fZmlyZVN0YWdlVGFnZ2VkKGN1clNwZWMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExvb3Ag4pSA4pSAXG5cbiAgbG9vcFRvKHN0YWdlSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXJTcGVjLmxvb3BUYXJnZXQpIGZhaWwoYGxvb3BUbyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIubmV4dCkgZmFpbChgY2Fubm90IHNldCBsb29wVG8gd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBpZiAoIXRoaXMuX2tub3duU3RhZ2VJZHMuaGFzKHN0YWdlSWQpKSB7XG4gICAgICBmYWlsKGBsb29wVG8oJyR7c3RhZ2VJZH0nKSB0YXJnZXQgbm90IGZvdW5kIOKAlCBkaWQgeW91IHBhc3MgYSBzdGFnZSBuYW1lIGluc3RlYWQgb2YgaWQ/YCk7XG4gICAgfVxuXG4gICAgY3VyLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCBpc0xvb3BSZWY6IHRydWUgfTtcbiAgICBjdXJTcGVjLmxvb3BUYXJnZXQgPSBzdGFnZUlkO1xuICAgIGN1clNwZWMubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIHR5cGU6ICdsb29wJywgaXNMb29wUmVmZXJlbmNlOiB0cnVlIH07XG5cbiAgICBjb25zdCB0YXJnZXRTdGVwID0gdGhpcy5fc3RhZ2VTdGVwTWFwLmdldChzdGFnZUlkKTtcbiAgICBpZiAodGFyZ2V0U3RlcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYOKGkiBsb29wcyBiYWNrIHRvIHN0ZXAgJHt0YXJnZXRTdGVwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYOKGkiBsb29wcyBiYWNrIHRvICR7c3RhZ2VJZH1gKTtcbiAgICB9XG5cbiAgICAvLyBMNy4zIOKAlCBGaXJlIHRoZSBsb29wIGJhY2stZWRnZSBldmVudC4gRGlzdGluY3QgZnJvbSBgb25FZGdlQWRkZWRgXG4gICAgLy8gYmVjYXVzZSBydW50aW1lIGBvbkxvb3BgIGNhcnJpZXMgYGl0ZXJhdGlvbjogbnVtYmVyYCB3aGljaCBoYXMgbm9cbiAgICAvLyBidWlsZCBtZWFuaW5nIOKAlCBzZXBhcmF0ZSBldmVudCBrZWVwcyBwYXlsb2FkcyBob25lc3QuXG4gICAgdGhpcy5fZmlyZUxvb3BFZGdlQWRkZWQoY3VyLmlkLCBzdGFnZUlkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdHJlYW1pbmcg4pSA4pSAXG5cbiAgb25TdHJlYW0oaGFuZGxlcjogU3RyZWFtVG9rZW5IYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25Ub2tlbiA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbVN0YXJ0KGhhbmRsZXI6IFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zdHJlYW1IYW5kbGVycy5vblN0YXJ0ID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uU3RyZWFtRW5kKGhhbmRsZXI6IFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zdHJlYW1IYW5kbGVycy5vbkVuZCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgT3V0cHV0IOKUgOKUgFxuXG4gIGJ1aWxkKCk6IFJ1bm5hYmxlRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIEw3LjMg4oCUIHNlYWwgdGhlIGNoYXJ0IHNvIHBvc3QtYnVpbGQgYXR0YWNoZXMgdGhyb3cuIFByZXZlbnRzXG4gICAgLy8gcmVjb3JkZXJzIGF0dGFjaGVkIG1pZC1leGVjdXRpb24gZnJvbSBnZXR0aW5nIHBhcnRpYWwgZGF0YS5cbiAgICB0aGlzLl9zZWFsZWQgPSB0cnVlO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuX3Jvb3QgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgY29uc3Qgcm9vdFNwZWMgPSB0aGlzLl9yb290U3BlYyA/PyBmYWlsKCdlbXB0eSBzcGVjOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIHRoaXMuX3N1YmZsb3dEZWZzKSB7XG4gICAgICBzdWJmbG93c1trZXldID0gZGVmO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3ROYW1lID0gdGhpcy5fcm9vdD8ubmFtZSA/PyAnRmxvd0NoYXJ0JztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgRmxvd0NoYXJ0OiAke3Jvb3ROYW1lfVxcblN0ZXBzOlxcbiR7dGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5qb2luKCdcXG4nKX1gIDogJyc7XG5cbiAgICBjb25zdCBjaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICByb290LFxuICAgICAgc3RhZ2VNYXA6IHRoaXMuX3N0YWdlTWFwLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiByb290U3BlYyxcbiAgICAgIC4uLihPYmplY3Qua2V5cyhzdWJmbG93cykubGVuZ3RoID4gMCA/IHsgc3ViZmxvd3MgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9lbmFibGVOYXJyYXRpdmUgPyB7IGVuYWJsZU5hcnJhdGl2ZTogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX2xvZ2dlciA/IHsgbG9nZ2VyOiB0aGlzLl9sb2dnZXIgfSA6IHt9KSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc3RhZ2VEZXNjcmlwdGlvbnM6IG5ldyBNYXAodGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMpLFxuICAgICAgLi4uKHRoaXMuX2lucHV0U2NoZW1hID8geyBpbnB1dFNjaGVtYTogdGhpcy5faW5wdXRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogdGhpcy5fb3V0cHV0U2NoZW1hIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fb3V0cHV0TWFwcGVyID8geyBvdXRwdXRNYXBwZXI6IHRoaXMuX291dHB1dE1hcHBlciB9IDoge30pLFxuICAgICAgLy8gQXV0by1lbWJlZCBUeXBlZFNjb3BlIGZhY3RvcnkgaWYgbm9uZSB3YXMgZXhwbGljaXRseSBzZXQuXG4gICAgICAvLyBUaGlzIG1lYW5zIEFOWSB3YXkgb2YgY3JlYXRpbmcgYSBGbG93Q2hhcnRCdWlsZGVyIChmbG93Q2hhcnQoKSwgbmV3IEZsb3dDaGFydEJ1aWxkZXIoKSxcbiAgICAgIC8vIG9yIGFueSBzdWJjbGFzcykgYXV0b21hdGljYWxseSBnZXRzIFR5cGVkU2NvcGUg4oCUIG5vIG1hbnVhbCBzZXRTY29wZUZhY3RvcnkgbmVlZGVkLlxuICAgICAgc2NvcGVGYWN0b3J5OiB0aGlzLl9zY29wZUZhY3RvcnkgPz8gKGNyZWF0ZVR5cGVkU2NvcGVGYWN0b3J5KCkgYXMgdW5rbm93biBhcyBTY29wZUZhY3Rvcnk8VFNjb3BlPiksXG4gICAgfTtcblxuICAgIHJldHVybiBtYWtlUnVubmFibGUoY2hhcnQpO1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRoZSBzY29wZSBmYWN0b3J5LiBSYXJlbHkgbmVlZGVkIOKAlCBhdXRvLWVtYmVkcyBUeXBlZFNjb3BlIGJ5IGRlZmF1bHQuICovXG4gIHNldFNjb3BlRmFjdG9yeShmYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPik6IHRoaXMge1xuICAgIHRoaXMuX3Njb3BlRmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1NwZWM8VFJlc3VsdCA9IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZT4oKTogVFJlc3VsdCB7XG4gICAgY29uc3Qgcm9vdFNwZWMgPSB0aGlzLl9yb290U3BlYyA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgICByZXR1cm4gcm9vdFNwZWMgYXMgVFJlc3VsdDtcbiAgfVxuXG4gIHRvTWVybWFpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFsnZmxvd2NoYXJ0IFREJ107XG4gICAgY29uc3QgaWRPZiA9IChrOiBzdHJpbmcpID0+IChrIHx8ICcnKS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csICdfJykgfHwgJ18nO1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuXG4gICAgY29uc3Qgd2FsayA9IChuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikgPT4ge1xuICAgICAgY29uc3QgbmlkID0gaWRPZihuLmlkKTtcbiAgICAgIGxpbmVzLnB1c2goYCR7bmlkfVtcIiR7bi5uYW1lfVwiXWApO1xuICAgICAgZm9yIChjb25zdCBjIG9mIG4uY2hpbGRyZW4gfHwgW10pIHtcbiAgICAgICAgY29uc3QgY2lkID0gaWRPZihjLmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke2NpZH1gKTtcbiAgICAgICAgd2FsayhjKTtcbiAgICAgIH1cbiAgICAgIGlmIChuLm5leHQpIHtcbiAgICAgICAgY29uc3QgbWlkID0gaWRPZihuLm5leHQuaWQpO1xuICAgICAgICBsaW5lcy5wdXNoKGAke25pZH0gLS0+ICR7bWlkfWApO1xuICAgICAgICB3YWxrKG4ubmV4dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHJvb3QpO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbHMgKGV4cG9zZWQgZm9yIGhlbHBlciBjbGFzc2VzKSDilIDilIBcblxuICBwcml2YXRlIF9uZWVkQ3Vyc29yKCk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY3Vyc29yID8/IGZhaWwoJ2N1cnNvciB1bmRlZmluZWQ7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvclNwZWMoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHtcbiAgICByZXR1cm4gdGhpcy5fY3Vyc29yU3BlYyA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSBhIGZhbi1vdXQgKGBhZGRMaXN0T2ZGdW5jdGlvbmAsIGBhZGRTdWJGbG93Q2hhcnRgLFxuICAgKiBgYWRkTGF6eVN1YkZsb3dDaGFydGApIGhhbmdzIGl0cyBjaGlsZHJlbiBvbiDigJQgdGhlIGN1cnNvciwgdW5sZXNzIHRoZVxuICAgKiBjdXJzb3IncyBgY2hpbGRyZW5gIGFscmVhZHkgTUVBTiBzb21ldGhpbmcgZWxzZTpcbiAgICpcbiAgICogLSBhIHN1YmZsb3cgTU9VTlQg4oCUIHRoZSBlbmdpbmUgcmVhZHMgYSBtb3VudCB0aGF0IGNhcnJpZXMgY2hpbGRyZW4gYXMgdGhlXG4gICAqICAgbW91bnRlZCBjaGFydCdzIE9XTiBjb250ZW50IChgTm9kZVJlc29sdmVyIMK3IHJlc29sdmVTdWJmbG93UmVmZXJlbmNlYCksXG4gICAqICAgc28gYSBmb3JrIGh1bmcgdGhlcmUgcmFuIElOU0lERSB0aGUgc3ViZmxvdzogdGhlIHN1YmZsb3cncyByZWFsIGNoYXJ0XG4gICAqICAgbmV2ZXIgcmFuLCBldmVyeXRoaW5nIGFmdGVyIHRoZSBmb3JrIHJhbiB0d2ljZSwgYW5kIGEgcGF1c2UgYWZ0ZXIgaXQgd2FzXG4gICAqICAgY2hlY2twb2ludGVkIHVuZGVyIHRoZSB3cm9uZyBzdWJmbG93IHBhdGggKGFuZCByZWZ1c2VkIG9uIHJlc3VtZSk7XG4gICAqIC0gYSBERUNJREVSIG9yIGEgU0VMRUNUT1IgKHRoZSBjdXJzb3IgYWZ0ZXIgYC5lbmQoKWApIOKAlCBpdHMgY2hpbGRyZW4gYXJlXG4gICAqICAgaXRzIGJyYW5jaGVzLCBzbyBhIGZvcmsgY2hpbGQgYmVjYW1lIGEgYnJhbmNoIG5vYm9keSBwaWNrcztcbiAgICogLSBhIGBwYXJhbGxlbEZvckVhY2hgIOKAlCBpdHMgYnJhbmNoZXMgY29tZSBmcm9tIGBpdGVtc2AgYXQgcnVuIHRpbWUgYW5kXG4gICAqICAgYnVpbHQgY2hpbGRyZW4gYXJlIG5ldmVyIGRpc3BhdGNoZWQsIHNvIHRoZSBmb3JrIG5ldmVyIHJhbi5cbiAgICpcbiAgICogVGhyb3VnaCA5LjM3LjAgdGhlIGJ1aWxkZXIgaHVuZyB0aGUgZm9yayB0aGVyZSBhbnl3YXkuIFNvIGFmdGVyIHN1Y2ggYVxuICAgKiBub2RlIHRoZSBmb3JrIGNvbnRpbnVlcyBBRlRFUiBpdDogYSBmdW5jdGlvbi1sZXNzIGZvcmsgbm9kZVxuICAgKiBgPG5vZGVJZD4tZm9ya2AgYmVjb21lcyB0aGUgbm9kZSdzIGBuZXh0YCBhbmQgdGhlIG5ldyBjdXJzb3Ig4oCUIHRoZSBzaGFwZVxuICAgKiBgYWRkRnVuY3Rpb24oLi4uKS5hZGRMaXN0T2ZGdW5jdGlvbiguLi4pYCBhbHJlYWR5IGJ1aWxkcywgd2hpY2ggZXZlcnlcbiAgICogcmVhZGVyIChlbmdpbmUsIHJlc3VtZSwgc3RydWN0dXJlLCBzcGVjKSBoYW5kbGVzLiBBIHNlY29uZCBmYW4tb3V0IGNhbGxcbiAgICogcmV1c2VzIHRoYXQgbm9kZSwgYXMgaXQgd291bGQgYW55IGN1cnNvci4gVGhlIGlkIGlzIHJlc2VydmVkIGJvdGggd2F5czpcbiAgICogcmVmdXNlZCBoZXJlIHdoZW4gYSBzdGFnZSBhbHJlYWR5IGhhcyBpdCwgYW5kIGJ5IHN0YWdlIGFkbWlzc2lvbiAvXG4gICAqIGBfcmVnaXN0ZXJTdWJmbG93RGVmYCB3aGVuIGEgbGF0ZXIgc3RhZ2Ugb3IgbW91bnQgYXNrcyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZWVkRm9ya1BhcmVudCgpOiB7IGN1cjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47IGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB9IHtcbiAgICBjb25zdCBvd25lciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBvd25lclNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IGNoaWxkcmVuTWVhblNvbWV0aGluZ0Vsc2UgPVxuICAgICAgb3duZXIuaXNTdWJmbG93Um9vdCB8fCBvd25lci5pc0R5bmFtaWNQYXJhbGxlbCB8fCBvd25lci5kZWNpZGVyRm4gfHwgb3duZXIuc2VsZWN0b3JGbjtcbiAgICBpZiAoIWNoaWxkcmVuTWVhblNvbWV0aGluZ0Vsc2UpIHJldHVybiB7IGN1cjogb3duZXIsIGN1clNwZWM6IG93bmVyU3BlYyB9O1xuXG4gICAgY29uc3QgaWQgPSBgJHtvd25lci5pZH0tZm9ya2A7XG4gICAgaWYgKHRoaXMuX2lkVGFrZW4oaWQpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgY2Fubm90IGZhbiBvdXQgYWZ0ZXIgJyR7b3duZXIubmFtZX0nOiB0aGUgZm9yayBub2RlIGl0IG5lZWRzLCAnJHtpZH0nLCBgICtcbiAgICAgICAgICBgaXMgYWxyZWFkeSBhIHN0YWdlIGlkLiBBZGQgYSBzdGFnZSBhZnRlciAnJHtvd25lci5uYW1lfScgYW5kIGZhbiBvdXQgZnJvbSBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IGlkLCBpZCB9O1xuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogaWQsIGlkLCB0eXBlOiAnZm9yaycgfTtcbiAgICBvd25lci5uZXh0ID0gbm9kZTtcbiAgICBvd25lclNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG4gICAgdGhpcy5fZm9ya05vZGVJZHMuYWRkKGlkKTtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KG93bmVyU3BlYywgaWQpO1xuICAgIHJldHVybiB7IGN1cjogbm9kZSwgY3VyU3BlYzogc3BlYyB9O1xuICB9XG5cbiAgLyoqIElkcyBgX25lZWRGb3JrUGFyZW50YCBnZW5lcmF0ZWQg4oCUIG5vIGxhdGVyIHN0YWdlIG9yIG1vdW50IG1heSB0YWtlIG9uZS4gKi9cbiAgcHJpdmF0ZSBfZm9ya05vZGVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogU2hhcmVkIGJ5IHN0YWdlIGFkbWlzc2lvbiBhbmQgc3ViZmxvdyByZWdpc3RyYXRpb246IHJlc2VydmVkIHN0cnVjdHVyYWwgaWRzIGNhbm5vdCBiZSByZXVzZWQuICovXG4gIHByaXZhdGUgX3JlZnVzZUZvcmtOb2RlSWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jbGFpbWVkSWRzLmhhcyhpZCkpIHtcbiAgICAgIGZhaWwoYGlkICcke2lkfScgaXMgYWxyZWFkeSB1c2VkIGJ5IGEgbGF6eSBzdWJmbG93IG1vdW50IG9yIGEgcGFyYWxsZWxGb3JFYWNoIGluIHRoaXMgY2hhcnQuIFJlbmFtZSB0aGUgc3RhZ2UuYCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZm9ya05vZGVJZHMuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGZhaWwoXG4gICAgICBgaWQgJyR7aWR9JyBpcyB0YWtlbjogaXQgaXMgdGhlIGZvcmsgbm9kZSB0aGUgYnVpbGRlciBwbGFjZWQgYWZ0ZXIgJyR7aWQuc2xpY2UoMCwgLSctZm9yaycubGVuZ3RoKX0nIGAgK1xuICAgICAgICAnKGEgZmFuLW91dCByaWdodCBhZnRlciBhIHN1YmZsb3cgbW91bnQsIGRlY2lkZXIsIHNlbGVjdG9yIG9yIHBhcmFsbGVsRm9yRWFjaCBjb250aW51ZXMgb24gaXQpLiAnICtcbiAgICAgICAgJ1JlbmFtZSB0aGUgc3RhZ2UuJyxcbiAgICApO1xuICB9XG5cbiAgLyoqIElkcyB0aGUgbGF6eS1tb3VudCBhbmQgcGFyYWxsZWxGb3JFYWNoIGRvb3JzIGNsYWltZWQgKHRoZXkgcmVnaXN0ZXIgaW4gbm8gbWFwKS4gKi9cbiAgcHJpdmF0ZSBfY2xhaW1lZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBTdHJ1Y3R1cmFsIGRlY2xhcmF0aW9ucyB3aXRob3V0IGFuIGVtYmVkZGVkIGZ1bmN0aW9uOyBub3QgZnVuY3Rpb24gZW50cmllcyBvciBsb29wIHRhcmdldHMuICovXG4gIHByaXZhdGUgX2Z1bmN0aW9ubGVzc1N0YWdlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIFRydWUgd2hlbiBhbiBlYXJsaWVyIHN0YWdlLCBicmFuY2gsIGZvcmsgY2hpbGQsIG1vdW50IG9yIGdlbmVyYXRlZCBmb3JrIG5vZGUgaG9sZHMgYGlkYC4gKi9cbiAgcHJpdmF0ZSBfaWRUYWtlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuaGFzKGlkKSB8fFxuICAgICAgdGhpcy5fc3RhZ2VNYXAuaGFzKGlkKSB8fFxuICAgICAgdGhpcy5fZnVuY3Rpb25sZXNzU3RhZ2VJZHMuaGFzKGlkKSB8fFxuICAgICAgdGhpcy5fc3ViZmxvd0RlZnMuaGFzKGlkKSB8fFxuICAgICAgdGhpcy5fY2xhaW1lZElkcy5oYXMoaWQpIHx8XG4gICAgICB0aGlzLl9mb3JrTm9kZUlkcy5oYXMoaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgVGhlIGxhenktbW91bnQgZG9vcnMgYW5kIGBhZGRQYXJhbGxlbEZvckVhY2hgIHJlZ2lzdGVyIHRoZWlyIGlkXG4gICAqIGluIG5vIG1hcCwgc28gdGhyb3VnaCA5LjM3LjAgdGhleSBhY2NlcHRlZCBhbiBpZCBhbm90aGVyIHN0YWdlIG9yIG1vdW50XG4gICAqIGFscmVhZHkgaGFkIChhbmQgYSBsYXRlciBzdGFnZSBjb3VsZCB0YWtlIHRoZWlycykuIFRoZXkgY2xhaW0gaXQgaGVyZTpcbiAgICogcmVmdXNlZCB3aGVuIHRha2VuLCByZWNvcmRlZCB3aGVuIGZyZXNoLiBMb29wLXJlZiBzdHVicyByZWZlcmVuY2UgYW5cbiAgICogZXhpc3Rpbmcgc3RhZ2UgcmF0aGVyIHRoYW4gY2xhaW1pbmcgYSBuZXcgaWQuIFJldXNhYmxlIGZ1bmN0aW9uIHN0YWdlc1xuICAgKiByZXRhaW4gdGhlaXIgc2VwYXJhdGUgYF9hZGRUb01hcGAgcnVsZS5cbiAgICovXG4gIF9jbGFpbUZyZXNoSWQoaWQ6IHN0cmluZywgZG9vcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lkVGFrZW4oaWQpKSB7XG4gICAgICBmYWlsKGAke2Rvb3J9OiBpZCAnJHtpZH0nIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIHN0YWdlIG9yIG1vdW50IGluIHRoaXMgY2hhcnQuIEdpdmUgaXQgaXRzIG93biBpZC5gKTtcbiAgICB9XG4gICAgdGhpcy5fY2xhaW1lZElkcy5hZGQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgdGhlIHNwZWMgY3Vyc29yLiBSZXRhaW5lZCBhcyBhIG1ldGhvZCBzbyBjYWxsIHNpdGVzIHN0YXlcbiAgICogb25lLWxpbmVycyBhbmQgZnV0dXJlIGN1cnNvci1yZWxhdGVkIHNpZGUgZWZmZWN0cyBoYXZlIGEgaG9vay5cbiAgICovXG4gIC8qKlxuICAgKiBXaGF0IHdhcyBhdHRhY2hlZCB0byB0aGUgQ1VSU09SIHdpdGhvdXQgYWR2YW5jaW5nIGl0IOKAlCBhIHN1YmZsb3cgbW91bnQsIGFcbiAgICogcGFyYWxsZWwgZm9yaydzIGNoaWxkcmVuLiBDbGVhcmVkIGJ5IHtAbGluayBfYWR2YW5jZUN1cnNvclNwZWN9LCB0aGUgc2luZ2xlXG4gICAqIGNob2tlIHBvaW50IGV2ZXJ5IGN1cnNvci1hZHZhbmNpbmcgbWV0aG9kIGFscmVhZHkgZ29lcyB0aHJvdWdoLCBzbyB0aGlzXG4gICAqIG1hcmtlciBjYW5ub3QgZHJpZnQgYXMgbmV3IGJ1aWxkZXIgbWV0aG9kcyBhcmUgYWRkZWQuXG4gICAqXG4gICAqIEV4aXN0cyBmb3IgYC5yZXRyeSgpYC4gVGhvc2UgbWV0aG9kcyBoYW5nIGNoaWxkcmVuIG9mZiB0aGUgY3VycmVudCBzdGFnZVxuICAgKiBhbmQgbGVhdmUgdGhlIGN1cnNvciBwb2ludGluZyBhdCB0aGF0IHN0YWdlLCBzbyBhIGNoYWluZWQgYC5yZXRyeSgpYCB3b3VsZFxuICAgKiBzaWxlbnRseSBhdHRhY2ggdGhlIHBvbGljeSB0byB0aGUgc3RhZ2UgQkVGT1JFIHRoZSB0aGluZyB5b3UganVzdCB3cm90ZSDigJRcbiAgICogZXhhY3RseSB0aGUgc2lsZW50IG1pcy1hdHRyaWJ1dGlvbiB0aGlzIGNvZGViYXNlIHJlZnVzZXMgZWxzZXdoZXJlIChzZWVcbiAgICogdGhlIGJyYW5jaC1zZWdtZW50IG1hcmtlciBydWxlcykuIE5hbWluZyB3aGF0IHdhcyBsYXN0IGFkZGVkIGxldHMgdGhlXG4gICAqIHJlZnVzYWwgc2F5IHNvbWV0aGluZyB1c2VmdWwuXG4gICAqL1xuICBwcml2YXRlIF9jdXJzb3JUYWlsPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2FkdmFuY2VDdXJzb3JTcGVjKG5ld1NwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnNvclRhaWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IG5ld1NwZWM7XG4gIH1cblxuICBfc3RhZ2VNYXBIYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VNYXAuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIFJlZ2lzdGVyIGEgbW91bnRlZCBzdWJmbG93J3MgZGVmaW5pdGlvbiDigJQgZmlyc3QgbW91bnQgd2lucyxcbiAgICogYXQgZXZlcnkgZWFnZXIgbW91bnQgc2l0ZSAobGluZWFyLCBmb3JrIGNoaWxkLCBkZWNpZGVyIGFuZCBzZWxlY3RvclxuICAgKiBicmFuY2gpLiBBIFNFQ09ORCBtb3VudCB1bmRlciB0aGUgc2FtZSBpZCBpcyBhbGxvd2VkIChleGlzdGluZyBjaGFydHMgZG9cbiAgICogaXQpIGFuZCBzaGFyZXMgdGhlIGZpcnN0IG9uZSdzIGRlZmluaXRpb24g4oCUIGJ1dCBhIHBhdXNlIGluc2lkZSBlaXRoZXJcbiAgICogY2Fubm90IGJlIHJlc3VtZWQ6IGEgY2hlY2twb2ludCdzIGBzdWJmbG93UGF0aGAgbmFtZXMgdGhlIHN1YmZsb3cgaWQsIG5vdFxuICAgKiB0aGUgbW91bnQsIHNvIGByZXN1bWUoKWAgcmVmdXNlcyB0aGUgYW1iaWd1b3VzIHBhdGguIERldiBtb2RlIHNheXMgc29cbiAgICogaGVyZSwgYXQgYnVpbGQgdGltZSwgd2hlcmUgdGhlIGlkIGNhbiBzdGlsbCBiZSBjaGFuZ2VkLlxuICAgKi9cbiAgX3JlZ2lzdGVyU3ViZmxvd0RlZihpZDogc3RyaW5nLCByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IHZvaWQge1xuICAgIHRoaXMuX3JlZnVzZUZvcmtOb2RlSWQoaWQpO1xuICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3QgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIHN1YmZsb3cgaWQgJyR7aWR9JyBpcyBtb3VudGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoaXMgY2hhcnQuIFRoZSBtb3VudHMgc2hhcmUgb25lIGAgK1xuICAgICAgICAgICdkZWZpbml0aW9uLCBhbmQgYSBwYXVzZSBpbnNpZGUgZWl0aGVyIGNhbm5vdCBiZSByZXN1bWVkIOKAlCB0aGUgY2hlY2twb2ludCBjYW5ub3Qgc2F5IHdoaWNoIG1vdW50ICcgK1xuICAgICAgICAgICdwYXVzZWQuIEdpdmUgZWFjaCBtb3VudCBpdHMgb3duIGlkLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgT25lIGFkbWlzc2lvbiBwYXRoIGZvciBvcHRpb25hbC1mdW5jdGlvbiBjaGlsZHJlbiBhbmQgYnJhbmNoZXMuXG4gICAqIEEgbWlzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBlcmFzZSB0aGUgZ3JhcGggaWRlbnRpdHk6IGNoZWNrIHJlc2VydmF0aW9uc1xuICAgKiBhbmQgcmVjb3JkIGl0IGZvciBmdXR1cmUgZnJlc2gtaWQgY2xhaW1zLCB3aXRob3V0IGFkZGluZyBhIGZ1bmN0aW9uIG9yIGFcbiAgICogbG9vcCB0YXJnZXQuIEV4aXN0aW5nIGZ1bmN0aW9uIHJlZmVyZW5jZXMgYnkgaWQvbmFtZSByZW1haW4gbGVnYWwuXG4gICAqL1xuICBfcmVnaXN0ZXJTdGFnZShpZDogc3RyaW5nLCBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKGZuKSB7XG4gICAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZWZ1c2VGb3JrTm9kZUlkKGlkKTtcbiAgICB0aGlzLl9mdW5jdGlvbmxlc3NTdGFnZUlkcy5hZGQoaWQpO1xuICB9XG5cbiAgX2FkZFRvTWFwKGlkOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pIHtcbiAgICB0aGlzLl9yZWZ1c2VGb3JrTm9kZUlkKGlkKTtcbiAgICBpZiAodGhpcy5fc3RhZ2VNYXAuaGFzKGlkKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zdGFnZU1hcC5nZXQoaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSBmbikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIGZvciBpZCAnJHtpZH0nYCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YWdlTWFwLnNldChpZCwgZm4pO1xuICB9XG5cbiAgX21lcmdlU3RhZ2VNYXAob3RoZXI6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4sIHByZWZpeD86IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG90aGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBqb2luUGF0aChwcmVmaXgsIGspIDogaztcbiAgICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgIT09IHYpIGZhaWwoYHN0YWdlTWFwIGNvbGxpc2lvbiB3aGlsZSBtb3VudGluZyBmbG93Y2hhcnQgYXQgJyR7a2V5fSdgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YWdlTWFwLnNldChrZXksIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IE1PVU5UIHRpbWUg4oCUIHRoZSBvbmVcbiAgICogcHJlZml4ZXIsIGBlbmdpbmUvZ3JhcGgvcHJlZml4Tm9kZVRyZWUudHNgICh0aGUgdHJhdmVyc2VyIGNhbGxzIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGF0IFJVTiB0aW1lKS4gS2VwdCBhcyB0aGUgYnVpbGRlcidzIGRvb3IgZm9yIGl0cyBtb3VudCBzaXRlcy5cbiAgICovXG4gIF9wcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHByZWZpeE5vZGVUcmVlKG5vZGUsIHByZWZpeCk7XG4gIH1cblxuICAvKipcbiAgICogVEhFIG1vdW50IG9mIGEgc3ViZmxvdyBjaGFydCB1bmRlciBgaWRgIChGMTApIOKAlCBldmVyeSBlYWdlciBtb3VudCBzaXRlXG4gICAqIChgYWRkU3ViRmxvd0NoYXJ0YCwgYGFkZFN1YkZsb3dDaGFydE5leHRgLCBhIGRlY2lkZXIvc2VsZWN0b3JcbiAgICogYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIGdvZXMgdGhyb3VnaCBpdCwgYW5kIGl0IGlzIHRoZSBvbmUgY2FsbGVyIG9mIHRoZVxuICAgKiBwcmVmaXhlci4gSW4gb3JkZXI6IHJlZ2lzdGVyIHRoZSBjaGFydCdzIHByZWZpeGVkIHJvb3QgdW5kZXIgYGlkYDtcbiAgICogYHBsYWNlYCB0aGUgbW91bnQncyBvd24gbm9kZSArIHNwZWMgYW5kIGZpcmUgaXRzIHN0cnVjdHVyZSBldmVudHM7IG1lcmdlXG4gICAqIHRoZSBjaGFydCdzIHN0YWdlIG1hcCB1bmRlciBgaWRgOyByZWdpc3RlciBpdHMgbmVzdGVkIHN1YmZsb3dzIHVuZGVyXG4gICAqIGBpZC88a2V5PmAgKGEga2V5IGFscmVhZHkgcmVnaXN0ZXJlZCBpcyBrZXB0KS5cbiAgICovXG4gIF9tb3VudFN1YmZsb3coaWQ6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PiwgcGxhY2U6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmVmaXhlZCA9IChyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikgPT4gdGhpcy5fcHJlZml4Tm9kZVRyZWUocm9vdCwgaWQpO1xuICAgIHRoaXMuX3JlZ2lzdGVyU3ViZmxvd0RlZihpZCwgcHJlZml4ZWQoc3ViZmxvdy5yb290KSk7XG4gICAgcGxhY2UoKTtcbiAgICB0aGlzLl9tZXJnZVN0YWdlTWFwKHN1YmZsb3cuc3RhZ2VNYXAsIGlkKTtcbiAgICBpZiAoIXN1YmZsb3cuc3ViZmxvd3MpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvdy5zdWJmbG93cykpIHtcbiAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgoaWQsIGtleSk7XG4gICAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhwcmVmaXhlZEtleSkpIHtcbiAgICAgICAgdGhpcy5fc3ViZmxvd0RlZnMuc2V0KHByZWZpeGVkS2V5LCB7IHJvb3Q6IHByZWZpeGVkKGRlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGYWN0b3J5IEZ1bmN0aW9uXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTdGFydCBhIGZsb3djaGFydCB3aXRoIGl0cyBmaXJzdCBzdGFnZTsgcmV0dXJucyBhIGZsdWVudCBidWlsZGVyLlxuICpcbiAqIENoYWluIGAuYWRkRnVuY3Rpb24oKWAgLyBgLmFkZERlY2lkZXJGdW5jdGlvbigpYCAvIGAuYWRkU2VsZWN0b3JGdW5jdGlvbigpYCAvXG4gKiBgLmFkZFN1YkZsb3dDaGFydCgpYCBldGMuIHRvIGFkZCBtb3JlIHN0YWdlcywgdGhlbiBmaW5pc2ggd2l0aCBgLmJ1aWxkKClgLlxuICpcbiAqIEBwYXJhbSBuYW1lICAgIEh1bWFuLXJlYWRhYmxlIGRpc3BsYXkgbGFiZWwgZm9yIHRoZSBzdGFnZSAoc2hvd24gaW4gdGhlIG5hcnJhdGl2ZS90cmFjZSkuXG4gKiBAcGFyYW0gZm4gICAgICBUaGUgc3RhZ2UncyB3b3JrIOKAlCBhIGAoc2NvcGUpID0+IOKApmAgZnVuY3Rpb24sIG9yIGEgYFBhdXNhYmxlSGFuZGxlcmAgZm9yIGh1bWFuLWluLXRoZS1sb29wIHBhdXNlcy5cbiAqIEBwYXJhbSBpZCAgICAgIFN0YWJsZSBzdGFnZSBpZCB1c2VkIGluIHRyYWNlcywgdGhlIGNvbW1pdCBsb2csIGFuZCBgcnVudGltZVN0YWdlSWRgLiBLZWVwIGl0IHVuaXF1ZSB3aXRoaW4gdGhlIGNoYXJ0LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYHsgZGVzY3JpcHRpb24/LCBzdHJ1Y3R1cmVSZWNvcmRlcnM/IH1gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjaGFydCA9IGZsb3dDaGFydDxTdGF0ZT4oJ0ZldGNoVXNlcicsIGFzeW5jIChzY29wZSkgPT4ge1xuICogICBzY29wZS51c2VyID0gYXdhaXQgZ2V0VXNlcigpO1xuICogfSwgJ2ZldGNoLXVzZXInKVxuICogICAuYWRkRnVuY3Rpb24oJ1Byb2Nlc3MnLCBwcm9jZXNzRm4sICdwcm9jZXNzJylcbiAqICAgLmJ1aWxkKCk7XG4gKlxuICogY29uc3QgdHJhY2UgPSBuYXJyYXRpdmUoKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoYXJ0LnJlY29yZGVyKHRyYWNlKS5ydW4oKTtcbiAqIGNvbnNvbGUubG9nKHRyYWNlLmdldEVudHJpZXMoKS5tYXAoKGUpID0+IGUudGV4dCkuam9pbignXFxuJykpO1xuICovXG4vLyBPdmVybG9hZCAxOiB0eXBlZCBzdGF0ZSB3aXRoIG9wdGlvbnMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUU3RhdGUgZXh0ZW5kcyBvYmplY3Q+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBUeXBlZFN0YWdlRnVuY3Rpb248VFN0YXRlPiB8IFBhdXNhYmxlSGFuZGxlcjxUeXBlZFNjb3BlPFRTdGF0ZT4+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8YW55LCBUeXBlZFNjb3BlPFRTdGF0ZT4+O1xuXG4vLyBPdmVybG9hZCAyOiBleHBsaWNpdCBnZW5lcmljcyB3aXRoIG9wdGlvbnMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT47XG5cbi8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiDigJQgYWNjZXB0cyB0aGUgb3B0aW9ucyBiYWcgKG9yIHVuZGVmaW5lZCkuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+KCk7XG4gIC8vIEF0dGFjaCBTdHJ1Y3R1cmVSZWNvcmRlcnMgQkVGT1JFIHN0YXJ0KCkgc28gdGhlIHNlZWQgZXZlbnQgZmlyZXMgdGhyb3VnaFxuICAvLyB0aGUgbm9ybWFsIGRpc3BhdGNoZXIgcGF0aCAobm8gcmVwbGF5IG5lZWRlZCkuIEl0ZXJhdGlvbiBvcmRlciBtYXRjaGVzXG4gIC8vIGFycmF5IG9yZGVyLCBtYXRjaGluZyB0aGUgZmx1ZW50IGAuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIoKWAgY2hhaW5cbiAgLy8gc2VtYW50aWNzLlxuICBpZiAob3B0aW9ucz8uc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgZm9yIChjb25zdCByZWMgb2Ygb3B0aW9ucy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICAgIGJ1aWxkZXIuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1aWxkZXIuc3RhcnQobmFtZSwgZm4gYXMgYW55LCBpZCwgb3B0aW9ucz8uZGVzY3JpcHRpb24sIHtcbiAgICAuLi4ob3B0aW9ucz8ucmV0cnkgJiYgeyByZXRyeTogb3B0aW9ucy5yZXRyeSB9KSxcbiAgICAuLi4ob3B0aW9ucz8udGFncyAmJiB7IHRhZ3M6IG9wdGlvbnMudGFncyB9KSxcbiAgfSk7XG59XG5cbi8qKlxuICogTGlrZSBgZmxvd0NoYXJ0KClgLCBidXQgdGhlIFJPT1Qgc3RhZ2UgaXMgYSBTRUxFQ1RPUiDigJQgaXQgcnVucyBmaXJzdCBhbmRcbiAqIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gaXQgKG5vIHNlcGFyYXRlIHNlZWQgc3RhZ2UpLiBSZXR1cm5zIGFcbiAqIGBTZWxlY3RvckZuTGlzdGA7IGRlY2xhcmUgYnJhbmNoZXMgdGhlbiBjYWxsIGAuZW5kKClgIHRvIGdldCB0aGUgYnVpbGRlclxuICogYmFjayBmb3IgYW55IHN1YnNlcXVlbnQgc3RhZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGZsb3dDaGFydFNlbGVjdG9yPE15U3RhdGU+KCdDb250ZXh0JywgY29udGV4dFNlbGVjdG9yRm4sICdjb250ZXh0JylcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1zeXN0ZW0tcHJvbXB0Jywgc3lzU2xvdCwgJ1N5c3RlbSBQcm9tcHQnLCB7Li4ufSlcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1tZXNzYWdlcycsIG1zZ1Nsb3QsICdNZXNzYWdlcycsIHsuLi59KVxuICogICAgIC5lbmQoKVxuICogICAgIC5hZGRGdW5jdGlvbignbWVzc2FnZUFQSScsIGFzc2VtYmxlRm4sICdtZXNzYWdlLWFwaScpXG4gKiAgICAgLmJ1aWxkKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnRTZWxlY3RvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgaWYgKG9wdGlvbnM/LnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG9wdGlvbnMuc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgICBidWlsZGVyLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWlsZGVyLnN0YXJ0U2VsZWN0b3IobmFtZSwgZm4sIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbiwge1xuICAgIC4uLihvcHRpb25zPy5mYWlsRmFzdCAhPT0gdW5kZWZpbmVkICYmIHsgZmFpbEZhc3Q6IG9wdGlvbnMuZmFpbEZhc3QgfSksXG4gICAgLi4uKG9wdGlvbnM/LnJldHJ5ICYmIHsgcmV0cnk6IG9wdGlvbnMucmV0cnkgfSksXG4gICAgLi4uKG9wdGlvbnM/LnRhZ3MgJiYgeyB0YWdzOiBvcHRpb25zLnRhZ3MgfSksXG4gIH0pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNwZWMgdG8gU3RhZ2VOb2RlIENvbnZlcnRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBzcGVjVG9TdGFnZU5vZGUoc3BlYzogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4ge1xuICBjb25zdCBpbmZsYXRlID0gKHM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+ID0+ICh7XG4gICAgbmFtZTogcy5uYW1lLFxuICAgIGlkOiBzLmlkLFxuICAgIGNoaWxkcmVuOiBzLmNoaWxkcmVuPy5sZW5ndGggPyBzLmNoaWxkcmVuLm1hcChpbmZsYXRlKSA6IHVuZGVmaW5lZCxcbiAgICBuZXh0OiBzLm5leHQgPyBpbmZsYXRlKHMubmV4dCkgOiB1bmRlZmluZWQsXG4gIH0pO1xuICByZXR1cm4gaW5mbGF0ZShzcGVjKTtcbn1cbiJdfQ==