@dollhousemcp/mcp-server 1.3.0 → 1.3.2

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 (623) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +12 -12
  3. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  4. package/dist/server/tools/CollectionTools.js +47 -2
  5. package/package.json +1 -1
  6. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  7. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  8. package/dist/collection/MarketplaceBrowser.js +0 -115
  9. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  10. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  11. package/dist/collection/MarketplaceSearch.js +0 -48
  12. package/dist/collection/PersonaInstaller.d.ts +0 -26
  13. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  14. package/dist/collection/PersonaInstaller.js +0 -103
  15. package/dist/marketplace/GitHubClient.d.ts +0 -22
  16. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  17. package/dist/marketplace/GitHubClient.js +0 -112
  18. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  19. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  20. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  21. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  22. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  23. package/dist/marketplace/MarketplaceSearch.js +0 -48
  24. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  25. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  26. package/dist/marketplace/PersonaDetails.js +0 -71
  27. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  28. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  29. package/dist/marketplace/PersonaInstaller.js +0 -100
  30. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  31. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  32. package/dist/marketplace/PersonaSubmitter.js +0 -57
  33. package/dist/marketplace/index.d.ts +0 -10
  34. package/dist/marketplace/index.d.ts.map +0 -1
  35. package/dist/marketplace/index.js +0 -10
  36. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  37. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  38. package/dist/server/tools/MarketplaceTools.js +0 -96
  39. package/dist/src/cache/APICache.d.ts +0 -23
  40. package/dist/src/cache/APICache.d.ts.map +0 -1
  41. package/dist/src/cache/APICache.js +0 -42
  42. package/dist/src/cache/index.d.ts +0 -5
  43. package/dist/src/cache/index.d.ts.map +0 -1
  44. package/dist/src/cache/index.js +0 -5
  45. package/dist/src/config/constants.d.ts +0 -25
  46. package/dist/src/config/constants.d.ts.map +0 -1
  47. package/dist/src/config/constants.js +0 -30
  48. package/dist/src/config/index.d.ts +0 -6
  49. package/dist/src/config/index.d.ts.map +0 -1
  50. package/dist/src/config/index.js +0 -6
  51. package/dist/src/config/indicator-config.d.ts +0 -107
  52. package/dist/src/config/indicator-config.d.ts.map +0 -1
  53. package/dist/src/config/indicator-config.js +0 -158
  54. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  55. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  56. package/dist/src/constants/defaultPersonas.js +0 -18
  57. package/dist/src/constants/limits.d.ts +0 -10
  58. package/dist/src/constants/limits.d.ts.map +0 -1
  59. package/dist/src/constants/limits.js +0 -13
  60. package/dist/src/errors/SecurityError.d.ts +0 -29
  61. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  62. package/dist/src/errors/SecurityError.js +0 -47
  63. package/dist/src/errors/index.d.ts +0 -2
  64. package/dist/src/errors/index.d.ts.map +0 -1
  65. package/dist/src/errors/index.js +0 -2
  66. package/dist/src/index.barrel.d.ts +0 -21
  67. package/dist/src/index.barrel.d.ts.map +0 -1
  68. package/dist/src/index.barrel.js +0 -31
  69. package/dist/src/index.d.ts +0 -220
  70. package/dist/src/index.d.ts.map +0 -1
  71. package/dist/src/index.js +0 -1559
  72. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  73. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  74. package/dist/src/marketplace/GitHubClient.js +0 -112
  75. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  76. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  77. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  78. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  79. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  80. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  81. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  82. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  83. package/dist/src/marketplace/PersonaDetails.js +0 -71
  84. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  85. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  86. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  87. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  88. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  89. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  90. package/dist/src/marketplace/index.d.ts +0 -10
  91. package/dist/src/marketplace/index.d.ts.map +0 -1
  92. package/dist/src/marketplace/index.js +0 -10
  93. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  94. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  95. package/dist/src/persona/PersonaLoader.js +0 -139
  96. package/dist/src/persona/PersonaManager.d.ts +0 -112
  97. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  98. package/dist/src/persona/PersonaManager.js +0 -341
  99. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  100. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  101. package/dist/src/persona/PersonaValidator.js +0 -157
  102. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  103. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  104. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  105. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  106. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  107. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  108. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  109. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  110. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  111. package/dist/src/persona/export-import/index.d.ts +0 -10
  112. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  113. package/dist/src/persona/export-import/index.js +0 -7
  114. package/dist/src/persona/index.d.ts +0 -7
  115. package/dist/src/persona/index.d.ts.map +0 -1
  116. package/dist/src/persona/index.js +0 -7
  117. package/dist/src/security/InputValidator.d.ts +0 -69
  118. package/dist/src/security/InputValidator.d.ts.map +0 -1
  119. package/dist/src/security/InputValidator.js +0 -381
  120. package/dist/src/security/commandValidator.d.ts +0 -7
  121. package/dist/src/security/commandValidator.d.ts.map +0 -1
  122. package/dist/src/security/commandValidator.js +0 -77
  123. package/dist/src/security/constants.d.ts +0 -21
  124. package/dist/src/security/constants.d.ts.map +0 -1
  125. package/dist/src/security/constants.js +0 -23
  126. package/dist/src/security/contentValidator.d.ts +0 -47
  127. package/dist/src/security/contentValidator.d.ts.map +0 -1
  128. package/dist/src/security/contentValidator.js +0 -188
  129. package/dist/src/security/fileLockManager.d.ts +0 -70
  130. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  131. package/dist/src/security/fileLockManager.js +0 -187
  132. package/dist/src/security/index.d.ts +0 -12
  133. package/dist/src/security/index.d.ts.map +0 -1
  134. package/dist/src/security/index.js +0 -14
  135. package/dist/src/security/pathValidator.d.ts +0 -9
  136. package/dist/src/security/pathValidator.d.ts.map +0 -1
  137. package/dist/src/security/pathValidator.js +0 -97
  138. package/dist/src/security/secureYamlParser.d.ts +0 -46
  139. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  140. package/dist/src/security/secureYamlParser.js +0 -203
  141. package/dist/src/security/securityMonitor.d.ts +0 -58
  142. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  143. package/dist/src/security/securityMonitor.js +0 -108
  144. package/dist/src/security/tokenManager.d.ts +0 -59
  145. package/dist/src/security/tokenManager.d.ts.map +0 -1
  146. package/dist/src/security/tokenManager.js +0 -216
  147. package/dist/src/security/yamlValidator.d.ts +0 -20
  148. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  149. package/dist/src/security/yamlValidator.js +0 -138
  150. package/dist/src/server/ServerSetup.d.ts +0 -31
  151. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  152. package/dist/src/server/ServerSetup.js +0 -79
  153. package/dist/src/server/index.d.ts +0 -7
  154. package/dist/src/server/index.d.ts.map +0 -1
  155. package/dist/src/server/index.js +0 -7
  156. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  157. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  158. package/dist/src/server/tools/ConfigTools.js +0 -63
  159. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  160. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  161. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  162. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  163. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  164. package/dist/src/server/tools/PersonaTools.js +0 -257
  165. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  166. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  167. package/dist/src/server/tools/ToolRegistry.js +0 -40
  168. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  169. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  170. package/dist/src/server/tools/UpdateTools.js +0 -64
  171. package/dist/src/server/tools/UserTools.d.ts +0 -10
  172. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  173. package/dist/src/server/tools/UserTools.js +0 -51
  174. package/dist/src/server/tools/index.d.ts +0 -10
  175. package/dist/src/server/tools/index.d.ts.map +0 -1
  176. package/dist/src/server/tools/index.js +0 -10
  177. package/dist/src/server/types.d.ts +0 -34
  178. package/dist/src/server/types.d.ts.map +0 -1
  179. package/dist/src/server/types.js +0 -5
  180. package/dist/src/tools/debug.d.ts +0 -20
  181. package/dist/src/tools/debug.d.ts.map +0 -1
  182. package/dist/src/tools/debug.js +0 -37
  183. package/dist/src/types/cache.d.ts +0 -8
  184. package/dist/src/types/cache.d.ts.map +0 -1
  185. package/dist/src/types/cache.js +0 -5
  186. package/dist/src/types/index.d.ts +0 -8
  187. package/dist/src/types/index.d.ts.map +0 -1
  188. package/dist/src/types/index.js +0 -8
  189. package/dist/src/types/marketplace.d.ts +0 -23
  190. package/dist/src/types/marketplace.d.ts.map +0 -1
  191. package/dist/src/types/marketplace.js +0 -5
  192. package/dist/src/types/mcp.d.ts +0 -161
  193. package/dist/src/types/mcp.d.ts.map +0 -1
  194. package/dist/src/types/mcp.js +0 -75
  195. package/dist/src/types/persona.d.ts +0 -30
  196. package/dist/src/types/persona.d.ts.map +0 -1
  197. package/dist/src/types/persona.js +0 -5
  198. package/dist/src/update/BackupManager.d.ts +0 -46
  199. package/dist/src/update/BackupManager.d.ts.map +0 -1
  200. package/dist/src/update/BackupManager.js +0 -261
  201. package/dist/src/update/DependencyChecker.d.ts +0 -41
  202. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  203. package/dist/src/update/DependencyChecker.js +0 -132
  204. package/dist/src/update/RateLimiter.d.ts +0 -80
  205. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  206. package/dist/src/update/RateLimiter.js +0 -172
  207. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  208. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  209. package/dist/src/update/SignatureVerifier.js +0 -214
  210. package/dist/src/update/UpdateChecker.d.ts +0 -127
  211. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  212. package/dist/src/update/UpdateChecker.js +0 -460
  213. package/dist/src/update/UpdateManager.d.ts +0 -41
  214. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  215. package/dist/src/update/UpdateManager.js +0 -260
  216. package/dist/src/update/VersionManager.d.ts +0 -31
  217. package/dist/src/update/VersionManager.d.ts.map +0 -1
  218. package/dist/src/update/VersionManager.js +0 -134
  219. package/dist/src/update/index.d.ts +0 -9
  220. package/dist/src/update/index.d.ts.map +0 -1
  221. package/dist/src/update/index.js +0 -9
  222. package/dist/src/utils/filesystem.d.ts +0 -32
  223. package/dist/src/utils/filesystem.d.ts.map +0 -1
  224. package/dist/src/utils/filesystem.js +0 -73
  225. package/dist/src/utils/git.d.ts +0 -32
  226. package/dist/src/utils/git.d.ts.map +0 -1
  227. package/dist/src/utils/git.js +0 -65
  228. package/dist/src/utils/index.d.ts +0 -7
  229. package/dist/src/utils/index.d.ts.map +0 -1
  230. package/dist/src/utils/index.js +0 -7
  231. package/dist/src/utils/logger.d.ts +0 -45
  232. package/dist/src/utils/logger.d.ts.map +0 -1
  233. package/dist/src/utils/logger.js +0 -91
  234. package/dist/src/utils/version.d.ts +0 -25
  235. package/dist/src/utils/version.d.ts.map +0 -1
  236. package/dist/src/utils/version.js +0 -97
  237. package/dist/test/src/cache/APICache.d.ts +0 -23
  238. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  239. package/dist/test/src/cache/APICache.js +0 -42
  240. package/dist/test/src/cache/index.d.ts +0 -5
  241. package/dist/test/src/cache/index.d.ts.map +0 -1
  242. package/dist/test/src/cache/index.js +0 -5
  243. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  244. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  245. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  246. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  247. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  248. package/dist/test/src/collection/CollectionSearch.js +0 -48
  249. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  250. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  251. package/dist/test/src/collection/GitHubClient.js +0 -114
  252. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  253. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  254. package/dist/test/src/collection/PersonaDetails.js +0 -71
  255. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  256. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  257. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  258. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  259. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  260. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  261. package/dist/test/src/collection/index.d.ts +0 -10
  262. package/dist/test/src/collection/index.d.ts.map +0 -1
  263. package/dist/test/src/collection/index.js +0 -10
  264. package/dist/test/src/config/constants.d.ts +0 -25
  265. package/dist/test/src/config/constants.d.ts.map +0 -1
  266. package/dist/test/src/config/constants.js +0 -30
  267. package/dist/test/src/config/index.d.ts +0 -6
  268. package/dist/test/src/config/index.d.ts.map +0 -1
  269. package/dist/test/src/config/index.js +0 -6
  270. package/dist/test/src/config/indicator-config.d.ts +0 -107
  271. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  272. package/dist/test/src/config/indicator-config.js +0 -158
  273. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  274. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  275. package/dist/test/src/constants/defaultPersonas.js +0 -18
  276. package/dist/test/src/constants/limits.d.ts +0 -10
  277. package/dist/test/src/constants/limits.d.ts.map +0 -1
  278. package/dist/test/src/constants/limits.js +0 -13
  279. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  280. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  281. package/dist/test/src/elements/BaseElement.js +0 -381
  282. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  283. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  284. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  285. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  286. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  287. package/dist/test/src/elements/agents/Agent.js +0 -848
  288. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  289. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  290. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  291. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  292. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  293. package/dist/test/src/elements/agents/constants.js +0 -45
  294. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  295. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  296. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  297. package/dist/test/src/elements/agents/index.d.ts +0 -8
  298. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  299. package/dist/test/src/elements/agents/index.js +0 -8
  300. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  301. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  302. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  303. package/dist/test/src/elements/agents/types.d.ts +0 -97
  304. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  305. package/dist/test/src/elements/agents/types.js +0 -5
  306. package/dist/test/src/elements/index.d.ts +0 -6
  307. package/dist/test/src/elements/index.d.ts.map +0 -1
  308. package/dist/test/src/elements/index.js +0 -6
  309. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  310. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  311. package/dist/test/src/elements/memories/Memory.js +0 -470
  312. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  313. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  314. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  315. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  316. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  317. package/dist/test/src/elements/memories/constants.js +0 -49
  318. package/dist/test/src/elements/memories/index.d.ts +0 -6
  319. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  320. package/dist/test/src/elements/memories/index.js +0 -6
  321. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  322. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  323. package/dist/test/src/elements/skills/Skill.js +0 -381
  324. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  325. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  326. package/dist/test/src/elements/templates/Template.js +0 -673
  327. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  328. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  329. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  330. package/dist/test/src/elements/templates/index.d.ts +0 -6
  331. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  332. package/dist/test/src/elements/templates/index.js +0 -6
  333. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  334. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  335. package/dist/test/src/errors/SecurityError.js +0 -47
  336. package/dist/test/src/errors/index.d.ts +0 -2
  337. package/dist/test/src/errors/index.d.ts.map +0 -1
  338. package/dist/test/src/errors/index.js +0 -2
  339. package/dist/test/src/index.barrel.d.ts +0 -21
  340. package/dist/test/src/index.barrel.d.ts.map +0 -1
  341. package/dist/test/src/index.barrel.js +0 -31
  342. package/dist/test/src/index.d.ts +0 -223
  343. package/dist/test/src/index.d.ts.map +0 -1
  344. package/dist/test/src/index.js +0 -1594
  345. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  346. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  347. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  348. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  349. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  350. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  351. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  352. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  353. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  354. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  355. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  356. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  357. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  358. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  359. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  360. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  361. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  362. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  363. package/dist/test/src/marketplace/index.d.ts +0 -10
  364. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  365. package/dist/test/src/marketplace/index.js +0 -10
  366. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  367. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  368. package/dist/test/src/persona/PersonaElement.js +0 -223
  369. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  370. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  371. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  372. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  373. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  374. package/dist/test/src/persona/PersonaLoader.js +0 -145
  375. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  376. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  377. package/dist/test/src/persona/PersonaManager.js +0 -341
  378. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  379. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  380. package/dist/test/src/persona/PersonaValidator.js +0 -157
  381. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  382. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  383. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  384. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  385. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  386. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  387. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  388. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  389. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  390. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  391. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  392. package/dist/test/src/persona/export-import/index.js +0 -7
  393. package/dist/test/src/persona/index.d.ts +0 -7
  394. package/dist/test/src/persona/index.d.ts.map +0 -1
  395. package/dist/test/src/persona/index.js +0 -7
  396. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  397. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  398. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  399. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  400. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  401. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  402. package/dist/test/src/portfolio/types.d.ts +0 -18
  403. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  404. package/dist/test/src/portfolio/types.js +0 -13
  405. package/dist/test/src/security/InputValidator.d.ts +0 -80
  406. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  407. package/dist/test/src/security/InputValidator.js +0 -436
  408. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  409. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  410. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  411. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  412. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  413. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  414. package/dist/test/src/security/audit/index.d.ts +0 -14
  415. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  416. package/dist/test/src/security/audit/index.js +0 -15
  417. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  418. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  419. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  420. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  421. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  422. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  423. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  424. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  425. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  426. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  427. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  428. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  429. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  430. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  431. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  432. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  433. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  434. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  435. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  436. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  437. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  438. package/dist/test/src/security/audit/types.d.ts +0 -94
  439. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  440. package/dist/test/src/security/audit/types.js +0 -6
  441. package/dist/test/src/security/commandValidator.d.ts +0 -7
  442. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  443. package/dist/test/src/security/commandValidator.js +0 -78
  444. package/dist/test/src/security/constants.d.ts +0 -24
  445. package/dist/test/src/security/constants.d.ts.map +0 -1
  446. package/dist/test/src/security/constants.js +0 -26
  447. package/dist/test/src/security/contentValidator.d.ts +0 -47
  448. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  449. package/dist/test/src/security/contentValidator.js +0 -301
  450. package/dist/test/src/security/errors.d.ts +0 -14
  451. package/dist/test/src/security/errors.d.ts.map +0 -1
  452. package/dist/test/src/security/errors.js +0 -28
  453. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  454. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  455. package/dist/test/src/security/fileLockManager.js +0 -187
  456. package/dist/test/src/security/index.d.ts +0 -12
  457. package/dist/test/src/security/index.d.ts.map +0 -1
  458. package/dist/test/src/security/index.js +0 -14
  459. package/dist/test/src/security/pathValidator.d.ts +0 -9
  460. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  461. package/dist/test/src/security/pathValidator.js +0 -98
  462. package/dist/test/src/security/regexValidator.d.ts +0 -59
  463. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  464. package/dist/test/src/security/regexValidator.js +0 -214
  465. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  466. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  467. package/dist/test/src/security/secureYamlParser.js +0 -203
  468. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  469. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  470. package/dist/test/src/security/securityMonitor.js +0 -108
  471. package/dist/test/src/security/tokenManager.d.ts +0 -85
  472. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  473. package/dist/test/src/security/tokenManager.js +0 -286
  474. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  475. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  476. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  477. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  478. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  479. package/dist/test/src/security/yamlValidator.js +0 -164
  480. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  481. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  482. package/dist/test/src/server/ServerSetup.js +0 -116
  483. package/dist/test/src/server/index.d.ts +0 -7
  484. package/dist/test/src/server/index.d.ts.map +0 -1
  485. package/dist/test/src/server/index.js +0 -7
  486. package/dist/test/src/server/startup.d.ts +0 -31
  487. package/dist/test/src/server/startup.d.ts.map +0 -1
  488. package/dist/test/src/server/startup.js +0 -67
  489. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  490. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  491. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  492. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  493. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  494. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  495. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  496. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  497. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  498. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  499. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  500. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  501. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  502. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  503. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  504. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  505. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  506. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  507. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  508. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  509. package/dist/test/src/server/tools/UserTools.js +0 -51
  510. package/dist/test/src/server/tools/index.d.ts +0 -10
  511. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  512. package/dist/test/src/server/tools/index.js +0 -10
  513. package/dist/test/src/server/types.d.ts +0 -34
  514. package/dist/test/src/server/types.d.ts.map +0 -1
  515. package/dist/test/src/server/types.js +0 -5
  516. package/dist/test/src/tools/debug.d.ts +0 -20
  517. package/dist/test/src/tools/debug.d.ts.map +0 -1
  518. package/dist/test/src/tools/debug.js +0 -37
  519. package/dist/test/src/types/cache.d.ts +0 -8
  520. package/dist/test/src/types/cache.d.ts.map +0 -1
  521. package/dist/test/src/types/cache.js +0 -5
  522. package/dist/test/src/types/collection.d.ts +0 -23
  523. package/dist/test/src/types/collection.d.ts.map +0 -1
  524. package/dist/test/src/types/collection.js +0 -5
  525. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  526. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  527. package/dist/test/src/types/elements/IElement.js +0 -30
  528. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  529. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  530. package/dist/test/src/types/elements/IElementManager.js +0 -6
  531. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  532. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  533. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  534. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  535. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  536. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  537. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  538. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  539. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  540. package/dist/test/src/types/elements/index.d.ts +0 -9
  541. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  542. package/dist/test/src/types/elements/index.js +0 -11
  543. package/dist/test/src/types/index.d.ts +0 -9
  544. package/dist/test/src/types/index.d.ts.map +0 -1
  545. package/dist/test/src/types/index.js +0 -9
  546. package/dist/test/src/types/marketplace.d.ts +0 -23
  547. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  548. package/dist/test/src/types/marketplace.js +0 -5
  549. package/dist/test/src/types/mcp.d.ts +0 -84
  550. package/dist/test/src/types/mcp.d.ts.map +0 -1
  551. package/dist/test/src/types/mcp.js +0 -80
  552. package/dist/test/src/types/persona.d.ts +0 -30
  553. package/dist/test/src/types/persona.d.ts.map +0 -1
  554. package/dist/test/src/types/persona.js +0 -5
  555. package/dist/test/src/update/BackupManager.d.ts +0 -46
  556. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  557. package/dist/test/src/update/BackupManager.js +0 -261
  558. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  559. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  560. package/dist/test/src/update/DependencyChecker.js +0 -132
  561. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  562. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  563. package/dist/test/src/update/RateLimiter.js +0 -172
  564. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  565. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  566. package/dist/test/src/update/SignatureVerifier.js +0 -214
  567. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  568. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  569. package/dist/test/src/update/UpdateChecker.js +0 -469
  570. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  571. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  572. package/dist/test/src/update/UpdateManager.js +0 -260
  573. package/dist/test/src/update/VersionManager.d.ts +0 -31
  574. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  575. package/dist/test/src/update/VersionManager.js +0 -134
  576. package/dist/test/src/update/index.d.ts +0 -9
  577. package/dist/test/src/update/index.d.ts.map +0 -1
  578. package/dist/test/src/update/index.js +0 -9
  579. package/dist/test/src/utils/filesystem.d.ts +0 -29
  580. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  581. package/dist/test/src/utils/filesystem.js +0 -94
  582. package/dist/test/src/utils/git.d.ts +0 -32
  583. package/dist/test/src/utils/git.d.ts.map +0 -1
  584. package/dist/test/src/utils/git.js +0 -65
  585. package/dist/test/src/utils/index.d.ts +0 -7
  586. package/dist/test/src/utils/index.d.ts.map +0 -1
  587. package/dist/test/src/utils/index.js +0 -7
  588. package/dist/test/src/utils/logger.d.ts +0 -45
  589. package/dist/test/src/utils/logger.d.ts.map +0 -1
  590. package/dist/test/src/utils/logger.js +0 -91
  591. package/dist/test/src/utils/version.d.ts +0 -25
  592. package/dist/test/src/utils/version.d.ts.map +0 -1
  593. package/dist/test/src/utils/version.js +0 -97
  594. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  595. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  596. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  597. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  598. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  599. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  600. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  601. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  602. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  603. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  604. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  605. package/dist/test/test/__tests__/integration/setup.js +0 -31
  606. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  607. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  608. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  609. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  610. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  611. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  612. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  613. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  614. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  615. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  616. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  617. package/dist/test/test/__tests__/security/index.js +0 -98
  618. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  619. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  620. package/dist/test/test/__tests__/security/setup.js +0 -23
  621. package/dist/types/marketplace.d.ts +0 -23
  622. package/dist/types/marketplace.d.ts.map +0 -1
  623. package/dist/types/marketplace.js +0 -5
@@ -1,312 +0,0 @@
1
- /**
2
- * Unicode Validator for DollhouseMCP
3
- *
4
- * Prevents Unicode-based bypass attacks including:
5
- * - Homograph attacks (visually similar characters)
6
- * - Direction override attacks (RLO/LRO)
7
- * - Mixed script attacks
8
- * - Zero-width character injection
9
- * - Unicode normalization bypasses
10
- *
11
- * Security: SEC-001 - Unicode attack prevention
12
- */
13
- import { SecurityMonitor } from '../securityMonitor.js';
14
- export class UnicodeValidator {
15
- /**
16
- * Unicode attack patterns and confusable characters
17
- */
18
- /**
19
- * Direction override characters that can hide or reverse text display
20
- * @see https://unicode.org/reports/tr9/#Directional_Formatting_Characters
21
- * U+202A-U+202E: Left/Right embedding and override marks (LRE, RLE, PDF, LRO, RLO)
22
- * U+2066-U+2069: Isolate formatting characters (LRI, RLI, FSI, PDI)
23
- */
24
- static DIRECTION_OVERRIDE_CHARS = /[\u202A-\u202E\u2066-\u2069]/g;
25
- /**
26
- * Zero-width and invisible formatting characters often used to hide payloads
27
- * U+200B-U+200F: Zero-width spaces and directional marks
28
- * U+2028-U+202F: Line/paragraph separators and formatting characters
29
- * U+FEFF: Zero-width no-break space (Byte Order Mark)
30
- */
31
- static ZERO_WIDTH_CHARS = /[\u200B-\u200F\u2028-\u202F\uFEFF]/g;
32
- /**
33
- * Non-printable control characters that should not appear in normal text
34
- * U+0000-U+0008, U+000B-U+000C, U+000E-U+001F: C0 control codes (except TAB, LF, CR)
35
- * U+007F-U+009F: Delete and C1 control codes
36
- * U+FFFE-U+FFFF: Non-characters that should never appear in valid text
37
- */
38
- static NON_PRINTABLE_CHARS = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\uFFFE\uFFFF]/g;
39
- /**
40
- * Common homograph/confusable character mappings
41
- * Maps visually similar Unicode characters to their ASCII equivalents
42
- */
43
- static CONFUSABLE_MAPPINGS = new Map([
44
- // Cyrillic to Latin
45
- ['а', 'a'], ['е', 'e'], ['о', 'o'], ['р', 'p'], ['с', 'c'], ['х', 'x'], ['у', 'y'],
46
- ['А', 'A'], ['В', 'B'], ['Е', 'E'], ['К', 'K'], ['М', 'M'], ['Н', 'H'], ['О', 'O'],
47
- ['Р', 'P'], ['С', 'C'], ['Т', 'T'], ['У', 'Y'], ['Х', 'X'],
48
- // Greek to Latin
49
- ['α', 'a'], ['β', 'b'], ['γ', 'g'], ['δ', 'd'], ['ε', 'e'], ['ζ', 'z'], ['η', 'h'],
50
- ['θ', 'th'], ['ι', 'i'], ['κ', 'k'], ['λ', 'l'], ['μ', 'm'], ['ν', 'n'], ['ξ', 'x'],
51
- ['ο', 'o'], ['π', 'p'], ['ρ', 'r'], ['σ', 's'], ['τ', 't'], ['υ', 'u'], ['φ', 'f'],
52
- ['χ', 'ch'], ['ψ', 'ps'], ['ω', 'w'],
53
- // Mathematical symbols to ASCII (various styles)
54
- ['𝒂', 'a'], ['𝒃', 'b'], ['𝒄', 'c'], ['𝒅', 'd'], ['𝒆', 'e'], ['𝒇', 'f'], ['𝒈', 'g'], ['𝒉', 'h'], ['𝒊', 'i'], ['𝒋', 'j'], ['𝒌', 'k'], ['𝒍', 'l'], ['𝒎', 'm'], ['𝒏', 'n'], ['𝒐', 'o'], ['𝒑', 'p'], ['𝒒', 'q'], ['𝒓', 'r'], ['𝒔', 's'], ['𝒕', 't'], ['𝒖', 'u'], ['𝒗', 'v'], ['𝒘', 'w'], ['𝒙', 'x'], ['𝒚', 'y'], ['𝒛', 'z'],
55
- ['𝐚', 'a'], ['𝐛', 'b'], ['𝐜', 'c'], ['𝐝', 'd'], ['𝐞', 'e'], ['𝐟', 'f'], ['𝐠', 'g'], ['𝐡', 'h'], ['𝐢', 'i'], ['𝐣', 'j'], ['𝐤', 'k'], ['𝐥', 'l'], ['𝐦', 'm'], ['𝐧', 'n'], ['𝐨', 'o'], ['𝐩', 'p'], ['𝐪', 'q'], ['𝐫', 'r'], ['𝐬', 's'], ['𝐭', 't'], ['𝐮', 'u'], ['𝐯', 'v'], ['𝐰', 'w'], ['𝐱', 'x'], ['𝐲', 'y'], ['𝐳', 'z'],
56
- // Special i variants (Turkish, etc.)
57
- ['ı', 'i'], ['İ', 'I'], ['і', 'i'], ['Ӏ', 'I'],
58
- // Other common confusables
59
- ['ǝ', 'e'], ['ɐ', 'a'], ['ɔ', 'o'], ['ʇ', 't'], ['ʌ', 'v'], ['ʍ', 'w'],
60
- ['℃', 'C'], ['℉', 'F'], ['№', 'No'], ['™', 'TM'], ['®', 'R'],
61
- // Fullwidth characters
62
- ['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D'], ['E', 'E'], ['F', 'F'], ['G', 'G'], ['H', 'H'], ['I', 'I'], ['J', 'J'], ['K', 'K'], ['L', 'L'], ['M', 'M'], ['N', 'N'], ['O', 'O'], ['P', 'P'], ['Q', 'Q'], ['R', 'R'], ['S', 'S'], ['T', 'T'], ['U', 'U'], ['V', 'V'], ['W', 'W'], ['X', 'X'], ['Y', 'Y'], ['Z', 'Z'],
63
- ['a', 'a'], ['b', 'b'], ['c', 'c'], ['d', 'd'], ['e', 'e'], ['f', 'f'], ['g', 'g'], ['h', 'h'], ['i', 'i'], ['j', 'j'], ['k', 'k'], ['l', 'l'], ['m', 'm'], ['n', 'n'], ['o', 'o'], ['p', 'p'], ['q', 'q'], ['r', 'r'], ['s', 's'], ['t', 't'], ['u', 'u'], ['v', 'v'], ['w', 'w'], ['x', 'x'], ['y', 'y'], ['z', 'z'],
64
- ['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7'], ['8', '8'], ['9', '9'],
65
- ]);
66
- /**
67
- * Script mixing detection patterns
68
- * Detects suspicious mixing of different Unicode scripts
69
- */
70
- static SCRIPT_PATTERNS = {
71
- LATIN: /[\u0000-\u007F\u00A0-\u00FF\u0100-\u017F\u0180-\u024F]/,
72
- CYRILLIC: /[\u0400-\u04FF\u0500-\u052F\u2DE0-\u2DFF\uA640-\uA69F]/,
73
- GREEK: /[\u0370-\u03FF\u1F00-\u1FFF]/,
74
- ARABIC: /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]/,
75
- HEBREW: /[\u0590-\u05FF\uFB1D-\uFB4F]/,
76
- CJK: /[\u2E80-\u2EFF\u2F00-\u2FDF\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31A0-\u31BF\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF]/,
77
- };
78
- /**
79
- * Normalize Unicode content to prevent bypass attacks
80
- */
81
- static normalize(content) {
82
- const issues = [];
83
- let normalized = content;
84
- let severity = 'low';
85
- try {
86
- // 1. Detect and log suspicious Unicode patterns before normalization
87
- const suspiciousPatterns = this.detectSuspiciousPatterns(content);
88
- issues.push(...suspiciousPatterns.issues);
89
- if (suspiciousPatterns.severity) {
90
- severity = this.escalateSeverity(severity, suspiciousPatterns.severity);
91
- }
92
- // 2. Remove direction override characters (prevents RLO/LRO attacks)
93
- if (this.DIRECTION_OVERRIDE_CHARS.test(normalized)) {
94
- issues.push('Direction override characters detected');
95
- severity = this.escalateSeverity(severity, 'high');
96
- normalized = normalized.replace(this.DIRECTION_OVERRIDE_CHARS, '');
97
- SecurityMonitor.logSecurityEvent({
98
- type: 'UNICODE_DIRECTION_OVERRIDE',
99
- severity: 'HIGH',
100
- source: 'unicode_validation',
101
- details: 'Direction override characters removed from content'
102
- });
103
- }
104
- // 3. Remove zero-width and non-printable characters
105
- if (this.ZERO_WIDTH_CHARS.test(normalized) || this.NON_PRINTABLE_CHARS.test(normalized)) {
106
- issues.push('Zero-width or non-printable characters detected');
107
- severity = this.escalateSeverity(severity, 'medium');
108
- normalized = normalized
109
- .replace(this.ZERO_WIDTH_CHARS, '')
110
- .replace(this.NON_PRINTABLE_CHARS, '');
111
- }
112
- // 4. Apply Unicode normalization (NFC - Canonical Decomposition + Composition)
113
- normalized = normalized.normalize('NFC');
114
- // 5. Detect mixed script attacks BEFORE confusable replacement
115
- const mixedScriptResult = this.detectMixedScripts(normalized);
116
- if (mixedScriptResult.isSuspicious) {
117
- issues.push(`Mixed script usage detected: ${mixedScriptResult.scripts.join(', ')}`);
118
- severity = this.escalateSeverity(severity, 'high');
119
- SecurityMonitor.logSecurityEvent({
120
- type: 'UNICODE_MIXED_SCRIPT',
121
- severity: 'HIGH',
122
- source: 'unicode_validation',
123
- details: `Mixed scripts detected: ${mixedScriptResult.scripts.join(', ')}`
124
- });
125
- }
126
- // 6. Always replace confusable characters with ASCII equivalents for security
127
- // This prevents homograph attacks regardless of script mixing
128
- const confusableResult = this.replaceConfusables(normalized);
129
- if (confusableResult.hasConfusables) {
130
- normalized = confusableResult.normalized;
131
- issues.push('Confusable Unicode characters detected and normalized');
132
- severity = this.escalateSeverity(severity, 'medium');
133
- // Log if this happens in legitimate multilingual context
134
- if (!mixedScriptResult.isSuspicious) {
135
- SecurityMonitor.logSecurityEvent({
136
- type: 'UNICODE_VALIDATION_ERROR',
137
- severity: 'LOW',
138
- source: 'unicode_validation',
139
- details: 'Confusable characters normalized in legitimate multilingual content'
140
- });
141
- }
142
- }
143
- return {
144
- isValid: issues.length === 0,
145
- normalizedContent: normalized,
146
- detectedIssues: issues.length > 0 ? issues : undefined,
147
- severity: issues.length > 0 ? severity : undefined
148
- };
149
- }
150
- catch (error) {
151
- SecurityMonitor.logSecurityEvent({
152
- type: 'UNICODE_VALIDATION_ERROR',
153
- severity: 'HIGH',
154
- source: 'unicode_validation',
155
- details: `Unicode validation failed: ${error instanceof Error ? error.message : String(error)}`
156
- });
157
- // Fallback: return original content if normalization fails
158
- return {
159
- isValid: false,
160
- normalizedContent: content,
161
- detectedIssues: ['Unicode validation failed'],
162
- severity: 'high'
163
- };
164
- }
165
- }
166
- /**
167
- * Detect suspicious Unicode patterns that might indicate attacks
168
- */
169
- static detectSuspiciousPatterns(content) {
170
- const issues = [];
171
- let severity;
172
- // Check for excessive Unicode escapes (possible encoding bypass)
173
- /**
174
- * Pattern to match Unicode escape sequences
175
- * \\u: Literal backslash followed by 'u'
176
- * [0-9a-fA-F]{4}: Exactly 4 hexadecimal digits
177
- * Used to detect attempts to bypass filters using \u0061dmin style encoding
178
- */
179
- const unicodeEscapePattern = /\\u[0-9a-fA-F]{4}/g;
180
- const unicodeEscapes = content.match(unicodeEscapePattern);
181
- if (unicodeEscapes && unicodeEscapes.length > 10) {
182
- issues.push(`Excessive Unicode escapes detected (${unicodeEscapes.length})`);
183
- severity = 'high';
184
- }
185
- // Check for suspicious Unicode ranges that might hide content
186
- const suspiciousRanges = [
187
- { range: /[\uE000-\uF8FF]/g, name: 'Private Use Area' },
188
- // Note: Properly paired surrogate pairs [\uD800-\uDFFF] are normal for emojis
189
- { range: /[\uFDD0-\uFDEF]/g, name: 'Non-characters' },
190
- { range: /[\uFFFE\uFFFF]/g, name: 'Non-characters' }
191
- ];
192
- for (const { range, name } of suspiciousRanges) {
193
- if (range.test(content)) {
194
- issues.push(`Suspicious Unicode range detected: ${name}`);
195
- severity = this.escalateSeverity(severity, 'medium');
196
- }
197
- }
198
- // Check for malformed surrogate pairs using safe character-by-character validation
199
- // This avoids ReDoS vulnerabilities from complex regex patterns
200
- if (this.hasMalformedSurrogates(content)) {
201
- issues.push('Malformed surrogate pairs detected');
202
- severity = this.escalateSeverity(severity, 'high');
203
- }
204
- return { issues, severity };
205
- }
206
- /**
207
- * Replace confusable Unicode characters with ASCII equivalents
208
- */
209
- static replaceConfusables(content) {
210
- let normalized = content;
211
- let hasConfusables = false;
212
- for (const [confusable, replacement] of this.CONFUSABLE_MAPPINGS) {
213
- if (normalized.includes(confusable)) {
214
- normalized = normalized.replace(new RegExp(this.escapeRegex(confusable), 'g'), replacement);
215
- hasConfusables = true;
216
- }
217
- }
218
- return { normalized, hasConfusables };
219
- }
220
- /**
221
- * Detect suspicious mixing of different Unicode scripts
222
- */
223
- static detectMixedScripts(content) {
224
- const detectedScripts = [];
225
- for (const [scriptName, pattern] of Object.entries(this.SCRIPT_PATTERNS)) {
226
- if (pattern.test(content)) {
227
- detectedScripts.push(scriptName);
228
- }
229
- }
230
- // Consider it suspicious if:
231
- // 1. More than 3 scripts are mixed (legitimate text rarely mixes >3 scripts)
232
- // 2. Content contains Latin + dangerous confusable scripts (Cyrillic/Greek - common attack pattern)
233
- // Note: Latin + CJK is common and legitimate (e.g., Chinese with English)
234
- const isSuspicious = detectedScripts.length > 3 ||
235
- (detectedScripts.includes('LATIN') && detectedScripts.length > 1 &&
236
- (detectedScripts.includes('CYRILLIC') || detectedScripts.includes('GREEK')));
237
- return { isSuspicious, scripts: detectedScripts };
238
- }
239
- /**
240
- * Escalate severity level (higher severity takes precedence)
241
- */
242
- static escalateSeverity(current, newSeverity) {
243
- const severityLevels = { low: 1, medium: 2, high: 3, critical: 4 };
244
- const currentLevel = current ? severityLevels[current] : 0;
245
- const newLevel = severityLevels[newSeverity];
246
- return newLevel > currentLevel ? newSeverity : (current || 'low');
247
- }
248
- /**
249
- * Escape special regex characters for safe replacement
250
- */
251
- static escapeRegex(string) {
252
- return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
253
- }
254
- /**
255
- * Check if content contains potentially dangerous Unicode patterns
256
- */
257
- static containsDangerousUnicode(content) {
258
- // Quick check for obviously dangerous patterns
259
- return this.DIRECTION_OVERRIDE_CHARS.test(content) ||
260
- this.ZERO_WIDTH_CHARS.test(content) ||
261
- this.NON_PRINTABLE_CHARS.test(content) ||
262
- this.hasExcessiveUnicodeEscapes(content);
263
- }
264
- /**
265
- * Check if content has excessive Unicode escape sequences
266
- * Prevents null pointer exception by safely checking match results
267
- */
268
- static hasExcessiveUnicodeEscapes(content) {
269
- const matches = content.match(/\\u[0-9a-fA-F]{4}/g);
270
- return matches !== null && matches.length > 10;
271
- }
272
- /**
273
- * Safely check for malformed surrogate pairs without ReDoS vulnerability
274
- * Uses character-by-character validation instead of complex regex
275
- */
276
- static hasMalformedSurrogates(content) {
277
- for (let i = 0; i < content.length; i++) {
278
- const char = content.charCodeAt(i);
279
- // High surrogate (U+D800-U+DBFF)
280
- if (char >= 0xD800 && char <= 0xDBFF) {
281
- // Check if it's followed by a low surrogate
282
- if (i + 1 >= content.length) {
283
- return true; // High surrogate at end of string
284
- }
285
- const nextChar = content.charCodeAt(i + 1);
286
- if (nextChar < 0xDC00 || nextChar > 0xDFFF) {
287
- return true; // High surrogate not followed by low surrogate
288
- }
289
- i++; // Skip the valid low surrogate
290
- }
291
- // Low surrogate (U+DC00-U+DFFF) without preceding high surrogate
292
- else if (char >= 0xDC00 && char <= 0xDFFF) {
293
- return true; // Unpaired low surrogate
294
- }
295
- }
296
- return false;
297
- }
298
- /**
299
- * Get safe preview of Unicode content for logging
300
- */
301
- static getSafePreview(content, maxLength = 100) {
302
- // Remove dangerous Unicode characters and truncate for safe logging
303
- const cleaned = content
304
- .replace(this.DIRECTION_OVERRIDE_CHARS, '[DIR]')
305
- .replace(this.ZERO_WIDTH_CHARS, '[ZW]')
306
- .replace(this.NON_PRINTABLE_CHARS, '[NP]');
307
- return cleaned.length > maxLength ?
308
- cleaned.substring(0, maxLength) + '...' :
309
- cleaned;
310
- }
311
- }
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pY29kZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTeEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7T0FFRztJQUVIOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLHdCQUF3QixHQUFHLCtCQUErQixDQUFDO0lBRW5GOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLGdCQUFnQixHQUFHLHFDQUFxQyxDQUFDO0lBRWpGOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLG1CQUFtQixHQUFHLG9FQUFvRSxDQUFDO0lBRW5IOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxtQkFBbUIsR0FBd0IsSUFBSSxHQUFHLENBQUM7UUFDekUsb0JBQW9CO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsRixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBRTFELGlCQUFpQjtRQUNqQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ25GLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsRixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFFcEMsaURBQWlEO1FBQ2pELENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUNoVixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFFaFYscUNBQXFDO1FBQ3JDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUU5QywyQkFBMkI7UUFDM0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3RFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUU1RCx1QkFBdUI7UUFDdkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3RULENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMs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LENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBZSxFQUFFLFlBQW9CLEdBQUc7UUFDNUQsb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU87YUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUM7YUFDL0MsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7YUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDO0lBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pY29kZSBWYWxpZGF0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBQcmV2ZW50cyBVbmljb2RlLWJhc2VkIGJ5cGFzcyBhdHRhY2tzIGluY2x1ZGluZzpcbiAqIC0gSG9tb2dyYXBoIGF0dGFja3MgKHZpc3VhbGx5IHNpbWlsYXIgY2hhcmFjdGVycylcbiAqIC0gRGlyZWN0aW9uIG92ZXJyaWRlIGF0dGFja3MgKFJMTy9MUk8pXG4gKiAtIE1peGVkIHNjcmlwdCBhdHRhY2tzXG4gKiAtIFplcm8td2lkdGggY2hhcmFjdGVyIGluamVjdGlvblxuICogLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gYnlwYXNzZXNcbiAqIFxuICogU2VjdXJpdHk6IFNFQy0wMDEgLSBVbmljb2RlIGF0dGFjayBwcmV2ZW50aW9uXG4gKi9cblxuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eU1vbml0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZztcbiAgZGV0ZWN0ZWRJc3N1ZXM/OiBzdHJpbmdbXTtcbiAgc2V2ZXJpdHk/OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcbn1cblxuZXhwb3J0IGNsYXNzIFVuaWNvZGVWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVW5pY29kZSBhdHRhY2sgcGF0dGVybnMgYW5kIGNvbmZ1c2FibGUgY2hhcmFjdGVyc1xuICAgKi9cbiAgXG4gIC8qKlxuICAgKiBEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyB0aGF0IGNhbiBoaWRlIG9yIHJldmVyc2UgdGV4dCBkaXNwbGF5XG4gICAqIEBzZWUgaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS8jRGlyZWN0aW9uYWxfRm9ybWF0dGluZ19DaGFyYWN0ZXJzXG4gICAqIFUrMjAyQS1VKzIwMkU6IExlZnQvUmlnaHQgZW1iZWRkaW5nIGFuZCBvdmVycmlkZSBtYXJrcyAoTFJFLCBSTEUsIFBERiwgTFJPLCBSTE8pXG4gICAqIFUrMjA2Ni1VKzIwNjk6IElzb2xhdGUgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIChMUkksIFJMSSwgRlNJLCBQREkpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBESVJFQ1RJT05fT1ZFUlJJREVfQ0hBUlMgPSAvW1xcdTIwMkEtXFx1MjAyRVxcdTIwNjYtXFx1MjA2OV0vZztcbiAgXG4gIC8qKlxuICAgKiBaZXJvLXdpZHRoIGFuZCBpbnZpc2libGUgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIG9mdGVuIHVzZWQgdG8gaGlkZSBwYXlsb2Fkc1xuICAgKiBVKzIwMEItVSsyMDBGOiBaZXJvLXdpZHRoIHNwYWNlcyBhbmQgZGlyZWN0aW9uYWwgbWFya3NcbiAgICogVSsyMDI4LVUrMjAyRjogTGluZS9wYXJhZ3JhcGggc2VwYXJhdG9ycyBhbmQgZm9ybWF0dGluZyBjaGFyYWN0ZXJzXG4gICAqIFUrRkVGRjogWmVyby13aWR0aCBuby1icmVhayBzcGFjZSAoQnl0ZSBPcmRlciBNYXJrKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWkVST19XSURUSF9DSEFSUyA9IC9bXFx1MjAwQi1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1RkVGRl0vZztcbiAgXG4gIC8qKlxuICAgKiBOb24tcHJpbnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYXBwZWFyIGluIG5vcm1hbCB0ZXh0XG4gICAqIFUrMDAwMC1VKzAwMDgsIFUrMDAwQi1VKzAwMEMsIFUrMDAwRS1VKzAwMUY6IEMwIGNvbnRyb2wgY29kZXMgKGV4Y2VwdCBUQUIsIExGLCBDUilcbiAgICogVSswMDdGLVUrMDA5RjogRGVsZXRlIGFuZCBDMSBjb250cm9sIGNvZGVzXG4gICAqIFUrRkZGRS1VK0ZGRkY6IE5vbi1jaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiB2YWxpZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOT05fUFJJTlRBQkxFX0NIQVJTID0gL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0YtXFx1MDA5RlxcdUZGRkVcXHVGRkZGXS9nO1xuICBcbiAgLyoqXG4gICAqIENvbW1vbiBob21vZ3JhcGgvY29uZnVzYWJsZSBjaGFyYWN0ZXIgbWFwcGluZ3NcbiAgICogTWFwcyB2aXN1YWxseSBzaW1pbGFyIFVuaWNvZGUgY2hhcmFjdGVycyB0byB0aGVpciBBU0NJSSBlcXVpdmFsZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ORlVTQUJMRV9NQVBQSU5HUzogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoW1xuICAgIC8vIEN5cmlsbGljIHRvIExhdGluXG4gICAgWyfQsCcsICdhJ10sIFsn0LUnLCAnZSddLCBbJ9C+JywgJ28nXSwgWyfRgCcsICdwJ10sIFsn0YEnLCAnYyddLCBbJ9GFJywgJ3gnXSwgWyfRgycsICd5J10sXG4gICAgWyfQkCcsICdBJ10sIFsn0JInLCAnQiddLCBbJ9CVJywgJ0UnXSwgWyfQmicsICdLJ10sIFsn0JwnLCAnTSddLCBbJ9CdJywgJ0gnXSwgWyfQnicsICdPJ10sIFxuICAgIFsn0KAnLCAnUCddLCBbJ9ChJywgJ0MnXSwgWyfQoicsICdUJ10sIFsn0KMnLCAnWSddLCBbJ9ClJywgJ1gnXSxcbiAgICBcbiAgICAvLyBHcmVlayB0byBMYXRpblxuICAgIFsnzrEnLCAnYSddLCBbJ86yJywgJ2InXSwgWyfOsycsICdnJ10sIFsnzrQnLCAnZCddLCBbJ861JywgJ2UnXSwgWyfOticsICd6J10sIFsnzrcnLCAnaCddLFxuICAgIFsnzrgnLCAndGgnXSwgWyfOuScsICdpJ10sIFsnzronLCAnayddLCBbJ867JywgJ2wnXSwgWyfOvCcsICdtJ10sIFsnzr0nLCAnbiddLCBbJ86+JywgJ3gnXSxcbiAgICBbJ86/JywgJ28nXSwgWyfPgCcsICdwJ10sIFsnz4EnLCAnciddLCBbJ8+DJywgJ3MnXSwgWyfPhCcsICd0J10sIFsnz4UnLCAndSddLCBbJ8+GJywgJ2YnXSxcbiAgICBbJ8+HJywgJ2NoJ10sIFsnz4gnLCAncHMnXSwgWyfPiScsICd3J10sXG4gICAgXG4gICAgLy8gTWF0aGVtYXRpY2FsIHN5bWJvbHMgdG8gQVNDSUkgKHZhcmlvdXMgc3R5bGVzKVxuICAgIFsn8J2SgicsICdhJ10sIFsn8J2SgycsICdiJ10sIFsn8J2ShCcsICdjJ10sIFsn8J2ShScsICdkJ10sIFsn8J2ShicsICdlJ10sIFsn8J2ShycsICdmJ10sIFsn8J2SiCcsICdnJ10sIFsn8J2SiScsICdoJ10sIFsn8J2SiicsICdpJ10sIFsn8J2SiycsICdqJ10sIFsn8J2SjCcsICdrJ10sIFsn8J2SjScsICdsJ10sIFsn8J2SjicsICdtJ10sIFsn8J2SjycsICduJ10sIFsn8J2SkCcsICdvJ10sIFsn8J2SkScsICdwJ10sIFsn8J2SkicsICdxJ10sIFsn8J2SkycsICdyJ10sIFsn8J2SlCcsICdzJ10sIFsn8J2SlScsICd0J10sIFsn8J2SlicsICd1J10sIFsn8J2SlycsICd2J10sIFsn8J2SmCcsICd3J10sIFsn8J2SmScsICd4J10sIFsn8J2SmicsICd5J10sIFsn8J2SmycsICd6J10sXG4gICAgWyfwnZCaJywgJ2EnXSwgWyfwnZCbJywgJ2InXSwgWyfwnZCcJywgJ2MnXSwgWyfwnZCdJywgJ2QnXSwgWyfwnZCeJywgJ2UnXSwgWyfwnZCfJywgJ2YnXSwgWyfwnZCgJywgJ2cnXSwgWyfwnZChJywgJ2gnXSwgWyfwnZCiJywgJ2knXSwgWyfwnZCjJywgJ2onXSwgWyfwnZCkJywgJ2snXSwgWyfwnZClJywgJ2wnXSwgWyfwnZCmJywgJ20nXSwgWyfwnZCnJywgJ24nXSwgWyfwnZCoJywgJ28nXSwgWyfwnZCpJywgJ3AnXSwgWyfwnZCqJywgJ3EnXSwgWyfwnZCrJywgJ3InXSwgWyfwnZCsJywgJ3MnXSwgWyfwnZCtJywgJ3QnXSwgWyfwnZCuJywgJ3UnXSwgWyfwnZCvJywgJ3YnXSwgWyfwnZCwJywgJ3cnXSwgWyfwnZCxJywgJ3gnXSwgWyfwnZCyJywgJ3knXSwgWyfwnZCzJywgJ3onXSxcbiAgICBcbiAgICAvLyBTcGVjaWFsIGkgdmFyaWFudHMgKFR1cmtpc2gsIGV0Yy4pXG4gICAgWyfEsScsICdpJ10sIFsnxLAnLCAnSSddLCBbJ9GWJywgJ2knXSwgWyfTgCcsICdJJ10sXG4gICAgXG4gICAgLy8gT3RoZXIgY29tbW9uIGNvbmZ1c2FibGVzXG4gICAgWyfHnScsICdlJ10sIFsnyZAnLCAnYSddLCBbJ8mUJywgJ28nXSwgWyfKhycsICd0J10sIFsnyownLCAndiddLCBbJ8qNJywgJ3cnXSxcbiAgICBbJ+KEgycsICdDJ10sIFsn4oSJJywgJ0YnXSwgWyfihJYnLCAnTm8nXSwgWyfihKInLCAnVE0nXSwgWyfCricsICdSJ10sXG4gICAgXG4gICAgLy8gRnVsbHdpZHRoIGNoYXJhY3RlcnNcbiAgICBbJ++8oScsICdBJ10sIFsn77yiJywgJ0InXSwgWyfvvKMnLCAnQyddLCBbJ++8pCcsICdEJ10sIFsn77ylJywgJ0UnXSwgWyfvvKYnLCAnRiddLCBbJ++8pycsICdHJ10sIFsn77yoJywgJ0gnXSwgWyfvvKknLCAnSSddLCBbJ++8qicsICdKJ10sIFsn77yrJywgJ0snXSwgWyfvvKwnLCAnTCddLCBbJ++8rScsICdNJ10sIFsn77yuJywgJ04nXSwgWyfvvK8nLCAnTyddLCBbJ++8sCcsICdQJ10sIFsn77yxJywgJ1EnXSwgWyfvvLInLCAnUiddLCBbJ++8sycsICdTJ10sIFsn77y0JywgJ1QnXSwgWyfvvLUnLCAnVSddLCBbJ++8ticsICdWJ10sIFsn77y3JywgJ1cnXSwgWyfvvLgnLCAnWCddLCBbJ++8uScsICdZJ10sIFsn77y6JywgJ1onXSxcbiAgICBbJ++9gScsICdhJ10sIFsn772CJywgJ2InXSwgWyfvvYMnLCAnYyddLCBbJ++9hCcsICdkJ10sIFsn772FJywgJ2UnXSwgWyfvvYYnLCAnZiddLCBbJ++9hycsICdnJ10sIFsn772IJywgJ2gnXSwgWyfvvYknLCAnaSddLCBbJ++9iicsICdqJ10sIFsn772LJywgJ2snXSwgWyfvvYwnLCAnbCddLCBbJ++9jScsICdtJ10sIFsn772OJywgJ24nXSwgWyfvvY8nLCAnbyddLCBbJ++9kCcsICdwJ10sIFsn772RJywgJ3EnXSwgWyfvvZInLCAnciddLCBbJ++9kycsICdzJ10sIFsn772UJywgJ3QnXSwgWyfvvZUnLCAndSddLCBbJ++9licsICd2J10sIFsn772XJywgJ3cnXSwgWyfvvZgnLCAneCddLCBbJ++9mScsICd5J10sIFsn772aJywgJ3onXSxcbiAgICBbJ++8kCcsICcwJ10sIFsn77yRJywgJzEnXSwgWyfvvJInLCAnMiddLCBbJ++8kycsICczJ10sIFsn77yUJywgJzQnXSwgWyfvvJUnLCAnNSddLCBbJ++8licsICc2J10sIFsn77yXJywgJzcnXSwgWyfvvJgnLCAnOCddLCBbJ++8mScsICc5J10sXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBTY3JpcHQgbWl4aW5nIGRldGVjdGlvbiBwYXR0ZXJuc1xuICAgKiBEZXRlY3RzIHN1c3BpY2lvdXMgbWl4aW5nIG9mIGRpZmZlcmVudCBVbmljb2RlIHNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDUklQVF9QQVRURVJOUyA9IHtcbiAgICBMQVRJTjogL1tcXHUwMDAwLVxcdTAwN0ZcXHUwMEEwLVxcdTAwRkZcXHUwMTAwLVxcdTAxN0ZcXHUwMTgwLVxcdTAyNEZdLyxcbiAgICBDWVJJTExJQzogL1tcXHUwNDAwLVxcdTA0RkZcXHUwNTAwLVxcdTA1MkZcXHUyREUwLVxcdTJERkZcXHVBNjQwLVxcdUE2OUZdLyxcbiAgICBHUkVFSzogL1tcXHUwMzcwLVxcdTAzRkZcXHUxRjAwLVxcdTFGRkZdLyxcbiAgICBBUkFCSUM6IC9bXFx1MDYwMC1cXHUwNkZGXFx1MDc1MC1cXHUwNzdGXFx1MDhBMC1cXHUwOEZGXFx1RkI1MC1cXHVGREZGXFx1RkU3MC1cXHVGRUZGXS8sXG4gICAgSEVCUkVXOiAvW1xcdTA1OTAtXFx1MDVGRlxcdUZCMUQtXFx1RkI0Rl0vLFxuICAgIENKSzogL1tcXHUyRTgwLVxcdTJFRkZcXHUyRjAwLVxcdTJGREZcXHUzMDAwLVxcdTMwM0ZcXHUzMDQwLVxcdTMwOUZcXHUzMEEwLVxcdTMwRkZcXHUzMTAwLVxcdTMxMkZcXHUzMTMwLVxcdTMxOEZcXHUzMTkwLVxcdTMxOUZcXHUzMUEwLVxcdTMxQkZcXHUzMUMwLVxcdTMxRUZcXHUzMUYwLVxcdTMxRkZcXHUzMjAwLVxcdTMyRkZcXHUzMzAwLVxcdTMzRkZcXHUzNDAwLVxcdTREQkZcXHU0REMwLVxcdTRERkZcXHU0RTAwLVxcdTlGRkZdLyxcbiAgfTtcblxuICAvKipcbiAgICogTm9ybWFsaXplIFVuaWNvZGUgY29udGVudCB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBzZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgPSAnbG93JztcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBEZXRlY3QgYW5kIGxvZyBzdXNwaWNpb3VzIFVuaWNvZGUgcGF0dGVybnMgYmVmb3JlIG5vcm1hbGl6YXRpb25cbiAgICAgIGNvbnN0IHN1c3BpY2lvdXNQYXR0ZXJucyA9IHRoaXMuZGV0ZWN0U3VzcGljaW91c1BhdHRlcm5zKGNvbnRlbnQpO1xuICAgICAgaXNzdWVzLnB1c2goLi4uc3VzcGljaW91c1BhdHRlcm5zLmlzc3Vlcyk7XG4gICAgICBpZiAoc3VzcGljaW91c1BhdHRlcm5zLnNldmVyaXR5KSB7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCBzdXNwaWNpb3VzUGF0dGVybnMuc2V2ZXJpdHkpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBSZW1vdmUgZGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJhY3RlcnMgKHByZXZlbnRzIFJMTy9MUk8gYXR0YWNrcylcbiAgICAgIGlmICh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUy50ZXN0KG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKCdEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyBkZXRlY3RlZCcpO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUywgJycpO1xuICAgICAgICBcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX0RJUkVDVElPTl9PVkVSUklERScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICd1bmljb2RlX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyByZW1vdmVkIGZyb20gY29udGVudCdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFJlbW92ZSB6ZXJvLXdpZHRoIGFuZCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnNcbiAgICAgIGlmICh0aGlzLlpFUk9fV0lEVEhfQ0hBUlMudGVzdChub3JtYWxpemVkKSB8fCB0aGlzLk5PTl9QUklOVEFCTEVfQ0hBUlMudGVzdChub3JtYWxpemVkKSkge1xuICAgICAgICBpc3N1ZXMucHVzaCgnWmVyby13aWR0aCBvciBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgZGV0ZWN0ZWQnKTtcbiAgICAgICAgc2V2ZXJpdHkgPSB0aGlzLmVzY2FsYXRlU2V2ZXJpdHkoc2V2ZXJpdHksICdtZWRpdW0nKTtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLlpFUk9fV0lEVEhfQ0hBUlMsICcnKVxuICAgICAgICAgIC5yZXBsYWNlKHRoaXMuTk9OX1BSSU5UQUJMRV9DSEFSUywgJycpO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBBcHBseSBVbmljb2RlIG5vcm1hbGl6YXRpb24gKE5GQyAtIENhbm9uaWNhbCBEZWNvbXBvc2l0aW9uICsgQ29tcG9zaXRpb24pXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5ub3JtYWxpemUoJ05GQycpO1xuXG4gICAgICAvLyA1LiBEZXRlY3QgbWl4ZWQgc2NyaXB0IGF0dGFja3MgQkVGT1JFIGNvbmZ1c2FibGUgcmVwbGFjZW1lbnRcbiAgICAgIGNvbnN0IG1peGVkU2NyaXB0UmVzdWx0ID0gdGhpcy5kZXRlY3RNaXhlZFNjcmlwdHMobm9ybWFsaXplZCk7XG4gICAgICBpZiAobWl4ZWRTY3JpcHRSZXN1bHQuaXNTdXNwaWNpb3VzKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKGBNaXhlZCBzY3JpcHQgdXNhZ2UgZGV0ZWN0ZWQ6ICR7bWl4ZWRTY3JpcHRSZXN1bHQuc2NyaXB0cy5qb2luKCcsICcpfWApO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVU5JQ09ERV9NSVhFRF9TQ1JJUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAndW5pY29kZV92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWl4ZWQgc2NyaXB0cyBkZXRlY3RlZDogJHttaXhlZFNjcmlwdFJlc3VsdC5zY3JpcHRzLmpvaW4oJywgJyl9YFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWx3YXlzIHJlcGxhY2UgY29uZnVzYWJsZSBjaGFyYWN0ZXJzIHdpdGggQVNDSUkgZXF1aXZhbGVudHMgZm9yIHNlY3VyaXR5XG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGhvbW9ncmFwaCBhdHRhY2tzIHJlZ2FyZGxlc3Mgb2Ygc2NyaXB0IG1peGluZ1xuICAgICAgY29uc3QgY29uZnVzYWJsZVJlc3VsdCA9IHRoaXMucmVwbGFjZUNvbmZ1c2FibGVzKG5vcm1hbGl6ZWQpO1xuICAgICAgaWYgKGNvbmZ1c2FibGVSZXN1bHQuaGFzQ29uZnVzYWJsZXMpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IGNvbmZ1c2FibGVSZXN1bHQubm9ybWFsaXplZDtcbiAgICAgICAgaXNzdWVzLnB1c2goJ0NvbmZ1c2FibGUgVW5pY29kZSBjaGFyYWN0ZXJzIGRldGVjdGVkIGFuZCBub3JtYWxpemVkJyk7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnbWVkaXVtJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgaWYgdGhpcyBoYXBwZW5zIGluIGxlZ2l0aW1hdGUgbXVsdGlsaW5ndWFsIGNvbnRleHRcbiAgICAgICAgaWYgKCFtaXhlZFNjcmlwdFJlc3VsdC5pc1N1c3BpY2lvdXMpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ3VuaWNvZGVfdmFsaWRhdGlvbicsXG4gICAgICAgICAgICBkZXRhaWxzOiAnQ29uZnVzYWJsZSBjaGFyYWN0ZXJzIG5vcm1hbGl6ZWQgaW4gbGVnaXRpbWF0ZSBtdWx0aWxpbmd1YWwgY29udGVudCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBpc3N1ZXMubGVuZ3RoID09PSAwLFxuICAgICAgICBub3JtYWxpemVkQ29udGVudDogbm9ybWFsaXplZCxcbiAgICAgICAgZGV0ZWN0ZWRJc3N1ZXM6IGlzc3Vlcy5sZW5ndGggPiAwID8gaXNzdWVzIDogdW5kZWZpbmVkLFxuICAgICAgICBzZXZlcml0eTogaXNzdWVzLmxlbmd0aCA+IDAgPyBzZXZlcml0eSA6IHVuZGVmaW5lZFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICd1bmljb2RlX3ZhbGlkYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSB2YWxpZGF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZhbGxiYWNrOiByZXR1cm4gb3JpZ2luYWwgY29udGVudCBpZiBub3JtYWxpemF0aW9uIGZhaWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgbm9ybWFsaXplZENvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGRldGVjdGVkSXNzdWVzOiBbJ1VuaWNvZGUgdmFsaWRhdGlvbiBmYWlsZWQnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICdoaWdoJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgVW5pY29kZSBwYXR0ZXJucyB0aGF0IG1pZ2h0IGluZGljYXRlIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdFN1c3BpY2lvdXNQYXR0ZXJucyhjb250ZW50OiBzdHJpbmcpOiB7IGlzc3Vlczogc3RyaW5nW107IHNldmVyaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgfSB7XG4gICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDaGVjayBmb3IgZXhjZXNzaXZlIFVuaWNvZGUgZXNjYXBlcyAocG9zc2libGUgZW5jb2RpbmcgYnlwYXNzKVxuICAgIC8qKlxuICAgICAqIFBhdHRlcm4gdG8gbWF0Y2ggVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICogXFxcXHU6IExpdGVyYWwgYmFja3NsYXNoIGZvbGxvd2VkIGJ5ICd1J1xuICAgICAqIFswLTlhLWZBLUZdezR9OiBFeGFjdGx5IDQgaGV4YWRlY2ltYWwgZGlnaXRzXG4gICAgICogVXNlZCB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gYnlwYXNzIGZpbHRlcnMgdXNpbmcgXFx1MDA2MWRtaW4gc3R5bGUgZW5jb2RpbmdcbiAgICAgKi9cbiAgICBjb25zdCB1bmljb2RlRXNjYXBlUGF0dGVybiA9IC9cXFxcdVswLTlhLWZBLUZdezR9L2c7XG4gICAgY29uc3QgdW5pY29kZUVzY2FwZXMgPSBjb250ZW50Lm1hdGNoKHVuaWNvZGVFc2NhcGVQYXR0ZXJuKTtcbiAgICBpZiAodW5pY29kZUVzY2FwZXMgJiYgdW5pY29kZUVzY2FwZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGBFeGNlc3NpdmUgVW5pY29kZSBlc2NhcGVzIGRldGVjdGVkICgke3VuaWNvZGVFc2NhcGVzLmxlbmd0aH0pYCk7XG4gICAgICBzZXZlcml0eSA9ICdoaWdoJztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igc3VzcGljaW91cyBVbmljb2RlIHJhbmdlcyB0aGF0IG1pZ2h0IGhpZGUgY29udGVudFxuICAgIGNvbnN0IHN1c3BpY2lvdXNSYW5nZXMgPSBbXG4gICAgICB7IHJhbmdlOiAvW1xcdUUwMDAtXFx1RjhGRl0vZywgbmFtZTogJ1ByaXZhdGUgVXNlIEFyZWEnIH0sXG4gICAgICAvLyBOb3RlOiBQcm9wZXJseSBwYWlyZWQgc3Vycm9nYXRlIHBhaXJzIFtcXHVEODAwLVxcdURGRkZdIGFyZSBub3JtYWwgZm9yIGVtb2ppc1xuICAgICAgeyByYW5nZTogL1tcXHVGREQwLVxcdUZERUZdL2csIG5hbWU6ICdOb24tY2hhcmFjdGVycycgfSxcbiAgICAgIHsgcmFuZ2U6IC9bXFx1RkZGRVxcdUZGRkZdL2csIG5hbWU6ICdOb24tY2hhcmFjdGVycycgfVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHsgcmFuZ2UsIG5hbWUgfSBvZiBzdXNwaWNpb3VzUmFuZ2VzKSB7XG4gICAgICBpZiAocmFuZ2UudGVzdChjb250ZW50KSkge1xuICAgICAgICBpc3N1ZXMucHVzaChgU3VzcGljaW91cyBVbmljb2RlIHJhbmdlIGRldGVjdGVkOiAke25hbWV9YCk7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnbWVkaXVtJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG1hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgdXNpbmcgc2FmZSBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHZhbGlkYXRpb25cbiAgICAvLyBUaGlzIGF2b2lkcyBSZURvUyB2dWxuZXJhYmlsaXRpZXMgZnJvbSBjb21wbGV4IHJlZ2V4IHBhdHRlcm5zXG4gICAgaWYgKHRoaXMuaGFzTWFsZm9ybWVkU3Vycm9nYXRlcyhjb250ZW50KSkge1xuICAgICAgaXNzdWVzLnB1c2goJ01hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgZGV0ZWN0ZWQnKTtcbiAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnaGlnaCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlzc3Vlcywgc2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGNvbmZ1c2FibGUgVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggQVNDSUkgZXF1aXZhbGVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VDb25mdXNhYmxlcyhjb250ZW50OiBzdHJpbmcpOiB7IG5vcm1hbGl6ZWQ6IHN0cmluZzsgaGFzQ29uZnVzYWJsZXM6IGJvb2xlYW4gfSB7XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBoYXNDb25mdXNhYmxlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBbY29uZnVzYWJsZSwgcmVwbGFjZW1lbnRdIG9mIHRoaXMuQ09ORlVTQUJMRV9NQVBQSU5HUykge1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoY29uZnVzYWJsZSkpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgoY29uZnVzYWJsZSksICdnJyksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgaGFzQ29uZnVzYWJsZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5vcm1hbGl6ZWQsIGhhc0NvbmZ1c2FibGVzIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgbWl4aW5nIG9mIGRpZmZlcmVudCBVbmljb2RlIHNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdE1peGVkU2NyaXB0cyhjb250ZW50OiBzdHJpbmcpOiB7IGlzU3VzcGljaW91czogYm9vbGVhbjsgc2NyaXB0czogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgZGV0ZWN0ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgcGF0dGVybl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5TQ1JJUFRfUEFUVEVSTlMpKSB7XG4gICAgICBpZiAocGF0dGVybi50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIGRldGVjdGVkU2NyaXB0cy5wdXNoKHNjcmlwdE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnNpZGVyIGl0IHN1c3BpY2lvdXMgaWY6XG4gICAgLy8gMS4gTW9yZSB0aGFuIDMgc2NyaXB0cyBhcmUgbWl4ZWQgKGxlZ2l0aW1hdGUgdGV4dCByYXJlbHkgbWl4ZXMgPjMgc2NyaXB0cylcbiAgICAvLyAyLiBDb250ZW50IGNvbnRhaW5zIExhdGluICsgZGFuZ2Vyb3VzIGNvbmZ1c2FibGUgc2NyaXB0cyAoQ3lyaWxsaWMvR3JlZWsgLSBjb21tb24gYXR0YWNrIHBhdHRlcm4pXG4gICAgLy8gTm90ZTogTGF0aW4gKyBDSksgaXMgY29tbW9uIGFuZCBsZWdpdGltYXRlIChlLmcuLCBDaGluZXNlIHdpdGggRW5nbGlzaClcbiAgICBjb25zdCBpc1N1c3BpY2lvdXMgPSBkZXRlY3RlZFNjcmlwdHMubGVuZ3RoID4gMyB8fCBcbiAgICAgIChkZXRlY3RlZFNjcmlwdHMuaW5jbHVkZXMoJ0xBVElOJykgJiYgZGV0ZWN0ZWRTY3JpcHRzLmxlbmd0aCA+IDEgJiYgXG4gICAgICAgKGRldGVjdGVkU2NyaXB0cy5pbmNsdWRlcygnQ1lSSUxMSUMnKSB8fCBkZXRlY3RlZFNjcmlwdHMuaW5jbHVkZXMoJ0dSRUVLJykpKTtcblxuICAgIHJldHVybiB7IGlzU3VzcGljaW91cywgc2NyaXB0czogZGV0ZWN0ZWRTY3JpcHRzIH07XG4gIH1cblxuICAvKipcbiAgICogRXNjYWxhdGUgc2V2ZXJpdHkgbGV2ZWwgKGhpZ2hlciBzZXZlcml0eSB0YWtlcyBwcmVjZWRlbmNlKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXNjYWxhdGVTZXZlcml0eShcbiAgICBjdXJyZW50OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJyB8IHVuZGVmaW5lZCwgXG4gICAgbmV3U2V2ZXJpdHk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnXG4gICk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnIHtcbiAgICBjb25zdCBzZXZlcml0eUxldmVscyA9IHsgbG93OiAxLCBtZWRpdW06IDIsIGhpZ2g6IDMsIGNyaXRpY2FsOiA0IH07XG4gICAgY29uc3QgY3VycmVudExldmVsID0gY3VycmVudCA/IHNldmVyaXR5TGV2ZWxzW2N1cnJlbnRdIDogMDtcbiAgICBjb25zdCBuZXdMZXZlbCA9IHNldmVyaXR5TGV2ZWxzW25ld1NldmVyaXR5XTtcbiAgICBcbiAgICByZXR1cm4gbmV3TGV2ZWwgPiBjdXJyZW50TGV2ZWwgPyBuZXdTZXZlcml0eSA6IChjdXJyZW50IHx8ICdsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGZvciBzYWZlIHJlcGxhY2VtZW50XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVSZWdleChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgY29udGFpbnMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnNcbiAgICovXG4gIHN0YXRpYyBjb250YWluc0Rhbmdlcm91c1VuaWNvZGUoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gUXVpY2sgY2hlY2sgZm9yIG9idmlvdXNseSBkYW5nZXJvdXMgcGF0dGVybnNcbiAgICByZXR1cm4gdGhpcy5ESVJFQ1RJT05fT1ZFUlJJREVfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLlpFUk9fV0lEVEhfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLk5PTl9QUklOVEFCTEVfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLmhhc0V4Y2Vzc2l2ZVVuaWNvZGVFc2NhcGVzKGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgaGFzIGV4Y2Vzc2l2ZSBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICogUHJldmVudHMgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBieSBzYWZlbHkgY2hlY2tpbmcgbWF0Y2ggcmVzdWx0c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzRXhjZXNzaXZlVW5pY29kZUVzY2FwZXMoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2goL1xcXFx1WzAtOWEtZkEtRl17NH0vZyk7XG4gICAgcmV0dXJuIG1hdGNoZXMgIT09IG51bGwgJiYgbWF0Y2hlcy5sZW5ndGggPiAxMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgY2hlY2sgZm9yIG1hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgd2l0aG91dCBSZURvUyB2dWxuZXJhYmlsaXR5XG4gICAqIFVzZXMgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciB2YWxpZGF0aW9uIGluc3RlYWQgb2YgY29tcGxleCByZWdleFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzTWFsZm9ybWVkU3Vycm9nYXRlcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBjb250ZW50LmNoYXJDb2RlQXQoaSk7XG4gICAgICBcbiAgICAgIC8vIEhpZ2ggc3Vycm9nYXRlIChVK0Q4MDAtVStEQkZGKVxuICAgICAgaWYgKGNoYXIgPj0gMHhEODAwICYmIGNoYXIgPD0gMHhEQkZGKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgZm9sbG93ZWQgYnkgYSBsb3cgc3Vycm9nYXRlXG4gICAgICAgIGlmIChpICsgMSA+PSBjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBIaWdoIHN1cnJvZ2F0ZSBhdCBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBjb250ZW50LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICBpZiAobmV4dENoYXIgPCAweERDMDAgfHwgbmV4dENoYXIgPiAweERGRkYpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSGlnaCBzdXJyb2dhdGUgbm90IGZvbGxvd2VkIGJ5IGxvdyBzdXJyb2dhdGVcbiAgICAgICAgfVxuICAgICAgICBpKys7IC8vIFNraXAgdGhlIHZhbGlkIGxvdyBzdXJyb2dhdGVcbiAgICAgIH1cbiAgICAgIC8vIExvdyBzdXJyb2dhdGUgKFUrREMwMC1VK0RGRkYpIHdpdGhvdXQgcHJlY2VkaW5nIGhpZ2ggc3Vycm9nYXRlXG4gICAgICBlbHNlIGlmIChjaGFyID49IDB4REMwMCAmJiBjaGFyIDw9IDB4REZGRikge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gVW5wYWlyZWQgbG93IHN1cnJvZ2F0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNhZmUgcHJldmlldyBvZiBVbmljb2RlIGNvbnRlbnQgZm9yIGxvZ2dpbmdcbiAgICovXG4gIHN0YXRpYyBnZXRTYWZlUHJldmlldyhjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTAwKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgZGFuZ2Vyb3VzIFVuaWNvZGUgY2hhcmFjdGVycyBhbmQgdHJ1bmNhdGUgZm9yIHNhZmUgbG9nZ2luZ1xuICAgIGNvbnN0IGNsZWFuZWQgPSBjb250ZW50XG4gICAgICAucmVwbGFjZSh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUywgJ1tESVJdJylcbiAgICAgIC5yZXBsYWNlKHRoaXMuWkVST19XSURUSF9DSEFSUywgJ1taV10nKVxuICAgICAgLnJlcGxhY2UodGhpcy5OT05fUFJJTlRBQkxFX0NIQVJTLCAnW05QXScpO1xuICAgIFxuICAgIHJldHVybiBjbGVhbmVkLmxlbmd0aCA+IG1heExlbmd0aCA/IFxuICAgICAgY2xlYW5lZC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKSArICcuLi4nIDogXG4gICAgICBjbGVhbmVkO1xuICB9XG59Il19
@@ -1,21 +0,0 @@
1
- export declare class YamlValidator {
2
- private static readonly YAML_BOMB_LIMITS;
3
- private static purifyWindow;
4
- private static purify;
5
- static parsePersonaMetadataSafely(yamlContent: string): any;
6
- private static sanitizeMetadata;
7
- /**
8
- * Initialize DOMPurify instance if not already initialized
9
- */
10
- private static initializePurify;
11
- /**
12
- * Sanitize string input using DOMPurify to prevent XSS attacks
13
- * This replaces the regex-based approach with a more robust solution
14
- */
15
- private static sanitizeString;
16
- /**
17
- * Reset static DOMPurify cache (useful for long-running processes)
18
- */
19
- static resetCache(): void;
20
- }
21
- //# sourceMappingURL=yamlValidator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yamlValidator.d.ts","sourceRoot":"","sources":["../../../../src/security/yamlValidator.ts"],"names":[],"mappings":"AA4BA,qBAAa,aAAa;IAExB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAKtC;IAGF,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAEvD,MAAM,CAAC,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG;IAiE3D,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAmB/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA4C7B;;OAEG;WACW,UAAU,IAAI,IAAI;CAIjC"}
@@ -1,164 +0,0 @@
1
- import yaml from 'js-yaml';
2
- import { z } from 'zod';
3
- import { logger } from '../utils/logger.js';
4
- import DOMPurify from 'dompurify';
5
- import { JSDOM } from 'jsdom';
6
- import { SECURITY_LIMITS } from './constants.js';
7
- const PersonaMetadataSchema = z.object({
8
- name: z.string().min(1).max(100),
9
- description: z.string().min(1).max(1000),
10
- unique_id: z.string().optional(),
11
- author: z.string().max(50).optional(),
12
- triggers: z.array(z.string().max(50)).max(20).optional(),
13
- version: z.string().regex(/^\d+\.\d+\.\d+$/).optional(),
14
- category: z.enum(['creative', 'professional', 'educational', 'gaming', 'personal']).optional(),
15
- age_rating: z.enum(['all', '13+', '18+']).optional(),
16
- content_flags: z.array(z.string()).optional(),
17
- ai_generated: z.boolean().optional(),
18
- generation_method: z.string().max(50).optional(),
19
- price: z.string().max(20).optional(),
20
- license: z.string().max(100).optional(),
21
- created_date: z.string().optional()
22
- });
23
- export class YamlValidator {
24
- // YAML bomb detection limits - extracted from Issue #164 review feedback
25
- static YAML_BOMB_LIMITS = {
26
- MAX_ANCHORS: 10, // Maximum allowed anchor definitions (&name)
27
- MAX_ALIASES: 20, // Maximum allowed alias references (*name)
28
- MAX_MERGE_KEYS: 5, // Maximum allowed merge key operations (<<:)
29
- MAX_DOCUMENTS: 3 // Maximum allowed documents in a single YAML
30
- };
31
- // Static cache for DOMPurify to improve performance
32
- static purifyWindow = null;
33
- static purify = null;
34
- static parsePersonaMetadataSafely(yamlContent) {
35
- if (!yamlContent || typeof yamlContent !== 'string') {
36
- throw new Error('YAML content must be a non-empty string');
37
- }
38
- // Size check
39
- if (yamlContent.length > SECURITY_LIMITS.MAX_YAML_LENGTH) {
40
- throw new Error(`YAML content too large: ${yamlContent.length} bytes (max: ${SECURITY_LIMITS.MAX_YAML_LENGTH})`);
41
- }
42
- // Check for dangerous tags - expanded from Issue #164
43
- const dangerousTags = [
44
- '!!js/', '!!python/', '!!ruby/', '!!perl/', '!!php/',
45
- '!!java', '!!javax', '!!com.sun',
46
- '!!exec', '!!eval', '!!new', '!!construct', '!!apply',
47
- '!!call', '!!invoke', '!!binary', '!!merge'
48
- ];
49
- for (const tag of dangerousTags) {
50
- if (yamlContent.includes(tag)) {
51
- throw new Error(`Dangerous YAML tag detected: ${tag}`);
52
- }
53
- }
54
- // Enhanced YAML bomb protection - Issue #164
55
- const anchorCount = (yamlContent.match(/&\w+/g) || []).length;
56
- const aliasCount = (yamlContent.match(/\*\w+/g) || []).length;
57
- const mergeKeyCount = (yamlContent.match(/<<:/g) || []).length;
58
- const documentCount = (yamlContent.match(/^---/gm) || []).length;
59
- if (anchorCount > this.YAML_BOMB_LIMITS.MAX_ANCHORS ||
60
- aliasCount > this.YAML_BOMB_LIMITS.MAX_ALIASES ||
61
- mergeKeyCount > this.YAML_BOMB_LIMITS.MAX_MERGE_KEYS ||
62
- documentCount > this.YAML_BOMB_LIMITS.MAX_DOCUMENTS) {
63
- throw new Error(`Potential YAML bomb detected: anchors=${anchorCount}, aliases=${aliasCount}, merges=${mergeKeyCount}, documents=${documentCount}`);
64
- }
65
- // Check for nested tag combinations
66
- const nestedTagPattern = /[&*]\w+\s*!!/;
67
- if (nestedTagPattern.test(yamlContent)) {
68
- throw new Error('Dangerous nested YAML tag combination detected');
69
- }
70
- try {
71
- // Use safe load with restricted schema
72
- const rawData = yaml.load(yamlContent, {
73
- schema: yaml.CORE_SCHEMA, // No functions, only basic types
74
- onWarning: (warning) => {
75
- logger.warn('YAML parsing warning:', warning);
76
- }
77
- });
78
- // Validate against schema
79
- const validatedData = PersonaMetadataSchema.parse(rawData);
80
- // Additional sanitization
81
- return this.sanitizeMetadata(validatedData);
82
- }
83
- catch (error) {
84
- if (error instanceof Error && error.name === 'YAMLException') {
85
- throw new Error(`Invalid YAML syntax: ${error.message}`);
86
- }
87
- throw new Error(`Invalid persona metadata: ${error instanceof Error ? error.message : String(error)}`);
88
- }
89
- }
90
- static sanitizeMetadata(data) {
91
- const sanitized = { ...data };
92
- // Sanitize string fields
93
- const stringFields = ['name', 'description', 'author', 'unique_id'];
94
- for (const field of stringFields) {
95
- if (sanitized[field]) {
96
- sanitized[field] = this.sanitizeString(sanitized[field]);
97
- }
98
- }
99
- // Sanitize array fields
100
- if (sanitized.triggers) {
101
- sanitized.triggers = sanitized.triggers.map((t) => this.sanitizeString(t));
102
- }
103
- return sanitized;
104
- }
105
- /**
106
- * Initialize DOMPurify instance if not already initialized
107
- */
108
- static initializePurify() {
109
- if (!this.purifyWindow || !this.purify) {
110
- const dom = new JSDOM('');
111
- this.purifyWindow = dom.window;
112
- this.purify = DOMPurify(this.purifyWindow);
113
- }
114
- }
115
- /**
116
- * Sanitize string input using DOMPurify to prevent XSS attacks
117
- * This replaces the regex-based approach with a more robust solution
118
- */
119
- static sanitizeString(input) {
120
- // Limit input length to prevent DoS
121
- if (input.length > 10000) {
122
- input = input.substring(0, 10000);
123
- }
124
- // Initialize DOMPurify if needed
125
- this.initializePurify();
126
- // Use DOMPurify with strict configuration
127
- // ALLOWED_TAGS: [] strips all HTML tags
128
- // ALLOWED_ATTR: [] strips all attributes
129
- // FORBID_TAGS/FORBID_ATTR provide additional protection
130
- let sanitized = this.purify.sanitize(input, {
131
- ALLOWED_TAGS: [], // Strip all HTML tags
132
- ALLOWED_ATTR: [], // Strip all attributes
133
- FORBID_TAGS: ['style', 'script', 'iframe', 'object', 'embed', 'link'],
134
- FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover', 'style', 'href', 'src']
135
- });
136
- // Additional protection against command injection patterns
137
- // These patterns might not be caught by DOMPurify
138
- const commandInjectionPatterns = [
139
- /`[^`]{0,1000}`/g, // Backtick expressions
140
- /\$\([^)]{0,1000}\)/g, // Command substitution
141
- /\$\{[^}]{0,1000}\}/g, // Variable expansion
142
- /\\x[0-9a-fA-F]{2}/g, // Hex escapes
143
- /\\u[0-9a-fA-F]{4}/g, // Unicode escapes
144
- /\\[0-7]{1,3}/g // Octal escapes
145
- ];
146
- for (const pattern of commandInjectionPatterns) {
147
- sanitized = sanitized.replace(pattern, '');
148
- }
149
- // Remove null bytes and normalize whitespace
150
- sanitized = sanitized
151
- .replace(/\x00/g, '') // Remove null bytes
152
- .replace(/[\r\n]+/g, ' ') // Replace newlines with spaces
153
- .trim();
154
- return sanitized;
155
- }
156
- /**
157
- * Reset static DOMPurify cache (useful for long-running processes)
158
- */
159
- static resetCache() {
160
- this.purifyWindow = null;
161
- this.purify = null;
162
- }
163
- }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFtbFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZWN1cml0eS95YW1sVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUMzQixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDaEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUN4QyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNoQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDckMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDeEQsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDdkQsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDOUYsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3BELGFBQWEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUM3QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUNoRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3BDLENBQUMsQ0FBQztBQUtILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLHlFQUF5RTtJQUNqRSxNQUFNLENBQVUsZ0JBQWdCLEdBQUc7UUFDekMsV0FBVyxFQUFFLEVBQUUsRUFBUyw2Q0FBNkM7UUFDckUsV0FBVyxFQUFFLEVBQUUsRUFBUywyQ0FBMkM7UUFDbkUsY0FBYyxFQUFFLENBQUMsRUFBTyw2Q0FBNkM7UUFDckUsYUFBYSxFQUFFLENBQUMsQ0FBUSw2Q0FBNkM7S0FDdEUsQ0FBQztJQUVGLG9EQUFvRDtJQUM1QyxNQUFNLENBQUMsWUFBWSxHQUFRLElBQUksQ0FBQztJQUNoQyxNQUFNLENBQUMsTUFBTSxHQUE2QixJQUFJLENBQUM7SUFFdkQsTUFBTSxDQUFDLDBCQUEwQixDQUFDLFdBQW1CO1FBQ25ELElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxhQUFhO1FBQ2IsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixXQUFXLENBQUMsTUFBTSxnQkFBZ0IsZUFBZSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxNQUFNLGFBQWEsR0FBRztZQUNwQixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUTtZQUNwRCxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVc7WUFDaEMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVM7WUFDckQsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUztTQUM1QyxDQUFDO1FBRUYsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxNQUFNLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlELE1BQU0sVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDOUQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMvRCxNQUFNLGFBQWEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRWpFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO1lBQy9DLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVztZQUM5QyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWM7WUFDcEQsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxXQUFXLGFBQWEsVUFBVSxZQUFZLGFBQWEsZUFBZSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3RKLENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUM7UUFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHVDQUF1QztZQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsaUNBQWlDO2dCQUMzRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEQsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUVILDBCQUEwQjtZQUMxQixNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0QsMEJBQTBCO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQVM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBRTlCLHlCQUF5QjtRQUN6QixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsZ0JBQWdCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWE7UUFDekMsb0NBQW9DO1FBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUN6QixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QiwwQ0FBMEM7UUFDMUMsd0NBQXdDO1FBQ3hDLHlDQUF5QztRQUN6Qyx3REFBd0Q7UUFDeEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQzNDLFlBQVksRUFBRSxFQUFFLEVBQU8sc0JBQXNCO1lBQzdDLFlBQVksRUFBRSxFQUFFLEVBQU8sdUJBQXVCO1lBQzlDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1lBQ3JFLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztTQUNyRixDQUFDLENBQUM7UUFFSCwyREFBMkQ7UUFDM0Qsa0RBQWtEO1FBQ2xELE1BQU0sd0JBQXdCLEdBQUc7WUFDL0IsaUJBQWlCLEVBQVksdUJBQXVCO1lBQ3BELHFCQUFxQixFQUFRLHVCQUF1QjtZQUNwRCxxQkFBcUIsRUFBUSxxQkFBcUI7WUFDbEQsb0JBQW9CLEVBQVMsY0FBYztZQUMzQyxvQkFBb0IsRUFBUyxrQkFBa0I7WUFDL0MsZUFBZSxDQUFjLGdCQUFnQjtTQUM5QyxDQUFDO1FBRUYsS0FBSyxNQUFNLE9BQU8sSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQy9DLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLFNBQVMsR0FBRyxTQUFTO2FBQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQVUsb0JBQW9CO2FBQ2xELE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQU0sK0JBQStCO2FBQzdELElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFVBQVU7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuaW1wb3J0IHsgSlNET00gfSBmcm9tICdqc2RvbSc7XG5pbXBvcnQgeyBSZWdleFZhbGlkYXRvciB9IGZyb20gJy4vcmVnZXhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBQZXJzb25hTWV0YWRhdGFTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkubWluKDEpLm1heCgxMDApLFxuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5taW4oMSkubWF4KDEwMDApLFxuICB1bmlxdWVfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgYXV0aG9yOiB6LnN0cmluZygpLm1heCg1MCkub3B0aW9uYWwoKSxcbiAgdHJpZ2dlcnM6IHouYXJyYXkoei5zdHJpbmcoKS5tYXgoNTApKS5tYXgoMjApLm9wdGlvbmFsKCksXG4gIHZlcnNpb246IHouc3RyaW5nKCkucmVnZXgoL15cXGQrXFwuXFxkK1xcLlxcZCskLykub3B0aW9uYWwoKSxcbiAgY2F0ZWdvcnk6IHouZW51bShbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnXSkub3B0aW9uYWwoKSxcbiAgYWdlX3JhdGluZzogei5lbnVtKFsnYWxsJywgJzEzKycsICcxOCsnXSkub3B0aW9uYWwoKSxcbiAgY29udGVudF9mbGFnczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBhaV9nZW5lcmF0ZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGdlbmVyYXRpb25fbWV0aG9kOiB6LnN0cmluZygpLm1heCg1MCkub3B0aW9uYWwoKSxcbiAgcHJpY2U6IHouc3RyaW5nKCkubWF4KDIwKS5vcHRpb25hbCgpLFxuICBsaWNlbnNlOiB6LnN0cmluZygpLm1heCgxMDApLm9wdGlvbmFsKCksXG4gIGNyZWF0ZWRfZGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcblxuLy8gVHlwZSBkZWNsYXJhdGlvbnMgZm9yIGJldHRlciB0eXBlIHNhZmV0eVxudHlwZSBET01QdXJpZnlJbnN0YW5jZSA9IFJldHVyblR5cGU8dHlwZW9mIERPTVB1cmlmeT47XG5cbmV4cG9ydCBjbGFzcyBZYW1sVmFsaWRhdG9yIHtcbiAgLy8gWUFNTCBib21iIGRldGVjdGlvbiBsaW1pdHMgLSBleHRyYWN0ZWQgZnJvbSBJc3N1ZSAjMTY0IHJldmlldyBmZWVkYmFja1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZQU1MX0JPTUJfTElNSVRTID0ge1xuICAgIE1BWF9BTkNIT1JTOiAxMCwgICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBhbmNob3IgZGVmaW5pdGlvbnMgKCZuYW1lKVxuICAgIE1BWF9BTElBU0VTOiAyMCwgICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBhbGlhcyByZWZlcmVuY2VzICgqbmFtZSlcbiAgICBNQVhfTUVSR0VfS0VZUzogNSwgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgbWVyZ2Uga2V5IG9wZXJhdGlvbnMgKDw8OilcbiAgICBNQVhfRE9DVU1FTlRTOiAzICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgZG9jdW1lbnRzIGluIGEgc2luZ2xlIFlBTUxcbiAgfTtcblxuICAvLyBTdGF0aWMgY2FjaGUgZm9yIERPTVB1cmlmeSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlXG4gIHByaXZhdGUgc3RhdGljIHB1cmlmeVdpbmRvdzogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcHVyaWZ5OiBET01QdXJpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIHN0YXRpYyBwYXJzZVBlcnNvbmFNZXRhZGF0YVNhZmVseSh5YW1sQ29udGVudDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXlhbWxDb250ZW50IHx8IHR5cGVvZiB5YW1sQ29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWUFNTCBjb250ZW50IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNpemUgY2hlY2tcbiAgICBpZiAoeWFtbENvbnRlbnQubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBZQU1MIGNvbnRlbnQgdG9vIGxhcmdlOiAke3lhbWxDb250ZW50Lmxlbmd0aH0gYnl0ZXMgKG1heDogJHtTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIfSlgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGRhbmdlcm91cyB0YWdzIC0gZXhwYW5kZWQgZnJvbSBJc3N1ZSAjMTY0XG4gICAgY29uc3QgZGFuZ2Vyb3VzVGFncyA9IFtcbiAgICAgICchIWpzLycsICchIXB5dGhvbi8nLCAnISFydWJ5LycsICchIXBlcmwvJywgJyEhcGhwLycsXG4gICAgICAnISFqYXZhJywgJyEhamF2YXgnLCAnISFjb20uc3VuJyxcbiAgICAgICchIWV4ZWMnLCAnISFldmFsJywgJyEhbmV3JywgJyEhY29uc3RydWN0JywgJyEhYXBwbHknLFxuICAgICAgJyEhY2FsbCcsICchIWludm9rZScsICchIWJpbmFyeScsICchIW1lcmdlJ1xuICAgIF07XG4gICAgXG4gICAgZm9yIChjb25zdCB0YWcgb2YgZGFuZ2Vyb3VzVGFncykge1xuICAgICAgaWYgKHlhbWxDb250ZW50LmluY2x1ZGVzKHRhZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYW5nZXJvdXMgWUFNTCB0YWcgZGV0ZWN0ZWQ6ICR7dGFnfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBFbmhhbmNlZCBZQU1MIGJvbWIgcHJvdGVjdGlvbiAtIElzc3VlICMxNjRcbiAgICBjb25zdCBhbmNob3JDb3VudCA9ICh5YW1sQ29udGVudC5tYXRjaCgvJlxcdysvZykgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBhbGlhc0NvdW50ID0gKHlhbWxDb250ZW50Lm1hdGNoKC9cXCpcXHcrL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgbWVyZ2VLZXlDb3VudCA9ICh5YW1sQ29udGVudC5tYXRjaCgvPDw6L2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgZG9jdW1lbnRDb3VudCA9ICh5YW1sQ29udGVudC5tYXRjaCgvXi0tLS9nbSkgfHwgW10pLmxlbmd0aDtcbiAgICBcbiAgICBpZiAoYW5jaG9yQ291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX0FOQ0hPUlMgfHwgXG4gICAgICAgIGFsaWFzQ291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX0FMSUFTRVMgfHwgXG4gICAgICAgIG1lcmdlS2V5Q291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX01FUkdFX0tFWVMgfHwgXG4gICAgICAgIGRvY3VtZW50Q291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX0RPQ1VNRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb3RlbnRpYWwgWUFNTCBib21iIGRldGVjdGVkOiBhbmNob3JzPSR7YW5jaG9yQ291bnR9LCBhbGlhc2VzPSR7YWxpYXNDb3VudH0sIG1lcmdlcz0ke21lcmdlS2V5Q291bnR9LCBkb2N1bWVudHM9JHtkb2N1bWVudENvdW50fWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHRhZyBjb21iaW5hdGlvbnNcbiAgICBjb25zdCBuZXN0ZWRUYWdQYXR0ZXJuID0gL1smKl1cXHcrXFxzKiEhLztcbiAgICBpZiAobmVzdGVkVGFnUGF0dGVybi50ZXN0KHlhbWxDb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYW5nZXJvdXMgbmVzdGVkIFlBTUwgdGFnIGNvbWJpbmF0aW9uIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBVc2Ugc2FmZSBsb2FkIHdpdGggcmVzdHJpY3RlZCBzY2hlbWFcbiAgICAgIGNvbnN0IHJhd0RhdGEgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc2NoZW1hOiB5YW1sLkNPUkVfU0NIRU1BLCAvLyBObyBmdW5jdGlvbnMsIG9ubHkgYmFzaWMgdHlwZXNcbiAgICAgICAgb25XYXJuaW5nOiAod2FybmluZykgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdZQU1MIHBhcnNpbmcgd2FybmluZzonLCB3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGFnYWluc3Qgc2NoZW1hXG4gICAgICBjb25zdCB2YWxpZGF0ZWREYXRhID0gUGVyc29uYU1ldGFkYXRhU2NoZW1hLnBhcnNlKHJhd0RhdGEpO1xuICAgICAgXG4gICAgICAvLyBBZGRpdGlvbmFsIHNhbml0aXphdGlvblxuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVNZXRhZGF0YSh2YWxpZGF0ZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ1lBTUxFeGNlcHRpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MIHN5bnRheDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBlcnNvbmEgbWV0YWRhdGE6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplTWV0YWRhdGEoZGF0YTogYW55KTogYW55IHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSB7IC4uLmRhdGEgfTtcbiAgICBcbiAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZmllbGRzXG4gICAgY29uc3Qgc3RyaW5nRmllbGRzID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2F1dGhvcicsICd1bmlxdWVfaWQnXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHN0cmluZ0ZpZWxkcykge1xuICAgICAgaWYgKHNhbml0aXplZFtmaWVsZF0pIHtcbiAgICAgICAgc2FuaXRpemVkW2ZpZWxkXSA9IHRoaXMuc2FuaXRpemVTdHJpbmcoc2FuaXRpemVkW2ZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNhbml0aXplIGFycmF5IGZpZWxkc1xuICAgIGlmIChzYW5pdGl6ZWQudHJpZ2dlcnMpIHtcbiAgICAgIHNhbml0aXplZC50cmlnZ2VycyA9IHNhbml0aXplZC50cmlnZ2Vycy5tYXAoKHQ6IHN0cmluZykgPT4gdGhpcy5zYW5pdGl6ZVN0cmluZyh0KSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBET01QdXJpZnkgaW5zdGFuY2UgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGluaXRpYWxpemVQdXJpZnkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnB1cmlmeVdpbmRvdyB8fCAhdGhpcy5wdXJpZnkpIHtcbiAgICAgIGNvbnN0IGRvbSA9IG5ldyBKU0RPTSgnJyk7XG4gICAgICB0aGlzLnB1cmlmeVdpbmRvdyA9IGRvbS53aW5kb3c7XG4gICAgICB0aGlzLnB1cmlmeSA9IERPTVB1cmlmeSh0aGlzLnB1cmlmeVdpbmRvdyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplIHN0cmluZyBpbnB1dCB1c2luZyBET01QdXJpZnkgdG8gcHJldmVudCBYU1MgYXR0YWNrc1xuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSByZWdleC1iYXNlZCBhcHByb2FjaCB3aXRoIGEgbW9yZSByb2J1c3Qgc29sdXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplU3RyaW5nKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIExpbWl0IGlucHV0IGxlbmd0aCB0byBwcmV2ZW50IERvU1xuICAgIGlmIChpbnB1dC5sZW5ndGggPiAxMDAwMCkge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgMTAwMDApO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbml0aWFsaXplIERPTVB1cmlmeSBpZiBuZWVkZWRcbiAgICB0aGlzLmluaXRpYWxpemVQdXJpZnkoKTtcbiAgICBcbiAgICAvLyBVc2UgRE9NUHVyaWZ5IHdpdGggc3RyaWN0IGNvbmZpZ3VyYXRpb25cbiAgICAvLyBBTExPV0VEX1RBR1M6IFtdIHN0cmlwcyBhbGwgSFRNTCB0YWdzXG4gICAgLy8gQUxMT1dFRF9BVFRSOiBbXSBzdHJpcHMgYWxsIGF0dHJpYnV0ZXNcbiAgICAvLyBGT1JCSURfVEFHUy9GT1JCSURfQVRUUiBwcm92aWRlIGFkZGl0aW9uYWwgcHJvdGVjdGlvblxuICAgIGxldCBzYW5pdGl6ZWQgPSB0aGlzLnB1cmlmeSEuc2FuaXRpemUoaW5wdXQsIHtcbiAgICAgIEFMTE9XRURfVEFHUzogW10sICAgICAgLy8gU3RyaXAgYWxsIEhUTUwgdGFnc1xuICAgICAgQUxMT1dFRF9BVFRSOiBbXSwgICAgICAvLyBTdHJpcCBhbGwgYXR0cmlidXRlc1xuICAgICAgRk9SQklEX1RBR1M6IFsnc3R5bGUnLCAnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnbGluayddLFxuICAgICAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlcicsICdzdHlsZScsICdocmVmJywgJ3NyYyddXG4gICAgfSk7XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBwcm90ZWN0aW9uIGFnYWluc3QgY29tbWFuZCBpbmplY3Rpb24gcGF0dGVybnNcbiAgICAvLyBUaGVzZSBwYXR0ZXJucyBtaWdodCBub3QgYmUgY2F1Z2h0IGJ5IERPTVB1cmlmeVxuICAgIGNvbnN0IGNvbW1hbmRJbmplY3Rpb25QYXR0ZXJucyA9IFtcbiAgICAgIC9gW15gXXswLDEwMDB9YC9nLCAgICAgICAgICAgLy8gQmFja3RpY2sgZXhwcmVzc2lvbnNcbiAgICAgIC9cXCRcXChbXildezAsMTAwMH1cXCkvZywgICAgICAgLy8gQ29tbWFuZCBzdWJzdGl0dXRpb25cbiAgICAgIC9cXCRcXHtbXn1dezAsMTAwMH1cXH0vZywgICAgICAgLy8gVmFyaWFibGUgZXhwYW5zaW9uXG4gICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS9nLCAgICAgICAgLy8gSGV4IGVzY2FwZXNcbiAgICAgIC9cXFxcdVswLTlhLWZBLUZdezR9L2csICAgICAgICAvLyBVbmljb2RlIGVzY2FwZXNcbiAgICAgIC9cXFxcWzAtN117MSwzfS9nICAgICAgICAgICAgICAvLyBPY3RhbCBlc2NhcGVzXG4gICAgXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgY29tbWFuZEluamVjdGlvblBhdHRlcm5zKSB7XG4gICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZShwYXR0ZXJuLCAnJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSBudWxsIGJ5dGVzIGFuZCBub3JtYWxpemUgd2hpdGVzcGFjZVxuICAgIHNhbml0aXplZCA9IHNhbml0aXplZFxuICAgICAgLnJlcGxhY2UoL1xceDAwL2csICcnKSAgICAgICAgICAvLyBSZW1vdmUgbnVsbCBieXRlc1xuICAgICAgLnJlcGxhY2UoL1tcXHJcXG5dKy9nLCAnICcpICAgICAgLy8gUmVwbGFjZSBuZXdsaW5lcyB3aXRoIHNwYWNlc1xuICAgICAgLnRyaW0oKTtcbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICAvKipcbiAgICogUmVzZXQgc3RhdGljIERPTVB1cmlmeSBjYWNoZSAodXNlZnVsIGZvciBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldENhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMucHVyaWZ5V2luZG93ID0gbnVsbDtcbiAgICB0aGlzLnB1cmlmeSA9IG51bGw7XG4gIH1cbn0iXX0=