@projectcor/maia-components 2.28.0 → 2.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) hide show
  1. package/lib/App.js +55 -0
  2. package/lib/components/atoms/ActionableButton.js +60 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +89 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +21 -0
  5. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +9 -0
  6. package/lib/components/atoms/AgentActivityIndicator/index.js +2 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +209 -0
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +93 -0
  9. package/lib/components/atoms/ApprovalBox/index.js +2 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCard.js +218 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +52 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +448 -0
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +58 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +55 -0
  15. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +14 -0
  16. package/lib/components/atoms/AttachmentCard/index.js +4 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +442 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +119 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +222 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +313 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/index.js +2 -0
  23. package/lib/components/atoms/Backdrop/Backdrop.js +17 -0
  24. package/lib/components/atoms/Backdrop/Backdrop.styles.js +9 -0
  25. package/lib/components/atoms/Backdrop/index.js +2 -0
  26. package/lib/components/atoms/CardItem.js +7 -0
  27. package/lib/components/atoms/CardMenu/CardMenu.js +131 -0
  28. package/lib/components/atoms/CardMenu/index.js +2 -0
  29. package/lib/components/atoms/CardMenu/styles.js +21 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +77 -0
  31. package/lib/components/atoms/ChatClientSelector/index.js +2 -0
  32. package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +9 -0
  33. package/lib/components/atoms/ChatDisclaimerMessage/index.js +2 -0
  34. package/lib/components/atoms/ChatDisclaimerMessage/styles.js +6 -0
  35. package/lib/components/atoms/Checkbox/Checkbox.js +34 -0
  36. package/lib/components/atoms/Checkbox/index.js +2 -0
  37. package/lib/components/atoms/Checkbox/styles.js +39 -0
  38. package/lib/components/atoms/Chip/Chip.js +150 -0
  39. package/lib/components/atoms/Chip/index.js +2 -0
  40. package/lib/components/atoms/Chip/styles.js +43 -0
  41. package/lib/components/atoms/ChipLlm/ChipLlm.js +45 -0
  42. package/lib/components/atoms/ChipLlm/ChipLlm.style.js +21 -0
  43. package/lib/components/atoms/ChipLlm/index.js +2 -0
  44. package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +2 -0
  45. package/lib/components/atoms/ChipStatus/ChipStatus.js +14 -0
  46. package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +27 -0
  47. package/lib/components/atoms/ChipStatus/index.js +2 -0
  48. package/lib/components/atoms/ClearButton.js +6 -0
  49. package/lib/components/atoms/ClientSelector/ClientSelector.js +146 -0
  50. package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +15 -0
  51. package/lib/components/atoms/ClientSelector/index.js +2 -0
  52. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  53. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +188 -0
  54. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  55. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +434 -0
  56. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  57. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +411 -0
  58. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +10 -0
  59. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  60. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +309 -0
  61. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +157 -0
  62. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  63. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +307 -0
  64. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +108 -0
  65. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  66. package/lib/components/atoms/CopyToClipboard.js +70 -0
  67. package/lib/components/atoms/EditableLabel/EditableLabel.js +110 -0
  68. package/lib/components/atoms/EditableLabel/index.js +2 -0
  69. package/lib/components/atoms/EditableLabel/styles.js +7 -0
  70. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +22 -0
  71. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +18 -0
  72. package/lib/components/atoms/EmptySearchClients/index.js +2 -0
  73. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +19 -0
  74. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +15 -0
  75. package/lib/components/atoms/EmptySearchProjects/index.js +2 -0
  76. package/lib/components/atoms/EntitySelector/EntitySelector.js +247 -0
  77. package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +38 -0
  78. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +67 -0
  79. package/lib/components/atoms/EntitySelector/index.js +2 -0
  80. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +14 -0
  81. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +15 -0
  82. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +14 -0
  83. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +15 -0
  84. package/lib/components/atoms/ErrorSearchFaqs/index.js +2 -0
  85. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +18 -0
  86. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +15 -0
  87. package/lib/components/atoms/ErrorSearchProjects/index.js +2 -0
  88. package/lib/components/atoms/Expand/Expand.js +32 -0
  89. package/lib/components/atoms/Expand/index.js +2 -0
  90. package/lib/components/atoms/Fade/Fade.js +56 -0
  91. package/lib/components/atoms/Fade/index.js +2 -0
  92. package/lib/components/atoms/FeedbackButton/FeedbackButton.js +59 -0
  93. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +14 -0
  94. package/lib/components/atoms/FeedbackButton/index.js +2 -0
  95. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +138 -0
  96. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +44 -0
  97. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +43 -0
  98. package/lib/components/atoms/FrequentlyAskedQuestions/index.js +2 -0
  99. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +122 -0
  100. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +43 -0
  101. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +62 -0
  102. package/lib/components/atoms/FrequentlyUsedActions/index.js +2 -0
  103. package/lib/components/atoms/GoBackButton.js +24 -0
  104. package/lib/components/atoms/HelpButton.js +44 -0
  105. package/lib/components/atoms/IconButton.js +56 -0
  106. package/lib/components/atoms/ImagePreview/ImagePreview.js +96 -0
  107. package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +70 -0
  108. package/lib/components/atoms/Input/CustomInput.interface.js +2 -0
  109. package/lib/components/atoms/Input/CustomInput.js +91 -0
  110. package/lib/components/atoms/Input/CustomInput.styles.js +39 -0
  111. package/lib/components/atoms/Input/index.js +2 -0
  112. package/lib/components/atoms/ListMenuOption/ListMenuOption.js +41 -0
  113. package/lib/components/atoms/ListMenuOption/index.js +2 -0
  114. package/lib/components/atoms/ListMenuOption/styles.js +9 -0
  115. package/lib/components/atoms/Loader.js +41 -0
  116. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +11 -0
  117. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +6 -0
  118. package/lib/components/atoms/LoadingFaqs/index.js +2 -0
  119. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +11 -0
  120. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +6 -0
  121. package/lib/components/atoms/LoadingSearchClients/index.js +2 -0
  122. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +14 -0
  123. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +10 -0
  124. package/lib/components/atoms/LoadingSearchProjects/index.js +2 -0
  125. package/lib/components/atoms/LoadingText/LoadingText.js +18 -0
  126. package/lib/components/atoms/LoadingText/index.js +2 -0
  127. package/lib/components/atoms/LoadingText/styles.js +7 -0
  128. package/lib/components/atoms/MAIAButton/MAIAButton.js +33 -0
  129. package/lib/components/atoms/MAIAButton/index.js +2 -0
  130. package/lib/components/atoms/MAIAError/MAIAError.js +15 -0
  131. package/lib/components/atoms/MAIAError/index.js +2 -0
  132. package/lib/components/atoms/MAIAInput/MAIAInput.js +1058 -0
  133. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +266 -0
  134. package/lib/components/atoms/MAIAInput/index.js +2 -0
  135. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +25 -0
  136. package/lib/components/atoms/MAIAInput/styles.js +182 -0
  137. package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +2 -0
  138. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +22 -0
  139. package/lib/components/atoms/MAIAMessage/index.js +2 -0
  140. package/lib/components/atoms/MAIAMessage/styles.js +7 -0
  141. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +23 -0
  142. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +2 -0
  143. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +51 -0
  144. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +26 -0
  145. package/lib/components/atoms/MaiaStreamdown/index.js +2 -0
  146. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +18 -0
  147. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +84 -0
  148. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +15 -0
  149. package/lib/components/atoms/MaiaWrapper/index.js +3 -0
  150. package/lib/components/atoms/MaiaWrapper/styles.js +21 -0
  151. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +2 -0
  152. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +84 -0
  153. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +53 -0
  154. package/lib/components/atoms/ModalClientAccess/index.js +2 -0
  155. package/lib/components/atoms/ModalInfo/ModalInfo.js +52 -0
  156. package/lib/components/atoms/ModalInfo/ModalInfoContent.js +7 -0
  157. package/lib/components/atoms/ModalInfo/index.js +3 -0
  158. package/lib/components/atoms/ModalInfo/styles.js +7 -0
  159. package/lib/components/atoms/ModalProject/ModalProject.interface.js +2 -0
  160. package/lib/components/atoms/ModalProject/ModalProject.js +112 -0
  161. package/lib/components/atoms/ModalProject/ModalProject.style.js +59 -0
  162. package/lib/components/atoms/ModalProject/index.js +2 -0
  163. package/lib/components/atoms/NextPageLoader.js +33 -0
  164. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +28 -0
  165. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +180 -0
  166. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +34 -0
  167. package/lib/components/atoms/OnboardingModalButton/index.js +3 -0
  168. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +131 -0
  169. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +59 -0
  170. package/lib/components/atoms/OptionAccessibility/index.js +2 -0
  171. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
  172. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
  173. package/lib/components/atoms/OptionCorPermission/index.js +2 -0
  174. package/lib/components/atoms/PrimaryButton.js +31 -0
  175. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +77 -0
  176. package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +61 -0
  177. package/lib/components/atoms/ProjectSelector/index.js +2 -0
  178. package/lib/components/atoms/SecondaryButton.js +20 -0
  179. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  180. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  181. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  182. package/lib/components/atoms/Skeleton/Skeleton.js +36 -0
  183. package/lib/components/atoms/Skeleton/index.js +2 -0
  184. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +16 -0
  185. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +24 -0
  186. package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +18 -0
  187. package/lib/components/atoms/SlashCommandChip/index.js +4 -0
  188. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +210 -0
  189. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +53 -0
  190. package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
  191. package/lib/components/atoms/Switch/Switch.js +27 -0
  192. package/lib/components/atoms/Switch/Switch.styles.js +22 -0
  193. package/lib/components/atoms/Switch/index.js +2 -0
  194. package/lib/components/atoms/TextArea/CustomTextArea.interface.js +2 -0
  195. package/lib/components/atoms/TextArea/CustomTextArea.js +93 -0
  196. package/lib/components/atoms/TextArea/CustomTextArea.styles.js +25 -0
  197. package/lib/components/atoms/TextArea/TextArea.interfaces.js +2 -0
  198. package/lib/components/atoms/TextArea/TextArea.js +172 -0
  199. package/lib/components/atoms/TextArea/TextArea.styles.js +16 -0
  200. package/lib/components/atoms/TextArea/index.js +2 -0
  201. package/lib/components/atoms/ThirdButton.js +19 -0
  202. package/lib/components/atoms/VideoModal/VideoModal.js +76 -0
  203. package/lib/components/atoms/VideoModal/index.js +2 -0
  204. package/lib/components/atoms/WithAppCfg.js +26 -0
  205. package/lib/components/atoms/WithFeatureValidation.js +23 -0
  206. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +9 -0
  207. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +6 -0
  208. package/lib/components/atoms/WrapperCenterIcon/index.js +2 -0
  209. package/lib/components/atoms/icons/AIIcon.js +23 -0
  210. package/lib/components/atoms/icons/AacFile.js +39 -0
  211. package/lib/components/atoms/icons/AccessibilityIcon.js +42 -0
  212. package/lib/components/atoms/icons/ActionAssignIcon.js +111 -0
  213. package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
  214. package/lib/components/atoms/icons/ActionChargeHoursIcon.js +111 -0
  215. package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
  216. package/lib/components/atoms/icons/ActionCreateIcon.js +91 -0
  217. package/lib/components/atoms/icons/ActionCreateReworkIcon.js +39 -0
  218. package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +37 -0
  219. package/lib/components/atoms/icons/ActionEditIcon.js +39 -0
  220. package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +88 -0
  221. package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +37 -0
  222. package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
  223. package/lib/components/atoms/icons/AgentMaiaIcon.js +31 -0
  224. package/lib/components/atoms/icons/Brain.js +77 -0
  225. package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
  226. package/lib/components/atoms/icons/CorLogo.js +76 -0
  227. package/lib/components/atoms/icons/CsvFile.js +41 -0
  228. package/lib/components/atoms/icons/DocFile.js +41 -0
  229. package/lib/components/atoms/icons/DocxFile.js +41 -0
  230. package/lib/components/atoms/icons/EmptyClientIllustration.js +67 -0
  231. package/lib/components/atoms/icons/EmptyHistory.js +46 -0
  232. package/lib/components/atoms/icons/EmptySearchIllustration.js +37 -0
  233. package/lib/components/atoms/icons/EmptyState.js +84 -0
  234. package/lib/components/atoms/icons/EmptyStateAgents.js +58 -0
  235. package/lib/components/atoms/icons/ErrorIcon.js +14 -0
  236. package/lib/components/atoms/icons/ErrorSearchIllustration.js +52 -0
  237. package/lib/components/atoms/icons/ErrorState.js +51 -0
  238. package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
  239. package/lib/components/atoms/icons/FaqsIcon.js +51 -0
  240. package/lib/components/atoms/icons/FlacIcon.js +39 -0
  241. package/lib/components/atoms/icons/FolderIcon.js +29 -0
  242. package/lib/components/atoms/icons/HomeIcon.js +30 -0
  243. package/lib/components/atoms/icons/ImageFile.js +46 -0
  244. package/lib/components/atoms/icons/M4aFile.js +39 -0
  245. package/lib/components/atoms/icons/MAIAIcon.js +20 -0
  246. package/lib/components/atoms/icons/MAIAIsologo.js +65 -0
  247. package/lib/components/atoms/icons/MDFile.js +41 -0
  248. package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +41 -0
  249. package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +41 -0
  250. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
  251. package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +41 -0
  252. package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
  253. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
  254. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
  255. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
  256. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
  257. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
  258. package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
  259. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
  260. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
  261. package/lib/components/atoms/icons/MaiaSettingsProject.js +111 -0
  262. package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +193 -0
  263. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  264. package/lib/components/atoms/icons/MaiaStoreIcon.js +31 -0
  265. package/lib/components/atoms/icons/Mp3File.js +39 -0
  266. package/lib/components/atoms/icons/Mp4File.js +39 -0
  267. package/lib/components/atoms/icons/MyAgentsNavIcon.js +51 -0
  268. package/lib/components/atoms/icons/NewChat.js +29 -0
  269. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  270. package/lib/components/atoms/icons/OgaFile.js +39 -0
  271. package/lib/components/atoms/icons/OggFile.js +39 -0
  272. package/lib/components/atoms/icons/PdfFile.js +39 -0
  273. package/lib/components/atoms/icons/PptFile.js +47 -0
  274. package/lib/components/atoms/icons/PptxFile.js +49 -0
  275. package/lib/components/atoms/icons/RetryIcon.js +34 -0
  276. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  277. package/lib/components/atoms/icons/SkillsNavIcon.js +27 -0
  278. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  279. package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
  280. package/lib/components/atoms/icons/TelescopeIcon.js +60 -0
  281. package/lib/components/atoms/icons/TemplateGradientIcon.js +42 -0
  282. package/lib/components/atoms/icons/TextFile.js +41 -0
  283. package/lib/components/atoms/icons/WavFile.js +39 -0
  284. package/lib/components/atoms/icons/WebmFile.js +50 -0
  285. package/lib/components/atoms/icons/XlsFile.js +42 -0
  286. package/lib/components/atoms/icons/XlsxFile.js +42 -0
  287. package/lib/components/atoms/icons/index.js +50 -0
  288. package/lib/components/atoms/index.js +42 -0
  289. package/lib/components/index.js +11 -0
  290. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +2 -0
  291. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +149 -0
  292. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +53 -0
  293. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +415 -0
  294. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +152 -0
  295. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +374 -0
  296. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +106 -0
  297. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +92 -0
  298. package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +57 -0
  299. package/lib/components/molecules/AbmSection/index.js +4 -0
  300. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +52 -0
  301. package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
  302. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +117 -0
  303. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +187 -0
  304. package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +6 -0
  305. package/lib/components/molecules/ChatAIContent/index.js +2 -0
  306. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +241 -0
  307. package/lib/components/molecules/ChatAIHistory/index.js +2 -0
  308. package/lib/components/molecules/ChatAIHistory/styles.js +22 -0
  309. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +649 -0
  310. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +115 -0
  311. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +95 -0
  312. package/lib/components/molecules/ChatAIHome/index.js +2 -0
  313. package/lib/components/molecules/ChatAIHome/styles.js +335 -0
  314. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +137 -0
  315. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +853 -0
  316. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +47 -0
  317. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +37 -0
  318. package/lib/components/molecules/ChatAIMessages/README.md +101 -0
  319. package/lib/components/molecules/ChatAIMessages/index.js +2 -0
  320. package/lib/components/molecules/ChatAIMessages/newStyles.js +131 -0
  321. package/lib/components/molecules/ChatAIMessages/styles.js +94 -0
  322. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +1217 -0
  323. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +58 -0
  324. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +127 -0
  325. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +34 -0
  326. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +2 -0
  327. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +189 -0
  328. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -0
  329. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +2 -0
  330. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +448 -0
  331. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +108 -0
  332. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +2 -0
  333. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +48 -0
  334. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +38 -0
  335. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  336. package/lib/components/molecules/ChatAIModal/constants.js +40 -0
  337. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
  338. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
  339. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
  340. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
  341. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
  342. package/lib/components/molecules/ChatAIModal/index.js +2 -0
  343. package/lib/components/molecules/ChatAIModal/layout.js +74 -0
  344. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +457 -0
  345. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +218 -0
  346. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +357 -0
  347. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +145 -0
  348. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  349. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +48 -0
  350. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +49 -0
  351. package/lib/components/molecules/ChatAIProjectSelector/index.js +2 -0
  352. package/lib/components/molecules/ChatFooter/ChatFooter.js +337 -0
  353. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
  354. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
  355. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +201 -0
  356. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +51 -0
  357. package/lib/components/molecules/ChatFooter/index.js +2 -0
  358. package/lib/components/molecules/ChatFooter/styles.js +23 -0
  359. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +62 -0
  360. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  361. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  362. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +118 -0
  363. package/lib/components/molecules/MessageFeedback/index.js +2 -0
  364. package/lib/components/molecules/MessageFeedback/styles.js +14 -0
  365. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +127 -0
  366. package/lib/components/molecules/ProjectSummaryChat/index.js +2 -0
  367. package/lib/components/molecules/ProjectSummaryChat/styles.js +8 -0
  368. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +152 -0
  369. package/lib/components/molecules/ProjectSummaryConfig/index.js +2 -0
  370. package/lib/components/molecules/ProjectSummaryConfig/styles.js +86 -0
  371. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +49 -0
  372. package/lib/components/molecules/ProjectSummaryContent/index.js +2 -0
  373. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +19 -0
  374. package/lib/components/molecules/ProjectSummaryModal/index.js +2 -0
  375. package/lib/components/molecules/ProjectSummaryModal/styles.js +2 -0
  376. package/lib/components/molecules/Sidebar/Sidebar.js +715 -0
  377. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +157 -0
  378. package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +48 -0
  379. package/lib/components/molecules/Sidebar/Sidebar.styles.js +75 -0
  380. package/lib/components/molecules/Sidebar/index.js +2 -0
  381. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +1420 -0
  382. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +93 -0
  383. package/lib/components/organisms/AbmAgentModal/index.js +2 -0
  384. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +175 -0
  385. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  386. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  387. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +432 -0
  388. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +98 -0
  389. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  390. package/lib/components/organisms/ChatAI/ChatAI.js +167 -0
  391. package/lib/components/organisms/ChatAI/index.js +2 -0
  392. package/lib/components/organisms/ChatAI/styles.js +7 -0
  393. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +23 -0
  394. package/lib/components/organisms/ClientAIButton/index.js +2 -0
  395. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +86 -0
  396. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +39 -0
  397. package/lib/components/organisms/DeleteAgentModal/index.js +2 -0
  398. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +122 -0
  399. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +47 -0
  400. package/lib/components/organisms/DeleteQuestionModal/index.js +2 -0
  401. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +138 -0
  402. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +69 -0
  403. package/lib/components/organisms/EditQuestionModal/index.js +2 -0
  404. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +113 -0
  405. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +54 -0
  406. package/lib/components/organisms/ModalFileExceeds/index.js +2 -0
  407. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +26 -0
  408. package/lib/components/organisms/ProjectAIButton/index.js +2 -0
  409. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +60 -0
  410. package/lib/components/organisms/ProjectSummary/index.js +2 -0
  411. package/lib/components/organisms/ProjectSummary/styles.js +7 -0
  412. package/lib/components/organisms/SnackBar/Snackbar.interface.js +2 -0
  413. package/lib/components/organisms/SnackBar/Snackbar.js +73 -0
  414. package/lib/components/organisms/SnackBar/Snackbar.styles.js +9 -0
  415. package/lib/components/organisms/SnackBar/index.js +2 -0
  416. package/lib/components/organisms/SourcesInformation/SourceItem.js +18 -0
  417. package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +14 -0
  418. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +66 -0
  419. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +27 -0
  420. package/lib/components/organisms/SourcesInformation/index.js +2 -0
  421. package/lib/constants/config.js +13 -0
  422. package/lib/constants/formatExtensions.js +55 -0
  423. package/lib/constants/gqlClient.js +4 -0
  424. package/lib/constants/maiaHourAgentAccess.js +15 -0
  425. package/lib/constants/maiaTaskPanelAccess.js +24 -0
  426. package/lib/constants/maiaTaskPanelOutsideClick.js +9 -0
  427. package/lib/constants/maiaTaskPanelZIndex.js +19 -0
  428. package/lib/constants/permissions/config.js +72 -0
  429. package/lib/constants/permissions/index.js +3 -0
  430. package/lib/constants/permissions/types.js +2 -0
  431. package/lib/constants/permissions/utils.js +18 -0
  432. package/lib/constants/plannerSyncEvents.js +15 -0
  433. package/lib/constants/taskLinkIcon.js +15 -0
  434. package/lib/constants/taskUrls.js +11 -0
  435. package/lib/context/cor-user.js +31 -0
  436. package/lib/context/global-context.js +39 -0
  437. package/lib/dev/DevChatAI.js +101 -0
  438. package/lib/dev/DevContextMentionInput.js +67 -0
  439. package/lib/dev/ProjectSummary.js +9 -0
  440. package/lib/dev/Providers.js +27 -0
  441. package/lib/exports.js +2 -0
  442. package/lib/hooks/README.md +192 -0
  443. package/lib/hooks/index.js +30 -0
  444. package/lib/hooks/useAccessClient/index.js +2 -0
  445. package/lib/hooks/useAccessClient/useAccessClient.js +81 -0
  446. package/lib/hooks/useAgentModel/index.js +2 -0
  447. package/lib/hooks/useAgentModel/useAgentModel.js +62 -0
  448. package/lib/hooks/useAgentModel/useCreateAgent.js +128 -0
  449. package/lib/hooks/useAgentModel/useDeleteAgent.js +88 -0
  450. package/lib/hooks/useAgentModel/useUpdateAgent.js +129 -0
  451. package/lib/hooks/useAgentSuggestions.js +60 -0
  452. package/lib/hooks/useCaretPosition.js +65 -0
  453. package/lib/hooks/useChatManager/index.js +2 -0
  454. package/lib/hooks/useChatManager/useChatManager.interface.js +2 -0
  455. package/lib/hooks/useChatManager/useChatManager.js +1782 -0
  456. package/lib/hooks/useChatMessages/index.js +2 -0
  457. package/lib/hooks/useChatMessages/useChatMessages.interface.js +2 -0
  458. package/lib/hooks/useChatMessages/useChatMessages.js +722 -0
  459. package/lib/hooks/useChats/index.js +2 -0
  460. package/lib/hooks/useChats/useChats.interfaces.js +2 -0
  461. package/lib/hooks/useChats/useChats.js +187 -0
  462. package/lib/hooks/useClientSearch.js +163 -0
  463. package/lib/hooks/useContextMentions.js +463 -0
  464. package/lib/hooks/useContextPinPopover.js +228 -0
  465. package/lib/hooks/useDebounce.js +18 -0
  466. package/lib/hooks/useEntitySearch.js +1239 -0
  467. package/lib/hooks/useEvent.js +93 -0
  468. package/lib/hooks/useFrequentlyAskedQuestions.js +150 -0
  469. package/lib/hooks/useFrequentlyUsedActions.js +94 -0
  470. package/lib/hooks/useKnowledge/deleteKnowledge.js +69 -0
  471. package/lib/hooks/useKnowledge/downloadKnowledge.js +81 -0
  472. package/lib/hooks/useKnowledge/index.js +4 -0
  473. package/lib/hooks/useKnowledge/saveKnowledge.js +107 -0
  474. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +156 -0
  475. package/lib/hooks/useMaiaTaskPanelZIndex.js +17 -0
  476. package/lib/hooks/useMentionAllowedTypes.js +136 -0
  477. package/lib/hooks/useMentionPopover.js +366 -0
  478. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
  479. package/lib/hooks/useModal/index.js +2 -0
  480. package/lib/hooks/useModal/useModal.interfaces.js +2 -0
  481. package/lib/hooks/useModal/useModal.js +47 -0
  482. package/lib/hooks/useOnboardingNavigation.js +20 -0
  483. package/lib/hooks/useOrchestratorStream/index.js +2 -0
  484. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +2 -0
  485. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +269 -0
  486. package/lib/hooks/useProjectSearch.js +183 -0
  487. package/lib/hooks/useProjectSummary.js +101 -0
  488. package/lib/hooks/useProjectSummaryConfig.js +211 -0
  489. package/lib/hooks/useProjects.js +46 -0
  490. package/lib/hooks/useRecentClientsSearch.js +150 -0
  491. package/lib/hooks/useRecentContexts.js +86 -0
  492. package/lib/hooks/useResize.js +29 -0
  493. package/lib/hooks/useSlashCommands.js +84 -0
  494. package/lib/hooks/useSmoothStreamText/index.js +2 -0
  495. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +197 -0
  496. package/lib/hooks/useSnackBarManager/useSnackBarManager.js +41 -0
  497. package/lib/hooks/useStreamResponse.js +112 -0
  498. package/lib/hooks/useStreamdownStyles.js +13 -0
  499. package/lib/hooks/useStreamingMessage/index.js +2 -0
  500. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +18 -0
  501. package/lib/hooks/useT.js +17 -0
  502. package/lib/hooks/useTabTaskDefault.js +33 -0
  503. package/lib/hooks/useTaskPanel.js +22 -0
  504. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  505. package/lib/hooks/useToggle.js +19 -0
  506. package/lib/hooks/useToggleFavorite/index.js +2 -0
  507. package/lib/hooks/useToggleFavorite/useToggleFavorite.js +83 -0
  508. package/lib/index.css +76 -0
  509. package/lib/index.js +30 -0
  510. package/lib/lang/br/index.js +761 -0
  511. package/lib/lang/en/index.js +761 -0
  512. package/lib/lang/es/index.js +762 -0
  513. package/lib/lang/fr/index.js +582 -0
  514. package/lib/lang/index.js +24 -0
  515. package/lib/lang/utils.js +33 -0
  516. package/lib/mocks/mockChats.js +395 -0
  517. package/lib/mocks/mockOrchestrator.js +5 -0
  518. package/lib/mocks/mockProject.js +11 -0
  519. package/lib/mocks/mockProjectSummary.js +6 -0
  520. package/lib/mocks/mockedUser.js +169 -0
  521. package/lib/services/apolloClient.js +3 -0
  522. package/lib/services/appcues.js +19 -0
  523. package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +31 -0
  524. package/lib/services/corpilot/ProjectSummary/index.js +5 -0
  525. package/lib/services/corpilot/client.js +27 -0
  526. package/lib/services/corpilot/index.js +5 -0
  527. package/lib/services/maia/Access/updateAccess.js +59 -0
  528. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +46 -0
  529. package/lib/services/maia/Actions/getSlashCommands.js +39 -0
  530. package/lib/services/maia/Actions/index.js +7 -0
  531. package/lib/services/maia/Agents/createAgent.js +39 -0
  532. package/lib/services/maia/Agents/deleteAgent.js +38 -0
  533. package/lib/services/maia/Agents/fetchAgentDetail.js +122 -0
  534. package/lib/services/maia/Agents/getAgentById.js +162 -0
  535. package/lib/services/maia/Agents/getAgentModels.js +112 -0
  536. package/lib/services/maia/Agents/getAgentSuggestions.js +44 -0
  537. package/lib/services/maia/Agents/getAgents.js +718 -0
  538. package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
  539. package/lib/services/maia/Agents/toggleFavorite.js +34 -0
  540. package/lib/services/maia/Agents/updateAgent.js +39 -0
  541. package/lib/services/maia/Chats/deleteChat.js +32 -0
  542. package/lib/services/maia/Chats/getChatMessages.js +144 -0
  543. package/lib/services/maia/Chats/getChatsByUserId.js +82 -0
  544. package/lib/services/maia/Chats/index.js +15 -0
  545. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  546. package/lib/services/maia/Chats/patchChat.js +43 -0
  547. package/lib/services/maia/Chats/wasHelpfulChat.js +31 -0
  548. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +55 -0
  549. package/lib/services/maia/Faqs/index.js +5 -0
  550. package/lib/services/maia/Knowledge/delete.js +41 -0
  551. package/lib/services/maia/Knowledge/download.js +48 -0
  552. package/lib/services/maia/Knowledge/index.js +3 -0
  553. package/lib/services/maia/Knowledge/save.js +43 -0
  554. package/lib/services/maia/Orchestrator/index.js +7 -0
  555. package/lib/services/maia/Orchestrator/orchestrator.js +246 -0
  556. package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
  557. package/lib/services/maia/RecentClients/index.js +6 -0
  558. package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
  559. package/lib/services/maia/RecentContexts/index.js +6 -0
  560. package/lib/services/maia/RecentProjects/getRecentProjects.js +55 -0
  561. package/lib/services/maia/RecentProjects/index.js +6 -0
  562. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  563. package/lib/services/maia/RecentTasks/index.js +6 -0
  564. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  565. package/lib/services/maia/RecentUsers/index.js +6 -0
  566. package/lib/services/maia/Skills/createSkill.js +39 -0
  567. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  568. package/lib/services/maia/Skills/generateSkill.js +41 -0
  569. package/lib/services/maia/Skills/getSkills.js +90 -0
  570. package/lib/services/maia/Skills/updateSkill.js +39 -0
  571. package/lib/services/maia/client.js +27 -0
  572. package/lib/services/maia/index.js +17 -0
  573. package/lib/services/query/ClientSearchQuery.js +5 -0
  574. package/lib/services/query/entitySearchQuery.js +18 -0
  575. package/lib/services/query/index.js +2 -0
  576. package/lib/services/query/projectSearchByValueQuery.js +5 -0
  577. package/lib/services/query/taskUserTabQuery.js +8 -0
  578. package/lib/services/query/usersDirectoryQuery.js +19 -0
  579. package/lib/services/types.js +6 -0
  580. package/lib/services/utils/fetchCOR.js +117 -0
  581. package/lib/services/utils/getCookie.js +10 -0
  582. package/lib/services/utils/index.js +3 -0
  583. package/lib/services/utils/mapChatMessages.js +287 -0
  584. package/lib/services/utils/validateIsMaia.js +4 -0
  585. package/lib/store/chatsSidebarOptimistic.js +92 -0
  586. package/lib/store/chatsStore.types.js +2 -0
  587. package/lib/store/chatsStoreLifecycle.js +8 -0
  588. package/lib/store/faqsStore.types.js +2 -0
  589. package/lib/store/index.js +4 -0
  590. package/lib/store/maiaLastChatPersistence.js +35 -0
  591. package/lib/store/sessions/activeView.js +22 -0
  592. package/lib/store/sessions/index.js +9 -0
  593. package/lib/store/sessions/sessionHitlContext.js +15 -0
  594. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  595. package/lib/store/sessions/sessionNotifications.js +110 -0
  596. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  597. package/lib/store/sessions/sessionStreamManager.js +715 -0
  598. package/lib/store/sessions/sessionStreamingText.js +80 -0
  599. package/lib/store/sessions/sessions.types.js +35 -0
  600. package/lib/store/sessions/useSessionMeta.js +39 -0
  601. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  602. package/lib/store/sessions/useSessionsStore.js +197 -0
  603. package/lib/store/useChatsStore.js +387 -0
  604. package/lib/store/useFaqsStore.js +27 -0
  605. package/lib/streamdownStyles.js +9 -0
  606. package/lib/styles/StyledCleanContainer.js +7 -0
  607. package/lib/styles/cascade.js +14 -0
  608. package/lib/styles/config.js +47 -0
  609. package/lib/styles/shared/scrollable.js +3 -0
  610. package/lib/styles/transitions.js +21 -0
  611. package/lib/types/Action.js +2 -0
  612. package/lib/types/AgentSuggestion.js +2 -0
  613. package/lib/types/Chat.js +10 -0
  614. package/lib/types/Client.js +2 -0
  615. package/lib/types/FrequentlyAskedQuestion.js +2 -0
  616. package/lib/types/Project.js +2 -0
  617. package/lib/types/ProjectSummaryConfigKeys.js +9 -0
  618. package/lib/types/Task.js +2 -0
  619. package/lib/types/agent.js +2 -0
  620. package/lib/types/agentModal.js +2 -0
  621. package/lib/types/contextMention.js +37 -0
  622. package/lib/types/global.d.js +2 -0
  623. package/lib/types/skill.js +2 -0
  624. package/lib/types/streamActivity.js +2 -0
  625. package/lib/types/userType.d.js +2 -0
  626. package/lib/utils/actionCategoryMap.js +37 -0
  627. package/lib/utils/actionIconMap.js +61 -0
  628. package/lib/utils/agentDisplayName.js +42 -0
  629. package/lib/utils/chatInputFiles.js +52 -0
  630. package/lib/utils/contextMentionIcons.js +134 -0
  631. package/lib/utils/contextMentionLabel.js +4 -0
  632. package/lib/utils/contextMentionTriggers.js +54 -0
  633. package/lib/utils/contextMentionTypeLabel.js +17 -0
  634. package/lib/utils/corConnectorMentionTypes.js +41 -0
  635. package/lib/utils/ensureStreamdownStyles.js +21 -0
  636. package/lib/utils/entityLinkRender.js +135 -0
  637. package/lib/utils/fileDownloadHelper.js +40 -0
  638. package/lib/utils/formatQuickActionMessage.js +16 -0
  639. package/lib/utils/formatUnreadCount.js +6 -0
  640. package/lib/utils/getUnitFileSize.js +13 -0
  641. package/lib/utils/hitlAnalytics.js +65 -0
  642. package/lib/utils/hoursPlannerQuickActionType.js +64 -0
  643. package/lib/utils/imagePreprocessor.js +108 -0
  644. package/lib/utils/index.js +3 -0
  645. package/lib/utils/maiaHostOpen.js +19 -0
  646. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  647. package/lib/utils/mapBackendLang.js +8 -0
  648. package/lib/utils/normalizeAgentConnectors.js +70 -0
  649. package/lib/utils/openTaskInCorPanel.js +22 -0
  650. package/lib/utils/orchestratorSubagents.js +11 -0
  651. package/lib/utils/renderContextMentions.js +399 -0
  652. package/lib/utils/retryCompletion.js +85 -0
  653. package/lib/utils/slashCommandMarker.js +30 -0
  654. package/lib/utils/sortManagerHoursHomeFuas.js +14 -0
  655. package/lib/utils/sseStreamContent.js +17 -0
  656. package/lib/utils/streamActivityMessages.js +359 -0
  657. package/lib/utils/validateTrimmedFields.js +8 -0
  658. package/package.json +1 -1
@@ -0,0 +1,1239 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _typeof from "@babel/runtime/helpers/typeof";
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
+ import { useLazyQuery } from '@apollo/client';
10
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
11
+ import { getRecentTasks } from '../services/maia/RecentTasks/getRecentTasks';
12
+ import { useUser } from '../context/cor-user';
13
+ import { PROJECTS_FALLBACK, SEARCH_ENTITIES, TASK_FAMILY_FALLBACK } from '../services/query/entitySearchQuery';
14
+ import { SEARCH_CLIENTS } from '../services/query/ClientSearchQuery';
15
+ import { USERS_DIRECTORY } from '../services/query/usersDirectoryQuery';
16
+ import { SEARCH_QUERY_DEBOUNCE_MS, SKILLS_SEARCH_MIN_QUERY_LENGTH } from '../constants/config';
17
+ import { useDebounce } from './useDebounce';
18
+ import { useT } from './useT';
19
+ import { fetchMaia } from '../services/maia/client';
20
+ var normalizePositiveInt = function normalizePositiveInt(value, fallback) {
21
+ var parsed = Number(value);
22
+ if (!Number.isFinite(parsed)) return fallback;
23
+ var normalized = Math.floor(parsed);
24
+ return normalized > 0 ? normalized : fallback;
25
+ };
26
+
27
+ /**
28
+ * Restringe los resultados al `clientId`/`projectId` del agente activo.
29
+ * Cuando el agente está scopeado a un client/project, tanto los recents como
30
+ * el search deben filtrar por ese contexto. Si el backend no entiende algún
31
+ * campo lo ignora y se cae al comportamiento global.
32
+ */
33
+
34
+ var BASE_FILTERS_BY_TYPE = {
35
+ project: {
36
+ project: 'true',
37
+ archived: 'all'
38
+ },
39
+ task: {
40
+ task: 'true',
41
+ archived: 'false'
42
+ }
43
+ };
44
+
45
+ /**
46
+ * Entradas para el argumento GraphQL `extra` (JSON string de array) al buscar tareas con contexto.
47
+ * Ej.: [{"projectId":"881552"}]
48
+ */
49
+ var buildTaskSearchExtraEntries = function buildTaskSearchExtraEntries(scope) {
50
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
51
+ var rawProject = (scope === null || scope === void 0 ? void 0 : scope.projectId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== '' ? String(scope.projectId) : null;
52
+ var agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity;
53
+ var entries = [];
54
+ var pushClient = function pushClient() {
55
+ if (rawClient) entries.push({
56
+ clientId: rawClient
57
+ });
58
+ };
59
+ var pushProject = function pushProject() {
60
+ if (rawProject) entries.push({
61
+ projectId: rawProject
62
+ });
63
+ };
64
+ if (agentEntity === 'project') {
65
+ if (rawProject) {
66
+ pushProject();
67
+ } else if (rawClient) {
68
+ pushClient();
69
+ }
70
+ } else if (agentEntity === 'client') {
71
+ pushClient();
72
+ pushProject();
73
+ } else {
74
+ pushClient();
75
+ pushProject();
76
+ }
77
+ return entries;
78
+ };
79
+ var buildTaskSearchExtra = function buildTaskSearchExtra(scope) {
80
+ var entries = buildTaskSearchExtraEntries(scope);
81
+ if (entries.length === 0) return undefined;
82
+ return JSON.stringify(entries);
83
+ };
84
+
85
+ /**
86
+ * Tab proyecto: con `clientId` en el scope, `extra` acota la búsqueda a proyectos de ese cliente.
87
+ * Ej.: `[{"clientId":"47105"}]` junto a `filters` `{"project":"true","archived":"all"}`.
88
+ */
89
+ var buildProjectSearchExtra = function buildProjectSearchExtra(scope) {
90
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
91
+ if (!rawClient) return undefined;
92
+ return JSON.stringify([{
93
+ clientId: rawClient
94
+ }]);
95
+ };
96
+ var buildSearchEntitiesExtra = function buildSearchEntitiesExtra(type, scope) {
97
+ if (type === 'task') return buildTaskSearchExtra(scope);
98
+ if (type === 'project') return buildProjectSearchExtra(scope);
99
+ return undefined;
100
+ };
101
+
102
+ /**
103
+ * Tab `task` / `project`: `filters` sólo tipo + archived (tareas: no archivadas); scope (clientId / projectId en tareas) en `extra`.
104
+ */
105
+ var buildFiltersForType = function buildFiltersForType(type) {
106
+ if (type === 'project') {
107
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.project);
108
+ }
109
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.task);
110
+ };
111
+
112
+ /**
113
+ * Filtros para la query users. El backend espera un JSON string con
114
+ * withPosition, withTeams y searchInput. Le agregamos clientId/projectId
115
+ * del scope en caso de que el backend los aproveche para filtrar por
116
+ * contexto (si no los entiende los ignora).
117
+ */
118
+ var buildUsersDirectoryFilters = function buildUsersDirectoryFilters(q) {
119
+ var base = {
120
+ withPosition: true,
121
+ withTeams: true
122
+ };
123
+ var trimmedQ = q.trim();
124
+ if (trimmedQ) {
125
+ base.searchInput = trimmedQ;
126
+ }
127
+ return JSON.stringify(base);
128
+ };
129
+ var highlightRange = function highlightRange(text, searchValue) {
130
+ if (!searchValue) return undefined;
131
+ var idx = text.toLowerCase().indexOf(searchValue.toLowerCase());
132
+ if (idx < 0) return undefined;
133
+ return {
134
+ start: idx,
135
+ length: searchValue.length
136
+ };
137
+ };
138
+ var firstDefined = function firstDefined() {
139
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
140
+ values[_key] = arguments[_key];
141
+ }
142
+ return values.find(function (value) {
143
+ return value !== undefined && value !== null;
144
+ });
145
+ };
146
+ var normalizeTrimmedString = function normalizeTrimmedString(value) {
147
+ if (typeof value !== 'string') return '';
148
+ return value.trim();
149
+ };
150
+ var getUserPositionName = function getUserPositionName(userPosition) {
151
+ if (typeof userPosition === 'string') return userPosition.trim();
152
+ if (userPosition && _typeof(userPosition) === 'object' && 'name' in userPosition) {
153
+ return normalizeTrimmedString(userPosition.name);
154
+ }
155
+ return '';
156
+ };
157
+ var mapClientToItem = function mapClientToItem(c, searchValue) {
158
+ var _c$totalProyectos, _c$totalProyectos2;
159
+ return {
160
+ id: c.id,
161
+ type: 'client',
162
+ primary: c.name,
163
+ primaryHighlight: highlightRange(c.name, searchValue),
164
+ breadcrumb: {
165
+ count: (_c$totalProyectos = c.totalProyectos) !== null && _c$totalProyectos !== void 0 ? _c$totalProyectos : undefined,
166
+ countLabel: 'projects'
167
+ },
168
+ raw: {
169
+ id: c.id,
170
+ name: c.name,
171
+ totalProyectos: (_c$totalProyectos2 = c.totalProyectos) !== null && _c$totalProyectos2 !== void 0 ? _c$totalProyectos2 : null
172
+ }
173
+ };
174
+ };
175
+ var mapUserToItem = function mapUserToItem(u, searchValue) {
176
+ var _u$firstName, _u$lastName, _u$picture, _u$userPosition$name, _u$userPosition, _u$email;
177
+ var fullName = "".concat((_u$firstName = u.firstName) !== null && _u$firstName !== void 0 ? _u$firstName : '', " ").concat((_u$lastName = u.lastName) !== null && _u$lastName !== void 0 ? _u$lastName : '').trim();
178
+ var primary = fullName || u.email || String(u.id);
179
+ return {
180
+ id: u.id,
181
+ type: 'user',
182
+ primary: primary,
183
+ primaryHighlight: highlightRange(primary, searchValue),
184
+ raw: {
185
+ id: u.id,
186
+ name: primary,
187
+ picture: (_u$picture = u.picture) !== null && _u$picture !== void 0 ? _u$picture : null,
188
+ positionName: (_u$userPosition$name = (_u$userPosition = u.userPosition) === null || _u$userPosition === void 0 ? void 0 : _u$userPosition.name) !== null && _u$userPosition$name !== void 0 ? _u$userPosition$name : null,
189
+ email: (_u$email = u.email) !== null && _u$email !== void 0 ? _u$email : null
190
+ }
191
+ };
192
+ };
193
+ var mapCorUserToUserItem = function mapCorUserToUserItem(user, searchValue, meLabel) {
194
+ var _user$firstName, _user$lastName;
195
+ var fullName = "".concat((_user$firstName = user.firstName) !== null && _user$firstName !== void 0 ? _user$firstName : '', " ").concat((_user$lastName = user.lastName) !== null && _user$lastName !== void 0 ? _user$lastName : '').trim();
196
+ /** Solo cargo real; sin fallback a `role` (la UI muestra “Sin posición” si falta). */
197
+ var positionLine = getUserPositionName(user.user_position) || null;
198
+ var email = normalizeTrimmedString(user.email) || null;
199
+ return {
200
+ id: user.id,
201
+ type: 'user',
202
+ primary: meLabel,
203
+ primaryHighlight: highlightRange(meLabel, searchValue),
204
+ raw: {
205
+ id: user.id,
206
+ name: fullName || String(user.id),
207
+ picture: user.picture || null,
208
+ positionName: positionLine,
209
+ email: email
210
+ }
211
+ };
212
+ };
213
+ var mapRecentTaskToItem = function mapRecentTaskToItem(task, searchValue) {
214
+ var _task$projectName;
215
+ var showProjectNameInTaskRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
216
+ var primary = task.title && task.title.trim() || String(task.id);
217
+ var projectName = showProjectNameInTaskRow ? (_task$projectName = task.projectName) !== null && _task$projectName !== void 0 ? _task$projectName : null : null;
218
+ return {
219
+ id: task.id,
220
+ type: 'task',
221
+ primary: primary,
222
+ primaryHighlight: highlightRange(primary, searchValue),
223
+ breadcrumb: projectName ? {
224
+ parent: projectName
225
+ } : undefined,
226
+ raw: {
227
+ id: task.id,
228
+ name: primary,
229
+ projectName: projectName
230
+ }
231
+ };
232
+ };
233
+ var normalizeTaskFamilyRecord = function normalizeTaskFamilyRecord(record) {
234
+ var _record$title, _firstDefined, _record$project, _record$father, _record$father2;
235
+ var taskFamilyId = record._id;
236
+ var id = taskFamilyId;
237
+ if (id === undefined || id === null || String(id) === '') return null;
238
+ var title = ((_record$title = record.title) !== null && _record$title !== void 0 ? _record$title : '').trim() || String(id);
239
+ var projectName = (_firstDefined = firstDefined((_record$project = record.project) === null || _record$project === void 0 ? void 0 : _record$project.name, (_record$father = record.father) === null || _record$father === void 0 ? void 0 : _record$father.title)) !== null && _firstDefined !== void 0 ? _firstDefined : null;
240
+ var hasFather = !!firstDefined(record.taskFather, (_record$father2 = record.father) === null || _record$father2 === void 0 ? void 0 : _record$father2.id);
241
+ return {
242
+ id: id,
243
+ title: title,
244
+ type: hasFather ? 'subtask' : 'task',
245
+ projectName: projectName
246
+ };
247
+ };
248
+ var normalizeProjectsFallbackRecord = function normalizeProjectsFallbackRecord(record) {
249
+ var _record$name, _firstDefined2, _record$client, _record$client$name, _record$client2;
250
+ var id = record.id;
251
+ if (id === undefined || id === null || String(id) === '') return null;
252
+ var title = (_record$name = record.name) !== null && _record$name !== void 0 ? _record$name : '';
253
+ var clientId = (_firstDefined2 = firstDefined(record.clientId, (_record$client = record.client) === null || _record$client === void 0 ? void 0 : _record$client.id)) !== null && _firstDefined2 !== void 0 ? _firstDefined2 : null;
254
+ var clientName = (_record$client$name = (_record$client2 = record.client) === null || _record$client2 === void 0 ? void 0 : _record$client2.name) !== null && _record$client$name !== void 0 ? _record$client$name : null;
255
+ return {
256
+ id: id,
257
+ title: title,
258
+ type: 'project',
259
+ clientId: clientId,
260
+ clientName: clientName
261
+ };
262
+ };
263
+ var mapSearchToItem = function mapSearchToItem(r, type, searchValue) {
264
+ var _r$projectName, _r$projectName2, _r$clientId, _r$clientName, _r$feeId, _father$title;
265
+ var showProjectNameInTaskRow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
266
+ var primary = r.title || r.projectName || '';
267
+ var parent;
268
+ if (type === 'project') parent = r.clientName;else if (type === 'task') parent = undefined;else parent = (_r$projectName = r.projectName) !== null && _r$projectName !== void 0 ? _r$projectName : r.clientName;
269
+ var father = type === 'task' ? r.father : null;
270
+ var hasFather = type === 'task' && father != null && father.id != null && String(father.id).length > 0;
271
+ var taskProjectName = type === 'task' && !showProjectNameInTaskRow ? null : (_r$projectName2 = r.projectName) !== null && _r$projectName2 !== void 0 ? _r$projectName2 : null;
272
+ return {
273
+ id: r.id,
274
+ type: type,
275
+ primary: primary,
276
+ primaryHighlight: highlightRange(primary, searchValue),
277
+ breadcrumb: parent ? {
278
+ parent: parent
279
+ } : undefined,
280
+ raw: {
281
+ id: r.id,
282
+ name: primary,
283
+ clientId: (_r$clientId = r.clientId) !== null && _r$clientId !== void 0 ? _r$clientId : null,
284
+ clientName: (_r$clientName = r.clientName) !== null && _r$clientName !== void 0 ? _r$clientName : null,
285
+ projectName: taskProjectName,
286
+ feeId: (_r$feeId = r.feeId) !== null && _r$feeId !== void 0 ? _r$feeId : null,
287
+ fatherId: hasFather ? father.id : null,
288
+ fatherTitle: hasFather ? ((_father$title = father.title) === null || _father$title === void 0 ? void 0 : _father$title.trim()) || null : null
289
+ }
290
+ };
291
+ };
292
+ var formatMcpPrimaryLabel = function formatMcpPrimaryLabel(slug) {
293
+ return slug.replace(/_/g, ' ').replace(/\b\w/g, function (_char) {
294
+ return _char.toUpperCase();
295
+ });
296
+ };
297
+ var mapSkillsToItems = function mapSkillsToItems(skills, searchValue) {
298
+ var q = searchValue.trim().toLowerCase();
299
+ var filtered = q ? skills.filter(function (s) {
300
+ return s.name.toLowerCase().includes(q);
301
+ }) : skills;
302
+ return filtered.map(function (skill) {
303
+ return {
304
+ id: skill.id,
305
+ type: 'skill',
306
+ primary: skill.name,
307
+ primaryHighlight: highlightRange(skill.name, searchValue),
308
+ raw: {
309
+ id: skill.id,
310
+ name: skill.name
311
+ }
312
+ };
313
+ });
314
+ };
315
+ var mapMcpSlugsToItems = function mapMcpSlugsToItems(slugs, searchValue) {
316
+ var q = searchValue.trim().toLowerCase();
317
+ var filtered = slugs;
318
+ if (q) {
319
+ filtered = slugs.filter(function (s) {
320
+ var primary = formatMcpPrimaryLabel(s);
321
+ return s.toLowerCase().includes(q) || primary.toLowerCase().includes(q);
322
+ });
323
+ }
324
+ return filtered.map(function (slug) {
325
+ var primary = formatMcpPrimaryLabel(slug);
326
+ return {
327
+ id: slug,
328
+ type: 'mcp',
329
+ primary: primary,
330
+ primaryHighlight: highlightRange(primary, searchValue),
331
+ raw: {
332
+ id: slug,
333
+ name: primary
334
+ }
335
+ };
336
+ });
337
+ };
338
+ export var useEntitySearch = function useEntitySearch(type, scope) {
339
+ var _scope$mcpSlugs, _scope$skills, _stableScope$projectI, _stableScope$clientId, _stableScope$agentEnt;
340
+ var corUser = useUser();
341
+ var _useT = useT(),
342
+ t = _useT.t;
343
+ /** Evita aplicar resultados de un `fetchRecent` viejo cuando el usuario ya cambió de tab (race async). */
344
+ var recentsFetchGenerationRef = useRef(0);
345
+ var _useState = useState(''),
346
+ _useState2 = _slicedToArray(_useState, 2),
347
+ searchValue = _useState2[0],
348
+ setSearchValue = _useState2[1];
349
+ var debouncedSearchValue = useDebounce(searchValue, SEARCH_QUERY_DEBOUNCE_MS);
350
+ var _useState3 = useState([]),
351
+ _useState4 = _slicedToArray(_useState3, 2),
352
+ items = _useState4[0],
353
+ setItems = _useState4[1];
354
+ var _useState5 = useState(false),
355
+ _useState6 = _slicedToArray(_useState5, 2),
356
+ loading = _useState6[0],
357
+ setLoading = _useState6[1];
358
+ var _useState7 = useState(false),
359
+ _useState8 = _slicedToArray(_useState7, 2),
360
+ error = _useState8[0],
361
+ setError = _useState8[1];
362
+ var _useState9 = useState(false),
363
+ _useState0 = _slicedToArray(_useState9, 2),
364
+ hideRecentsLabel = _useState0[0],
365
+ setHideRecentsLabel = _useState0[1];
366
+ var _useState1 = useState(false),
367
+ _useState10 = _slicedToArray(_useState1, 2),
368
+ hasMore = _useState10[0],
369
+ setHasMore = _useState10[1];
370
+ var _useState11 = useState(false),
371
+ _useState12 = _slicedToArray(_useState11, 2),
372
+ isLoadingMore = _useState12[0],
373
+ setIsLoadingMore = _useState12[1];
374
+ var _useState13 = useState(1),
375
+ _useState14 = _slicedToArray(_useState13, 2),
376
+ currentPage = _useState14[0],
377
+ setCurrentPage = _useState14[1];
378
+ var _useState15 = useState('none'),
379
+ _useState16 = _slicedToArray(_useState15, 2),
380
+ activePaginationSource = _useState16[0],
381
+ setActivePaginationSource = _useState16[1];
382
+ var _useState17 = useState(false),
383
+ _useState18 = _slicedToArray(_useState17, 2),
384
+ skillsCatalogEmpty = _useState18[0],
385
+ setSkillsCatalogEmpty = _useState18[1];
386
+ var mcpSlugsKey = ((_scope$mcpSlugs = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs !== void 0 ? _scope$mcpSlugs : []).join('|');
387
+ var skillsKey = ((_scope$skills = scope === null || scope === void 0 ? void 0 : scope.skills) !== null && _scope$skills !== void 0 ? _scope$skills : []).map(function (s) {
388
+ return s.id;
389
+ }).join('|');
390
+ var showProjectNameInTaskRow = (scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== 'project';
391
+
392
+ // Estabilizamos el scope para no disparar fetchs por cambios de identidad de objeto.
393
+ var stableScope = useMemo(function () {
394
+ var _scope$clientId, _scope$projectId, _scope$mcpSlugs2, _scope$agentEntity;
395
+ return {
396
+ clientId: (_scope$clientId = scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && _scope$clientId !== void 0 ? _scope$clientId : null,
397
+ projectId: (_scope$projectId = scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && _scope$projectId !== void 0 ? _scope$projectId : null,
398
+ mcpSlugs: (_scope$mcpSlugs2 = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs2 !== void 0 ? _scope$mcpSlugs2 : [],
399
+ skills: scope === null || scope === void 0 ? void 0 : scope.skills,
400
+ agentEntity: (_scope$agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== null && _scope$agentEntity !== void 0 ? _scope$agentEntity : null
401
+ };
402
+ }, [scope === null || scope === void 0 ? void 0 : scope.clientId, scope === null || scope === void 0 ? void 0 : scope.projectId, mcpSlugsKey, skillsKey, scope === null || scope === void 0 ? void 0 : scope.agentEntity]);
403
+
404
+ // --- Search: project | task (GraphQL: search) ---
405
+ var _useLazyQuery = useLazyQuery(SEARCH_ENTITIES, {
406
+ variables: {
407
+ limit: 20
408
+ },
409
+ fetchPolicy: 'network-only'
410
+ }),
411
+ _useLazyQuery2 = _slicedToArray(_useLazyQuery, 2),
412
+ fetchSearchEntities = _useLazyQuery2[0],
413
+ _useLazyQuery2$ = _useLazyQuery2[1],
414
+ searchData = _useLazyQuery2$.data,
415
+ searchLoading = _useLazyQuery2$.loading,
416
+ searchError = _useLazyQuery2$.error;
417
+
418
+ // --- Search: client (GraphQL) ---
419
+ var _useLazyQuery3 = useLazyQuery(SEARCH_CLIENTS, {
420
+ fetchPolicy: 'network-only'
421
+ }),
422
+ _useLazyQuery4 = _slicedToArray(_useLazyQuery3, 2),
423
+ fetchSearchClients = _useLazyQuery4[0],
424
+ _useLazyQuery4$ = _useLazyQuery4[1],
425
+ clientsData = _useLazyQuery4$.data,
426
+ clientsLoading = _useLazyQuery4$.loading,
427
+ clientsError = _useLazyQuery4$.error;
428
+
429
+ // --- Search: user (GraphQL: users) ---
430
+ var _useLazyQuery5 = useLazyQuery(USERS_DIRECTORY, {
431
+ fetchPolicy: 'network-only'
432
+ }),
433
+ _useLazyQuery6 = _slicedToArray(_useLazyQuery5, 2),
434
+ fetchUsersDirectory = _useLazyQuery6[0],
435
+ _useLazyQuery6$ = _useLazyQuery6[1],
436
+ usersData = _useLazyQuery6$.data,
437
+ usersLoading = _useLazyQuery6$.loading,
438
+ usersError = _useLazyQuery6$.error;
439
+ var syncUsersPagination = useCallback(function (payload) {
440
+ var _payload$users, _payload$users2;
441
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$users = payload.users) === null || _payload$users === void 0 ? void 0 : _payload$users.page, 1);
442
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$users2 = payload.users) === null || _payload$users2 === void 0 ? void 0 : _payload$users2.lastPage, page);
443
+ setCurrentPage(page);
444
+ setHasMore(page < lastPage);
445
+ }, []);
446
+ var syncClientsPagination = useCallback(function (payload) {
447
+ var _payload$clients, _payload$clients2;
448
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients = payload.clients) === null || _payload$clients === void 0 ? void 0 : _payload$clients.page, 1);
449
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients2 = payload.clients) === null || _payload$clients2 === void 0 ? void 0 : _payload$clients2.lastPage, page);
450
+ setCurrentPage(page);
451
+ setHasMore(page < lastPage);
452
+ }, []);
453
+ var syncTaskFallbackPagination = useCallback(function (payload) {
454
+ var _payload$taskFamily, _payload$taskFamily2;
455
+ var rawPage = Number(payload === null || payload === void 0 || (_payload$taskFamily = payload.taskFamily) === null || _payload$taskFamily === void 0 ? void 0 : _payload$taskFamily.page);
456
+ // taskFamily usa páginas 0-based; convertimos a 1-based para consistencia con el resto
457
+ var page = Number.isFinite(rawPage) && rawPage >= 0 ? Math.floor(rawPage) + 1 : 1;
458
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$taskFamily2 = payload.taskFamily) === null || _payload$taskFamily2 === void 0 ? void 0 : _payload$taskFamily2.lastPage, page);
459
+ setCurrentPage(page);
460
+ setHasMore(page < lastPage);
461
+ }, []);
462
+ var syncProjectFallbackPagination = useCallback(function (payload) {
463
+ var _payload$projects, _payload$projects2;
464
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects = payload.projects) === null || _payload$projects === void 0 ? void 0 : _payload$projects.page, 1);
465
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects2 = payload.projects) === null || _payload$projects2 === void 0 ? void 0 : _payload$projects2.lastPage, page);
466
+ setCurrentPage(page);
467
+ setHasMore(page < lastPage);
468
+ }, []);
469
+ var _useLazyQuery7 = useLazyQuery(TASK_FAMILY_FALLBACK, {
470
+ fetchPolicy: 'network-only'
471
+ }),
472
+ _useLazyQuery8 = _slicedToArray(_useLazyQuery7, 1),
473
+ fetchTaskFamilyFallback = _useLazyQuery8[0];
474
+ var _useLazyQuery9 = useLazyQuery(PROJECTS_FALLBACK, {
475
+ fetchPolicy: 'network-only'
476
+ }),
477
+ _useLazyQuery0 = _slicedToArray(_useLazyQuery9, 1),
478
+ fetchProjectsFallback = _useLazyQuery0[0];
479
+ var fetchRecent = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
480
+ var generation, _stableScope$mcpSlugs, slugs, _data$data, _data$next_offset, response, data, skills, canPaginate, _fallbackData$project, _fallbackData$project2, argumentsFilter, _yield$fetchProjectsF, fallbackData, mapped, recentTaskFilters, _data, taskItems, _fallbackData$taskFam, _fallbackData$taskFam2, filter, _yield$fetchTaskFamil, _fallbackData, _data2$users$data, _data2$users, _yield$fetchUsersDire, _data2, _mapped, meItem, withoutMe, _t, _t2;
481
+ return _regeneratorRuntime.wrap(function (_context) {
482
+ while (1) switch (_context.prev = _context.next) {
483
+ case 0:
484
+ recentsFetchGenerationRef.current += 1;
485
+ generation = recentsFetchGenerationRef.current;
486
+ if (!(type === 'mcp')) {
487
+ _context.next = 1;
488
+ break;
489
+ }
490
+ slugs = (_stableScope$mcpSlugs = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs !== void 0 ? _stableScope$mcpSlugs : [];
491
+ setLoading(false);
492
+ setError(false);
493
+ setItems(mapMcpSlugsToItems(slugs, ''));
494
+ setHideRecentsLabel(false);
495
+ setActivePaginationSource('none');
496
+ setHasMore(false);
497
+ return _context.abrupt("return");
498
+ case 1:
499
+ if (!(type === 'skill')) {
500
+ _context.next = 11;
501
+ break;
502
+ }
503
+ if (!stableScope.skills) {
504
+ _context.next = 2;
505
+ break;
506
+ }
507
+ setLoading(false);
508
+ setError(false);
509
+ setSkillsCatalogEmpty(stableScope.skills.length === 0);
510
+ setItems(mapSkillsToItems(stableScope.skills, ''));
511
+ setHideRecentsLabel(true);
512
+ setActivePaginationSource('none');
513
+ setHasMore(false);
514
+ return _context.abrupt("return");
515
+ case 2:
516
+ setLoading(true);
517
+ setError(false);
518
+ _context.prev = 3;
519
+ _context.next = 4;
520
+ return fetchMaia({
521
+ path: 'skills',
522
+ method: 'GET'
523
+ });
524
+ case 4:
525
+ response = _context.sent;
526
+ _context.next = 5;
527
+ return response.json();
528
+ case 5:
529
+ data = _context.sent;
530
+ if (!(generation !== recentsFetchGenerationRef.current)) {
531
+ _context.next = 6;
532
+ break;
533
+ }
534
+ return _context.abrupt("return");
535
+ case 6:
536
+ skills = (_data$data = data.data) !== null && _data$data !== void 0 ? _data$data : [];
537
+ canPaginate = !!data.has_more && data.next_offset != null;
538
+ setSkillsCatalogEmpty(skills.length === 0);
539
+ setItems(mapSkillsToItems(skills, ''));
540
+ setHideRecentsLabel(true);
541
+ setHasMore(canPaginate);
542
+ setCurrentPage((_data$next_offset = data.next_offset) !== null && _data$next_offset !== void 0 ? _data$next_offset : 0);
543
+ setActivePaginationSource(canPaginate ? 'skills' : 'none');
544
+ _context.next = 9;
545
+ break;
546
+ case 7:
547
+ _context.prev = 7;
548
+ _t = _context["catch"](3);
549
+ if (!(generation !== recentsFetchGenerationRef.current)) {
550
+ _context.next = 8;
551
+ break;
552
+ }
553
+ return _context.abrupt("return");
554
+ case 8:
555
+ setError(true);
556
+ setItems([]);
557
+ case 9:
558
+ _context.prev = 9;
559
+ if (generation === recentsFetchGenerationRef.current) setLoading(false);
560
+ return _context.finish(9);
561
+ case 10:
562
+ return _context.abrupt("return");
563
+ case 11:
564
+ setLoading(true);
565
+ setError(false);
566
+ _context.prev = 12;
567
+ if (!(type === 'client')) {
568
+ _context.next = 13;
569
+ break;
570
+ }
571
+ setItems([]);
572
+ setHideRecentsLabel(false);
573
+ setActivePaginationSource('none');
574
+ setHasMore(false);
575
+ _context.next = 31;
576
+ break;
577
+ case 13:
578
+ if (!(type === 'project')) {
579
+ _context.next = 17;
580
+ break;
581
+ }
582
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
583
+ client_id: [String(stableScope.clientId)]
584
+ } : undefined;
585
+ _context.next = 14;
586
+ return fetchProjectsFallback({
587
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
588
+ arguments: argumentsFilter
589
+ } : {}), {}, {
590
+ page: 1,
591
+ perPage: 20
592
+ })
593
+ });
594
+ case 14:
595
+ _yield$fetchProjectsF = _context.sent;
596
+ fallbackData = _yield$fetchProjectsF.data;
597
+ if (!(generation !== recentsFetchGenerationRef.current)) {
598
+ _context.next = 15;
599
+ break;
600
+ }
601
+ return _context.abrupt("return");
602
+ case 15:
603
+ mapped = ((_fallbackData$project = fallbackData === null || fallbackData === void 0 || (_fallbackData$project2 = fallbackData.projects) === null || _fallbackData$project2 === void 0 ? void 0 : _fallbackData$project2.data) !== null && _fallbackData$project !== void 0 ? _fallbackData$project : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
604
+ return item !== null;
605
+ }).map(function (item) {
606
+ return mapSearchToItem(item, 'project', '');
607
+ });
608
+ setHideRecentsLabel(mapped.length > 0);
609
+ setActivePaginationSource('project-fallback');
610
+ syncProjectFallbackPagination(fallbackData);
611
+ if (!(generation !== recentsFetchGenerationRef.current)) {
612
+ _context.next = 16;
613
+ break;
614
+ }
615
+ return _context.abrupt("return");
616
+ case 16:
617
+ setItems(mapped);
618
+ _context.next = 31;
619
+ break;
620
+ case 17:
621
+ if (!(type === 'task')) {
622
+ _context.next = 25;
623
+ break;
624
+ }
625
+ if (stableScope.agentEntity === 'project') {
626
+ recentTaskFilters = {
627
+ projectId: stableScope.projectId
628
+ };
629
+ } else if (stableScope.agentEntity === 'client') {
630
+ recentTaskFilters = {
631
+ clientId: stableScope.clientId
632
+ };
633
+ }
634
+ _context.next = 18;
635
+ return getRecentTasks(recentTaskFilters);
636
+ case 18:
637
+ _data = _context.sent;
638
+ if (!(generation !== recentsFetchGenerationRef.current)) {
639
+ _context.next = 19;
640
+ break;
641
+ }
642
+ return _context.abrupt("return");
643
+ case 19:
644
+ taskItems = (_data !== null && _data !== void 0 ? _data : []).map(function (task) {
645
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
646
+ });
647
+ if (!(taskItems.length === 0)) {
648
+ _context.next = 22;
649
+ break;
650
+ }
651
+ filter = {};
652
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
653
+ filter.projectIds = [String(stableScope.projectId)];
654
+ }
655
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
656
+ filter.clientIds = [String(stableScope.clientId)];
657
+ }
658
+ _context.next = 20;
659
+ return fetchTaskFamilyFallback({
660
+ variables: {
661
+ filter: _objectSpread({
662
+ archived: false
663
+ }, filter),
664
+ pagination: {
665
+ offset: 0,
666
+ size: 20
667
+ }
668
+ }
669
+ });
670
+ case 20:
671
+ _yield$fetchTaskFamil = _context.sent;
672
+ _fallbackData = _yield$fetchTaskFamil.data;
673
+ if (!(generation !== recentsFetchGenerationRef.current)) {
674
+ _context.next = 21;
675
+ break;
676
+ }
677
+ return _context.abrupt("return");
678
+ case 21:
679
+ taskItems = ((_fallbackData$taskFam = _fallbackData === null || _fallbackData === void 0 || (_fallbackData$taskFam2 = _fallbackData.taskFamily) === null || _fallbackData$taskFam2 === void 0 ? void 0 : _fallbackData$taskFam2.data) !== null && _fallbackData$taskFam !== void 0 ? _fallbackData$taskFam : []).map(normalizeTaskFamilyRecord).filter(function (item) {
680
+ return item !== null;
681
+ }).map(function (task) {
682
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
683
+ });
684
+ setHideRecentsLabel(taskItems.length > 0);
685
+ setActivePaginationSource('task-fallback');
686
+ syncTaskFallbackPagination(_fallbackData);
687
+ _context.next = 23;
688
+ break;
689
+ case 22:
690
+ setHideRecentsLabel(false);
691
+ setActivePaginationSource('none');
692
+ setHasMore(false);
693
+ case 23:
694
+ if (!(generation !== recentsFetchGenerationRef.current)) {
695
+ _context.next = 24;
696
+ break;
697
+ }
698
+ return _context.abrupt("return");
699
+ case 24:
700
+ setItems(taskItems);
701
+ _context.next = 31;
702
+ break;
703
+ case 25:
704
+ if (!(type === 'user')) {
705
+ _context.next = 29;
706
+ break;
707
+ }
708
+ _context.next = 26;
709
+ return fetchUsersDirectory({
710
+ variables: {
711
+ filters: buildUsersDirectoryFilters(''),
712
+ page: 1
713
+ }
714
+ });
715
+ case 26:
716
+ _yield$fetchUsersDire = _context.sent;
717
+ _data2 = _yield$fetchUsersDire.data;
718
+ if (!(generation !== recentsFetchGenerationRef.current)) {
719
+ _context.next = 27;
720
+ break;
721
+ }
722
+ return _context.abrupt("return");
723
+ case 27:
724
+ _mapped = ((_data2$users$data = _data2 === null || _data2 === void 0 || (_data2$users = _data2.users) === null || _data2$users === void 0 ? void 0 : _data2$users.data) !== null && _data2$users$data !== void 0 ? _data2$users$data : []).map(function (u) {
725
+ return mapUserToItem(u, '');
726
+ });
727
+ if (!(generation !== recentsFetchGenerationRef.current)) {
728
+ _context.next = 28;
729
+ break;
730
+ }
731
+ return _context.abrupt("return");
732
+ case 28:
733
+ meItem = mapCorUserToUserItem(corUser, '', t('contextMention.me'));
734
+ withoutMe = _mapped.filter(function (item) {
735
+ return String(item.id) !== String(meItem.id);
736
+ });
737
+ setItems([meItem].concat(_toConsumableArray(withoutMe)));
738
+ syncUsersPagination(_data2);
739
+ setHideRecentsLabel(false);
740
+ setActivePaginationSource('users');
741
+ _context.next = 31;
742
+ break;
743
+ case 29:
744
+ if (!(generation !== recentsFetchGenerationRef.current)) {
745
+ _context.next = 30;
746
+ break;
747
+ }
748
+ return _context.abrupt("return");
749
+ case 30:
750
+ setItems([]);
751
+ setHideRecentsLabel(false);
752
+ setActivePaginationSource('none');
753
+ setHasMore(false);
754
+ setCurrentPage(1);
755
+ case 31:
756
+ _context.next = 34;
757
+ break;
758
+ case 32:
759
+ _context.prev = 32;
760
+ _t2 = _context["catch"](12);
761
+ if (!(generation !== recentsFetchGenerationRef.current)) {
762
+ _context.next = 33;
763
+ break;
764
+ }
765
+ return _context.abrupt("return");
766
+ case 33:
767
+ setError(true);
768
+ setItems([]);
769
+ setHideRecentsLabel(false);
770
+ case 34:
771
+ _context.prev = 34;
772
+ if (generation === recentsFetchGenerationRef.current) {
773
+ setLoading(false);
774
+ }
775
+ return _context.finish(34);
776
+ case 35:
777
+ case "end":
778
+ return _context.stop();
779
+ }
780
+ }, _callee, null, [[3, 7, 9, 10], [12, 32, 34, 35]]);
781
+ })), [type, stableScope, fetchUsersDirectory, fetchTaskFamilyFallback, fetchProjectsFallback, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination, showProjectNameInTaskRow, corUser, t]);
782
+
783
+ // Disparar search al cambiar debounced value
784
+ useEffect(function () {
785
+ var q = debouncedSearchValue.trim();
786
+ if (type === 'mcp') {
787
+ var _stableScope$mcpSlugs2;
788
+ var slugs = (_stableScope$mcpSlugs2 = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs2 !== void 0 ? _stableScope$mcpSlugs2 : [];
789
+ setLoading(false);
790
+ setError(false);
791
+ setItems(mapMcpSlugsToItems(slugs, q));
792
+ return;
793
+ }
794
+ if (type === 'skill') {
795
+ if (stableScope.skills) {
796
+ setLoading(false);
797
+ setError(false);
798
+ setItems(mapSkillsToItems(stableScope.skills, q));
799
+ return;
800
+ }
801
+ if (!q) return;
802
+ if (q.length < SKILLS_SEARCH_MIN_QUERY_LENGTH) {
803
+ setLoading(false);
804
+ setError(false);
805
+ if (!skillsCatalogEmpty) {
806
+ setItems([]);
807
+ }
808
+ setHasMore(false);
809
+ setActivePaginationSource('none');
810
+ return;
811
+ }
812
+ recentsFetchGenerationRef.current += 1;
813
+ var searchGen = recentsFetchGenerationRef.current;
814
+ setLoading(true);
815
+ setError(false);
816
+ fetchMaia({
817
+ path: "skills?q=".concat(encodeURIComponent(q)),
818
+ method: 'GET'
819
+ }).then(function (r) {
820
+ return r.json();
821
+ }).then(function (data) {
822
+ var _data$data2, _data$next_offset2;
823
+ if (searchGen !== recentsFetchGenerationRef.current) return;
824
+ var canPaginate = !!data.has_more && data.next_offset != null;
825
+ setItems(mapSkillsToItems((_data$data2 = data.data) !== null && _data$data2 !== void 0 ? _data$data2 : [], q));
826
+ setHasMore(canPaginate);
827
+ setCurrentPage((_data$next_offset2 = data.next_offset) !== null && _data$next_offset2 !== void 0 ? _data$next_offset2 : 0);
828
+ setActivePaginationSource(canPaginate ? 'skills' : 'none');
829
+ setLoading(false);
830
+ setError(false);
831
+ })["catch"](function () {
832
+ if (searchGen !== recentsFetchGenerationRef.current) return;
833
+ setError(true);
834
+ setItems([]);
835
+ setLoading(false);
836
+ });
837
+ return;
838
+ }
839
+ if (!q) return;
840
+ if (type === 'client') {
841
+ fetchSearchClients({
842
+ variables: {
843
+ filter: {
844
+ name: q
845
+ },
846
+ page: 1,
847
+ perPage: 20
848
+ }
849
+ });
850
+ setActivePaginationSource('clients-search');
851
+ } else if (type === 'user') {
852
+ fetchUsersDirectory({
853
+ variables: {
854
+ filters: buildUsersDirectoryFilters(q),
855
+ page: 1
856
+ }
857
+ });
858
+ setActivePaginationSource('users');
859
+ } else {
860
+ var filters = buildFiltersForType(type);
861
+ var extra = buildSearchEntitiesExtra(type, stableScope);
862
+ fetchSearchEntities({
863
+ variables: _objectSpread({
864
+ q: q,
865
+ filters: filters
866
+ }, extra !== undefined ? {
867
+ extra: extra
868
+ } : {})
869
+ });
870
+ setActivePaginationSource('none');
871
+ setHasMore(false);
872
+ }
873
+ }, [debouncedSearchValue, type, stableScope, fetchSearchEntities, fetchSearchClients, fetchUsersDirectory, skillsCatalogEmpty]);
874
+
875
+ // Sincronizar resultados de search
876
+ useEffect(function () {
877
+ if (type === 'mcp') return;
878
+ if (type === 'skill') return;
879
+ var q = debouncedSearchValue.trim();
880
+ if (!q) return;
881
+ setHideRecentsLabel(false);
882
+ if (type === 'client') {
883
+ var _clientsData$clients;
884
+ setLoading(clientsLoading);
885
+ if (clientsError) {
886
+ setError(true);
887
+ return;
888
+ }
889
+ if (clientsData !== null && clientsData !== void 0 && (_clientsData$clients = clientsData.clients) !== null && _clientsData$clients !== void 0 && _clientsData$clients.data) {
890
+ setItems(clientsData.clients.data.map(function (c) {
891
+ return mapClientToItem(c, q);
892
+ }));
893
+ syncClientsPagination(clientsData);
894
+ setError(false);
895
+ }
896
+ } else if (type === 'user') {
897
+ var _usersData$users;
898
+ setLoading(usersLoading);
899
+ if (usersError) {
900
+ setError(true);
901
+ return;
902
+ }
903
+ if (usersData !== null && usersData !== void 0 && (_usersData$users = usersData.users) !== null && _usersData$users !== void 0 && _usersData$users.data) {
904
+ var mapped = usersData.users.data.map(function (u) {
905
+ return mapUserToItem(u, q);
906
+ });
907
+ var meId = String(corUser.id);
908
+ var hasMeInResults = mapped.some(function (item) {
909
+ return String(item.id) === meId;
910
+ });
911
+ var withoutMe = mapped.filter(function (item) {
912
+ return String(item.id) !== meId;
913
+ });
914
+ var meItem = mapCorUserToUserItem(corUser, q, t('contextMention.me'));
915
+ setItems(hasMeInResults ? [meItem].concat(_toConsumableArray(withoutMe)) : mapped);
916
+ syncUsersPagination(usersData);
917
+ setError(false);
918
+ }
919
+ } else {
920
+ setLoading(searchLoading);
921
+ if (searchError) {
922
+ setError(true);
923
+ return;
924
+ }
925
+ if (searchData !== null && searchData !== void 0 && searchData.search) {
926
+ setItems(searchData.search.map(function (r) {
927
+ return mapSearchToItem(r, type, q, showProjectNameInTaskRow);
928
+ }));
929
+ setHasMore(false);
930
+ setError(false);
931
+ }
932
+ }
933
+ }, [searchData, clientsData, usersData, searchLoading, clientsLoading, usersLoading, searchError, clientsError, usersError, debouncedSearchValue, type, syncClientsPagination, syncUsersPagination, showProjectNameInTaskRow, corUser, t]);
934
+ var loadMore = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
935
+ var safeCurrentPage, nextPage, q, loadMoreBaselineGen, _data$users$data, _data$users, _yield$fetchUsersDire2, data, nextItems, _data3$clients$data, _data3$clients, _yield$fetchSearchCli, _data3, _nextItems, _data4$taskFamily$dat, _data4$taskFamily, filter, _yield$fetchTaskFamil2, _data4, _nextItems2, _data5$projects$data, _data5$projects, argumentsFilter, _yield$fetchProjectsF2, _data5, _nextItems3, _skillData$data, _skillData$next_offse, skillOffset, skillQ, skillPath, skillResponse, skillData, canPaginate, _nextItems4, _t3;
936
+ return _regeneratorRuntime.wrap(function (_context2) {
937
+ while (1) switch (_context2.prev = _context2.next) {
938
+ case 0:
939
+ if (!(isLoadingMore || !hasMore || activePaginationSource === 'none')) {
940
+ _context2.next = 1;
941
+ break;
942
+ }
943
+ return _context2.abrupt("return");
944
+ case 1:
945
+ safeCurrentPage = normalizePositiveInt(currentPage, 1);
946
+ nextPage = safeCurrentPage + 1;
947
+ q = debouncedSearchValue.trim();
948
+ loadMoreBaselineGen = recentsFetchGenerationRef.current;
949
+ setIsLoadingMore(true);
950
+ _context2.prev = 2;
951
+ if (!(activePaginationSource === 'users')) {
952
+ _context2.next = 5;
953
+ break;
954
+ }
955
+ _context2.next = 3;
956
+ return fetchUsersDirectory({
957
+ variables: {
958
+ filters: buildUsersDirectoryFilters(q),
959
+ page: nextPage
960
+ }
961
+ });
962
+ case 3:
963
+ _yield$fetchUsersDire2 = _context2.sent;
964
+ data = _yield$fetchUsersDire2.data;
965
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
966
+ _context2.next = 4;
967
+ break;
968
+ }
969
+ return _context2.abrupt("return");
970
+ case 4:
971
+ nextItems = ((_data$users$data = data === null || data === void 0 || (_data$users = data.users) === null || _data$users === void 0 ? void 0 : _data$users.data) !== null && _data$users$data !== void 0 ? _data$users$data : []).map(function (u) {
972
+ return mapUserToItem(u, q);
973
+ });
974
+ setItems(function (prev) {
975
+ if (!q) {
976
+ var _prev$;
977
+ var meItem = ((_prev$ = prev[0]) === null || _prev$ === void 0 ? void 0 : _prev$.type) === 'user' ? prev[0] : mapCorUserToUserItem(corUser, '', t('contextMention.me'));
978
+ var _existingIds = new Set(prev.map(function (item) {
979
+ return String(item.id);
980
+ }));
981
+ var _appended = nextItems.filter(function (item) {
982
+ return !_existingIds.has(String(item.id));
983
+ });
984
+ var withoutMe = prev.filter(function (item) {
985
+ return String(item.id) !== String(meItem.id);
986
+ });
987
+ return [meItem].concat(_toConsumableArray(withoutMe), _toConsumableArray(_appended));
988
+ }
989
+ var existingIds = new Set(prev.map(function (item) {
990
+ return "".concat(item.type, "-").concat(item.id);
991
+ }));
992
+ var appended = nextItems.filter(function (item) {
993
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
994
+ });
995
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
996
+ });
997
+ syncUsersPagination(data);
998
+ _context2.next = 19;
999
+ break;
1000
+ case 5:
1001
+ if (!(activePaginationSource === 'clients-search')) {
1002
+ _context2.next = 8;
1003
+ break;
1004
+ }
1005
+ _context2.next = 6;
1006
+ return fetchSearchClients({
1007
+ variables: {
1008
+ filter: {
1009
+ name: q
1010
+ },
1011
+ page: nextPage,
1012
+ perPage: 20
1013
+ }
1014
+ });
1015
+ case 6:
1016
+ _yield$fetchSearchCli = _context2.sent;
1017
+ _data3 = _yield$fetchSearchCli.data;
1018
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1019
+ _context2.next = 7;
1020
+ break;
1021
+ }
1022
+ return _context2.abrupt("return");
1023
+ case 7:
1024
+ _nextItems = ((_data3$clients$data = _data3 === null || _data3 === void 0 || (_data3$clients = _data3.clients) === null || _data3$clients === void 0 ? void 0 : _data3$clients.data) !== null && _data3$clients$data !== void 0 ? _data3$clients$data : []).map(function (c) {
1025
+ return mapClientToItem(c, q);
1026
+ });
1027
+ setItems(function (prev) {
1028
+ var existingIds = new Set(prev.map(function (item) {
1029
+ return "".concat(item.type, "-").concat(item.id);
1030
+ }));
1031
+ var appended = _nextItems.filter(function (item) {
1032
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1033
+ });
1034
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1035
+ });
1036
+ syncClientsPagination(_data3);
1037
+ _context2.next = 19;
1038
+ break;
1039
+ case 8:
1040
+ if (!(activePaginationSource === 'task-fallback')) {
1041
+ _context2.next = 11;
1042
+ break;
1043
+ }
1044
+ filter = {};
1045
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
1046
+ filter.projectIds = [String(stableScope.projectId)];
1047
+ }
1048
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
1049
+ filter.clientIds = [String(stableScope.clientId)];
1050
+ }
1051
+ _context2.next = 9;
1052
+ return fetchTaskFamilyFallback({
1053
+ variables: {
1054
+ filter: _objectSpread({
1055
+ archived: false
1056
+ }, filter),
1057
+ pagination: {
1058
+ offset: (nextPage - 1) * 20,
1059
+ size: 20
1060
+ }
1061
+ }
1062
+ });
1063
+ case 9:
1064
+ _yield$fetchTaskFamil2 = _context2.sent;
1065
+ _data4 = _yield$fetchTaskFamil2.data;
1066
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1067
+ _context2.next = 10;
1068
+ break;
1069
+ }
1070
+ return _context2.abrupt("return");
1071
+ case 10:
1072
+ _nextItems2 = ((_data4$taskFamily$dat = _data4 === null || _data4 === void 0 || (_data4$taskFamily = _data4.taskFamily) === null || _data4$taskFamily === void 0 ? void 0 : _data4$taskFamily.data) !== null && _data4$taskFamily$dat !== void 0 ? _data4$taskFamily$dat : []).map(normalizeTaskFamilyRecord).filter(function (item) {
1073
+ return item !== null;
1074
+ }).map(function (task) {
1075
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
1076
+ });
1077
+ setItems(function (prev) {
1078
+ var existingIds = new Set(prev.map(function (item) {
1079
+ return "".concat(item.type, "-").concat(item.id);
1080
+ }));
1081
+ var appended = _nextItems2.filter(function (item) {
1082
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1083
+ });
1084
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1085
+ });
1086
+ syncTaskFallbackPagination(_data4);
1087
+ _context2.next = 19;
1088
+ break;
1089
+ case 11:
1090
+ if (!(activePaginationSource === 'project-fallback')) {
1091
+ _context2.next = 14;
1092
+ break;
1093
+ }
1094
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
1095
+ client_id: [String(stableScope.clientId)]
1096
+ } : undefined;
1097
+ _context2.next = 12;
1098
+ return fetchProjectsFallback({
1099
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
1100
+ arguments: argumentsFilter
1101
+ } : {}), {}, {
1102
+ page: nextPage,
1103
+ perPage: 20
1104
+ })
1105
+ });
1106
+ case 12:
1107
+ _yield$fetchProjectsF2 = _context2.sent;
1108
+ _data5 = _yield$fetchProjectsF2.data;
1109
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1110
+ _context2.next = 13;
1111
+ break;
1112
+ }
1113
+ return _context2.abrupt("return");
1114
+ case 13:
1115
+ _nextItems3 = ((_data5$projects$data = _data5 === null || _data5 === void 0 || (_data5$projects = _data5.projects) === null || _data5$projects === void 0 ? void 0 : _data5$projects.data) !== null && _data5$projects$data !== void 0 ? _data5$projects$data : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
1116
+ return item !== null;
1117
+ }).map(function (item) {
1118
+ return mapSearchToItem(item, 'project', '');
1119
+ });
1120
+ setItems(function (prev) {
1121
+ var existingIds = new Set(prev.map(function (item) {
1122
+ return "".concat(item.type, "-").concat(item.id);
1123
+ }));
1124
+ var appended = _nextItems3.filter(function (item) {
1125
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1126
+ });
1127
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1128
+ });
1129
+ syncProjectFallbackPagination(_data5);
1130
+ _context2.next = 19;
1131
+ break;
1132
+ case 14:
1133
+ if (!(activePaginationSource === 'skills')) {
1134
+ _context2.next = 19;
1135
+ break;
1136
+ }
1137
+ skillOffset = currentPage;
1138
+ skillQ = debouncedSearchValue.trim();
1139
+ if (!(skillQ && skillQ.length < SKILLS_SEARCH_MIN_QUERY_LENGTH)) {
1140
+ _context2.next = 15;
1141
+ break;
1142
+ }
1143
+ return _context2.abrupt("return");
1144
+ case 15:
1145
+ skillPath = skillQ ? "skills?offset=".concat(skillOffset, "&q=").concat(encodeURIComponent(skillQ)) : "skills?offset=".concat(skillOffset);
1146
+ _context2.next = 16;
1147
+ return fetchMaia({
1148
+ path: skillPath,
1149
+ method: 'GET'
1150
+ });
1151
+ case 16:
1152
+ skillResponse = _context2.sent;
1153
+ _context2.next = 17;
1154
+ return skillResponse.json();
1155
+ case 17:
1156
+ skillData = _context2.sent;
1157
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1158
+ _context2.next = 18;
1159
+ break;
1160
+ }
1161
+ return _context2.abrupt("return");
1162
+ case 18:
1163
+ canPaginate = !!skillData.has_more && skillData.next_offset != null;
1164
+ _nextItems4 = mapSkillsToItems((_skillData$data = skillData.data) !== null && _skillData$data !== void 0 ? _skillData$data : [], skillQ);
1165
+ setItems(function (prev) {
1166
+ var existingIds = new Set(prev.map(function (item) {
1167
+ return "".concat(item.type, "-").concat(item.id);
1168
+ }));
1169
+ var appended = _nextItems4.filter(function (item) {
1170
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1171
+ });
1172
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1173
+ });
1174
+ setHasMore(canPaginate);
1175
+ setCurrentPage((_skillData$next_offse = skillData.next_offset) !== null && _skillData$next_offse !== void 0 ? _skillData$next_offse : 0);
1176
+ setActivePaginationSource(canPaginate ? 'skills' : 'none');
1177
+ case 19:
1178
+ _context2.next = 22;
1179
+ break;
1180
+ case 20:
1181
+ _context2.prev = 20;
1182
+ _t3 = _context2["catch"](2);
1183
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1184
+ _context2.next = 21;
1185
+ break;
1186
+ }
1187
+ return _context2.abrupt("return");
1188
+ case 21:
1189
+ console.error('[useEntitySearch] loadMore failed', {
1190
+ source: activePaginationSource,
1191
+ nextPage: nextPage,
1192
+ error: _t3
1193
+ });
1194
+ // Evita loop de reintentos automáticos por scroll cuando backend está caído (ej. 503).
1195
+ setError(true);
1196
+ setHasMore(false);
1197
+ case 22:
1198
+ _context2.prev = 22;
1199
+ setIsLoadingMore(false);
1200
+ return _context2.finish(22);
1201
+ case 23:
1202
+ case "end":
1203
+ return _context2.stop();
1204
+ }
1205
+ }, _callee2, null, [[2, 20, 22, 23]]);
1206
+ })), [isLoadingMore, hasMore, currentPage, activePaginationSource, debouncedSearchValue, fetchUsersDirectory, fetchSearchClients, fetchTaskFamilyFallback, fetchProjectsFallback, stableScope.projectId, stableScope.clientId, showProjectNameInTaskRow, corUser, t, syncClientsPagination, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination]);
1207
+
1208
+ // Mantenemos una ref a la última fetchRecent para que el effect de recents no se
1209
+ // re-dispare solo porque cambió la identidad de fetchRecent (scope/corUser/t).
1210
+ var fetchRecentRef = useRef(fetchRecent);
1211
+ useEffect(function () {
1212
+ fetchRecentRef.current = fetchRecent;
1213
+ }, [fetchRecent]);
1214
+
1215
+ // Trigger de recents: los recents de user NO dependen del scope, así que cambiar
1216
+ // de proyecto/cliente no debe re-fetchearlos. Los tipos scopeados (project/task) sí.
1217
+ var recentsTrigger = type === 'user' || type === 'skill' ? type : "".concat(type, "|").concat((_stableScope$projectI = stableScope.projectId) !== null && _stableScope$projectI !== void 0 ? _stableScope$projectI : '', "|").concat((_stableScope$clientId = stableScope.clientId) !== null && _stableScope$clientId !== void 0 ? _stableScope$clientId : '', "|").concat((_stableScope$agentEnt = stableScope.agentEntity) !== null && _stableScope$agentEnt !== void 0 ? _stableScope$agentEnt : '', "|").concat(mcpSlugsKey);
1218
+
1219
+ // Cuando se limpia el search, volver a recents
1220
+ useEffect(function () {
1221
+ if (!debouncedSearchValue.trim()) {
1222
+ fetchRecentRef.current();
1223
+ }
1224
+ }, [debouncedSearchValue, recentsTrigger]);
1225
+ return {
1226
+ items: items,
1227
+ loading: loading,
1228
+ error: error,
1229
+ hideRecentsLabel: hideRecentsLabel,
1230
+ hasMore: hasMore,
1231
+ isLoadingMore: isLoadingMore,
1232
+ loadMore: loadMore,
1233
+ searchValue: searchValue,
1234
+ updateSearchValue: setSearchValue,
1235
+ fetchRecent: fetchRecent,
1236
+ skillsCatalogEmpty: skillsCatalogEmpty
1237
+ };
1238
+ };
1239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VMYXp5UXVlcnkiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImdldFJlY2VudFRhc2tzIiwidXNlVXNlciIsIlBST0pFQ1RTX0ZBTExCQUNLIiwiU0VBUkNIX0VOVElUSUVTIiwiVEFTS19GQU1JTFlfRkFMTEJBQ0siLCJTRUFSQ0hfQ0xJRU5UUyIsIlVTRVJTX0RJUkVDVE9SWSIsIlNFQVJDSF9RVUVSWV9ERUJPVU5DRV9NUyIsIlNLSUxMU19TRUFSQ0hfTUlOX1FVRVJZX0xFTkdUSCIsInVzZURlYm91bmNlIiwidXNlVCIsImZldGNoTWFpYSIsIm5vcm1hbGl6ZVBvc2l0aXZlSW50IiwidmFsdWUiLCJmYWxsYmFjayIsInBhcnNlZCIsIk51bWJlciIsImlzRmluaXRlIiwibm9ybWFsaXplZCIsIk1hdGgiLCJmbG9vciIsIkJBU0VfRklMVEVSU19CWV9UWVBFIiwicHJvamVjdCIsImFyY2hpdmVkIiwidGFzayIsImJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyIsInNjb3BlIiwicmF3Q2xpZW50IiwiY2xpZW50SWQiLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJyYXdQcm9qZWN0IiwicHJvamVjdElkIiwiYWdlbnRFbnRpdHkiLCJlbnRyaWVzIiwicHVzaENsaWVudCIsInB1c2giLCJwdXNoUHJvamVjdCIsImJ1aWxkVGFza1NlYXJjaEV4dHJhIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhIiwiYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhIiwidHlwZSIsImJ1aWxkRmlsdGVyc0ZvclR5cGUiLCJidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyIsInEiLCJiYXNlIiwid2l0aFBvc2l0aW9uIiwid2l0aFRlYW1zIiwidHJpbW1lZFEiLCJ0cmltIiwic2VhcmNoSW5wdXQiLCJoaWdobGlnaHRSYW5nZSIsInRleHQiLCJzZWFyY2hWYWx1ZSIsImlkeCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsInN0YXJ0IiwiZmlyc3REZWZpbmVkIiwiX2xlbiIsImFyZ3VtZW50cyIsInZhbHVlcyIsIkFycmF5IiwiX2tleSIsImZpbmQiLCJub3JtYWxpemVUcmltbWVkU3RyaW5nIiwiZ2V0VXNlclBvc2l0aW9uTmFtZSIsInVzZXJQb3NpdGlvbiIsIl90eXBlb2YiLCJuYW1lIiwibWFwQ2xpZW50VG9JdGVtIiwiYyIsIl9jJHRvdGFsUHJveWVjdG9zIiwiX2MkdG90YWxQcm95ZWN0b3MyIiwiaWQiLCJwcmltYXJ5IiwicHJpbWFyeUhpZ2hsaWdodCIsImJyZWFkY3J1bWIiLCJjb3VudCIsInRvdGFsUHJveWVjdG9zIiwiY291bnRMYWJlbCIsInJhdyIsIm1hcFVzZXJUb0l0ZW0iLCJ1IiwiX3UkZmlyc3ROYW1lIiwiX3UkbGFzdE5hbWUiLCJfdSRwaWN0dXJlIiwiX3UkdXNlclBvc2l0aW9uJG5hbWUiLCJfdSR1c2VyUG9zaXRpb24iLCJfdSRlbWFpbCIsImZ1bGxOYW1lIiwiY29uY2F0IiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJlbWFpbCIsInBpY3R1cmUiLCJwb3NpdGlvbk5hbWUiLCJtYXBDb3JVc2VyVG9Vc2VySXRlbSIsInVzZXIiLCJtZUxhYmVsIiwiX3VzZXIkZmlyc3ROYW1lIiwiX3VzZXIkbGFzdE5hbWUiLCJwb3NpdGlvbkxpbmUiLCJ1c2VyX3Bvc2l0aW9uIiwibWFwUmVjZW50VGFza1RvSXRlbSIsIl90YXNrJHByb2plY3ROYW1lIiwic2hvd1Byb2plY3ROYW1lSW5UYXNrUm93IiwidGl0bGUiLCJwcm9qZWN0TmFtZSIsInBhcmVudCIsIm5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQiLCJyZWNvcmQiLCJfcmVjb3JkJHRpdGxlIiwiX2ZpcnN0RGVmaW5lZCIsIl9yZWNvcmQkcHJvamVjdCIsIl9yZWNvcmQkZmF0aGVyIiwiX3JlY29yZCRmYXRoZXIyIiwidGFza0ZhbWlseUlkIiwiX2lkIiwiZmF0aGVyIiwiaGFzRmF0aGVyIiwidGFza0ZhdGhlciIsIm5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQiLCJfcmVjb3JkJG5hbWUiLCJfZmlyc3REZWZpbmVkMiIsIl9yZWNvcmQkY2xpZW50IiwiX3JlY29yZCRjbGllbnQkbmFtZSIsIl9yZWNvcmQkY2xpZW50MiIsImNsaWVudCIsImNsaWVudE5hbWUiLCJtYXBTZWFyY2hUb0l0ZW0iLCJyIiwiX3IkcHJvamVjdE5hbWUiLCJfciRwcm9qZWN0TmFtZTIiLCJfciRjbGllbnRJZCIsIl9yJGNsaWVudE5hbWUiLCJfciRmZWVJZCIsIl9mYXRoZXIkdGl0bGUiLCJ0YXNrUHJvamVjdE5hbWUiLCJmZWVJZCIsImZhdGhlcklkIiwiZmF0aGVyVGl0bGUiLCJmb3JtYXRNY3BQcmltYXJ5TGFiZWwiLCJzbHVnIiwicmVwbGFjZSIsImNoYXIiLCJ0b1VwcGVyQ2FzZSIsIm1hcFNraWxsc1RvSXRlbXMiLCJza2lsbHMiLCJmaWx0ZXJlZCIsImZpbHRlciIsInMiLCJpbmNsdWRlcyIsIm1hcCIsInNraWxsIiwibWFwTWNwU2x1Z3NUb0l0ZW1zIiwic2x1Z3MiLCJ1c2VFbnRpdHlTZWFyY2giLCJfc2NvcGUkbWNwU2x1Z3MiLCJfc2NvcGUkc2tpbGxzIiwiX3N0YWJsZVNjb3BlJHByb2plY3RJIiwiX3N0YWJsZVNjb3BlJGNsaWVudElkIiwiX3N0YWJsZVNjb3BlJGFnZW50RW50IiwiY29yVXNlciIsIl91c2VUIiwidCIsInJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRTZWFyY2hWYWx1ZSIsImRlYm91bmNlZFNlYXJjaFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJpdGVtcyIsInNldEl0ZW1zIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwiaGlkZVJlY2VudHNMYWJlbCIsInNldEhpZGVSZWNlbnRzTGFiZWwiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJoYXNNb3JlIiwic2V0SGFzTW9yZSIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc0xvYWRpbmdNb3JlIiwic2V0SXNMb2FkaW5nTW9yZSIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJjdXJyZW50UGFnZSIsInNldEN1cnJlbnRQYWdlIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UiLCJzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlIiwiX3VzZVN0YXRlMTciLCJfdXNlU3RhdGUxOCIsInNraWxsc0NhdGFsb2dFbXB0eSIsInNldFNraWxsc0NhdGFsb2dFbXB0eSIsIm1jcFNsdWdzS2V5IiwibWNwU2x1Z3MiLCJqb2luIiwic2tpbGxzS2V5Iiwic3RhYmxlU2NvcGUiLCJfc2NvcGUkY2xpZW50SWQiLCJfc2NvcGUkcHJvamVjdElkIiwiX3Njb3BlJG1jcFNsdWdzMiIsIl9zY29wZSRhZ2VudEVudGl0eSIsIl91c2VMYXp5UXVlcnkiLCJ2YXJpYWJsZXMiLCJsaW1pdCIsImZldGNoUG9saWN5IiwiX3VzZUxhenlRdWVyeTIiLCJmZXRjaFNlYXJjaEVudGl0aWVzIiwiX3VzZUxhenlRdWVyeTIkIiwic2VhcmNoRGF0YSIsImRhdGEiLCJzZWFyY2hMb2FkaW5nIiwic2VhcmNoRXJyb3IiLCJfdXNlTGF6eVF1ZXJ5MyIsIl91c2VMYXp5UXVlcnk0IiwiZmV0Y2hTZWFyY2hDbGllbnRzIiwiX3VzZUxhenlRdWVyeTQkIiwiY2xpZW50c0RhdGEiLCJjbGllbnRzTG9hZGluZyIsImNsaWVudHNFcnJvciIsIl91c2VMYXp5UXVlcnk1IiwiX3VzZUxhenlRdWVyeTYiLCJmZXRjaFVzZXJzRGlyZWN0b3J5IiwiX3VzZUxhenlRdWVyeTYkIiwidXNlcnNEYXRhIiwidXNlcnNMb2FkaW5nIiwidXNlcnNFcnJvciIsInN5bmNVc2Vyc1BhZ2luYXRpb24iLCJwYXlsb2FkIiwiX3BheWxvYWQkdXNlcnMiLCJfcGF5bG9hZCR1c2VyczIiLCJwYWdlIiwidXNlcnMiLCJsYXN0UGFnZSIsInN5bmNDbGllbnRzUGFnaW5hdGlvbiIsIl9wYXlsb2FkJGNsaWVudHMiLCJfcGF5bG9hZCRjbGllbnRzMiIsImNsaWVudHMiLCJzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbiIsIl9wYXlsb2FkJHRhc2tGYW1pbHkiLCJfcGF5bG9hZCR0YXNrRmFtaWx5MiIsInJhd1BhZ2UiLCJ0YXNrRmFtaWx5Iiwic3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24iLCJfcGF5bG9hZCRwcm9qZWN0cyIsIl9wYXlsb2FkJHByb2plY3RzMiIsInByb2plY3RzIiwiX3VzZUxhenlRdWVyeTciLCJfdXNlTGF6eVF1ZXJ5OCIsImZldGNoVGFza0ZhbWlseUZhbGxiYWNrIiwiX3VzZUxhenlRdWVyeTkiLCJfdXNlTGF6eVF1ZXJ5MCIsImZldGNoUHJvamVjdHNGYWxsYmFjayIsImZldGNoUmVjZW50IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJnZW5lcmF0aW9uIiwiX3N0YWJsZVNjb3BlJG1jcFNsdWdzIiwiX2RhdGEkZGF0YSIsIl9kYXRhJG5leHRfb2Zmc2V0IiwicmVzcG9uc2UiLCJjYW5QYWdpbmF0ZSIsIl9mYWxsYmFja0RhdGEkcHJvamVjdCIsIl9mYWxsYmFja0RhdGEkcHJvamVjdDIiLCJhcmd1bWVudHNGaWx0ZXIiLCJfeWllbGQkZmV0Y2hQcm9qZWN0c0YiLCJmYWxsYmFja0RhdGEiLCJtYXBwZWQiLCJyZWNlbnRUYXNrRmlsdGVycyIsIl9kYXRhIiwidGFza0l0ZW1zIiwiX2ZhbGxiYWNrRGF0YSR0YXNrRmFtIiwiX2ZhbGxiYWNrRGF0YSR0YXNrRmFtMiIsIl95aWVsZCRmZXRjaFRhc2tGYW1pbCIsIl9mYWxsYmFja0RhdGEiLCJfZGF0YTIkdXNlcnMkZGF0YSIsIl9kYXRhMiR1c2VycyIsIl95aWVsZCRmZXRjaFVzZXJzRGlyZSIsIl9kYXRhMiIsIl9tYXBwZWQiLCJtZUl0ZW0iLCJ3aXRob3V0TWUiLCJfdCIsIl90MiIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiY3VycmVudCIsImFicnVwdCIsInBhdGgiLCJtZXRob2QiLCJzZW50IiwianNvbiIsImhhc19tb3JlIiwibmV4dF9vZmZzZXQiLCJmaW5pc2giLCJjbGllbnRfaWQiLCJfb2JqZWN0U3ByZWFkIiwicGVyUGFnZSIsIml0ZW0iLCJwcm9qZWN0SWRzIiwiY2xpZW50SWRzIiwicGFnaW5hdGlvbiIsIm9mZnNldCIsInNpemUiLCJmaWx0ZXJzIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwic3RvcCIsIl9zdGFibGVTY29wZSRtY3BTbHVnczIiLCJzZWFyY2hHZW4iLCJlbmNvZGVVUklDb21wb25lbnQiLCJ0aGVuIiwiX2RhdGEkZGF0YTIiLCJfZGF0YSRuZXh0X29mZnNldDIiLCJleHRyYSIsIl9jbGllbnRzRGF0YSRjbGllbnRzIiwiX3VzZXJzRGF0YSR1c2VycyIsIm1lSWQiLCJoYXNNZUluUmVzdWx0cyIsInNvbWUiLCJzZWFyY2giLCJsb2FkTW9yZSIsIl9jYWxsZWUyIiwic2FmZUN1cnJlbnRQYWdlIiwibmV4dFBhZ2UiLCJsb2FkTW9yZUJhc2VsaW5lR2VuIiwiX2RhdGEkdXNlcnMkZGF0YSIsIl9kYXRhJHVzZXJzIiwiX3lpZWxkJGZldGNoVXNlcnNEaXJlMiIsIm5leHRJdGVtcyIsIl9kYXRhMyRjbGllbnRzJGRhdGEiLCJfZGF0YTMkY2xpZW50cyIsIl95aWVsZCRmZXRjaFNlYXJjaENsaSIsIl9kYXRhMyIsIl9uZXh0SXRlbXMiLCJfZGF0YTQkdGFza0ZhbWlseSRkYXQiLCJfZGF0YTQkdGFza0ZhbWlseSIsIl95aWVsZCRmZXRjaFRhc2tGYW1pbDIiLCJfZGF0YTQiLCJfbmV4dEl0ZW1zMiIsIl9kYXRhNSRwcm9qZWN0cyRkYXRhIiwiX2RhdGE1JHByb2plY3RzIiwiX3lpZWxkJGZldGNoUHJvamVjdHNGMiIsIl9kYXRhNSIsIl9uZXh0SXRlbXMzIiwiX3NraWxsRGF0YSRkYXRhIiwiX3NraWxsRGF0YSRuZXh0X29mZnNlIiwic2tpbGxPZmZzZXQiLCJza2lsbFEiLCJza2lsbFBhdGgiLCJza2lsbFJlc3BvbnNlIiwic2tpbGxEYXRhIiwiX25leHRJdGVtczQiLCJfdDMiLCJfY29udGV4dDIiLCJfcHJldiQiLCJleGlzdGluZ0lkcyIsIlNldCIsImFwcGVuZGVkIiwiaGFzIiwiY29uc29sZSIsInNvdXJjZSIsImZldGNoUmVjZW50UmVmIiwicmVjZW50c1RyaWdnZXIiLCJ1cGRhdGVTZWFyY2hWYWx1ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VFbnRpdHlTZWFyY2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlTGF6eVF1ZXJ5IH0gZnJvbSAnQGFwb2xsby9jbGllbnQnXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBnZXRSZWNlbnRUYXNrcyB9IGZyb20gJy4uL3NlcnZpY2VzL21haWEvUmVjZW50VGFza3MvZ2V0UmVjZW50VGFza3MnXG5pbXBvcnQgdHlwZSB7IFJlY2VudFRhc2tJdGVtIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRUYXNrcy9nZXRSZWNlbnRUYXNrcydcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgUFJPSkVDVFNfRkFMTEJBQ0ssIFNFQVJDSF9FTlRJVElFUywgVEFTS19GQU1JTFlfRkFMTEJBQ0sgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9lbnRpdHlTZWFyY2hRdWVyeSdcbmltcG9ydCB7IFNFQVJDSF9DTElFTlRTIH0gZnJvbSAnLi4vc2VydmljZXMvcXVlcnkvQ2xpZW50U2VhcmNoUXVlcnknXG5pbXBvcnQgeyBVU0VSU19ESVJFQ1RPUlkgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS91c2Vyc0RpcmVjdG9yeVF1ZXJ5J1xuaW1wb3J0IHsgU0VBUkNIX1FVRVJZX0RFQk9VTkNFX01TLCBTS0lMTFNfU0VBUkNIX01JTl9RVUVSWV9MRU5HVEggfSBmcm9tICcuLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgdXNlRGVib3VuY2UgfSBmcm9tICcuL3VzZURlYm91bmNlJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4vdXNlVCdcbmltcG9ydCB7IENvbnRleHRFbnRpdHlUeXBlLCBDb250ZXh0TWVudGlvbkl0ZW0gfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB0eXBlIHsgQWdlbnRFbnRpdHkgfSBmcm9tICcuLi90eXBlcy9hZ2VudCdcbmltcG9ydCB0eXBlIHsgU2tpbGwgfSBmcm9tICcuLi90eXBlcy9za2lsbCdcbmltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL3NlcnZpY2VzL21haWEvY2xpZW50J1xuXG50eXBlIFJhd1NlYXJjaFJlc3VsdCA9IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuICB0aXRsZTogc3RyaW5nXG4gIHR5cGU/OiBzdHJpbmdcbiAgY2xpZW50SWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsXG4gIGZlZUlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbFxuICBjbGllbnROYW1lPzogc3RyaW5nIHwgbnVsbFxuICBwcm9qZWN0TmFtZT86IHN0cmluZyB8IG51bGxcbiAgZmF0aGVyPzogeyBpZDogc3RyaW5nIHwgbnVtYmVyOyB0aXRsZT86IHN0cmluZyB8IG51bGwgfSB8IG51bGxcbn1cblxudHlwZSBSYXdDbGllbnQgPSB7XG4gIGlkOiBudW1iZXIgfCBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHRvdGFsUHJveWVjdG9zPzogbnVtYmVyIHwgbnVsbFxufVxuXG50eXBlIFJhd0RpcmVjdG9yeVVzZXIgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgZmlyc3ROYW1lPzogc3RyaW5nIHwgbnVsbFxuICBsYXN0TmFtZT86IHN0cmluZyB8IG51bGxcbiAgZW1haWw/OiBzdHJpbmcgfCBudWxsXG4gIHBpY3R1cmU/OiBzdHJpbmcgfCBudWxsXG4gIHVzZXJQb3NpdGlvbj86IHsgbmFtZT86IHN0cmluZyB8IG51bGwgfSB8IG51bGxcbn1cblxudHlwZSBTZWFyY2hFbnRpdGllc0RhdGEgPSB7IHNlYXJjaDogUmF3U2VhcmNoUmVzdWx0W10gfCBudWxsIH1cbnR5cGUgU2VhcmNoQ2xpZW50c0RhdGEgPSB7XG4gIGNsaWVudHM6IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YTogUmF3Q2xpZW50W11cbiAgfSB8IG51bGxcbn1cbnR5cGUgVXNlcnNEaXJlY3RvcnlEYXRhID0ge1xuICB1c2Vyczoge1xuICAgIHRvdGFsPzogbnVtYmVyIHwgbnVsbFxuICAgIHBlclBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgcGFnZT86IG51bWJlciB8IG51bGxcbiAgICBsYXN0UGFnZT86IG51bWJlciB8IG51bGxcbiAgICBkYXRhOiBSYXdEaXJlY3RvcnlVc2VyW10gfCBudWxsXG4gIH0gfCBudWxsXG59XG5cbnR5cGUgVGFza0ZhbWlseVJlY29yZCA9IHtcbiAgX2lkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICB0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgcHJvamVjdElkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICB0YXNrRmF0aGVyPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBmYXRoZXI/OiB7IGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDsgdGl0bGU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG4gIHByb2plY3Q/OiB7IGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDsgbmFtZT86IHN0cmluZyB8IG51bGwgfSB8IG51bGxcbn1cblxudHlwZSBUYXNrRmFtaWx5RGF0YSA9IHtcbiAgdGFza0ZhbWlseT86IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YT86IFRhc2tGYW1pbHlSZWNvcmRbXSB8IG51bGxcbiAgfSB8IG51bGxcbn1cblxudHlwZSBGYWxsYmFja1Byb2plY3RSZWNvcmQgPSB7XG4gIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICBjbGllbnRJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgY2xpZW50PzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgUHJvamVjdHNGYWxsYmFja0RhdGEgPSB7XG4gIHByb2plY3RzPzoge1xuICAgIHRvdGFsPzogbnVtYmVyIHwgbnVsbFxuICAgIHBlclBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgcGFnZT86IG51bWJlciB8IG51bGxcbiAgICBsYXN0UGFnZT86IG51bWJlciB8IG51bGxcbiAgICBkYXRhPzogRmFsbGJhY2tQcm9qZWN0UmVjb3JkW10gfCBudWxsXG4gIH0gfCBudWxsXG59XG5cbnR5cGUgUGFnaW5hdGlvblNvdXJjZSA9ICdub25lJyB8ICd1c2VycycgfCAnY2xpZW50cy1zZWFyY2gnIHwgJ3Rhc2stZmFsbGJhY2snIHwgJ3Byb2plY3QtZmFsbGJhY2snIHwgJ3NraWxscydcblxuY29uc3Qgbm9ybWFsaXplUG9zaXRpdmVJbnQgPSAodmFsdWU6IHVua25vd24sIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkpIHJldHVybiBmYWxsYmFja1xuICBjb25zdCBub3JtYWxpemVkID0gTWF0aC5mbG9vcihwYXJzZWQpXG4gIHJldHVybiBub3JtYWxpemVkID4gMCA/IG5vcm1hbGl6ZWQgOiBmYWxsYmFja1xufVxuXG4vKipcbiAqIFJlc3RyaW5nZSBsb3MgcmVzdWx0YWRvcyBhbCBgY2xpZW50SWRgL2Bwcm9qZWN0SWRgIGRlbCBhZ2VudGUgYWN0aXZvLlxuICogQ3VhbmRvIGVsIGFnZW50ZSBlc3TDoSBzY29wZWFkbyBhIHVuIGNsaWVudC9wcm9qZWN0LCB0YW50byBsb3MgcmVjZW50cyBjb21vXG4gKiBlbCBzZWFyY2ggZGViZW4gZmlsdHJhciBwb3IgZXNlIGNvbnRleHRvLiBTaSBlbCBiYWNrZW5kIG5vIGVudGllbmRlIGFsZ8O6blxuICogY2FtcG8gbG8gaWdub3JhIHkgc2UgY2FlIGFsIGNvbXBvcnRhbWllbnRvIGdsb2JhbC5cbiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5U2VhcmNoU2NvcGUgPSB7XG4gIGNsaWVudElkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBwcm9qZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIC8qKiBTbHVncyBkZWwgY29uZWN0b3IgTUNQIGRlbCBhZ2VudGUgKGxpc3RhZG8gbG9jYWwsIHNpbiBHcmFwaFFMKS4gKi9cbiAgbWNwU2x1Z3M/OiBzdHJpbmdbXVxuICAvKipcbiAgICogU2tpbGxzIHByZWNhcmdhZGFzIChsaXN0YWRvIGxvY2FsLCBzaW4gUkVTVCkuIEN1YW5kbyBzZSBwcm92ZWVuLCBzZSB1c2FuIGRpcmVjdGFtZW50ZVxuICAgKiBlbiBsdWdhciBkZSBmZXRjaGVhciBkZXNkZSBsYSBBUEkuIMOadGlsIHBhcmEgZGV2L3Rlc3RpbmcgeSBwYXJhIFNTUi5cbiAgICovXG4gIHNraWxscz86IFNraWxsW11cbiAgLyoqXG4gICAqIGBlbnRpdHlgIGRlbCBhZ2VudGUgYWN0aXZvLiBQYXJhIGVzcGVjaWFsaXN0YXM6XG4gICAqIC0gYHByb2plY3RgOiBiw7pzcXVlZGEgZGUgdGFyZWFzIGZ1ZXJ6YSBmaWx0cm8gcG9yIGBwcm9qZWN0SWRgIGRlbCBjb250ZXh0by5cbiAgICogLSBgY2xpZW50YDogYsO6c3F1ZWRhIGRlIHByb3llY3RvcyBwb3IgYGNsaWVudElkYDsgdGFyZWFzIHBvciBjbGllbnRlICh5IHByb3llY3RvIHNpIGFwbGljYSkuXG4gICAqL1xuICBhZ2VudEVudGl0eT86IEFnZW50RW50aXR5IHwgbnVsbFxufVxuXG50eXBlIFNlYXJjaEZpbHRlcmFibGVUeXBlID0gJ3Byb2plY3QnIHwgJ3Rhc2snXG5cbmNvbnN0IEJBU0VfRklMVEVSU19CWV9UWVBFOiBSZWNvcmQ8U2VhcmNoRmlsdGVyYWJsZVR5cGUsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICBwcm9qZWN0OiB7IHByb2plY3Q6ICd0cnVlJywgYXJjaGl2ZWQ6ICdhbGwnIH0sXG4gIHRhc2s6IHsgdGFzazogJ3RydWUnLCBhcmNoaXZlZDogJ2ZhbHNlJyB9LFxufVxuXG4vKipcbiAqIEVudHJhZGFzIHBhcmEgZWwgYXJndW1lbnRvIEdyYXBoUUwgYGV4dHJhYCAoSlNPTiBzdHJpbmcgZGUgYXJyYXkpIGFsIGJ1c2NhciB0YXJlYXMgY29uIGNvbnRleHRvLlxuICogRWouOiBbe1wicHJvamVjdElkXCI6XCI4ODE1NTJcIn1dXG4gKi9cbmNvbnN0IGJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyA9IChzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKTogQXJyYXk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4ge1xuICBjb25zdCByYXdDbGllbnQgPVxuICAgIHNjb3BlPy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHNjb3BlPy5jbGllbnRJZCAhPT0gbnVsbCAmJiBzY29wZT8uY2xpZW50SWQgIT09ICcnID8gU3RyaW5nKHNjb3BlLmNsaWVudElkKSA6IG51bGxcbiAgY29uc3QgcmF3UHJvamVjdCA9XG4gICAgc2NvcGU/LnByb2plY3RJZCAhPT0gdW5kZWZpbmVkICYmIHNjb3BlPy5wcm9qZWN0SWQgIT09IG51bGwgJiYgc2NvcGU/LnByb2plY3RJZCAhPT0gJydcbiAgICAgID8gU3RyaW5nKHNjb3BlLnByb2plY3RJZClcbiAgICAgIDogbnVsbFxuXG4gIGNvbnN0IGFnZW50RW50aXR5ID0gc2NvcGU/LmFnZW50RW50aXR5XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0gW11cblxuICBjb25zdCBwdXNoQ2xpZW50ID0gKCkgPT4ge1xuICAgIGlmIChyYXdDbGllbnQpIGVudHJpZXMucHVzaCh7IGNsaWVudElkOiByYXdDbGllbnQgfSlcbiAgfVxuICBjb25zdCBwdXNoUHJvamVjdCA9ICgpID0+IHtcbiAgICBpZiAocmF3UHJvamVjdCkgZW50cmllcy5wdXNoKHsgcHJvamVjdElkOiByYXdQcm9qZWN0IH0pXG4gIH1cblxuICBpZiAoYWdlbnRFbnRpdHkgPT09ICdwcm9qZWN0Jykge1xuICAgIGlmIChyYXdQcm9qZWN0KSB7XG4gICAgICBwdXNoUHJvamVjdCgpXG4gICAgfSBlbHNlIGlmIChyYXdDbGllbnQpIHtcbiAgICAgIHB1c2hDbGllbnQoKVxuICAgIH1cbiAgfSBlbHNlIGlmIChhZ2VudEVudGl0eSA9PT0gJ2NsaWVudCcpIHtcbiAgICBwdXNoQ2xpZW50KClcbiAgICBwdXNoUHJvamVjdCgpXG4gIH0gZWxzZSB7XG4gICAgcHVzaENsaWVudCgpXG4gICAgcHVzaFByb2plY3QoKVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuY29uc3QgYnVpbGRUYXNrU2VhcmNoRXh0cmEgPSAoc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGVudHJpZXMgPSBidWlsZFRhc2tTZWFyY2hFeHRyYUVudHJpZXMoc2NvcGUpXG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW50cmllcylcbn1cblxuLyoqXG4gKiBUYWIgcHJveWVjdG86IGNvbiBgY2xpZW50SWRgIGVuIGVsIHNjb3BlLCBgZXh0cmFgIGFjb3RhIGxhIGLDunNxdWVkYSBhIHByb3llY3RvcyBkZSBlc2UgY2xpZW50ZS5cbiAqIEVqLjogYFt7XCJjbGllbnRJZFwiOlwiNDcxMDVcIn1dYCBqdW50byBhIGBmaWx0ZXJzYCBge1wicHJvamVjdFwiOlwidHJ1ZVwiLFwiYXJjaGl2ZWRcIjpcImFsbFwifWAuXG4gKi9cbmNvbnN0IGJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhID0gKHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCByYXdDbGllbnQgPVxuICAgIHNjb3BlPy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHNjb3BlPy5jbGllbnRJZCAhPT0gbnVsbCAmJiBzY29wZT8uY2xpZW50SWQgIT09ICcnID8gU3RyaW5nKHNjb3BlLmNsaWVudElkKSA6IG51bGxcbiAgaWYgKCFyYXdDbGllbnQpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFt7IGNsaWVudElkOiByYXdDbGllbnQgfV0pXG59XG5cbmNvbnN0IGJ1aWxkU2VhcmNoRW50aXRpZXNFeHRyYSA9ICh0eXBlOiBTZWFyY2hGaWx0ZXJhYmxlVHlwZSwgc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlID09PSAndGFzaycpIHJldHVybiBidWlsZFRhc2tTZWFyY2hFeHRyYShzY29wZSlcbiAgaWYgKHR5cGUgPT09ICdwcm9qZWN0JykgcmV0dXJuIGJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhKHNjb3BlKVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogVGFiIGB0YXNrYCAvIGBwcm9qZWN0YDogYGZpbHRlcnNgIHPDs2xvIHRpcG8gKyBhcmNoaXZlZCAodGFyZWFzOiBubyBhcmNoaXZhZGFzKTsgc2NvcGUgKGNsaWVudElkIC8gcHJvamVjdElkIGVuIHRhcmVhcykgZW4gYGV4dHJhYC5cbiAqL1xuY29uc3QgYnVpbGRGaWx0ZXJzRm9yVHlwZSA9ICh0eXBlOiBTZWFyY2hGaWx0ZXJhYmxlVHlwZSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQkFTRV9GSUxURVJTX0JZX1RZUEUucHJvamVjdClcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQkFTRV9GSUxURVJTX0JZX1RZUEUudGFzaylcbn1cblxuLyoqXG4gKiBGaWx0cm9zIHBhcmEgbGEgcXVlcnkgdXNlcnMuIEVsIGJhY2tlbmQgZXNwZXJhIHVuIEpTT04gc3RyaW5nIGNvblxuICogd2l0aFBvc2l0aW9uLCB3aXRoVGVhbXMgeSBzZWFyY2hJbnB1dC4gTGUgYWdyZWdhbW9zIGNsaWVudElkL3Byb2plY3RJZFxuICogZGVsIHNjb3BlIGVuIGNhc28gZGUgcXVlIGVsIGJhY2tlbmQgbG9zIGFwcm92ZWNoZSBwYXJhIGZpbHRyYXIgcG9yXG4gKiBjb250ZXh0byAoc2kgbm8gbG9zIGVudGllbmRlIGxvcyBpZ25vcmEpLlxuICovXG5jb25zdCBidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyA9IChxOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBiYXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICB3aXRoUG9zaXRpb246IHRydWUsXG4gICAgd2l0aFRlYW1zOiB0cnVlLFxuICB9XG4gIGNvbnN0IHRyaW1tZWRRID0gcS50cmltKClcbiAgaWYgKHRyaW1tZWRRKSB7XG4gICAgYmFzZS5zZWFyY2hJbnB1dCA9IHRyaW1tZWRRXG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJhc2UpXG59XG5cbmNvbnN0IGhpZ2hsaWdodFJhbmdlID0gKHRleHQ6IHN0cmluZywgc2VhcmNoVmFsdWU6IHN0cmluZykgPT4ge1xuICBpZiAoIXNlYXJjaFZhbHVlKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IGlkeCA9IHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCkpXG4gIGlmIChpZHggPCAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IHN0YXJ0OiBpZHgsIGxlbmd0aDogc2VhcmNoVmFsdWUubGVuZ3RoIH1cbn1cblxuY29uc3QgZmlyc3REZWZpbmVkID0gPFQ+KC4uLnZhbHVlczogQXJyYXk8VCB8IG51bGwgfCB1bmRlZmluZWQ+KTogVCB8IHVuZGVmaW5lZCA9PlxuICB2YWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKVxuXG5jb25zdCBub3JtYWxpemVUcmltbWVkU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiAnJ1xuICByZXR1cm4gdmFsdWUudHJpbSgpXG59XG5cbmNvbnN0IGdldFVzZXJQb3NpdGlvbk5hbWUgPSAodXNlclBvc2l0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VVc2VyPlsndXNlcl9wb3NpdGlvbiddKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB1c2VyUG9zaXRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gdXNlclBvc2l0aW9uLnRyaW0oKVxuICBpZiAodXNlclBvc2l0aW9uICYmIHR5cGVvZiB1c2VyUG9zaXRpb24gPT09ICdvYmplY3QnICYmICduYW1lJyBpbiB1c2VyUG9zaXRpb24pIHtcbiAgICByZXR1cm4gbm9ybWFsaXplVHJpbW1lZFN0cmluZyh1c2VyUG9zaXRpb24ubmFtZSlcbiAgfVxuICByZXR1cm4gJydcbn1cblxuY29uc3QgbWFwQ2xpZW50VG9JdGVtID0gKGM6IFJhd0NsaWVudCwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbSA9PiAoe1xuICBpZDogYy5pZCxcbiAgdHlwZTogJ2NsaWVudCcsXG4gIHByaW1hcnk6IGMubmFtZSxcbiAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UoYy5uYW1lLCBzZWFyY2hWYWx1ZSksXG4gIGJyZWFkY3J1bWI6IHtcbiAgICBjb3VudDogYy50b3RhbFByb3llY3RvcyA/PyB1bmRlZmluZWQsXG4gICAgY291bnRMYWJlbDogJ3Byb2plY3RzJyxcbiAgfSxcbiAgcmF3OiB7XG4gICAgaWQ6IGMuaWQsXG4gICAgbmFtZTogYy5uYW1lLFxuICAgIHRvdGFsUHJveWVjdG9zOiBjLnRvdGFsUHJveWVjdG9zID8/IG51bGwsXG4gIH0sXG59KVxuXG5jb25zdCBtYXBVc2VyVG9JdGVtID0gKHU6IFJhd0RpcmVjdG9yeVVzZXIsIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW0gPT4ge1xuICBjb25zdCBmdWxsTmFtZSA9IGAke3UuZmlyc3ROYW1lID8/ICcnfSAke3UubGFzdE5hbWUgPz8gJyd9YC50cmltKClcbiAgY29uc3QgcHJpbWFyeSA9IGZ1bGxOYW1lIHx8IHUuZW1haWwgfHwgU3RyaW5nKHUuaWQpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogdS5pZCxcbiAgICB0eXBlOiAndXNlcicsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgcmF3OiB7XG4gICAgICBpZDogdS5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwaWN0dXJlOiB1LnBpY3R1cmUgPz8gbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogdS51c2VyUG9zaXRpb24/Lm5hbWUgPz8gbnVsbCxcbiAgICAgIGVtYWlsOiB1LmVtYWlsID8/IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYXBDb3JVc2VyVG9Vc2VySXRlbSA9IChcbiAgdXNlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlVXNlcj4sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIG1lTGFiZWw6IHN0cmluZ1xuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgZnVsbE5hbWUgPSBgJHt1c2VyLmZpcnN0TmFtZSA/PyAnJ30gJHt1c2VyLmxhc3ROYW1lID8/ICcnfWAudHJpbSgpXG4gIC8qKiBTb2xvIGNhcmdvIHJlYWw7IHNpbiBmYWxsYmFjayBhIGByb2xlYCAobGEgVUkgbXVlc3RyYSDigJxTaW4gcG9zaWNpw7Nu4oCdIHNpIGZhbHRhKS4gKi9cbiAgY29uc3QgcG9zaXRpb25MaW5lID0gZ2V0VXNlclBvc2l0aW9uTmFtZSh1c2VyLnVzZXJfcG9zaXRpb24pIHx8IG51bGxcbiAgY29uc3QgZW1haWwgPSBub3JtYWxpemVUcmltbWVkU3RyaW5nKHVzZXIuZW1haWwpIHx8IG51bGxcblxuICByZXR1cm4ge1xuICAgIGlkOiB1c2VyLmlkLFxuICAgIHR5cGU6ICd1c2VyJyxcbiAgICBwcmltYXJ5OiBtZUxhYmVsLFxuICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKG1lTGFiZWwsIHNlYXJjaFZhbHVlKSxcbiAgICByYXc6IHtcbiAgICAgIGlkOiB1c2VyLmlkLFxuICAgICAgbmFtZTogZnVsbE5hbWUgfHwgU3RyaW5nKHVzZXIuaWQpLFxuICAgICAgcGljdHVyZTogdXNlci5waWN0dXJlIHx8IG51bGwsXG4gICAgICBwb3NpdGlvbk5hbWU6IHBvc2l0aW9uTGluZSxcbiAgICAgIGVtYWlsLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbWFwUmVjZW50VGFza1RvSXRlbSA9IChcbiAgdGFzazogUmVjZW50VGFza0l0ZW0sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHRydWVcbik6IENvbnRleHRNZW50aW9uSXRlbSA9PiB7XG4gIGNvbnN0IHByaW1hcnkgPSAodGFzay50aXRsZSAmJiB0YXNrLnRpdGxlLnRyaW0oKSkgfHwgU3RyaW5nKHRhc2suaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID8gKHRhc2sucHJvamVjdE5hbWUgPz8gbnVsbCkgOiBudWxsXG4gIHJldHVybiB7XG4gICAgaWQ6IHRhc2suaWQsXG4gICAgdHlwZTogJ3Rhc2snLFxuICAgIHByaW1hcnksXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgIGJyZWFkY3J1bWI6IHByb2plY3ROYW1lID8geyBwYXJlbnQ6IHByb2plY3ROYW1lIH0gOiB1bmRlZmluZWQsXG4gICAgcmF3OiB7XG4gICAgICBpZDogdGFzay5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwcm9qZWN0TmFtZSxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQgPSAocmVjb3JkOiBUYXNrRmFtaWx5UmVjb3JkKTogUmVjZW50VGFza0l0ZW0gfCBudWxsID0+IHtcbiAgY29uc3QgeyBfaWQ6IHRhc2tGYW1pbHlJZCB9ID0gcmVjb3JkXG4gIGNvbnN0IGlkID0gdGFza0ZhbWlseUlkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IChyZWNvcmQudGl0bGUgPz8gJycpLnRyaW0oKSB8fCBTdHJpbmcoaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gZmlyc3REZWZpbmVkKHJlY29yZC5wcm9qZWN0Py5uYW1lLCByZWNvcmQuZmF0aGVyPy50aXRsZSkgPz8gbnVsbFxuICBjb25zdCBoYXNGYXRoZXIgPSAhIWZpcnN0RGVmaW5lZChyZWNvcmQudGFza0ZhdGhlciwgcmVjb3JkLmZhdGhlcj8uaWQpXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgdGl0bGUsXG4gICAgdHlwZTogaGFzRmF0aGVyID8gJ3N1YnRhc2snIDogJ3Rhc2snLFxuICAgIHByb2plY3ROYW1lLFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQgPSAocmVjb3JkOiBGYWxsYmFja1Byb2plY3RSZWNvcmQpOiBSYXdTZWFyY2hSZXN1bHQgfCBudWxsID0+IHtcbiAgY29uc3QgeyBpZCB9ID0gcmVjb3JkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IHJlY29yZC5uYW1lID8/ICcnXG4gIGNvbnN0IGNsaWVudElkID0gZmlyc3REZWZpbmVkKHJlY29yZC5jbGllbnRJZCwgcmVjb3JkLmNsaWVudD8uaWQpID8/IG51bGxcbiAgY29uc3QgY2xpZW50TmFtZSA9IHJlY29yZC5jbGllbnQ/Lm5hbWUgPz8gbnVsbFxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIHR5cGU6ICdwcm9qZWN0JyxcbiAgICBjbGllbnRJZCxcbiAgICBjbGllbnROYW1lLFxuICB9XG59XG5cbmNvbnN0IG1hcFNlYXJjaFRvSXRlbSA9IChcbiAgcjogUmF3U2VhcmNoUmVzdWx0LFxuICB0eXBlOiBDb250ZXh0RW50aXR5VHlwZSxcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyxcbiAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID0gdHJ1ZVxuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgcHJpbWFyeSA9IHIudGl0bGUgfHwgci5wcm9qZWN0TmFtZSB8fCAnJ1xuICBsZXQgcGFyZW50OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHBhcmVudCA9IHIuY2xpZW50TmFtZVxuICBlbHNlIGlmICh0eXBlID09PSAndGFzaycpIHBhcmVudCA9IHVuZGVmaW5lZFxuICBlbHNlIHBhcmVudCA9IHIucHJvamVjdE5hbWUgPz8gci5jbGllbnROYW1lXG5cbiAgY29uc3QgZmF0aGVyID0gdHlwZSA9PT0gJ3Rhc2snID8gci5mYXRoZXIgOiBudWxsXG4gIGNvbnN0IGhhc0ZhdGhlciA9IHR5cGUgPT09ICd0YXNrJyAmJiBmYXRoZXIgIT0gbnVsbCAmJiBmYXRoZXIuaWQgIT0gbnVsbCAmJiBTdHJpbmcoZmF0aGVyLmlkKS5sZW5ndGggPiAwXG5cbiAgY29uc3QgdGFza1Byb2plY3ROYW1lID0gdHlwZSA9PT0gJ3Rhc2snICYmICFzaG93UHJvamVjdE5hbWVJblRhc2tSb3cgPyBudWxsIDogKHIucHJvamVjdE5hbWUgPz8gbnVsbClcblxuICByZXR1cm4ge1xuICAgIGlkOiByLmlkLFxuICAgIHR5cGUsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgYnJlYWRjcnVtYjogcGFyZW50ID8geyBwYXJlbnQgfSA6IHVuZGVmaW5lZCxcbiAgICByYXc6IHtcbiAgICAgIGlkOiByLmlkLFxuICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIGNsaWVudElkOiByLmNsaWVudElkID8/IG51bGwsXG4gICAgICBjbGllbnROYW1lOiByLmNsaWVudE5hbWUgPz8gbnVsbCxcbiAgICAgIHByb2plY3ROYW1lOiB0YXNrUHJvamVjdE5hbWUsXG4gICAgICBmZWVJZDogci5mZWVJZCA/PyBudWxsLFxuICAgICAgZmF0aGVySWQ6IGhhc0ZhdGhlciA/IGZhdGhlci5pZCA6IG51bGwsXG4gICAgICBmYXRoZXJUaXRsZTogaGFzRmF0aGVyID8gZmF0aGVyLnRpdGxlPy50cmltKCkgfHwgbnVsbCA6IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBmb3JtYXRNY3BQcmltYXJ5TGFiZWwgPSAoc2x1Zzogc3RyaW5nKTogc3RyaW5nID0+XG4gIHNsdWcucmVwbGFjZSgvXy9nLCAnICcpLnJlcGxhY2UoL1xcYlxcdy9nLCBjaGFyID0+IGNoYXIudG9VcHBlckNhc2UoKSlcblxudHlwZSBTa2lsbHNBcGlSZXNwb25zZSA9IHsgZGF0YT86IFNraWxsW107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH1cblxuY29uc3QgbWFwU2tpbGxzVG9JdGVtcyA9IChza2lsbHM6IFNraWxsW10sIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW1bXSA9PiB7XG4gIGNvbnN0IHEgPSBzZWFyY2hWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICBjb25zdCBmaWx0ZXJlZCA9IHEgPyBza2lsbHMuZmlsdGVyKHMgPT4gcy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogc2tpbGxzXG4gIHJldHVybiBmaWx0ZXJlZC5tYXAoc2tpbGwgPT4gKHtcbiAgICBpZDogc2tpbGwuaWQsXG4gICAgdHlwZTogJ3NraWxsJyBhcyBjb25zdCxcbiAgICBwcmltYXJ5OiBza2lsbC5uYW1lLFxuICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKHNraWxsLm5hbWUsIHNlYXJjaFZhbHVlKSxcbiAgICByYXc6IHtcbiAgICAgIGlkOiBza2lsbC5pZCxcbiAgICAgIG5hbWU6IHNraWxsLm5hbWUsXG4gICAgfSxcbiAgfSkpXG59XG5cbmNvbnN0IG1hcE1jcFNsdWdzVG9JdGVtcyA9IChzbHVnczogc3RyaW5nW10sIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW1bXSA9PiB7XG4gIGNvbnN0IHEgPSBzZWFyY2hWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICBsZXQgZmlsdGVyZWQgPSBzbHVnc1xuICBpZiAocSkge1xuICAgIGZpbHRlcmVkID0gc2x1Z3MuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgcHJpbWFyeSA9IGZvcm1hdE1jcFByaW1hcnlMYWJlbChzKVxuICAgICAgcmV0dXJuIHMudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBwcmltYXJ5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICB9KVxuICB9XG4gIHJldHVybiBmaWx0ZXJlZC5tYXAoc2x1ZyA9PiB7XG4gICAgY29uc3QgcHJpbWFyeSA9IGZvcm1hdE1jcFByaW1hcnlMYWJlbChzbHVnKVxuICAgIHJldHVybiB7XG4gICAgICBpZDogc2x1ZyxcbiAgICAgIHR5cGU6ICdtY3AnIGFzIGNvbnN0LFxuICAgICAgcHJpbWFyeSxcbiAgICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKHByaW1hcnksIHNlYXJjaFZhbHVlKSxcbiAgICAgIHJhdzoge1xuICAgICAgICBpZDogc2x1ZyxcbiAgICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIH0sXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlRW50aXR5U2VhcmNoID0gKHR5cGU6IENvbnRleHRFbnRpdHlUeXBlLCBzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKSA9PiB7XG4gIGNvbnN0IGNvclVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgLyoqIEV2aXRhIGFwbGljYXIgcmVzdWx0YWRvcyBkZSB1biBgZmV0Y2hSZWNlbnRgIHZpZWpvIGN1YW5kbyBlbCB1c3VhcmlvIHlhIGNhbWJpw7MgZGUgdGFiIChyYWNlIGFzeW5jKS4gKi9cbiAgY29uc3QgcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZiA9IHVzZVJlZigwKVxuICBjb25zdCBbc2VhcmNoVmFsdWUsIHNldFNlYXJjaFZhbHVlXSA9IHVzZVN0YXRlKCcnKVxuICBjb25zdCBkZWJvdW5jZWRTZWFyY2hWYWx1ZSA9IHVzZURlYm91bmNlKHNlYXJjaFZhbHVlLCBTRUFSQ0hfUVVFUllfREVCT1VOQ0VfTVMpXG4gIGNvbnN0IFtpdGVtcywgc2V0SXRlbXNdID0gdXNlU3RhdGU8Q29udGV4dE1lbnRpb25JdGVtW10+KFtdKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hpZGVSZWNlbnRzTGFiZWwsIHNldEhpZGVSZWNlbnRzTGFiZWxdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtoYXNNb3JlLCBzZXRIYXNNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNMb2FkaW5nTW9yZSwgc2V0SXNMb2FkaW5nTW9yZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2N1cnJlbnRQYWdlLCBzZXRDdXJyZW50UGFnZV0gPSB1c2VTdGF0ZSgxKVxuICBjb25zdCBbYWN0aXZlUGFnaW5hdGlvblNvdXJjZSwgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZV0gPSB1c2VTdGF0ZTxQYWdpbmF0aW9uU291cmNlPignbm9uZScpXG4gIGNvbnN0IFtza2lsbHNDYXRhbG9nRW1wdHksIHNldFNraWxsc0NhdGFsb2dFbXB0eV0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBtY3BTbHVnc0tleSA9IChzY29wZT8ubWNwU2x1Z3MgPz8gW10pLmpvaW4oJ3wnKVxuICBjb25zdCBza2lsbHNLZXkgPSAoc2NvcGU/LnNraWxscyA/PyBbXSkubWFwKHMgPT4gcy5pZCkuam9pbignfCcpXG4gIGNvbnN0IHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHNjb3BlPy5hZ2VudEVudGl0eSAhPT0gJ3Byb2plY3QnXG5cbiAgLy8gRXN0YWJpbGl6YW1vcyBlbCBzY29wZSBwYXJhIG5vIGRpc3BhcmFyIGZldGNocyBwb3IgY2FtYmlvcyBkZSBpZGVudGlkYWQgZGUgb2JqZXRvLlxuICBjb25zdCBzdGFibGVTY29wZSA9IHVzZU1lbW88RW50aXR5U2VhcmNoU2NvcGU+KFxuICAgICgpID0+ICh7XG4gICAgICBjbGllbnRJZDogc2NvcGU/LmNsaWVudElkID8/IG51bGwsXG4gICAgICBwcm9qZWN0SWQ6IHNjb3BlPy5wcm9qZWN0SWQgPz8gbnVsbCxcbiAgICAgIG1jcFNsdWdzOiBzY29wZT8ubWNwU2x1Z3MgPz8gW10sXG4gICAgICBza2lsbHM6IHNjb3BlPy5za2lsbHMsXG4gICAgICBhZ2VudEVudGl0eTogc2NvcGU/LmFnZW50RW50aXR5ID8/IG51bGwsXG4gICAgfSksXG4gICAgW3Njb3BlPy5jbGllbnRJZCwgc2NvcGU/LnByb2plY3RJZCwgbWNwU2x1Z3NLZXksIHNraWxsc0tleSwgc2NvcGU/LmFnZW50RW50aXR5XVxuICApXG5cbiAgLy8gLS0tIFNlYXJjaDogcHJvamVjdCB8IHRhc2sgKEdyYXBoUUw6IHNlYXJjaCkgLS0tXG4gIGNvbnN0IFtmZXRjaFNlYXJjaEVudGl0aWVzLCB7IGRhdGE6IHNlYXJjaERhdGEsIGxvYWRpbmc6IHNlYXJjaExvYWRpbmcsIGVycm9yOiBzZWFyY2hFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFNlYXJjaEVudGl0aWVzRGF0YT4oU0VBUkNIX0VOVElUSUVTLCB7XG4gICAgICB2YXJpYWJsZXM6IHsgbGltaXQ6IDIwIH0sXG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgfSlcblxuICAvLyAtLS0gU2VhcmNoOiBjbGllbnQgKEdyYXBoUUwpIC0tLVxuICBjb25zdCBbZmV0Y2hTZWFyY2hDbGllbnRzLCB7IGRhdGE6IGNsaWVudHNEYXRhLCBsb2FkaW5nOiBjbGllbnRzTG9hZGluZywgZXJyb3I6IGNsaWVudHNFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFNlYXJjaENsaWVudHNEYXRhPihTRUFSQ0hfQ0xJRU5UUywge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgLy8gLS0tIFNlYXJjaDogdXNlciAoR3JhcGhRTDogdXNlcnMpIC0tLVxuICBjb25zdCBbZmV0Y2hVc2Vyc0RpcmVjdG9yeSwgeyBkYXRhOiB1c2Vyc0RhdGEsIGxvYWRpbmc6IHVzZXJzTG9hZGluZywgZXJyb3I6IHVzZXJzRXJyb3IgfV0gPVxuICAgIHVzZUxhenlRdWVyeTxVc2Vyc0RpcmVjdG9yeURhdGE+KFVTRVJTX0RJUkVDVE9SWSwge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgY29uc3Qgc3luY1VzZXJzUGFnaW5hdGlvbiA9IHVzZUNhbGxiYWNrKChwYXlsb2FkPzogVXNlcnNEaXJlY3RvcnlEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy51c2Vycz8ucGFnZSwgMSlcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnVzZXJzPy5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBzeW5jQ2xpZW50c1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFNlYXJjaENsaWVudHNEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5jbGllbnRzPy5wYWdlLCAxKVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8uY2xpZW50cz8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFRhc2tGYW1pbHlEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHJhd1BhZ2UgPSBOdW1iZXIocGF5bG9hZD8udGFza0ZhbWlseT8ucGFnZSlcbiAgICAvLyB0YXNrRmFtaWx5IHVzYSBww6FnaW5hcyAwLWJhc2VkOyBjb252ZXJ0aW1vcyBhIDEtYmFzZWQgcGFyYSBjb25zaXN0ZW5jaWEgY29uIGVsIHJlc3RvXG4gICAgY29uc3QgcGFnZSA9IE51bWJlci5pc0Zpbml0ZShyYXdQYWdlKSAmJiByYXdQYWdlID49IDAgPyBNYXRoLmZsb29yKHJhd1BhZ2UpICsgMSA6IDFcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnRhc2tGYW1pbHk/Lmxhc3RQYWdlLCBwYWdlKVxuICAgIHNldEN1cnJlbnRQYWdlKHBhZ2UpXG4gICAgc2V0SGFzTW9yZShwYWdlIDwgbGFzdFBhZ2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uID0gdXNlQ2FsbGJhY2soKHBheWxvYWQ/OiBQcm9qZWN0c0ZhbGxiYWNrRGF0YSB8IG51bGwpID0+IHtcbiAgICBjb25zdCBwYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8ucHJvamVjdHM/LnBhZ2UsIDEpXG4gICAgY29uc3QgbGFzdFBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5wcm9qZWN0cz8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3QgW2ZldGNoVGFza0ZhbWlseUZhbGxiYWNrXSA9IHVzZUxhenlRdWVyeTxUYXNrRmFtaWx5RGF0YT4oVEFTS19GQU1JTFlfRkFMTEJBQ0ssIHtcbiAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gIH0pXG5cbiAgY29uc3QgW2ZldGNoUHJvamVjdHNGYWxsYmFja10gPSB1c2VMYXp5UXVlcnk8UHJvamVjdHNGYWxsYmFja0RhdGE+KFBST0pFQ1RTX0ZBTExCQUNLLCB7XG4gICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICB9KVxuXG4gIGNvbnN0IGZldGNoUmVjZW50ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCArPSAxXG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudFxuXG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSB7XG4gICAgICBjb25zdCBzbHVncyA9IHN0YWJsZVNjb3BlLm1jcFNsdWdzID8/IFtdXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICBzZXRJdGVtcyhtYXBNY3BTbHVnc1RvSXRlbXMoc2x1Z3MsICcnKSlcbiAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NraWxsJykge1xuICAgICAgaWYgKHN0YWJsZVNjb3BlLnNraWxscykge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgICAgc2V0U2tpbGxzQ2F0YWxvZ0VtcHR5KHN0YWJsZVNjb3BlLnNraWxscy5sZW5ndGggPT09IDApXG4gICAgICAgIHNldEl0ZW1zKG1hcFNraWxsc1RvSXRlbXMoc3RhYmxlU2NvcGUuc2tpbGxzLCAnJykpXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwodHJ1ZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7IHBhdGg6ICdza2lsbHMnLCBtZXRob2Q6ICdHRVQnIH0pXG4gICAgICAgIGNvbnN0IGRhdGE6IFNraWxsc0FwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zdCBza2lsbHM6IFNraWxsW10gPSBkYXRhLmRhdGEgPz8gW11cbiAgICAgICAgY29uc3QgY2FuUGFnaW5hdGUgPSAhIWRhdGEuaGFzX21vcmUgJiYgZGF0YS5uZXh0X29mZnNldCAhPSBudWxsXG4gICAgICAgIHNldFNraWxsc0NhdGFsb2dFbXB0eShza2lsbHMubGVuZ3RoID09PSAwKVxuICAgICAgICBzZXRJdGVtcyhtYXBTa2lsbHNUb0l0ZW1zKHNraWxscywgJycpKVxuICAgICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKHRydWUpXG4gICAgICAgIHNldEhhc01vcmUoY2FuUGFnaW5hdGUpXG4gICAgICAgIHNldEN1cnJlbnRQYWdlKGRhdGEubmV4dF9vZmZzZXQgPz8gMClcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZShjYW5QYWdpbmF0ZSA/ICdza2lsbHMnIDogJ25vbmUnKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICBzZXRJdGVtcyhbXSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uID09PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgICBzZXRJdGVtcyhbXSlcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwcm9qZWN0Jykge1xuICAgICAgICBjb25zdCBhcmd1bWVudHNGaWx0ZXIgPVxuICAgICAgICAgIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnXG4gICAgICAgICAgICA/IHsgY2xpZW50X2lkOiBbU3RyaW5nKHN0YWJsZVNjb3BlLmNsaWVudElkKV0gfVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgeyBkYXRhOiBmYWxsYmFja0RhdGEgfSA9IGF3YWl0IGZldGNoUHJvamVjdHNGYWxsYmFjayh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAuLi4oYXJndW1lbnRzRmlsdGVyID8geyBhcmd1bWVudHM6IGFyZ3VtZW50c0ZpbHRlciB9IDoge30pLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zdCBtYXBwZWQgPSAoZmFsbGJhY2tEYXRhPy5wcm9qZWN0cz8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAubWFwKG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmF3U2VhcmNoUmVzdWx0ID0+IGl0ZW0gIT09IG51bGwpXG4gICAgICAgICAgLm1hcChpdGVtID0+IG1hcFNlYXJjaFRvSXRlbShpdGVtLCAncHJvamVjdCcsICcnKSlcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChtYXBwZWQubGVuZ3RoID4gMClcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgncHJvamVjdC1mYWxsYmFjaycpXG4gICAgICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uKGZhbGxiYWNrRGF0YSlcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldEl0ZW1zKG1hcHBlZClcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Rhc2snKSB7XG4gICAgICAgIGxldCByZWNlbnRUYXNrRmlsdGVyczogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBjbGllbnRJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwgfSB8IHVuZGVmaW5lZFxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUuYWdlbnRFbnRpdHkgPT09ICdwcm9qZWN0Jykge1xuICAgICAgICAgIHJlY2VudFRhc2tGaWx0ZXJzID0geyBwcm9qZWN0SWQ6IHN0YWJsZVNjb3BlLnByb2plY3RJZCB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhYmxlU2NvcGUuYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgICAgICAgcmVjZW50VGFza0ZpbHRlcnMgPSB7IGNsaWVudElkOiBzdGFibGVTY29wZS5jbGllbnRJZCB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudFRhc2tzKHJlY2VudFRhc2tGaWx0ZXJzKVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgbGV0IHRhc2tJdGVtcyA9IChkYXRhID8/IFtdKS5tYXAodGFzayA9PiBtYXBSZWNlbnRUYXNrVG9JdGVtKHRhc2ssICcnLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKVxuICAgICAgICBpZiAodGFza0l0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge31cbiAgICAgICAgICBpZiAoc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gJycpIHtcbiAgICAgICAgICAgIGZpbHRlci5wcm9qZWN0SWRzID0gW1N0cmluZyhzdGFibGVTY29wZS5wcm9qZWN0SWQpXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gJycpIHtcbiAgICAgICAgICAgIGZpbHRlci5jbGllbnRJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLmNsaWVudElkKV1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBkYXRhOiBmYWxsYmFja0RhdGEgfSA9IGF3YWl0IGZldGNoVGFza0ZhbWlseUZhbGxiYWNrKHtcbiAgICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgICBmaWx0ZXI6IHsgYXJjaGl2ZWQ6IGZhbHNlLCAuLi5maWx0ZXIgfSxcbiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogeyBvZmZzZXQ6IDAsIHNpemU6IDIwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgdGFza0l0ZW1zID0gKGZhbGxiYWNrRGF0YT8udGFza0ZhbWlseT8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAobm9ybWFsaXplVGFza0ZhbWlseVJlY29yZClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIFJlY2VudFRhc2tJdGVtID0+IGl0ZW0gIT09IG51bGwpXG4gICAgICAgICAgICAubWFwKHRhc2sgPT4gbWFwUmVjZW50VGFza1RvSXRlbSh0YXNrLCAnJywgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93KSlcbiAgICAgICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKHRhc2tJdGVtcy5sZW5ndGggPiAwKVxuICAgICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ3Rhc2stZmFsbGJhY2snKVxuICAgICAgICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uKGZhbGxiYWNrRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuICAgICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldEl0ZW1zKHRhc2tJdGVtcylcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hVc2Vyc0RpcmVjdG9yeSh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycygnJyksXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zdCBtYXBwZWQgPSAoZGF0YT8udXNlcnM/LmRhdGEgPz8gW10pLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgJycpKVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbWVJdGVtID0gbWFwQ29yVXNlclRvVXNlckl0ZW0oY29yVXNlciwgJycsIHQoJ2NvbnRleHRNZW50aW9uLm1lJykpXG4gICAgICAgIGNvbnN0IHdpdGhvdXRNZSA9IG1hcHBlZC5maWx0ZXIoaXRlbSA9PiBTdHJpbmcoaXRlbS5pZCkgIT09IFN0cmluZyhtZUl0ZW0uaWQpKVxuICAgICAgICBzZXRJdGVtcyhbbWVJdGVtLCAuLi53aXRob3V0TWVdKVxuICAgICAgICBzeW5jVXNlcnNQYWdpbmF0aW9uKGRhdGEpXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ3VzZXJzJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXRJdGVtcyhbXSlcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICAgIHNldEN1cnJlbnRQYWdlKDEpXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgIHNldEVycm9yKHRydWUpXG4gICAgICBzZXRJdGVtcyhbXSlcbiAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChnZW5lcmF0aW9uID09PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICB0eXBlLFxuICAgIHN0YWJsZVNjb3BlLFxuICAgIGZldGNoVXNlcnNEaXJlY3RvcnksXG4gICAgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2ssXG4gICAgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrLFxuICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24sXG4gICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93LFxuICAgIGNvclVzZXIsXG4gICAgdCxcbiAgXSlcblxuICAvLyBEaXNwYXJhciBzZWFyY2ggYWwgY2FtYmlhciBkZWJvdW5jZWQgdmFsdWVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBxID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG5cbiAgICBpZiAodHlwZSA9PT0gJ21jcCcpIHtcbiAgICAgIGNvbnN0IHNsdWdzID0gc3RhYmxlU2NvcGUubWNwU2x1Z3MgPz8gW11cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIHNldEl0ZW1zKG1hcE1jcFNsdWdzVG9JdGVtcyhzbHVncywgcSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NraWxsJykge1xuICAgICAgaWYgKHN0YWJsZVNjb3BlLnNraWxscykge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgICAgc2V0SXRlbXMobWFwU2tpbGxzVG9JdGVtcyhzdGFibGVTY29wZS5za2lsbHMsIHEpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICghcSkgcmV0dXJuXG4gICAgICBpZiAocS5sZW5ndGggPCBTS0lMTFNfU0VBUkNIX01JTl9RVUVSWV9MRU5HVEgpIHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICAgIGlmICghc2tpbGxzQ2F0YWxvZ0VtcHR5KSB7XG4gICAgICAgICAgc2V0SXRlbXMoW10pXG4gICAgICAgIH1cbiAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgICAgIGNvbnN0IHNlYXJjaEdlbiA9IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudFxuICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoOiBgc2tpbGxzP3E9JHtlbmNvZGVVUklDb21wb25lbnQocSl9YCxcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKHIgPT4gci5qc29uKCkgYXMgUHJvbWlzZTxTa2lsbHNBcGlSZXNwb25zZT4pXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgIGlmIChzZWFyY2hHZW4gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgY29uc3QgY2FuUGFnaW5hdGUgPSAhIWRhdGEuaGFzX21vcmUgJiYgZGF0YS5uZXh0X29mZnNldCAhPSBudWxsXG4gICAgICAgICAgc2V0SXRlbXMobWFwU2tpbGxzVG9JdGVtcyhkYXRhLmRhdGEgPz8gW10sIHEpKVxuICAgICAgICAgIHNldEhhc01vcmUoY2FuUGFnaW5hdGUpXG4gICAgICAgICAgc2V0Q3VycmVudFBhZ2UoZGF0YS5uZXh0X29mZnNldCA/PyAwKVxuICAgICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoY2FuUGFnaW5hdGUgPyAnc2tpbGxzJyA6ICdub25lJylcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICAgIHNldEVycm9yKGZhbHNlKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmIChzZWFyY2hHZW4gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgICAgICBzZXRJdGVtcyhbXSlcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFxKSByZXR1cm5cblxuICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgZmV0Y2hTZWFyY2hDbGllbnRzKHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgZmlsdGVyOiB7IG5hbWU6IHEgfSxcbiAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ2NsaWVudHMtc2VhcmNoJylcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgZmV0Y2hVc2Vyc0RpcmVjdG9yeSh7XG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIGZpbHRlcnM6IGJ1aWxkVXNlcnNEaXJlY3RvcnlGaWx0ZXJzKHEpLFxuICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndXNlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gYnVpbGRGaWx0ZXJzRm9yVHlwZSh0eXBlKVxuICAgICAgY29uc3QgZXh0cmEgPSBidWlsZFNlYXJjaEVudGl0aWVzRXh0cmEodHlwZSwgc3RhYmxlU2NvcGUpXG4gICAgICBmZXRjaFNlYXJjaEVudGl0aWVzKHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgcSxcbiAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgIC4uLihleHRyYSAhPT0gdW5kZWZpbmVkID8geyBleHRyYSB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICB9XG4gIH0sIFtcbiAgICBkZWJvdW5jZWRTZWFyY2hWYWx1ZSxcbiAgICB0eXBlLFxuICAgIHN0YWJsZVNjb3BlLFxuICAgIGZldGNoU2VhcmNoRW50aXRpZXMsXG4gICAgZmV0Y2hTZWFyY2hDbGllbnRzLFxuICAgIGZldGNoVXNlcnNEaXJlY3RvcnksXG4gICAgc2tpbGxzQ2F0YWxvZ0VtcHR5LFxuICBdKVxuXG4gIC8vIFNpbmNyb25pemFyIHJlc3VsdGFkb3MgZGUgc2VhcmNoXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSByZXR1cm5cbiAgICBpZiAodHlwZSA9PT0gJ3NraWxsJykgcmV0dXJuXG5cbiAgICBjb25zdCBxID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG4gICAgaWYgKCFxKSByZXR1cm5cbiAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuXG4gICAgaWYgKHR5cGUgPT09ICdjbGllbnQnKSB7XG4gICAgICBzZXRMb2FkaW5nKGNsaWVudHNMb2FkaW5nKVxuICAgICAgaWYgKGNsaWVudHNFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChjbGllbnRzRGF0YT8uY2xpZW50cz8uZGF0YSkge1xuICAgICAgICBzZXRJdGVtcyhjbGllbnRzRGF0YS5jbGllbnRzLmRhdGEubWFwKGMgPT4gbWFwQ2xpZW50VG9JdGVtKGMsIHEpKSlcbiAgICAgICAgc3luY0NsaWVudHNQYWdpbmF0aW9uKGNsaWVudHNEYXRhKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgc2V0TG9hZGluZyh1c2Vyc0xvYWRpbmcpXG4gICAgICBpZiAodXNlcnNFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh1c2Vyc0RhdGE/LnVzZXJzPy5kYXRhKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IHVzZXJzRGF0YS51c2Vycy5kYXRhLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgcSkpXG4gICAgICAgIGNvbnN0IG1lSWQgPSBTdHJpbmcoY29yVXNlci5pZClcbiAgICAgICAgY29uc3QgaGFzTWVJblJlc3VsdHMgPSBtYXBwZWQuc29tZShpdGVtID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gbWVJZClcbiAgICAgICAgY29uc3Qgd2l0aG91dE1lID0gbWFwcGVkLmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gbWVJZClcbiAgICAgICAgY29uc3QgbWVJdGVtID0gbWFwQ29yVXNlclRvVXNlckl0ZW0oY29yVXNlciwgcSwgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgc2V0SXRlbXMoaGFzTWVJblJlc3VsdHMgPyBbbWVJdGVtLCAuLi53aXRob3V0TWVdIDogbWFwcGVkKVxuICAgICAgICBzeW5jVXNlcnNQYWdpbmF0aW9uKHVzZXJzRGF0YSlcbiAgICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExvYWRpbmcoc2VhcmNoTG9hZGluZylcbiAgICAgIGlmIChzZWFyY2hFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2hEYXRhPy5zZWFyY2gpIHtcbiAgICAgICAgc2V0SXRlbXMoc2VhcmNoRGF0YS5zZWFyY2gubWFwKHIgPT4gbWFwU2VhcmNoVG9JdGVtKHIsIHR5cGUsIHEsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBzZWFyY2hEYXRhLFxuICAgIGNsaWVudHNEYXRhLFxuICAgIHVzZXJzRGF0YSxcbiAgICBzZWFyY2hMb2FkaW5nLFxuICAgIGNsaWVudHNMb2FkaW5nLFxuICAgIHVzZXJzTG9hZGluZyxcbiAgICBzZWFyY2hFcnJvcixcbiAgICBjbGllbnRzRXJyb3IsXG4gICAgdXNlcnNFcnJvcixcbiAgICBkZWJvdW5jZWRTZWFyY2hWYWx1ZSxcbiAgICB0eXBlLFxuICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbixcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyxcbiAgICBjb3JVc2VyLFxuICAgIHQsXG4gIF0pXG5cbiAgY29uc3QgbG9hZE1vcmUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzTG9hZGluZ01vcmUgfHwgIWhhc01vcmUgfHwgYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2FmZUN1cnJlbnRQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQoY3VycmVudFBhZ2UsIDEpXG4gICAgY29uc3QgbmV4dFBhZ2UgPSBzYWZlQ3VycmVudFBhZ2UgKyAxXG4gICAgY29uc3QgcSA9IGRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKVxuICAgIGNvbnN0IGxvYWRNb3JlQmFzZWxpbmVHZW4gPSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnRcbiAgICBzZXRJc0xvYWRpbmdNb3JlKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAndXNlcnMnKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hVc2Vyc0RpcmVjdG9yeSh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyhxKSxcbiAgICAgICAgICAgIHBhZ2U6IG5leHRQYWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChsb2FkTW9yZUJhc2VsaW5lR2VuICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8udXNlcnM/LmRhdGEgPz8gW10pLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgcSkpXG4gICAgICAgIHNldEl0ZW1zKHByZXYgPT4ge1xuICAgICAgICAgIGlmICghcSkge1xuICAgICAgICAgICAgY29uc3QgbWVJdGVtID1cbiAgICAgICAgICAgICAgcHJldlswXT8udHlwZSA9PT0gJ3VzZXInID8gcHJldlswXSA6IG1hcENvclVzZXJUb1VzZXJJdGVtKGNvclVzZXIsICcnLCB0KCdjb250ZXh0TWVudGlvbi5tZScpKVxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpKSlcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoU3RyaW5nKGl0ZW0uaWQpKSlcbiAgICAgICAgICAgIGNvbnN0IHdpdGhvdXRNZSA9IHByZXYuZmlsdGVyKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpICE9PSBTdHJpbmcobWVJdGVtLmlkKSlcbiAgICAgICAgICAgIHJldHVybiBbbWVJdGVtLCAuLi53aXRob3V0TWUsIC4uLmFwcGVuZGVkXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24oZGF0YSlcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ2NsaWVudHMtc2VhcmNoJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoU2VhcmNoQ2xpZW50cyh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBmaWx0ZXI6IHsgbmFtZTogcSB9LFxuICAgICAgICAgICAgcGFnZTogbmV4dFBhZ2UsXG4gICAgICAgICAgICBwZXJQYWdlOiAyMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAobG9hZE1vcmVCYXNlbGluZUdlbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LmNsaWVudHM/LmRhdGEgPz8gW10pLm1hcChjID0+IG1hcENsaWVudFRvSXRlbShjLCBxKSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jQ2xpZW50c1BhZ2luYXRpb24oZGF0YSlcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ3Rhc2stZmFsbGJhY2snKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge31cbiAgICAgICAgaWYgKHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09ICcnKSB7XG4gICAgICAgICAgZmlsdGVyLnByb2plY3RJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLnByb2plY3RJZCldXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnKSB7XG4gICAgICAgICAgZmlsdGVyLmNsaWVudElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2soe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyOiB7IGFyY2hpdmVkOiBmYWxzZSwgLi4uZmlsdGVyIH0sXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7IG9mZnNldDogKG5leHRQYWdlIC0gMSkgKiAyMCwgc2l6ZTogMjAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAobG9hZE1vcmVCYXNlbGluZUdlbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LnRhc2tGYW1pbHk/LmRhdGEgPz8gW10pXG4gICAgICAgICAgLm1hcChub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkKVxuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIFJlY2VudFRhc2tJdGVtID0+IGl0ZW0gIT09IG51bGwpXG4gICAgICAgICAgLm1hcCh0YXNrID0+IG1hcFJlY2VudFRhc2tUb0l0ZW0odGFzaywgJycsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpXG4gICAgICAgIHNldEl0ZW1zKHByZXYgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2LCAuLi5hcHBlbmRlZF1cbiAgICAgICAgfSlcbiAgICAgICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24oZGF0YSlcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ3Byb2plY3QtZmFsbGJhY2snKSB7XG4gICAgICAgIGNvbnN0IGFyZ3VtZW50c0ZpbHRlciA9XG4gICAgICAgICAgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gJydcbiAgICAgICAgICAgID8geyBjbGllbnRfaWQ6IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoUHJvamVjdHNGYWxsYmFjayh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAuLi4oYXJndW1lbnRzRmlsdGVyID8geyBhcmd1bWVudHM6IGFyZ3VtZW50c0ZpbHRlciB9IDoge30pLFxuICAgICAgICAgICAgcGFnZTogbmV4dFBhZ2UsXG4gICAgICAgICAgICBwZXJQYWdlOiAyMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAobG9hZE1vcmVCYXNlbGluZUdlbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LnByb2plY3RzPy5kYXRhID8/IFtdKVxuICAgICAgICAgIC5tYXAobm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZClcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSYXdTZWFyY2hSZXN1bHQgPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAubWFwKGl0ZW0gPT4gbWFwU2VhcmNoVG9JdGVtKGl0ZW0sICdwcm9qZWN0JywgJycpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICdza2lsbHMnKSB7XG4gICAgICAgIGNvbnN0IHNraWxsT2Zmc2V0ID0gY3VycmVudFBhZ2VcbiAgICAgICAgY29uc3Qgc2tpbGxRID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG4gICAgICAgIGlmIChza2lsbFEgJiYgc2tpbGxRLmxlbmd0aCA8IFNLSUxMU19TRUFSQ0hfTUlOX1FVRVJZX0xFTkdUSCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHNraWxsUGF0aCA9IHNraWxsUVxuICAgICAgICAgID8gYHNraWxscz9vZmZzZXQ9JHtza2lsbE9mZnNldH0mcT0ke2VuY29kZVVSSUNvbXBvbmVudChza2lsbFEpfWBcbiAgICAgICAgICA6IGBza2lsbHM/b2Zmc2V0PSR7c2tpbGxPZmZzZXR9YFxuICAgICAgICBjb25zdCBza2lsbFJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHsgcGF0aDogc2tpbGxQYXRoLCBtZXRob2Q6ICdHRVQnIH0pXG4gICAgICAgIGNvbnN0IHNraWxsRGF0YTogU2tpbGxzQXBpUmVzcG9uc2UgPSBhd2FpdCBza2lsbFJlc3BvbnNlLmpzb24oKVxuICAgICAgICBpZiAobG9hZE1vcmVCYXNlbGluZUdlbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgY2FuUGFnaW5hdGUgPSAhIXNraWxsRGF0YS5oYXNfbW9yZSAmJiBza2lsbERhdGEubmV4dF9vZmZzZXQgIT0gbnVsbFxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSBtYXBTa2lsbHNUb0l0ZW1zKHNraWxsRGF0YS5kYXRhID8/IFtdLCBza2lsbFEpXG4gICAgICAgIHNldEl0ZW1zKHByZXYgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2LCAuLi5hcHBlbmRlZF1cbiAgICAgICAgfSlcbiAgICAgICAgc2V0SGFzTW9yZShjYW5QYWdpbmF0ZSlcbiAgICAgICAgc2V0Q3VycmVudFBhZ2Uoc2tpbGxEYXRhLm5leHRfb2Zmc2V0ID8/IDApXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoY2FuUGFnaW5hdGUgPyAnc2tpbGxzJyA6ICdub25lJylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChsb2FkTW9yZUJhc2VsaW5lR2VuICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgY29uc29sZS5lcnJvcignW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgZmFpbGVkJywge1xuICAgICAgICBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgICAgIG5leHRQYWdlLFxuICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgfSlcbiAgICAgIC8vIEV2aXRhIGxvb3AgZGUgcmVpbnRlbnRvcyBhdXRvbcOhdGljb3MgcG9yIHNjcm9sbCBjdWFuZG8gYmFja2VuZCBlc3TDoSBjYcOtZG8gKGVqLiA1MDMpLlxuICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZ01vcmUoZmFsc2UpXG4gICAgfVxuICB9LCBbXG4gICAgaXNMb2FkaW5nTW9yZSxcbiAgICBoYXNNb3JlLFxuICAgIGN1cnJlbnRQYWdlLFxuICAgIGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgZGVib3VuY2VkU2VhcmNoVmFsdWUsXG4gICAgZmV0Y2hVc2Vyc0RpcmVjdG9yeSxcbiAgICBmZXRjaFNlYXJjaENsaWVudHMsXG4gICAgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2ssXG4gICAgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrLFxuICAgIHN0YWJsZVNjb3BlLnByb2plY3RJZCxcbiAgICBzdGFibGVTY29wZS5jbGllbnRJZCxcbiAgICBzaG93UHJvamVjdE5hbWVJblRhc2tSb3csXG4gICAgY29yVXNlcixcbiAgICB0LFxuICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbixcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uLFxuICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uLFxuICBdKVxuXG4gIC8vIE1hbnRlbmVtb3MgdW5hIHJlZiBhIGxhIMO6bHRpbWEgZmV0Y2hSZWNlbnQgcGFyYSBxdWUgZWwgZWZmZWN0IGRlIHJlY2VudHMgbm8gc2VcbiAgLy8gcmUtZGlzcGFyZSBzb2xvIHBvcnF1ZSBjYW1iacOzIGxhIGlkZW50aWRhZCBkZSBmZXRjaFJlY2VudCAoc2NvcGUvY29yVXNlci90KS5cbiAgY29uc3QgZmV0Y2hSZWNlbnRSZWYgPSB1c2VSZWYoZmV0Y2hSZWNlbnQpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmV0Y2hSZWNlbnRSZWYuY3VycmVudCA9IGZldGNoUmVjZW50XG4gIH0sIFtmZXRjaFJlY2VudF0pXG5cbiAgLy8gVHJpZ2dlciBkZSByZWNlbnRzOiBsb3MgcmVjZW50cyBkZSB1c2VyIE5PIGRlcGVuZGVuIGRlbCBzY29wZSwgYXPDrSBxdWUgY2FtYmlhclxuICAvLyBkZSBwcm95ZWN0by9jbGllbnRlIG5vIGRlYmUgcmUtZmV0Y2hlYXJsb3MuIExvcyB0aXBvcyBzY29wZWFkb3MgKHByb2plY3QvdGFzaykgc8OtLlxuICBjb25zdCByZWNlbnRzVHJpZ2dlciA9XG4gICAgdHlwZSA9PT0gJ3VzZXInIHx8IHR5cGUgPT09ICdza2lsbCdcbiAgICAgID8gdHlwZVxuICAgICAgOiBgJHt0eXBlfXwke3N0YWJsZVNjb3BlLnByb2plY3RJZCA/PyAnJ318JHtzdGFibGVTY29wZS5jbGllbnRJZCA/PyAnJ318JHtzdGFibGVTY29wZS5hZ2VudEVudGl0eSA/PyAnJ318JHttY3BTbHVnc0tleX1gXG5cbiAgLy8gQ3VhbmRvIHNlIGxpbXBpYSBlbCBzZWFyY2gsIHZvbHZlciBhIHJlY2VudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKSkge1xuICAgICAgZmV0Y2hSZWNlbnRSZWYuY3VycmVudCgpXG4gICAgfVxuICB9LCBbZGVib3VuY2VkU2VhcmNoVmFsdWUsIHJlY2VudHNUcmlnZ2VyXSlcblxuICByZXR1cm4ge1xuICAgIGl0ZW1zLFxuICAgIGxvYWRpbmcsXG4gICAgZXJyb3IsXG4gICAgaGlkZVJlY2VudHNMYWJlbCxcbiAgICBoYXNNb3JlLFxuICAgIGlzTG9hZGluZ01vcmUsXG4gICAgbG9hZE1vcmUsXG4gICAgc2VhcmNoVmFsdWUsXG4gICAgdXBkYXRlU2VhcmNoVmFsdWU6IHNldFNlYXJjaFZhbHVlLFxuICAgIGZldGNoUmVjZW50LFxuICAgIHNraWxsc0NhdGFsb2dFbXB0eSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLFNBQVNBLFlBQVksUUFBUSxnQkFBZ0I7QUFDN0MsU0FBU0MsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUN6RSxTQUFTQyxjQUFjLFFBQVEsNkNBQTZDO0FBRTVFLFNBQVNDLE9BQU8sUUFBUSxxQkFBcUI7QUFDN0MsU0FBU0MsaUJBQWlCLEVBQUVDLGVBQWUsRUFBRUMsb0JBQW9CLFFBQVEscUNBQXFDO0FBQzlHLFNBQVNDLGNBQWMsUUFBUSxxQ0FBcUM7QUFDcEUsU0FBU0MsZUFBZSxRQUFRLHVDQUF1QztBQUN2RSxTQUFTQyx3QkFBd0IsRUFBRUMsOEJBQThCLFFBQVEscUJBQXFCO0FBQzlGLFNBQVNDLFdBQVcsUUFBUSxlQUFlO0FBQzNDLFNBQVNDLElBQUksUUFBUSxRQUFRO0FBSTdCLFNBQVNDLFNBQVMsUUFBUSx5QkFBeUI7QUFzRm5ELElBQU1DLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUlDLEtBQWMsRUFBRUMsUUFBZ0IsRUFBYTtFQUN6RSxJQUFNQyxNQUFNLEdBQUdDLE1BQU0sQ0FBQ0gsS0FBSyxDQUFDO0VBQzVCLElBQUksQ0FBQ0csTUFBTSxDQUFDQyxRQUFRLENBQUNGLE1BQU0sQ0FBQyxFQUFFLE9BQU9ELFFBQVE7RUFDN0MsSUFBTUksVUFBVSxHQUFHQyxJQUFJLENBQUNDLEtBQUssQ0FBQ0wsTUFBTSxDQUFDO0VBQ3JDLE9BQU9HLFVBQVUsR0FBRyxDQUFDLEdBQUdBLFVBQVUsR0FBR0osUUFBUTtBQUMvQyxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFxQkEsSUFBTU8sb0JBQTBFLEdBQUc7RUFDakZDLE9BQU8sRUFBRTtJQUFFQSxPQUFPLEVBQUUsTUFBTTtJQUFFQyxRQUFRLEVBQUU7RUFBTSxDQUFDO0VBQzdDQyxJQUFJLEVBQUU7SUFBRUEsSUFBSSxFQUFFLE1BQU07SUFBRUQsUUFBUSxFQUFFO0VBQVE7QUFDMUMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1FLDJCQUEyQixHQUFHLFNBQTlCQSwyQkFBMkJBLENBQUlDLEtBQXlCLEVBQW9DO0VBQ2hHLElBQU1DLFNBQVMsR0FDYixDQUFBRCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUUsUUFBUSxNQUFLQyxTQUFTLElBQUksQ0FBQUgsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVFLFFBQVEsTUFBSyxJQUFJLElBQUksQ0FBQUYsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVFLFFBQVEsTUFBSyxFQUFFLEdBQUdFLE1BQU0sQ0FBQ0osS0FBSyxDQUFDRSxRQUFRLENBQUMsR0FBRyxJQUFJO0VBQ3JILElBQU1HLFVBQVUsR0FDZCxDQUFBTCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRU0sU0FBUyxNQUFLSCxTQUFTLElBQUksQ0FBQUgsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVNLFNBQVMsTUFBSyxJQUFJLElBQUksQ0FBQU4sS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVNLFNBQVMsTUFBSyxFQUFFLEdBQ2xGRixNQUFNLENBQUNKLEtBQUssQ0FBQ00sU0FBUyxDQUFDLEdBQ3ZCLElBQUk7RUFFVixJQUFNQyxXQUFXLEdBQUdQLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFTyxXQUFXO0VBQ3RDLElBQU1DLE9BQXNDLEdBQUcsRUFBRTtFQUVqRCxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBQSxFQUFTO0lBQ3ZCLElBQUlSLFNBQVMsRUFBRU8sT0FBTyxDQUFDRSxJQUFJLENBQUM7TUFBRVIsUUFBUSxFQUFFRDtJQUFVLENBQUMsQ0FBQztFQUN0RCxDQUFDO0VBQ0QsSUFBTVUsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUEsRUFBUztJQUN4QixJQUFJTixVQUFVLEVBQUVHLE9BQU8sQ0FBQ0UsSUFBSSxDQUFDO01BQUVKLFNBQVMsRUFBRUQ7SUFBVyxDQUFDLENBQUM7RUFDekQsQ0FBQztFQUVELElBQUlFLFdBQVcsS0FBSyxTQUFTLEVBQUU7SUFDN0IsSUFBSUYsVUFBVSxFQUFFO01BQ2RNLFdBQVcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxNQUFNLElBQUlWLFNBQVMsRUFBRTtNQUNwQlEsVUFBVSxDQUFDLENBQUM7SUFDZDtFQUNGLENBQUMsTUFBTSxJQUFJRixXQUFXLEtBQUssUUFBUSxFQUFFO0lBQ25DRSxVQUFVLENBQUMsQ0FBQztJQUNaRSxXQUFXLENBQUMsQ0FBQztFQUNmLENBQUMsTUFBTTtJQUNMRixVQUFVLENBQUMsQ0FBQztJQUNaRSxXQUFXLENBQUMsQ0FBQztFQUNmO0VBRUEsT0FBT0gsT0FBTztBQUNoQixDQUFDO0FBRUQsSUFBTUksb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FBSVosS0FBeUIsRUFBeUI7RUFDOUUsSUFBTVEsT0FBTyxHQUFHVCwyQkFBMkIsQ0FBQ0MsS0FBSyxDQUFDO0VBQ2xELElBQUlRLE9BQU8sQ0FBQ0ssTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPVixTQUFTO0VBQzFDLE9BQU9XLElBQUksQ0FBQ0MsU0FBUyxDQUFDUCxPQUFPLENBQUM7QUFDaEMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1RLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQUloQixLQUF5QixFQUF5QjtFQUNqRixJQUFNQyxTQUFTLEdBQ2IsQ0FBQUQsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVFLFFBQVEsTUFBS0MsU0FBUyxJQUFJLENBQUFILEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFRSxRQUFRLE1BQUssSUFBSSxJQUFJLENBQUFGLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFRSxRQUFRLE1BQUssRUFBRSxHQUFHRSxNQUFNLENBQUNKLEtBQUssQ0FBQ0UsUUFBUSxDQUFDLEdBQUcsSUFBSTtFQUNySCxJQUFJLENBQUNELFNBQVMsRUFBRSxPQUFPRSxTQUFTO0VBQ2hDLE9BQU9XLElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUM7SUFBRWIsUUFBUSxFQUFFRDtFQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxJQUFNZ0Isd0JBQXdCLEdBQUcsU0FBM0JBLHdCQUF3QkEsQ0FBSUMsSUFBMEIsRUFBRWxCLEtBQXlCLEVBQXlCO0VBQzlHLElBQUlrQixJQUFJLEtBQUssTUFBTSxFQUFFLE9BQU9OLG9CQUFvQixDQUFDWixLQUFLLENBQUM7RUFDdkQsSUFBSWtCLElBQUksS0FBSyxTQUFTLEVBQUUsT0FBT0YsdUJBQXVCLENBQUNoQixLQUFLLENBQUM7RUFDN0QsT0FBT0csU0FBUztBQUNsQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLElBQU1nQixtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFJRCxJQUEwQixFQUFhO0VBQ2xFLElBQUlBLElBQUksS0FBSyxTQUFTLEVBQUU7SUFDdEIsT0FBT0osSUFBSSxDQUFDQyxTQUFTLENBQUNwQixvQkFBb0IsQ0FBQ0MsT0FBTyxDQUFDO0VBQ3JEO0VBQ0EsT0FBT2tCLElBQUksQ0FBQ0MsU0FBUyxDQUFDcEIsb0JBQW9CLENBQUNHLElBQUksQ0FBQztBQUNsRCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1zQiwwQkFBMEIsR0FBRyxTQUE3QkEsMEJBQTBCQSxDQUFJQyxDQUFTLEVBQWE7RUFDeEQsSUFBTUMsSUFBNkIsR0FBRztJQUNwQ0MsWUFBWSxFQUFFLElBQUk7SUFDbEJDLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRCxJQUFNQyxRQUFRLEdBQUdKLENBQUMsQ0FBQ0ssSUFBSSxDQUFDLENBQUM7RUFDekIsSUFBSUQsUUFBUSxFQUFFO0lBQ1pILElBQUksQ0FBQ0ssV0FBVyxHQUFHRixRQUFRO0VBQzdCO0VBQ0EsT0FBT1gsSUFBSSxDQUFDQyxTQUFTLENBQUNPLElBQUksQ0FBQztBQUM3QixDQUFDO0FBRUQsSUFBTU0sY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFJQyxJQUFZLEVBQUVDLFdBQW1CLEVBQUs7RUFDNUQsSUFBSSxDQUFDQSxXQUFXLEVBQUUsT0FBTzNCLFNBQVM7RUFDbEMsSUFBTTRCLEdBQUcsR0FBR0YsSUFBSSxDQUFDRyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUNILFdBQVcsQ0FBQ0UsV0FBVyxDQUFDLENBQUMsQ0FBQztFQUNqRSxJQUFJRCxHQUFHLEdBQUcsQ0FBQyxFQUFFLE9BQU81QixTQUFTO0VBQzdCLE9BQU87SUFBRStCLEtBQUssRUFBRUgsR0FBRztJQUFFbEIsTUFBTSxFQUFFaUIsV0FBVyxDQUFDakI7RUFBTyxDQUFDO0FBQ25ELENBQUM7QUFFRCxJQUFNc0IsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUE7RUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsQ0FBQXhCLE1BQUEsRUFBVXlCLE1BQU0sT0FBQUMsS0FBQSxDQUFBSCxJQUFBLEdBQUFJLElBQUEsTUFBQUEsSUFBQSxHQUFBSixJQUFBLEVBQUFJLElBQUE7SUFBTkYsTUFBTSxDQUFBRSxJQUFBLElBQUFILFNBQUEsQ0FBQUcsSUFBQTtFQUFBO0VBQUEsT0FDaENGLE1BQU0sQ0FBQ0csSUFBSSxDQUFDLFVBQUF0RCxLQUFLO0lBQUEsT0FBSUEsS0FBSyxLQUFLZ0IsU0FBUyxJQUFJaEIsS0FBSyxLQUFLLElBQUk7RUFBQSxFQUFDO0FBQUE7QUFFN0QsSUFBTXVELHNCQUFzQixHQUFHLFNBQXpCQSxzQkFBc0JBLENBQUl2RCxLQUFjLEVBQWE7RUFDekQsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFLE9BQU8sRUFBRTtFQUN4QyxPQUFPQSxLQUFLLENBQUN1QyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsSUFBTWlCLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQUlDLFlBQXlELEVBQWE7RUFDakcsSUFBSSxPQUFPQSxZQUFZLEtBQUssUUFBUSxFQUFFLE9BQU9BLFlBQVksQ0FBQ2xCLElBQUksQ0FBQyxDQUFDO0VBQ2hFLElBQUlrQixZQUFZLElBQUlDLE9BQUEsQ0FBT0QsWUFBWSxNQUFLLFFBQVEsSUFBSSxNQUFNLElBQUlBLFlBQVksRUFBRTtJQUM5RSxPQUFPRixzQkFBc0IsQ0FBQ0UsWUFBWSxDQUFDRSxJQUFJLENBQUM7RUFDbEQ7RUFDQSxPQUFPLEVBQUU7QUFDWCxDQUFDO0FBRUQsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJQyxDQUFZLEVBQUVsQixXQUFtQjtFQUFBLElBQUFtQixpQkFBQSxFQUFBQyxrQkFBQTtFQUFBLE9BQTBCO0lBQ2xGQyxFQUFFLEVBQUVILENBQUMsQ0FBQ0csRUFBRTtJQUNSakMsSUFBSSxFQUFFLFFBQVE7SUFDZGtDLE9BQU8sRUFBRUosQ0FBQyxDQUFDRixJQUFJO0lBQ2ZPLGdCQUFnQixFQUFFekIsY0FBYyxDQUFDb0IsQ0FBQyxDQUFDRixJQUFJLEVBQUVoQixXQUFXLENBQUM7SUFDckR3QixVQUFVLEVBQUU7TUFDVkMsS0FBSyxHQUFBTixpQkFBQSxHQUFFRCxDQUFDLENBQUNRLGNBQWMsY0FBQVAsaUJBQUEsY0FBQUEsaUJBQUEsR0FBSTlDLFNBQVM7TUFDcENzRCxVQUFVLEVBQUU7SUFDZCxDQUFDO0lBQ0RDLEdBQUcsRUFBRTtNQUNIUCxFQUFFLEVBQUVILENBQUMsQ0FBQ0csRUFBRTtNQUNSTCxJQUFJLEVBQUVFLENBQUMsQ0FBQ0YsSUFBSTtNQUNaVSxjQUFjLEdBQUFOLGtCQUFBLEdBQUVGLENBQUMsQ0FBQ1EsY0FBYyxjQUFBTixrQkFBQSxjQUFBQSxrQkFBQSxHQUFJO0lBQ3RDO0VBQ0YsQ0FBQztBQUFBLENBQUM7QUFFRixJQUFNUyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUlDLENBQW1CLEVBQUU5QixXQUFtQixFQUF5QjtFQUFBLElBQUErQixZQUFBLEVBQUFDLFdBQUEsRUFBQUMsVUFBQSxFQUFBQyxvQkFBQSxFQUFBQyxlQUFBLEVBQUFDLFFBQUE7RUFDdEYsSUFBTUMsUUFBUSxHQUFHLEdBQUFDLE1BQUEsRUFBQVAsWUFBQSxHQUFHRCxDQUFDLENBQUNTLFNBQVMsY0FBQVIsWUFBQSxjQUFBQSxZQUFBLEdBQUksRUFBRSxPQUFBTyxNQUFBLEVBQUFOLFdBQUEsR0FBSUYsQ0FBQyxDQUFDVSxRQUFRLGNBQUFSLFdBQUEsY0FBQUEsV0FBQSxHQUFJLEVBQUUsRUFBR3BDLElBQUksQ0FBQyxDQUFDO0VBQ2xFLElBQU0wQixPQUFPLEdBQUdlLFFBQVEsSUFBSVAsQ0FBQyxDQUFDVyxLQUFLLElBQUluRSxNQUFNLENBQUN3RCxDQUFDLENBQUNULEVBQUUsQ0FBQztFQUVuRCxPQUFPO0lBQ0xBLEVBQUUsRUFBRVMsQ0FBQyxDQUFDVCxFQUFFO0lBQ1JqQyxJQUFJLEVBQUUsTUFBTTtJQUNaa0MsT0FBTyxFQUFQQSxPQUFPO0lBQ1BDLGdCQUFnQixFQUFFekIsY0FBYyxDQUFDd0IsT0FBTyxFQUFFdEIsV0FBVyxDQUFDO0lBQ3RENEIsR0FBRyxFQUFFO01BQ0hQLEVBQUUsRUFBRVMsQ0FBQyxDQUFDVCxFQUFFO01BQ1JMLElBQUksRUFBRU0sT0FBTztNQUNib0IsT0FBTyxHQUFBVCxVQUFBLEdBQUVILENBQUMsQ0FBQ1ksT0FBTyxjQUFBVCxVQUFBLGNBQUFBLFVBQUEsR0FBSSxJQUFJO01BQzFCVSxZQUFZLEdBQUFULG9CQUFBLElBQUFDLGVBQUEsR0FBRUwsQ0FBQyxDQUFDaEIsWUFBWSxjQUFBcUIsZUFBQSx1QkFBZEEsZUFBQSxDQUFnQm5CLElBQUksY0FBQWtCLG9CQUFBLGNBQUFBLG9CQUFBLEdBQUksSUFBSTtNQUMxQ08sS0FBSyxHQUFBTCxRQUFBLEdBQUVOLENBQUMsQ0FBQ1csS0FBSyxjQUFBTCxRQUFBLGNBQUFBLFFBQUEsR0FBSTtJQUNwQjtFQUNGLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBTVEsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FDeEJDLElBQWdDLEVBQ2hDN0MsV0FBbUIsRUFDbkI4QyxPQUFlLEVBQ1E7RUFBQSxJQUFBQyxlQUFBLEVBQUFDLGNBQUE7RUFDdkIsSUFBTVgsUUFBUSxHQUFHLEdBQUFDLE1BQUEsRUFBQVMsZUFBQSxHQUFHRixJQUFJLENBQUNOLFNBQVMsY0FBQVEsZUFBQSxjQUFBQSxlQUFBLEdBQUksRUFBRSxPQUFBVCxNQUFBLEVBQUFVLGNBQUEsR0FBSUgsSUFBSSxDQUFDTCxRQUFRLGNBQUFRLGNBQUEsY0FBQUEsY0FBQSxHQUFJLEVBQUUsRUFBR3BELElBQUksQ0FBQyxDQUFDO0VBQ3hFO0VBQ0EsSUFBTXFELFlBQVksR0FBR3BDLG1CQUFtQixDQUFDZ0MsSUFBSSxDQUFDSyxhQUFhLENBQUMsSUFBSSxJQUFJO0VBQ3BFLElBQU1ULEtBQUssR0FBRzdCLHNCQUFzQixDQUFDaUMsSUFBSSxDQUFDSixLQUFLLENBQUMsSUFBSSxJQUFJO0VBRXhELE9BQU87SUFDTHBCLEVBQUUsRUFBRXdCLElBQUksQ0FBQ3hCLEVBQUU7SUFDWGpDLElBQUksRUFBRSxNQUFNO0lBQ1prQyxPQUFPLEVBQUV3QixPQUFPO0lBQ2hCdkIsZ0JBQWdCLEVBQUV6QixjQUFjLENBQUNnRCxPQUFPLEVBQUU5QyxXQUFXLENBQUM7SUFDdEQ0QixHQUFHLEVBQUU7TUFDSFAsRUFBRSxFQUFFd0IsSUFBSSxDQUFDeEIsRUFBRTtNQUNYTCxJQUFJLEVBQUVxQixRQUFRLElBQUkvRCxNQUFNLENBQUN1RSxJQUFJLENBQUN4QixFQUFFLENBQUM7TUFDakNxQixPQUFPLEVBQUVHLElBQUksQ0FBQ0gsT0FBTyxJQUFJLElBQUk7TUFDN0JDLFlBQVksRUFBRU0sWUFBWTtNQUMxQlIsS0FBSyxFQUFMQTtJQUNGO0VBQ0YsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFNVSxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUN2Qm5GLElBQW9CLEVBQ3BCZ0MsV0FBbUIsRUFFSTtFQUFBLElBQUFvRCxpQkFBQTtFQUFBLElBRHZCQyx3QkFBd0IsR0FBQTlDLFNBQUEsQ0FBQXhCLE1BQUEsUUFBQXdCLFNBQUEsUUFBQWxDLFNBQUEsR0FBQWtDLFNBQUEsTUFBRyxJQUFJO0VBRS9CLElBQU1lLE9BQU8sR0FBSXRELElBQUksQ0FBQ3NGLEtBQUssSUFBSXRGLElBQUksQ0FBQ3NGLEtBQUssQ0FBQzFELElBQUksQ0FBQyxDQUFDLElBQUt0QixNQUFNLENBQUNOLElBQUksQ0FBQ3FELEVBQUUsQ0FBQztFQUNwRSxJQUFNa0MsV0FBVyxHQUFHRix3QkFBd0IsSUFBQUQsaUJBQUEsR0FBSXBGLElBQUksQ0FBQ3VGLFdBQVcsY0FBQUgsaUJBQUEsY0FBQUEsaUJBQUEsR0FBSSxJQUFJLEdBQUksSUFBSTtFQUNoRixPQUFPO0lBQ0wvQixFQUFFLEVBQUVyRCxJQUFJLENBQUNxRCxFQUFFO0lBQ1hqQyxJQUFJLEVBQUUsTUFBTTtJQUNaa0MsT0FBTyxFQUFQQSxPQUFPO0lBQ1BDLGdCQUFnQixFQUFFekIsY0FBYyxDQUFDd0IsT0FBTyxFQUFFdEIsV0FBVyxDQUFDO0lBQ3REd0IsVUFBVSxFQUFFK0IsV0FBVyxHQUFHO01BQUVDLE1BQU0sRUFBRUQ7SUFBWSxDQUFDLEdBQUdsRixTQUFTO0lBQzdEdUQsR0FBRyxFQUFFO01BQ0hQLEVBQUUsRUFBRXJELElBQUksQ0FBQ3FELEVBQUU7TUFDWEwsSUFBSSxFQUFFTSxPQUFPO01BQ2JpQyxXQUFXLEVBQVhBO0lBQ0Y7RUFDRixDQUFDO0FBQ0gsQ0FBQztBQUVELElBQU1FLHlCQUF5QixHQUFHLFNBQTVCQSx5QkFBeUJBLENBQUlDLE1BQXdCLEVBQTRCO0VBQUEsSUFBQUMsYUFBQSxFQUFBQyxhQUFBLEVBQUFDLGVBQUEsRUFBQUMsY0FBQSxFQUFBQyxlQUFBO0VBQ3JGLElBQWFDLFlBQVksR0FBS04sTUFBTSxDQUE1Qk8sR0FBRztFQUNYLElBQU01QyxFQUFFLEdBQUcyQyxZQUFZO0VBQ3ZCLElBQUkzQyxFQUFFLEtBQUtoRCxTQUFTLElBQUlnRCxFQUFFLEtBQUssSUFBSSxJQUFJL0MsTUFBTSxDQUFDK0MsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sSUFBSTtFQUNyRSxJQUFNaUMsS0FBSyxHQUFHLEVBQUFLLGFBQUEsR0FBQ0QsTUFBTSxDQUFDSixLQUFLLGNBQUFLLGFBQUEsY0FBQUEsYUFBQSxHQUFJLEVBQUUsRUFBRS9ELElBQUksQ0FBQyxDQUFDLElBQUl0QixNQUFNLENBQUMrQyxFQUFFLENBQUM7RUFDdkQsSUFBTWtDLFdBQVcsSUFBQUssYUFBQSxHQUFHdkQsWUFBWSxFQUFBd0QsZUFBQSxHQUFDSCxNQUFNLENBQUM1RixPQUFPLGNBQUErRixlQUFBLHVCQUFkQSxlQUFBLENBQWdCN0MsSUFBSSxHQUFBOEMsY0FBQSxHQUFFSixNQUFNLENBQUNRLE1BQU0sY0FBQUosY0FBQSx1QkFBYkEsY0FBQSxDQUFlUixLQUFLLENBQUMsY0FBQU0sYUFBQSxjQUFBQSxhQUFBLEdBQUksSUFBSTtFQUNwRixJQUFNTyxTQUFTLEdBQUcsQ0FBQyxDQUFDOUQsWUFBWSxDQUFDcUQsTUFBTSxDQUFDVSxVQUFVLEdBQUFMLGVBQUEsR0FBRUwsTUFBTSxDQUFDUSxNQUFNLGNBQUFILGVBQUEsdUJBQWJBLGVBQUEsQ0FBZTFDLEVBQUUsQ0FBQztFQUN0RSxPQUFPO0lBQ0xBLEVBQUUsRUFBRkEsRUFBRTtJQUNGaUMsS0FBSyxFQUFMQSxLQUFLO0lBQ0xsRSxJQUFJLEVBQUUrRSxTQUFTLEdBQUcsU0FBUyxHQUFHLE1BQU07SUFDcENaLFdBQVcsRUFBWEE7RUFDRixDQUFDO0FBQ0gsQ0FBQztBQUVELElBQU1jLCtCQUErQixHQUFHLFNBQWxDQSwrQkFBK0JBLENBQUlYLE1BQTZCLEVBQTZCO0VBQUEsSUFBQVksWUFBQSxFQUFBQyxjQUFBLEVBQUFDLGNBQUEsRUFBQUMsbUJBQUEsRUFBQUMsZUFBQTtFQUNqRyxJQUFRckQsRUFBRSxHQUFLcUMsTUFBTSxDQUFickMsRUFBRTtFQUNWLElBQUlBLEVBQUUsS0FBS2hELFNBQVMsSUFBSWdELEVBQUUsS0FBSyxJQUFJLElBQUkvQyxNQUFNLENBQUMrQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxJQUFJO0VBQ3JFLElBQU1pQyxLQUFLLElBQUFnQixZQUFBLEdBQUdaLE1BQU0sQ0FBQzFDLElBQUksY0FBQXNELFlBQUEsY0FBQUEsWUFBQSxHQUFJLEVBQUU7RUFDL0IsSUFBTWxHLFFBQVEsSUFBQW1HLGNBQUEsR0FBR2xFLFlBQVksQ0FBQ3FELE1BQU0sQ0FBQ3RGLFFBQVEsR0FBQW9HLGNBQUEsR0FBRWQsTUFBTSxDQUFDaUIsTUFBTSxjQUFBSCxjQUFBLHVCQUFiQSxjQUFBLENBQWVuRCxFQUFFLENBQUMsY0FBQWtELGNBQUEsY0FBQUEsY0FBQSxHQUFJLElBQUk7RUFDekUsSUFBTUssVUFBVSxJQUFBSCxtQkFBQSxJQUFBQyxlQUFBLEdBQUdoQixNQUFNLENBQUNpQixNQUFNLGNBQUFELGVBQUEsdUJBQWJBLGVBQUEsQ0FBZTFELElBQUksY0FBQXlELG1CQUFBLGNBQUFBLG1CQUFBLEdBQUksSUFBSTtFQUM5QyxPQUFPO0lBQ0xwRCxFQUFFLEVBQUZBLEVBQUU7SUFDRmlDLEtBQUssRUFBTEEsS0FBSztJQUNMbEUsSUFBSSxFQUFFLFNBQVM7SUFDZmhCLFFBQVEsRUFBUkEsUUFBUTtJQUNSd0csVUFBVSxFQUFWQTtFQUNGLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUNuQkMsQ0FBa0IsRUFDbEIxRixJQUF1QixFQUN2QlksV0FBbUIsRUFFSTtFQUFBLElBQUErRSxjQUFBLEVBQUFDLGVBQUEsRUFBQUMsV0FBQSxFQUFBQyxhQUFBLEVBQUFDLFFBQUEsRUFBQUMsYUFBQTtFQUFBLElBRHZCL0Isd0JBQXdCLEdBQUE5QyxTQUFBLENBQUF4QixNQUFBLFFBQUF3QixTQUFBLFFBQUFsQyxTQUFBLEdBQUFrQyxTQUFBLE1BQUcsSUFBSTtFQUUvQixJQUFNZSxPQUFPLEdBQUd3RCxDQUFDLENBQUN4QixLQUFLLElBQUl3QixDQUFDLENBQUN2QixXQUFXLElBQUksRUFBRTtFQUM5QyxJQUFJQyxNQUFpQztFQUNyQyxJQUFJcEUsSUFBSSxLQUFLLFNBQVMsRUFBRW9FLE1BQU0sR0FBR3NCLENBQUMsQ0FBQ0YsVUFBVSxNQUN4QyxJQUFJeEYsSUFBSSxLQUFLLE1BQU0sRUFBRW9FLE1BQU0sR0FBR25GLFNBQVMsTUFDdkNtRixNQUFNLElBQUF1QixjQUFBLEdBQUdELENBQUMsQ0FBQ3ZCLFdBQVcsY0FBQXdCLGNBQUEsY0FBQUEsY0FBQSxHQUFJRCxDQUFDLENBQUNGLFVBQVU7RUFFM0MsSUFBTVYsTUFBTSxHQUFHOUUsSUFBSSxLQUFLLE1BQU0sR0FBRzBGLENBQUMsQ0FBQ1osTUFBTSxHQUFHLElBQUk7RUFDaEQsSUFBTUMsU0FBUyxHQUFHL0UsSUFBSSxLQUFLLE1BQU0sSUFBSThFLE1BQU0sSUFBSSxJQUFJLElBQUlBLE1BQU0sQ0FBQzdDLEVBQUUsSUFBSSxJQUFJLElBQUkvQyxNQUFNLENBQUM0RixNQUFNLENBQUM3QyxFQUFFLENBQUMsQ0FBQ3RDLE1BQU0sR0FBRyxDQUFDO0VBRXhHLElBQU1zRyxlQUFlLEdBQUdqRyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUNpRSx3QkFBd0IsR0FBRyxJQUFJLElBQUEyQixlQUFBLEdBQUlGLENBQUMsQ0FBQ3ZCLFdBQVcsY0FBQXlCLGVBQUEsY0FBQUEsZUFBQSxHQUFJLElBQUs7RUFFckcsT0FBTztJQUNMM0QsRUFBRSxFQUFFeUQsQ0FBQyxDQUFDekQsRUFBRTtJQUNSakMsSUFBSSxFQUFKQSxJQUFJO0lBQ0prQyxPQUFPLEVBQVBBLE9BQU87SUFDUEMsZ0JBQWdCLEVBQUV6QixjQUFjLENBQUN3QixPQUFPLEVBQUV0QixXQUFXLENBQUM7SUFDdER3QixVQUFVLEVBQUVnQyxNQUFNLEdBQUc7TUFBRUEsTUFBTSxFQUFOQTtJQUFPLENBQUMsR0FBR25GLFNBQVM7SUFDM0N1RCxHQUFHLEVBQUU7TUFDSFAsRUFBRSxFQUFFeUQsQ0FBQyxDQUFDekQsRUFBRTtNQUNSTCxJQUFJLEVBQUVNLE9BQU87TUFDYmxELFFBQVEsR0FBQTZHLFdBQUEsR0FBRUgsQ0FBQyxDQUFDMUcsUUFBUSxjQUFBNkcsV0FBQSxjQUFBQSxXQUFBLEdBQUksSUFBSTtNQUM1QkwsVUFBVSxHQUFBTSxhQUFBLEdBQUVKLENBQUMsQ0FBQ0YsVUFBVSxjQUFBTSxhQUFBLGNBQUFBLGFBQUEsR0FBSSxJQUFJO01BQ2hDM0IsV0FBVyxFQUFFOEIsZUFBZTtNQUM1QkMsS0FBSyxHQUFBSCxRQUFBLEdBQUVMLENBQUMsQ0FBQ1EsS0FBSyxjQUFBSCxRQUFBLGNBQUFBLFFBQUEsR0FBSSxJQUFJO01BQ3RCSSxRQUFRLEVBQUVwQixTQUFTLEdBQUdELE1BQU0sQ0FBQzdDLEVBQUUsR0FBRyxJQUFJO01BQ3RDbUUsV0FBVyxFQUFFckIsU0FBUyxHQUFHLEVBQUFpQixhQUFBLEdBQUFsQixNQUFNLENBQUNaLEtBQUssY0FBQThCLGFBQUEsdUJBQVpBLGFBQUEsQ0FBY3hGLElBQUksQ0FBQyxDQUFDLEtBQUksSUFBSSxHQUFHO0lBQzFEO0VBQ0YsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFNNkYscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBSUMsSUFBWTtFQUFBLE9BQ3pDQSxJQUFJLENBQUNDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUNBLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBQUMsS0FBSTtJQUFBLE9BQUlBLEtBQUksQ0FBQ0MsV0FBVyxDQUFDLENBQUM7RUFBQSxFQUFDO0FBQUE7QUFJdEUsSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBSUMsTUFBZSxFQUFFL0YsV0FBbUIsRUFBMkI7RUFDdkYsSUFBTVQsQ0FBQyxHQUFHUyxXQUFXLENBQUNKLElBQUksQ0FBQyxDQUFDLENBQUNNLFdBQVcsQ0FBQyxDQUFDO0VBQzFDLElBQU04RixRQUFRLEdBQUd6RyxDQUFDLEdBQUd3RyxNQUFNLENBQUNFLE1BQU0sQ0FBQyxVQUFBQyxDQUFDO0lBQUEsT0FBSUEsQ0FBQyxDQUFDbEYsSUFBSSxDQUFDZCxXQUFXLENBQUMsQ0FBQyxDQUFDaUcsUUFBUSxDQUFDNUcsQ0FBQyxDQUFDO0VBQUEsRUFBQyxHQUFHd0csTUFBTTtFQUNsRixPQUFPQyxRQUFRLENBQUNJLEdBQUcsQ0FBQyxVQUFBQyxLQUFLO0lBQUEsT0FBSztNQUM1QmhGLEVBQUUsRUFBRWdGLEtBQUssQ0FBQ2hGLEVBQUU7TUFDWmpDLElBQUksRUFBRSxPQUFnQjtNQUN0QmtDLE9BQU8sRUFBRStFLEtBQUssQ0FBQ3JGLElBQUk7TUFDbkJPLGdCQUFnQixFQUFFekIsY0FBYyxDQUFDdUcsS0FBSyxDQUFDckYsSUFBSSxFQUFFaEIsV0FBVyxDQUFDO01BQ3pENEIsR0FBRyxFQUFFO1FBQ0hQLEVBQUUsRUFBRWdGLEtBQUssQ0FBQ2hGLEVBQUU7UUFDWkwsSUFBSSxFQUFFcUYsS0FBSyxDQUFDckY7TUFDZDtJQUNGLENBQUM7RUFBQSxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsSUFBTXNGLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUlDLEtBQWUsRUFBRXZHLFdBQW1CLEVBQTJCO0VBQ3pGLElBQU1ULENBQUMsR0FBR1MsV0FBVyxDQUFDSixJQUFJLENBQUMsQ0FBQyxDQUFDTSxXQUFXLENBQUMsQ0FBQztFQUMxQyxJQUFJOEYsUUFBUSxHQUFHTyxLQUFLO0VBQ3BCLElBQUloSCxDQUFDLEVBQUU7SUFDTHlHLFFBQVEsR0FBR08sS0FBSyxDQUFDTixNQUFNLENBQUMsVUFBQUMsQ0FBQyxFQUFJO01BQzNCLElBQU01RSxPQUFPLEdBQUdtRSxxQkFBcUIsQ0FBQ1MsQ0FBQyxDQUFDO01BQ3hDLE9BQU9BLENBQUMsQ0FBQ2hHLFdBQVcsQ0FBQyxDQUFDLENBQUNpRyxRQUFRLENBQUM1RyxDQUFDLENBQUMsSUFBSStCLE9BQU8sQ0FBQ3BCLFdBQVcsQ0FBQyxDQUFDLENBQUNpRyxRQUFRLENBQUM1RyxDQUFDLENBQUM7SUFDekUsQ0FBQyxDQUFDO0VBQ0o7RUFDQSxPQUFPeUcsUUFBUSxDQUFDSSxHQUFHLENBQUMsVUFBQVYsSUFBSSxFQUFJO0lBQzFCLElBQU1wRSxPQUFPLEdBQUdtRSxxQkFBcUIsQ0FBQ0MsSUFBSSxDQUFDO0lBQzNDLE9BQU87TUFDTHJFLEVBQUUsRUFBRXFFLElBQUk7TUFDUnRHLElBQUksRUFBRSxLQUFjO01BQ3BCa0MsT0FBTyxFQUFQQSxPQUFPO01BQ1BDLGdCQUFnQixFQUFFekIsY0FBYyxDQUFDd0IsT0FBTyxFQUFFdEIsV0FBVyxDQUFDO01BQ3RENEIsR0FBRyxFQUFFO1FBQ0hQLEVBQUUsRUFBRXFFLElBQUk7UUFDUjFFLElBQUksRUFBRU07TUFDUjtJQUNGLENBQUM7RUFDSCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsT0FBTyxJQUFNa0YsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJcEgsSUFBdUIsRUFBRWxCLEtBQXlCLEVBQUs7RUFBQSxJQUFBdUksZUFBQSxFQUFBQyxhQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHFCQUFBO0VBQ3JGLElBQU1DLE9BQU8sR0FBR3JLLE9BQU8sQ0FBQyxDQUFDO0VBQ3pCLElBQUFzSyxLQUFBLEdBQWM3SixJQUFJLENBQUMsQ0FBQztJQUFaOEosQ0FBQyxHQUFBRCxLQUFBLENBQURDLENBQUM7RUFDVDtFQUNBLElBQU1DLHlCQUF5QixHQUFHM0ssTUFBTSxDQUFDLENBQUMsQ0FBQztFQUMzQyxJQUFBNEssU0FBQSxHQUFzQzNLLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFBQTRLLFVBQUEsR0FBQUMsY0FBQSxDQUFBRixTQUFBO0lBQTNDbEgsV0FBVyxHQUFBbUgsVUFBQTtJQUFFRSxjQUFjLEdBQUFGLFVBQUE7RUFDbEMsSUFBTUcsb0JBQW9CLEdBQUdySyxXQUFXLENBQUMrQyxXQUFXLEVBQUVqRCx3QkFBd0IsQ0FBQztFQUMvRSxJQUFBd0ssVUFBQSxHQUEwQmhMLFFBQVEsQ0FBdUIsRUFBRSxDQUFDO0lBQUFpTCxVQUFBLEdBQUFKLGNBQUEsQ0FBQUcsVUFBQTtJQUFyREUsS0FBSyxHQUFBRCxVQUFBO0lBQUVFLFFBQVEsR0FBQUYsVUFBQTtFQUN0QixJQUFBRyxVQUFBLEdBQThCcEwsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBcUwsVUFBQSxHQUFBUixjQUFBLENBQUFPLFVBQUE7SUFBdENFLE9BQU8sR0FBQUQsVUFBQTtJQUFFRSxVQUFVLEdBQUFGLFVBQUE7RUFDMUIsSUFBQUcsVUFBQSxHQUEwQnhMLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFBQXlMLFVBQUEsR0FBQVosY0FBQSxDQUFBVyxVQUFBO0lBQWxDRSxLQUFLLEdBQUFELFVBQUE7SUFBRUUsUUFBUSxHQUFBRixVQUFBO0VBQ3RCLElBQUFHLFVBQUEsR0FBZ0Q1TCxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUE2TCxVQUFBLEdBQUFoQixjQUFBLENBQUFlLFVBQUE7SUFBeERFLGdCQUFnQixHQUFBRCxVQUFBO0lBQUVFLG1CQUFtQixHQUFBRixVQUFBO0VBQzVDLElBQUFHLFVBQUEsR0FBOEJoTSxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFpTSxXQUFBLEdBQUFwQixjQUFBLENBQUFtQixVQUFBO0lBQXRDRSxPQUFPLEdBQUFELFdBQUE7SUFBRUUsVUFBVSxHQUFBRixXQUFBO0VBQzFCLElBQUFHLFdBQUEsR0FBMENwTSxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFxTSxXQUFBLEdBQUF4QixjQUFBLENBQUF1QixXQUFBO0lBQWxERSxhQUFhLEdBQUFELFdBQUE7SUFBRUUsZ0JBQWdCLEdBQUFGLFdBQUE7RUFDdEMsSUFBQUcsV0FBQSxHQUFzQ3hNLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFBQXlNLFdBQUEsR0FBQTVCLGNBQUEsQ0FBQTJCLFdBQUE7SUFBMUNFLFdBQVcsR0FBQUQsV0FBQTtJQUFFRSxjQUFjLEdBQUFGLFdBQUE7RUFDbEMsSUFBQUcsV0FBQSxHQUE0RDVNLFFBQVEsQ0FBbUIsTUFBTSxDQUFDO0lBQUE2TSxXQUFBLEdBQUFoQyxjQUFBLENBQUErQixXQUFBO0lBQXZGRSxzQkFBc0IsR0FBQUQsV0FBQTtJQUFFRSx5QkFBeUIsR0FBQUYsV0FBQTtFQUN4RCxJQUFBRyxXQUFBLEdBQW9EaE4sUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBaU4sV0FBQSxHQUFBcEMsY0FBQSxDQUFBbUMsV0FBQTtJQUE1REUsa0JBQWtCLEdBQUFELFdBQUE7SUFBRUUscUJBQXFCLEdBQUFGLFdBQUE7RUFFaEQsSUFBTUcsV0FBVyxHQUFHLEVBQUFsRCxlQUFBLEdBQUN2SSxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTBMLFFBQVEsY0FBQW5ELGVBQUEsY0FBQUEsZUFBQSxHQUFJLEVBQUUsRUFBRW9ELElBQUksQ0FBQyxHQUFHLENBQUM7RUFDckQsSUFBTUMsU0FBUyxHQUFHLEVBQUFwRCxhQUFBLEdBQUN4SSxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTZILE1BQU0sY0FBQVcsYUFBQSxjQUFBQSxhQUFBLEdBQUksRUFBRSxFQUFFTixHQUFHLENBQUMsVUFBQUYsQ0FBQztJQUFBLE9BQUlBLENBQUMsQ0FBQzdFLEVBQUU7RUFBQSxFQUFDLENBQUN3SSxJQUFJLENBQUMsR0FBRyxDQUFDO0VBQ2hFLElBQU14Ryx3QkFBd0IsR0FBRyxDQUFBbkYsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVPLFdBQVcsTUFBSyxTQUFTOztFQUVqRTtFQUNBLElBQU1zTCxXQUFXLEdBQUcxTixPQUFPLENBQ3pCO0lBQUEsSUFBQTJOLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsa0JBQUE7SUFBQSxPQUFPO01BQ0wvTCxRQUFRLEdBQUE0TCxlQUFBLEdBQUU5TCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUUsUUFBUSxjQUFBNEwsZUFBQSxjQUFBQSxlQUFBLEdBQUksSUFBSTtNQUNqQ3hMLFNBQVMsR0FBQXlMLGdCQUFBLEdBQUUvTCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRU0sU0FBUyxjQUFBeUwsZ0JBQUEsY0FBQUEsZ0JBQUEsR0FBSSxJQUFJO01BQ25DTCxRQUFRLEdBQUFNLGdCQUFBLEdBQUVoTSxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTBMLFFBQVEsY0FBQU0sZ0JBQUEsY0FBQUEsZ0JBQUEsR0FBSSxFQUFFO01BQy9CbkUsTUFBTSxFQUFFN0gsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUU2SCxNQUFNO01BQ3JCdEgsV0FBVyxHQUFBMEwsa0JBQUEsR0FBRWpNLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFTyxXQUFXLGNBQUEwTCxrQkFBQSxjQUFBQSxrQkFBQSxHQUFJO0lBQ3JDLENBQUM7RUFBQSxDQUFDLEVBQ0YsQ0FBQ2pNLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFRSxRQUFRLEVBQUVGLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFTSxTQUFTLEVBQUVtTCxXQUFXLEVBQUVHLFNBQVMsRUFBRTVMLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFTyxXQUFXLENBQ2hGLENBQUM7O0VBRUQ7RUFDQSxJQUFBMkwsYUFBQSxHQUNFbE8sWUFBWSxDQUFxQlMsZUFBZSxFQUFFO01BQ2hEME4sU0FBUyxFQUFFO1FBQUVDLEtBQUssRUFBRTtNQUFHLENBQUM7TUFDeEJDLFdBQVcsRUFBRTtJQUNmLENBQUMsQ0FBQztJQUFBQyxjQUFBLEdBQUFwRCxjQUFBLENBQUFnRCxhQUFBO0lBSkdLLG1CQUFtQixHQUFBRCxjQUFBO0lBQUFFLGVBQUEsR0FBQUYsY0FBQTtJQUFVRyxVQUFVLEdBQUFELGVBQUEsQ0FBaEJFLElBQUk7SUFBdUJDLGFBQWEsR0FBQUgsZUFBQSxDQUF0QjdDLE9BQU87SUFBd0JpRCxXQUFXLEdBQUFKLGVBQUEsQ0FBbEJ6QyxLQUFLOztFQU03RTtFQUNBLElBQUE4QyxjQUFBLEdBQ0U3TyxZQUFZLENBQW9CVyxjQUFjLEVBQUU7TUFDOUMwTixXQUFXLEVBQUU7SUFDZixDQUFDLENBQUM7SUFBQVMsY0FBQSxHQUFBNUQsY0FBQSxDQUFBMkQsY0FBQTtJQUhHRSxrQkFBa0IsR0FBQUQsY0FBQTtJQUFBRSxlQUFBLEdBQUFGLGNBQUE7SUFBVUcsV0FBVyxHQUFBRCxlQUFBLENBQWpCTixJQUFJO0lBQXdCUSxjQUFjLEdBQUFGLGVBQUEsQ0FBdkJyRCxPQUFPO0lBQXlCd0QsWUFBWSxHQUFBSCxlQUFBLENBQW5CakQsS0FBSzs7RUFLOUU7RUFDQSxJQUFBcUQsY0FBQSxHQUNFcFAsWUFBWSxDQUFxQlksZUFBZSxFQUFFO01BQ2hEeU4sV0FBVyxFQUFFO0lBQ2YsQ0FBQyxDQUFDO0lBQUFnQixjQUFBLEdBQUFuRSxjQUFBLENBQUFrRSxjQUFBO0lBSEdFLG1CQUFtQixHQUFBRCxjQUFBO0lBQUFFLGVBQUEsR0FBQUYsY0FBQTtJQUFVRyxTQUFTLEdBQUFELGVBQUEsQ0FBZmIsSUFBSTtJQUFzQmUsWUFBWSxHQUFBRixlQUFBLENBQXJCNUQsT0FBTztJQUF1QitELFVBQVUsR0FBQUgsZUFBQSxDQUFqQnhELEtBQUs7RUFLM0UsSUFBTTRELG1CQUFtQixHQUFHMVAsV0FBVyxDQUFDLFVBQUMyUCxPQUFtQyxFQUFLO0lBQUEsSUFBQUMsY0FBQSxFQUFBQyxlQUFBO0lBQy9FLElBQU1DLElBQUksR0FBRzdPLG9CQUFvQixDQUFDME8sT0FBTyxhQUFQQSxPQUFPLGdCQUFBQyxjQUFBLEdBQVBELE9BQU8sQ0FBRUksS0FBSyxjQUFBSCxjQUFBLHVCQUFkQSxjQUFBLENBQWdCRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFELElBQU1FLFFBQVEsR0FBRy9PLG9CQUFvQixDQUFDME8sT0FBTyxhQUFQQSxPQUFPLGdCQUFBRSxlQUFBLEdBQVBGLE9BQU8sQ0FBRUksS0FBSyxjQUFBRixlQUFBLHVCQUFkQSxlQUFBLENBQWdCRyxRQUFRLEVBQUVGLElBQUksQ0FBQztJQUNyRS9DLGNBQWMsQ0FBQytDLElBQUksQ0FBQztJQUNwQnZELFVBQVUsQ0FBQ3VELElBQUksR0FBR0UsUUFBUSxDQUFDO0VBQzdCLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFNQyxxQkFBcUIsR0FBR2pRLFdBQVcsQ0FBQyxVQUFDMlAsT0FBa0MsRUFBSztJQUFBLElBQUFPLGdCQUFBLEVBQUFDLGlCQUFBO0lBQ2hGLElBQU1MLElBQUksR0FBRzdPLG9CQUFvQixDQUFDME8sT0FBTyxhQUFQQSxPQUFPLGdCQUFBTyxnQkFBQSxHQUFQUCxPQUFPLENBQUVTLE9BQU8sY0FBQUYsZ0JBQUEsdUJBQWhCQSxnQkFBQSxDQUFrQkosSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RCxJQUFNRSxRQUFRLEdBQUcvTyxvQkFBb0IsQ0FBQzBPLE9BQU8sYUFBUEEsT0FBTyxnQkFBQVEsaUJBQUEsR0FBUFIsT0FBTyxDQUFFUyxPQUFPLGNBQUFELGlCQUFBLHVCQUFoQkEsaUJBQUEsQ0FBa0JILFFBQVEsRUFBRUYsSUFBSSxDQUFDO0lBQ3ZFL0MsY0FBYyxDQUFDK0MsSUFBSSxDQUFDO0lBQ3BCdkQsVUFBVSxDQUFDdUQsSUFBSSxHQUFHRSxRQUFRLENBQUM7RUFDN0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLElBQU1LLDBCQUEwQixHQUFHclEsV0FBVyxDQUFDLFVBQUMyUCxPQUErQixFQUFLO0lBQUEsSUFBQVcsbUJBQUEsRUFBQUMsb0JBQUE7SUFDbEYsSUFBTUMsT0FBTyxHQUFHblAsTUFBTSxDQUFDc08sT0FBTyxhQUFQQSxPQUFPLGdCQUFBVyxtQkFBQSxHQUFQWCxPQUFPLENBQUVjLFVBQVUsY0FBQUgsbUJBQUEsdUJBQW5CQSxtQkFBQSxDQUFxQlIsSUFBSSxDQUFDO0lBQ2pEO0lBQ0EsSUFBTUEsSUFBSSxHQUFHek8sTUFBTSxDQUFDQyxRQUFRLENBQUNrUCxPQUFPLENBQUMsSUFBSUEsT0FBTyxJQUFJLENBQUMsR0FBR2hQLElBQUksQ0FBQ0MsS0FBSyxDQUFDK08sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDbkYsSUFBTVIsUUFBUSxHQUFHL08sb0JBQW9CLENBQUMwTyxPQUFPLGFBQVBBLE9BQU8sZ0JBQUFZLG9CQUFBLEdBQVBaLE9BQU8sQ0FBRWMsVUFBVSxjQUFBRixvQkFBQSx1QkFBbkJBLG9CQUFBLENBQXFCUCxRQUFRLEVBQUVGLElBQUksQ0FBQztJQUMxRS9DLGNBQWMsQ0FBQytDLElBQUksQ0FBQztJQUNwQnZELFVBQVUsQ0FBQ3VELElBQUksR0FBR0UsUUFBUSxDQUFDO0VBQzdCLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFNVSw2QkFBNkIsR0FBRzFRLFdBQVcsQ0FBQyxVQUFDMlAsT0FBcUMsRUFBSztJQUFBLElBQUFnQixpQkFBQSxFQUFBQyxrQkFBQTtJQUMzRixJQUFNZCxJQUFJLEdBQUc3TyxvQkFBb0IsQ0FBQzBPLE9BQU8sYUFBUEEsT0FBTyxnQkFBQWdCLGlCQUFBLEdBQVBoQixPQUFPLENBQUVrQixRQUFRLGNBQUFGLGlCQUFBLHVCQUFqQkEsaUJBQUEsQ0FBbUJiLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0QsSUFBTUUsUUFBUSxHQUFHL08sb0JBQW9CLENBQUMwTyxPQUFPLGFBQVBBLE9BQU8sZ0JBQUFpQixrQkFBQSxHQUFQakIsT0FBTyxDQUFFa0IsUUFBUSxjQUFBRCxrQkFBQSx1QkFBakJBLGtCQUFBLENBQW1CWixRQUFRLEVBQUVGLElBQUksQ0FBQztJQUN4RS9DLGNBQWMsQ0FBQytDLElBQUksQ0FBQztJQUNwQnZELFVBQVUsQ0FBQ3VELElBQUksR0FBR0UsUUFBUSxDQUFDO0VBQzdCLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFBYyxjQUFBLEdBQWtDL1EsWUFBWSxDQUFpQlUsb0JBQW9CLEVBQUU7TUFDbkYyTixXQUFXLEVBQUU7SUFDZixDQUFDLENBQUM7SUFBQTJDLGNBQUEsR0FBQTlGLGNBQUEsQ0FBQTZGLGNBQUE7SUFGS0UsdUJBQXVCLEdBQUFELGNBQUE7RUFJOUIsSUFBQUUsY0FBQSxHQUFnQ2xSLFlBQVksQ0FBdUJRLGlCQUFpQixFQUFFO01BQ3BGNk4sV0FBVyxFQUFFO0lBQ2YsQ0FBQyxDQUFDO0lBQUE4QyxjQUFBLEdBQUFqRyxjQUFBLENBQUFnRyxjQUFBO0lBRktFLHFCQUFxQixHQUFBRCxjQUFBO0VBSTVCLElBQU1FLFdBQVcsR0FBR3BSLFdBQVcsY0FBQXFSLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBQyxTQUFBQyxRQUFBO0lBQUEsSUFBQUMsVUFBQSxFQUFBQyxxQkFBQSxFQUFBdEgsS0FBQSxFQUFBdUgsVUFBQSxFQUFBQyxpQkFBQSxFQUFBQyxRQUFBLEVBQUFwRCxJQUFBLEVBQUE3RSxNQUFBLEVBQUFrSSxXQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLGVBQUEsRUFBQUMscUJBQUEsRUFBQUMsWUFBQSxFQUFBQyxNQUFBLEVBQUFDLGlCQUFBLEVBQUFDLEtBQUEsRUFBQUMsU0FBQSxFQUFBQyxxQkFBQSxFQUFBQyxzQkFBQSxFQUFBM0ksTUFBQSxFQUFBNEkscUJBQUEsRUFBQUMsYUFBQSxFQUFBQyxpQkFBQSxFQUFBQyxZQUFBLEVBQUFDLHFCQUFBLEVBQUFDLE1BQUEsRUFBQUMsT0FBQSxFQUFBQyxNQUFBLEVBQUFDLFNBQUEsRUFBQUMsRUFBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQTlCLG1CQUFBLENBQUErQixJQUFBLFdBQUFDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtRQUFBO1VBQzlCMUkseUJBQXlCLENBQUMySSxPQUFPLElBQUksQ0FBQztVQUNoQ2hDLFVBQVUsR0FBRzNHLHlCQUF5QixDQUFDMkksT0FBTztVQUFBLE1BRWhEeFEsSUFBSSxLQUFLLEtBQUs7WUFBQXFRLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDVnBKLEtBQUssSUFBQXNILHFCQUFBLEdBQUc5RCxXQUFXLENBQUNILFFBQVEsY0FBQWlFLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksRUFBRTtVQUN4Qy9GLFVBQVUsQ0FBQyxLQUFLLENBQUM7VUFDakJJLFFBQVEsQ0FBQyxLQUFLLENBQUM7VUFDZlIsUUFBUSxDQUFDcEIsa0JBQWtCLENBQUNDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztVQUN2QytCLG1CQUFtQixDQUFDLEtBQUssQ0FBQztVQUMxQmdCLHlCQUF5QixDQUFDLE1BQU0sQ0FBQztVQUNqQ1osVUFBVSxDQUFDLEtBQUssQ0FBQztVQUFBLE9BQUErRyxRQUFBLENBQUFJLE1BQUE7UUFBQTtVQUFBLE1BSWZ6USxJQUFJLEtBQUssT0FBTztZQUFBcVEsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLEtBQ2Q1RixXQUFXLENBQUNoRSxNQUFNO1lBQUEwSixRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQ3BCN0gsVUFBVSxDQUFDLEtBQUssQ0FBQztVQUNqQkksUUFBUSxDQUFDLEtBQUssQ0FBQztVQUNmd0IscUJBQXFCLENBQUNLLFdBQVcsQ0FBQ2hFLE1BQU0sQ0FBQ2hILE1BQU0sS0FBSyxDQUFDLENBQUM7VUFDdEQySSxRQUFRLENBQUM1QixnQkFBZ0IsQ0FBQ2lFLFdBQVcsQ0FBQ2hFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztVQUNsRHVDLG1CQUFtQixDQUFDLElBQUksQ0FBQztVQUN6QmdCLHlCQUF5QixDQUFDLE1BQU0sQ0FBQztVQUNqQ1osVUFBVSxDQUFDLEtBQUssQ0FBQztVQUFBLE9BQUErRyxRQUFBLENBQUFJLE1BQUE7UUFBQTtVQUduQi9ILFVBQVUsQ0FBQyxJQUFJLENBQUM7VUFDaEJJLFFBQVEsQ0FBQyxLQUFLLENBQUM7VUFBQXVILFFBQUEsQ0FBQUMsSUFBQTtVQUFBRCxRQUFBLENBQUFFLElBQUE7VUFBQSxPQUVVeFMsU0FBUyxDQUFDO1lBQUUyUyxJQUFJLEVBQUUsUUFBUTtZQUFFQyxNQUFNLEVBQUU7VUFBTSxDQUFDLENBQUM7UUFBQTtVQUE3RC9CLFFBQVEsR0FBQXlCLFFBQUEsQ0FBQU8sSUFBQTtVQUFBUCxRQUFBLENBQUFFLElBQUE7VUFBQSxPQUN3QjNCLFFBQVEsQ0FBQ2lDLElBQUksQ0FBQyxDQUFDO1FBQUE7VUFBL0NyRixJQUF1QixHQUFBNkUsUUFBQSxDQUFBTyxJQUFBO1VBQUEsTUFDekJwQyxVQUFVLEtBQUszRyx5QkFBeUIsQ0FBQzJJLE9BQU87WUFBQUgsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFGLFFBQUEsQ0FBQUksTUFBQTtRQUFBO1VBQzlDOUosTUFBZSxJQUFBK0gsVUFBQSxHQUFHbEQsSUFBSSxDQUFDQSxJQUFJLGNBQUFrRCxVQUFBLGNBQUFBLFVBQUEsR0FBSSxFQUFFO1VBQ2pDRyxXQUFXLEdBQUcsQ0FBQyxDQUFDckQsSUFBSSxDQUFDc0YsUUFBUSxJQUFJdEYsSUFBSSxDQUFDdUYsV0FBVyxJQUFJLElBQUk7VUFDL0R6RyxxQkFBcUIsQ0FBQzNELE1BQU0sQ0FBQ2hILE1BQU0sS0FBSyxDQUFDLENBQUM7VUFDMUMySSxRQUFRLENBQUM1QixnQkFBZ0IsQ0FBQ0MsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1VBQ3RDdUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1VBQ3pCSSxVQUFVLENBQUN1RixXQUFXLENBQUM7VUFDdkIvRSxjQUFjLEVBQUE2RSxpQkFBQSxHQUFDbkQsSUFBSSxDQUFDdUYsV0FBVyxjQUFBcEMsaUJBQUEsY0FBQUEsaUJBQUEsR0FBSSxDQUFDLENBQUM7VUFDckN6RSx5QkFBeUIsQ0FBQzJFLFdBQVcsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDO1VBQUF3QixRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUFBSixFQUFBLEdBQUFHLFFBQUE7VUFBQSxNQUV0RDdCLFVBQVUsS0FBSzNHLHlCQUF5QixDQUFDMkksT0FBTztZQUFBSCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBSSxNQUFBO1FBQUE7VUFDcEQzSCxRQUFRLENBQUMsSUFBSSxDQUFDO1VBQ2RSLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFBQTtVQUFBK0gsUUFBQSxDQUFBQyxJQUFBO1VBRVosSUFBSTlCLFVBQVUsS0FBSzNHLHlCQUF5QixDQUFDMkksT0FBTyxFQUFFOUgsVUFBVSxDQUFDLEtBQUssQ0FBQztVQUFBLE9BQUEySCxRQUFBLENBQUFXLE1BQUE7UUFBQTtVQUFBLE9BQUFYLFFBQUEsQ0FBQUksTUFBQTtRQUFBO1VBSzNFL0gsVUFBVSxDQUFDLElBQUksQ0FBQztVQUNoQkksUUFBUSxDQUFDLEtBQUssQ0FBQztVQUFBdUgsUUFBQSxDQUFBQyxJQUFBO1VBQUEsTUFFVHRRLElBQUksS0FBSyxRQUFRO1lBQUFxUSxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQ25CakksUUFBUSxDQUFDLEVBQUUsQ0FBQztVQUNaWSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7VUFDMUJnQix5QkFBeUIsQ0FBQyxNQUFNLENBQUM7VUFDakNaLFVBQVUsQ0FBQyxLQUFLLENBQUM7VUFBQStHLFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQSxNQUNSdlEsSUFBSSxLQUFLLFNBQVM7WUFBQXFRLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDckJ2QixlQUFlLEdBQ25CckUsV0FBVyxDQUFDM0wsUUFBUSxLQUFLLElBQUksSUFBSTJMLFdBQVcsQ0FBQzNMLFFBQVEsS0FBS0MsU0FBUyxJQUFJMEwsV0FBVyxDQUFDM0wsUUFBUSxLQUFLLEVBQUUsR0FDOUY7WUFBRWlTLFNBQVMsRUFBRSxDQUFDL1IsTUFBTSxDQUFDeUwsV0FBVyxDQUFDM0wsUUFBUSxDQUFDO1VBQUUsQ0FBQyxHQUM3Q0MsU0FBUztVQUFBb1IsUUFBQSxDQUFBRSxJQUFBO1VBQUEsT0FDc0JyQyxxQkFBcUIsQ0FBQztZQUN6RGpELFNBQVMsRUFBQWlHLGFBQUEsQ0FBQUEsYUFBQSxLQUNIbEMsZUFBZSxHQUFHO2NBQUU3TixTQUFTLEVBQUU2TjtZQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2NBQ3pEbkMsSUFBSSxFQUFFLENBQUM7Y0FDUHNFLE9BQU8sRUFBRTtZQUFFO1VBRWYsQ0FBQyxDQUFDO1FBQUE7VUFBQWxDLHFCQUFBLEdBQUFvQixRQUFBLENBQUFPLElBQUE7VUFOWTFCLFlBQVksR0FBQUQscUJBQUEsQ0FBbEJ6RCxJQUFJO1VBQUEsTUFPUmdELFVBQVUsS0FBSzNHLHlCQUF5QixDQUFDMkksT0FBTztZQUFBSCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBSSxNQUFBO1FBQUE7VUFDOUN0QixNQUFNLEdBQUcsRUFBQUwscUJBQUEsR0FBQ0ksWUFBWSxhQUFaQSxZQUFZLGdCQUFBSCxzQkFBQSxHQUFaRyxZQUFZLENBQUV0QixRQUFRLGNBQUFtQixzQkFBQSx1QkFBdEJBLHNCQUFBLENBQXdCdkQsSUFBSSxjQUFBc0QscUJBQUEsY0FBQUEscUJBQUEsR0FBSSxFQUFFLEVBQy9DOUgsR0FBRyxDQUFDL0IsK0JBQStCLENBQUMsQ0FDcEM0QixNQUFNLENBQUMsVUFBQ3VLLElBQUk7WUFBQSxPQUE4QkEsSUFBSSxLQUFLLElBQUk7VUFBQSxFQUFDLENBQ3hEcEssR0FBRyxDQUFDLFVBQUFvSyxJQUFJO1lBQUEsT0FBSTNMLGVBQWUsQ0FBQzJMLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDO1VBQUEsRUFBQztVQUNwRGxJLG1CQUFtQixDQUFDaUcsTUFBTSxDQUFDeFAsTUFBTSxHQUFHLENBQUMsQ0FBQztVQUN0Q3VLLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDO1VBQzdDdUQsNkJBQTZCLENBQUN5QixZQUFZLENBQUM7VUFBQSxNQUN2Q1YsVUFBVSxLQUFLM0cseUJBQXlCLENBQUMySSxPQUFPO1lBQUFILFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFJLE1BQUE7UUFBQTtVQUNwRG5JLFFBQVEsQ0FBQzZHLE1BQU0sQ0FBQztVQUFBa0IsUUFBQSxDQUFBRSxJQUFBO1VBQUE7UUFBQTtVQUFBLE1BQ1B2USxJQUFJLEtBQUssTUFBTTtZQUFBcVEsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUV4QixJQUFJNUYsV0FBVyxDQUFDdEwsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUN6QytQLGlCQUFpQixHQUFHO2NBQUVoUSxTQUFTLEVBQUV1TCxXQUFXLENBQUN2TDtZQUFVLENBQUM7VUFDMUQsQ0FBQyxNQUFNLElBQUl1TCxXQUFXLENBQUN0TCxXQUFXLEtBQUssUUFBUSxFQUFFO1lBQy9DK1AsaUJBQWlCLEdBQUc7Y0FBRXBRLFFBQVEsRUFBRTJMLFdBQVcsQ0FBQzNMO1lBQVMsQ0FBQztVQUN4RDtVQUFDcVIsUUFBQSxDQUFBRSxJQUFBO1VBQUEsT0FDa0JuVCxjQUFjLENBQUNnUyxpQkFBaUIsQ0FBQztRQUFBO1VBQTlDNUQsS0FBSSxHQUFBNkUsUUFBQSxDQUFBTyxJQUFBO1VBQUEsTUFDTnBDLFVBQVUsS0FBSzNHLHlCQUF5QixDQUFDMkksT0FBTztZQUFBSCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBSSxNQUFBO1FBQUE7VUFDaERuQixTQUFTLEdBQUcsQ0FBQzlELEtBQUksYUFBSkEsS0FBSSxjQUFKQSxLQUFJLEdBQUksRUFBRSxFQUFFeEUsR0FBRyxDQUFDLFVBQUFwSSxJQUFJO1lBQUEsT0FBSW1GLG1CQUFtQixDQUFDbkYsSUFBSSxFQUFFLEVBQUUsRUFBRXFGLHdCQUF3QixDQUFDO1VBQUEsRUFBQztVQUFBLE1BQzdGcUwsU0FBUyxDQUFDM1AsTUFBTSxLQUFLLENBQUM7WUFBQTBRLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDbEIxSixNQUFnQyxHQUFHLENBQUMsQ0FBQztVQUMzQyxJQUFJOEQsV0FBVyxDQUFDdkwsU0FBUyxLQUFLLElBQUksSUFBSXVMLFdBQVcsQ0FBQ3ZMLFNBQVMsS0FBS0gsU0FBUyxJQUFJMEwsV0FBVyxDQUFDdkwsU0FBUyxLQUFLLEVBQUUsRUFBRTtZQUN6R3lILE1BQU0sQ0FBQ3dLLFVBQVUsR0FBRyxDQUFDblMsTUFBTSxDQUFDeUwsV0FBVyxDQUFDdkwsU0FBUyxDQUFDLENBQUM7VUFDckQ7VUFDQSxJQUFJdUwsV0FBVyxDQUFDM0wsUUFBUSxLQUFLLElBQUksSUFBSTJMLFdBQVcsQ0FBQzNMLFFBQVEsS0FBS0MsU0FBUyxJQUFJMEwsV0FBVyxDQUFDM0wsUUFBUSxLQUFLLEVBQUUsRUFBRTtZQUN0RzZILE1BQU0sQ0FBQ3lLLFNBQVMsR0FBRyxDQUFDcFMsTUFBTSxDQUFDeUwsV0FBVyxDQUFDM0wsUUFBUSxDQUFDLENBQUM7VUFDbkQ7VUFBQ3FSLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BQ29DeEMsdUJBQXVCLENBQUM7WUFDM0Q5QyxTQUFTLEVBQUU7Y0FDVHBFLE1BQU0sRUFBQXFLLGFBQUE7Z0JBQUl2UyxRQUFRLEVBQUU7Y0FBSyxHQUFLa0ksTUFBTSxDQUFFO2NBQ3RDMEssVUFBVSxFQUFFO2dCQUFFQyxNQUFNLEVBQUUsQ0FBQztnQkFBRUMsSUFBSSxFQUFFO2NBQUc7WUFDcEM7VUFDRixDQUFDLENBQUM7UUFBQTtVQUFBaEMscUJBQUEsR0FBQVksUUFBQSxDQUFBTyxJQUFBO1VBTFkxQixhQUFZLEdBQUFPLHFCQUFBLENBQWxCakUsSUFBSTtVQUFBLE1BTVJnRCxVQUFVLEtBQUszRyx5QkFBeUIsQ0FBQzJJLE9BQU87WUFBQUgsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFGLFFBQUEsQ0FBQUksTUFBQTtRQUFBO1VBQ3BEbkIsU0FBUyxHQUFHLEVBQUFDLHFCQUFBLEdBQUNMLGFBQVksYUFBWkEsYUFBWSxnQkFBQU0sc0JBQUEsR0FBWk4sYUFBWSxDQUFFMUIsVUFBVSxjQUFBZ0Msc0JBQUEsdUJBQXhCQSxzQkFBQSxDQUEwQmhFLElBQUksY0FBQStELHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksRUFBRSxFQUM5Q3ZJLEdBQUcsQ0FBQzNDLHlCQUF5QixDQUFDLENBQzlCd0MsTUFBTSxDQUFDLFVBQUN1SyxJQUFJO1lBQUEsT0FBNkJBLElBQUksS0FBSyxJQUFJO1VBQUEsRUFBQyxDQUN2RHBLLEdBQUcsQ0FBQyxVQUFBcEksSUFBSTtZQUFBLE9BQUltRixtQkFBbUIsQ0FBQ25GLElBQUksRUFBRSxFQUFFLEVBQUVxRix3QkFBd0IsQ0FBQztVQUFBLEVBQUM7VUFDdkVpRixtQkFBbUIsQ0FBQ29HLFNBQVMsQ0FBQzNQLE1BQU0sR0FBRyxDQUFDLENBQUM7VUFDekN1Syx5QkFBeUIsQ0FBQyxlQUFlLENBQUM7VUFDMUNrRCwwQkFBMEIsQ0FBQzhCLGFBQVksQ0FBQztVQUFBbUIsUUFBQSxDQUFBRSxJQUFBO1VBQUE7UUFBQTtVQUV4Q3JILG1CQUFtQixDQUFDLEtBQUssQ0FBQztVQUMxQmdCLHlCQUF5QixDQUFDLE1BQU0sQ0FBQztVQUNqQ1osVUFBVSxDQUFDLEtBQUssQ0FBQztRQUFBO1VBQUEsTUFFZmtGLFVBQVUsS0FBSzNHLHlCQUF5QixDQUFDMkksT0FBTztZQUFBSCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBSSxNQUFBO1FBQUE7VUFDcERuSSxRQUFRLENBQUNnSCxTQUFTLENBQUM7VUFBQWUsUUFBQSxDQUFBRSxJQUFBO1VBQUE7UUFBQTtVQUFBLE1BQ1Z2USxJQUFJLEtBQUssTUFBTTtZQUFBcVEsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBRixRQUFBLENBQUFFLElBQUE7VUFBQSxPQUNEbkUsbUJBQW1CLENBQUM7WUFDekNuQixTQUFTLEVBQUU7Y0FDVHlHLE9BQU8sRUFBRXhSLDBCQUEwQixDQUFDLEVBQUUsQ0FBQztjQUN2QzJNLElBQUksRUFBRTtZQUNSO1VBQ0YsQ0FBQyxDQUFDO1FBQUE7VUFBQWdELHFCQUFBLEdBQUFRLFFBQUEsQ0FBQU8sSUFBQTtVQUxNcEYsTUFBSSxHQUFBcUUscUJBQUEsQ0FBSnJFLElBQUk7VUFBQSxNQU1SZ0QsVUFBVSxLQUFLM0cseUJBQXlCLENBQUMySSxPQUFPO1lBQUFILFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFJLE1BQUE7UUFBQTtVQUM5Q3RCLE9BQU0sR0FBRyxFQUFBUSxpQkFBQSxHQUFDbkUsTUFBSSxhQUFKQSxNQUFJLGdCQUFBb0UsWUFBQSxHQUFKcEUsTUFBSSxDQUFFc0IsS0FBSyxjQUFBOEMsWUFBQSx1QkFBWEEsWUFBQSxDQUFhcEUsSUFBSSxjQUFBbUUsaUJBQUEsY0FBQUEsaUJBQUEsR0FBSSxFQUFFLEVBQUUzSSxHQUFHLENBQUMsVUFBQXRFLENBQUM7WUFBQSxPQUFJRCxhQUFhLENBQUNDLENBQUMsRUFBRSxFQUFFLENBQUM7VUFBQSxFQUFDO1VBQUEsTUFDbkU4TCxVQUFVLEtBQUszRyx5QkFBeUIsQ0FBQzJJLE9BQU87WUFBQUgsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFGLFFBQUEsQ0FBQUksTUFBQTtRQUFBO1VBQzlDVCxNQUFNLEdBQUd4TSxvQkFBb0IsQ0FBQ2tFLE9BQU8sRUFBRSxFQUFFLEVBQUVFLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1VBQ2xFcUksU0FBUyxHQUFHZCxPQUFNLENBQUN0SSxNQUFNLENBQUMsVUFBQXVLLElBQUk7WUFBQSxPQUFJbFMsTUFBTSxDQUFDa1MsSUFBSSxDQUFDblAsRUFBRSxDQUFDLEtBQUsvQyxNQUFNLENBQUM4USxNQUFNLENBQUMvTixFQUFFLENBQUM7VUFBQSxFQUFDO1VBQzlFcUcsUUFBUSxFQUFFMEgsTUFBTSxFQUFBOU0sTUFBQSxDQUFBeU8sa0JBQUEsQ0FBSzFCLFNBQVMsRUFBQyxDQUFDO1VBQ2hDeEQsbUJBQW1CLENBQUNqQixNQUFJLENBQUM7VUFDekJ0QyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7VUFDMUJnQix5QkFBeUIsQ0FBQyxPQUFPLENBQUM7VUFBQW1HLFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQSxNQUU5Qi9CLFVBQVUsS0FBSzNHLHlCQUF5QixDQUFDMkksT0FBTztZQUFBSCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBSSxNQUFBO1FBQUE7VUFDcERuSSxRQUFRLENBQUMsRUFBRSxDQUFDO1VBQ1pZLG1CQUFtQixDQUFDLEtBQUssQ0FBQztVQUMxQmdCLHlCQUF5QixDQUFDLE1BQU0sQ0FBQztVQUNqQ1osVUFBVSxDQUFDLEtBQUssQ0FBQztVQUNqQlEsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUFBO1VBQUF1RyxRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUFBSCxHQUFBLEdBQUFFLFFBQUE7VUFBQSxNQUdmN0IsVUFBVSxLQUFLM0cseUJBQXlCLENBQUMySSxPQUFPO1lBQUFILFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFJLE1BQUE7UUFBQTtVQUNwRDNILFFBQVEsQ0FBQyxJQUFJLENBQUM7VUFDZFIsUUFBUSxDQUFDLEVBQUUsQ0FBQztVQUNaWSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7UUFBQTtVQUFBbUgsUUFBQSxDQUFBQyxJQUFBO1VBRTFCLElBQUk5QixVQUFVLEtBQUszRyx5QkFBeUIsQ0FBQzJJLE9BQU8sRUFBRTtZQUNwRDlILFVBQVUsQ0FBQyxLQUFLLENBQUM7VUFDbkI7VUFBQyxPQUFBMkgsUUFBQSxDQUFBVyxNQUFBO1FBQUE7UUFBQTtVQUFBLE9BQUFYLFFBQUEsQ0FBQXVCLElBQUE7TUFBQTtJQUFBLEdBQUFyRCxPQUFBO0VBQUEsQ0FFSixJQUFFLENBQ0R2TyxJQUFJLEVBQ0oySyxXQUFXLEVBQ1h5QixtQkFBbUIsRUFDbkIyQix1QkFBdUIsRUFDdkJHLHFCQUFxQixFQUNyQnpCLG1CQUFtQixFQUNuQlcsMEJBQTBCLEVBQzFCSyw2QkFBNkIsRUFDN0J4Six3QkFBd0IsRUFDeEJ5RCxPQUFPLEVBQ1BFLENBQUMsQ0FDRixDQUFDOztFQUVGO0VBQ0E1SyxTQUFTLENBQUMsWUFBTTtJQUNkLElBQU1tRCxDQUFDLEdBQUcrSCxvQkFBb0IsQ0FBQzFILElBQUksQ0FBQyxDQUFDO0lBRXJDLElBQUlSLElBQUksS0FBSyxLQUFLLEVBQUU7TUFBQSxJQUFBNlIsc0JBQUE7TUFDbEIsSUFBTTFLLEtBQUssSUFBQTBLLHNCQUFBLEdBQUdsSCxXQUFXLENBQUNILFFBQVEsY0FBQXFILHNCQUFBLGNBQUFBLHNCQUFBLEdBQUksRUFBRTtNQUN4Q25KLFVBQVUsQ0FBQyxLQUFLLENBQUM7TUFDakJJLFFBQVEsQ0FBQyxLQUFLLENBQUM7TUFDZlIsUUFBUSxDQUFDcEIsa0JBQWtCLENBQUNDLEtBQUssRUFBRWhILENBQUMsQ0FBQyxDQUFDO01BQ3RDO0lBQ0Y7SUFFQSxJQUFJSCxJQUFJLEtBQUssT0FBTyxFQUFFO01BQ3BCLElBQUkySyxXQUFXLENBQUNoRSxNQUFNLEVBQUU7UUFDdEIrQixVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ2pCSSxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2ZSLFFBQVEsQ0FBQzVCLGdCQUFnQixDQUFDaUUsV0FBVyxDQUFDaEUsTUFBTSxFQUFFeEcsQ0FBQyxDQUFDLENBQUM7UUFDakQ7TUFDRjtNQUNBLElBQUksQ0FBQ0EsQ0FBQyxFQUFFO01BQ1IsSUFBSUEsQ0FBQyxDQUFDUixNQUFNLEdBQUcvQiw4QkFBOEIsRUFBRTtRQUM3QzhLLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDakJJLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDZixJQUFJLENBQUN1QixrQkFBa0IsRUFBRTtVQUN2Qi9CLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDZDtRQUNBZ0IsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNqQlkseUJBQXlCLENBQUMsTUFBTSxDQUFDO1FBQ2pDO01BQ0Y7TUFDQXJDLHlCQUF5QixDQUFDMkksT0FBTyxJQUFJLENBQUM7TUFDdEMsSUFBTXNCLFNBQVMsR0FBR2pLLHlCQUF5QixDQUFDMkksT0FBTztNQUNuRDlILFVBQVUsQ0FBQyxJQUFJLENBQUM7TUFDaEJJLFFBQVEsQ0FBQyxLQUFLLENBQUM7TUFDZi9LLFNBQVMsQ0FBQztRQUNSMlMsSUFBSSxjQUFBeE4sTUFBQSxDQUFjNk8sa0JBQWtCLENBQUM1UixDQUFDLENBQUMsQ0FBRTtRQUN6Q3dRLE1BQU0sRUFBRTtNQUNWLENBQUMsQ0FBQyxDQUNDcUIsSUFBSSxDQUFDLFVBQUF0TSxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDbUwsSUFBSSxDQUFDLENBQUM7TUFBQSxDQUE4QixDQUFDLENBQ2pEbUIsSUFBSSxDQUFDLFVBQUF4RyxJQUFJLEVBQUk7UUFBQSxJQUFBeUcsV0FBQSxFQUFBQyxrQkFBQTtRQUNaLElBQUlKLFNBQVMsS0FBS2pLLHlCQUF5QixDQUFDMkksT0FBTyxFQUFFO1FBQ3JELElBQU0zQixXQUFXLEdBQUcsQ0FBQyxDQUFDckQsSUFBSSxDQUFDc0YsUUFBUSxJQUFJdEYsSUFBSSxDQUFDdUYsV0FBVyxJQUFJLElBQUk7UUFDL0R6SSxRQUFRLENBQUM1QixnQkFBZ0IsRUFBQXVMLFdBQUEsR0FBQ3pHLElBQUksQ0FBQ0EsSUFBSSxjQUFBeUcsV0FBQSxjQUFBQSxXQUFBLEdBQUksRUFBRSxFQUFFOVIsQ0FBQyxDQUFDLENBQUM7UUFDOUNtSixVQUFVLENBQUN1RixXQUFXLENBQUM7UUFDdkIvRSxjQUFjLEVBQUFvSSxrQkFBQSxHQUFDMUcsSUFBSSxDQUFDdUYsV0FBVyxjQUFBbUIsa0JBQUEsY0FBQUEsa0JBQUEsR0FBSSxDQUFDLENBQUM7UUFDckNoSSx5QkFBeUIsQ0FBQzJFLFdBQVcsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQzFEbkcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNqQkksUUFBUSxDQUFDLEtBQUssQ0FBQztNQUNqQixDQUFDLENBQUMsU0FDSSxDQUFDLFlBQU07UUFDWCxJQUFJZ0osU0FBUyxLQUFLaksseUJBQXlCLENBQUMySSxPQUFPLEVBQUU7UUFDckQxSCxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2RSLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDWkksVUFBVSxDQUFDLEtBQUssQ0FBQztNQUNuQixDQUFDLENBQUM7TUFDSjtJQUNGO0lBRUEsSUFBSSxDQUFDdkksQ0FBQyxFQUFFO0lBRVIsSUFBSUgsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUNyQjZMLGtCQUFrQixDQUFDO1FBQ2pCWixTQUFTLEVBQUU7VUFDVHBFLE1BQU0sRUFBRTtZQUFFakYsSUFBSSxFQUFFekI7VUFBRSxDQUFDO1VBQ25CME0sSUFBSSxFQUFFLENBQUM7VUFDUHNFLE9BQU8sRUFBRTtRQUNYO01BQ0YsQ0FBQyxDQUFDO01BQ0ZqSCx5QkFBeUIsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM3QyxDQUFDLE1BQU0sSUFBSWxLLElBQUksS0FBSyxNQUFNLEVBQUU7TUFDMUJvTSxtQkFBbUIsQ0FBQztRQUNsQm5CLFNBQVMsRUFBRTtVQUNUeUcsT0FBTyxFQUFFeFIsMEJBQTBCLENBQUNDLENBQUMsQ0FBQztVQUN0QzBNLElBQUksRUFBRTtRQUNSO01BQ0YsQ0FBQyxDQUFDO01BQ0YzQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQyxNQUFNO01BQ0wsSUFBTXdILE9BQU8sR0FBR3pSLG1CQUFtQixDQUFDRCxJQUFJLENBQUM7TUFDekMsSUFBTW1TLEtBQUssR0FBR3BTLHdCQUF3QixDQUFDQyxJQUFJLEVBQUUySyxXQUFXLENBQUM7TUFDekRVLG1CQUFtQixDQUFDO1FBQ2xCSixTQUFTLEVBQUFpRyxhQUFBO1VBQ1AvUSxDQUFDLEVBQURBLENBQUM7VUFDRHVSLE9BQU8sRUFBUEE7UUFBTyxHQUNIUyxLQUFLLEtBQUtsVCxTQUFTLEdBQUc7VUFBRWtULEtBQUssRUFBTEE7UUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BRTVDLENBQUMsQ0FBQztNQUNGakkseUJBQXlCLENBQUMsTUFBTSxDQUFDO01BQ2pDWixVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ25CO0VBQ0YsQ0FBQyxFQUFFLENBQ0RwQixvQkFBb0IsRUFDcEJsSSxJQUFJLEVBQ0oySyxXQUFXLEVBQ1hVLG1CQUFtQixFQUNuQlEsa0JBQWtCLEVBQ2xCTyxtQkFBbUIsRUFDbkIvQixrQkFBa0IsQ0FDbkIsQ0FBQzs7RUFFRjtFQUNBck4sU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJZ0QsSUFBSSxLQUFLLEtBQUssRUFBRTtJQUNwQixJQUFJQSxJQUFJLEtBQUssT0FBTyxFQUFFO0lBRXRCLElBQU1HLENBQUMsR0FBRytILG9CQUFvQixDQUFDMUgsSUFBSSxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDTCxDQUFDLEVBQUU7SUFDUitJLG1CQUFtQixDQUFDLEtBQUssQ0FBQztJQUUxQixJQUFJbEosSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUFBLElBQUFvUyxvQkFBQTtNQUNyQjFKLFVBQVUsQ0FBQ3NELGNBQWMsQ0FBQztNQUMxQixJQUFJQyxZQUFZLEVBQUU7UUFDaEJuRCxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2Q7TUFDRjtNQUNBLElBQUlpRCxXQUFXLGFBQVhBLFdBQVcsZ0JBQUFxRyxvQkFBQSxHQUFYckcsV0FBVyxDQUFFb0IsT0FBTyxjQUFBaUYsb0JBQUEsZUFBcEJBLG9CQUFBLENBQXNCNUcsSUFBSSxFQUFFO1FBQzlCbEQsUUFBUSxDQUFDeUQsV0FBVyxDQUFDb0IsT0FBTyxDQUFDM0IsSUFBSSxDQUFDeEUsR0FBRyxDQUFDLFVBQUFsRixDQUFDO1VBQUEsT0FBSUQsZUFBZSxDQUFDQyxDQUFDLEVBQUUzQixDQUFDLENBQUM7UUFBQSxFQUFDLENBQUM7UUFDbEU2TSxxQkFBcUIsQ0FBQ2pCLFdBQVcsQ0FBQztRQUNsQ2pELFFBQVEsQ0FBQyxLQUFLLENBQUM7TUFDakI7SUFDRixDQUFDLE1BQU0sSUFBSTlJLElBQUksS0FBSyxNQUFNLEVBQUU7TUFBQSxJQUFBcVMsZ0JBQUE7TUFDMUIzSixVQUFVLENBQUM2RCxZQUFZLENBQUM7TUFDeEIsSUFBSUMsVUFBVSxFQUFFO1FBQ2QxRCxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2Q7TUFDRjtNQUNBLElBQUl3RCxTQUFTLGFBQVRBLFNBQVMsZ0JBQUErRixnQkFBQSxHQUFUL0YsU0FBUyxDQUFFUSxLQUFLLGNBQUF1RixnQkFBQSxlQUFoQkEsZ0JBQUEsQ0FBa0I3RyxJQUFJLEVBQUU7UUFDMUIsSUFBTTJELE1BQU0sR0FBRzdDLFNBQVMsQ0FBQ1EsS0FBSyxDQUFDdEIsSUFBSSxDQUFDeEUsR0FBRyxDQUFDLFVBQUF0RSxDQUFDO1VBQUEsT0FBSUQsYUFBYSxDQUFDQyxDQUFDLEVBQUV2QyxDQUFDLENBQUM7UUFBQSxFQUFDO1FBQ2pFLElBQU1tUyxJQUFJLEdBQUdwVCxNQUFNLENBQUN3SSxPQUFPLENBQUN6RixFQUFFLENBQUM7UUFDL0IsSUFBTXNRLGNBQWMsR0FBR3BELE1BQU0sQ0FBQ3FELElBQUksQ0FBQyxVQUFBcEIsSUFBSTtVQUFBLE9BQUlsUyxNQUFNLENBQUNrUyxJQUFJLENBQUNuUCxFQUFFLENBQUMsS0FBS3FRLElBQUk7UUFBQSxFQUFDO1FBQ3BFLElBQU1yQyxTQUFTLEdBQUdkLE1BQU0sQ0FBQ3RJLE1BQU0sQ0FBQyxVQUFBdUssSUFBSTtVQUFBLE9BQUlsUyxNQUFNLENBQUNrUyxJQUFJLENBQUNuUCxFQUFFLENBQUMsS0FBS3FRLElBQUk7UUFBQSxFQUFDO1FBQ2pFLElBQU10QyxNQUFNLEdBQUd4TSxvQkFBb0IsQ0FBQ2tFLE9BQU8sRUFBRXZILENBQUMsRUFBRXlILENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZFVSxRQUFRLENBQUNpSyxjQUFjLElBQUl2QyxNQUFNLEVBQUE5TSxNQUFBLENBQUF5TyxrQkFBQSxDQUFLMUIsU0FBUyxLQUFJZCxNQUFNLENBQUM7UUFDMUQxQyxtQkFBbUIsQ0FBQ0gsU0FBUyxDQUFDO1FBQzlCeEQsUUFBUSxDQUFDLEtBQUssQ0FBQztNQUNqQjtJQUNGLENBQUMsTUFBTTtNQUNMSixVQUFVLENBQUMrQyxhQUFhLENBQUM7TUFDekIsSUFBSUMsV0FBVyxFQUFFO1FBQ2Y1QyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2Q7TUFDRjtNQUNBLElBQUl5QyxVQUFVLGFBQVZBLFVBQVUsZUFBVkEsVUFBVSxDQUFFa0gsTUFBTSxFQUFFO1FBQ3RCbkssUUFBUSxDQUFDaUQsVUFBVSxDQUFDa0gsTUFBTSxDQUFDekwsR0FBRyxDQUFDLFVBQUF0QixDQUFDO1VBQUEsT0FBSUQsZUFBZSxDQUFDQyxDQUFDLEVBQUUxRixJQUFJLEVBQUVHLENBQUMsRUFBRThELHdCQUF3QixDQUFDO1FBQUEsRUFBQyxDQUFDO1FBQzNGcUYsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNqQlIsUUFBUSxDQUFDLEtBQUssQ0FBQztNQUNqQjtJQUNGO0VBQ0YsQ0FBQyxFQUFFLENBQ0R5QyxVQUFVLEVBQ1ZRLFdBQVcsRUFDWE8sU0FBUyxFQUNUYixhQUFhLEVBQ2JPLGNBQWMsRUFDZE8sWUFBWSxFQUNaYixXQUFXLEVBQ1hPLFlBQVksRUFDWk8sVUFBVSxFQUNWdEUsb0JBQW9CLEVBQ3BCbEksSUFBSSxFQUNKZ04scUJBQXFCLEVBQ3JCUCxtQkFBbUIsRUFDbkJ4SSx3QkFBd0IsRUFDeEJ5RCxPQUFPLEVBQ1BFLENBQUMsQ0FDRixDQUFDO0VBRUYsSUFBTThLLFFBQVEsR0FBRzNWLFdBQVcsY0FBQXFSLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBQyxTQUFBcUUsU0FBQTtJQUFBLElBQUFDLGVBQUEsRUFBQUMsUUFBQSxFQUFBMVMsQ0FBQSxFQUFBMlMsbUJBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsV0FBQSxFQUFBQyxzQkFBQSxFQUFBekgsSUFBQSxFQUFBMEgsU0FBQSxFQUFBQyxtQkFBQSxFQUFBQyxjQUFBLEVBQUFDLHFCQUFBLEVBQUFDLE1BQUEsRUFBQUMsVUFBQSxFQUFBQyxxQkFBQSxFQUFBQyxpQkFBQSxFQUFBNU0sTUFBQSxFQUFBNk0sc0JBQUEsRUFBQUMsTUFBQSxFQUFBQyxXQUFBLEVBQUFDLG9CQUFBLEVBQUFDLGVBQUEsRUFBQTlFLGVBQUEsRUFBQStFLHNCQUFBLEVBQUFDLE1BQUEsRUFBQUMsV0FBQSxFQUFBQyxlQUFBLEVBQUFDLHFCQUFBLEVBQUFDLFdBQUEsRUFBQUMsTUFBQSxFQUFBQyxTQUFBLEVBQUFDLGFBQUEsRUFBQUMsU0FBQSxFQUFBM0YsV0FBQSxFQUFBNEYsV0FBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQXJHLG1CQUFBLENBQUErQixJQUFBLFdBQUF1RSxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQXJFLElBQUEsR0FBQXFFLFNBQUEsQ0FBQXBFLElBQUE7UUFBQTtVQUFBLE1BQ3ZCOUcsYUFBYSxJQUFJLENBQUNKLE9BQU8sSUFBSVksc0JBQXNCLEtBQUssTUFBTTtZQUFBMEssU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0UsU0FBQSxDQUFBbEUsTUFBQTtRQUFBO1VBRzVEbUMsZUFBZSxHQUFHNVUsb0JBQW9CLENBQUM2TCxXQUFXLEVBQUUsQ0FBQyxDQUFDO1VBQ3REZ0osUUFBUSxHQUFHRCxlQUFlLEdBQUcsQ0FBQztVQUM5QnpTLENBQUMsR0FBRytILG9CQUFvQixDQUFDMUgsSUFBSSxDQUFDLENBQUM7VUFDL0JzUyxtQkFBbUIsR0FBR2pMLHlCQUF5QixDQUFDMkksT0FBTztVQUM3RDlHLGdCQUFnQixDQUFDLElBQUksQ0FBQztVQUFBaUwsU0FBQSxDQUFBckUsSUFBQTtVQUFBLE1BRWhCckcsc0JBQXNCLEtBQUssT0FBTztZQUFBMEssU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQW9FLFNBQUEsQ0FBQXBFLElBQUE7VUFBQSxPQUNibkUsbUJBQW1CLENBQUM7WUFDekNuQixTQUFTLEVBQUU7Y0FDVHlHLE9BQU8sRUFBRXhSLDBCQUEwQixDQUFDQyxDQUFDLENBQUM7Y0FDdEMwTSxJQUFJLEVBQUVnRztZQUNSO1VBQ0YsQ0FBQyxDQUFDO1FBQUE7VUFBQUksc0JBQUEsR0FBQTBCLFNBQUEsQ0FBQS9ELElBQUE7VUFMTXBGLElBQUksR0FBQXlILHNCQUFBLENBQUp6SCxJQUFJO1VBQUEsTUFNUnNILG1CQUFtQixLQUFLakwseUJBQXlCLENBQUMySSxPQUFPO1lBQUFtRSxTQUFBLENBQUFwRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFvRSxTQUFBLENBQUFsRSxNQUFBO1FBQUE7VUFDdkR5QyxTQUFTLEdBQUcsRUFBQUgsZ0JBQUEsR0FBQ3ZILElBQUksYUFBSkEsSUFBSSxnQkFBQXdILFdBQUEsR0FBSnhILElBQUksQ0FBRXNCLEtBQUssY0FBQWtHLFdBQUEsdUJBQVhBLFdBQUEsQ0FBYXhILElBQUksY0FBQXVILGdCQUFBLGNBQUFBLGdCQUFBLEdBQUksRUFBRSxFQUFFL0wsR0FBRyxDQUFDLFVBQUF0RSxDQUFDO1lBQUEsT0FBSUQsYUFBYSxDQUFDQyxDQUFDLEVBQUV2QyxDQUFDLENBQUM7VUFBQSxFQUFDO1VBQ3pFbUksUUFBUSxDQUFDLFVBQUFnSSxJQUFJLEVBQUk7WUFDZixJQUFJLENBQUNuUSxDQUFDLEVBQUU7Y0FBQSxJQUFBeVUsTUFBQTtjQUNOLElBQU01RSxNQUFNLEdBQ1YsRUFBQTRFLE1BQUEsR0FBQXRFLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBQXNFLE1BQUEsdUJBQVBBLE1BQUEsQ0FBUzVVLElBQUksTUFBSyxNQUFNLEdBQUdzUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUc5TSxvQkFBb0IsQ0FBQ2tFLE9BQU8sRUFBRSxFQUFFLEVBQUVFLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2NBQ2hHLElBQU1pTixZQUFXLEdBQUcsSUFBSUMsR0FBRyxDQUFDeEUsSUFBSSxDQUFDdEosR0FBRyxDQUFDLFVBQUFvSyxJQUFJO2dCQUFBLE9BQUlsUyxNQUFNLENBQUNrUyxJQUFJLENBQUNuUCxFQUFFLENBQUM7Y0FBQSxFQUFDLENBQUM7Y0FDOUQsSUFBTThTLFNBQVEsR0FBRzdCLFNBQVMsQ0FBQ3JNLE1BQU0sQ0FBQyxVQUFBdUssSUFBSTtnQkFBQSxPQUFJLENBQUN5RCxZQUFXLENBQUNHLEdBQUcsQ0FBQzlWLE1BQU0sQ0FBQ2tTLElBQUksQ0FBQ25QLEVBQUUsQ0FBQyxDQUFDO2NBQUEsRUFBQztjQUM1RSxJQUFNZ08sU0FBUyxHQUFHSyxJQUFJLENBQUN6SixNQUFNLENBQUMsVUFBQXVLLElBQUk7Z0JBQUEsT0FBSWxTLE1BQU0sQ0FBQ2tTLElBQUksQ0FBQ25QLEVBQUUsQ0FBQyxLQUFLL0MsTUFBTSxDQUFDOFEsTUFBTSxDQUFDL04sRUFBRSxDQUFDO2NBQUEsRUFBQztjQUM1RSxRQUFRK04sTUFBTSxFQUFBOU0sTUFBQSxDQUFBeU8sa0JBQUEsQ0FBSzFCLFNBQVMsR0FBQTBCLGtCQUFBLENBQUtvRCxTQUFRO1lBQzNDO1lBQ0EsSUFBTUYsV0FBVyxHQUFHLElBQUlDLEdBQUcsQ0FBQ3hFLElBQUksQ0FBQ3RKLEdBQUcsQ0FBQyxVQUFBb0ssSUFBSTtjQUFBLFVBQUFsTyxNQUFBLENBQU9rTyxJQUFJLENBQUNwUixJQUFJLE9BQUFrRCxNQUFBLENBQUlrTyxJQUFJLENBQUNuUCxFQUFFO1lBQUEsQ0FBRSxDQUFDLENBQUM7WUFDeEUsSUFBTThTLFFBQVEsR0FBRzdCLFNBQVMsQ0FBQ3JNLE1BQU0sQ0FBQyxVQUFBdUssSUFBSTtjQUFBLE9BQUksQ0FBQ3lELFdBQVcsQ0FBQ0csR0FBRyxJQUFBOVIsTUFBQSxDQUFJa08sSUFBSSxDQUFDcFIsSUFBSSxPQUFBa0QsTUFBQSxDQUFJa08sSUFBSSxDQUFDblAsRUFBRSxDQUFFLENBQUM7WUFBQSxFQUFDO1lBQ3RGLFVBQUFpQixNQUFBLENBQUF5TyxrQkFBQSxDQUFXckIsSUFBSSxHQUFBcUIsa0JBQUEsQ0FBS29ELFFBQVE7VUFDOUIsQ0FBQyxDQUFDO1VBQ0Z0SSxtQkFBbUIsQ0FBQ2pCLElBQUksQ0FBQztVQUFBbUosU0FBQSxDQUFBcEUsSUFBQTtVQUFBO1FBQUE7VUFBQSxNQUNoQnRHLHNCQUFzQixLQUFLLGdCQUFnQjtZQUFBMEssU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQW9FLFNBQUEsQ0FBQXBFLElBQUE7VUFBQSxPQUM3QjFFLGtCQUFrQixDQUFDO1lBQ3hDWixTQUFTLEVBQUU7Y0FDVHBFLE1BQU0sRUFBRTtnQkFBRWpGLElBQUksRUFBRXpCO2NBQUUsQ0FBQztjQUNuQjBNLElBQUksRUFBRWdHLFFBQVE7Y0FDZDFCLE9BQU8sRUFBRTtZQUNYO1VBQ0YsQ0FBQyxDQUFDO1FBQUE7VUFBQWtDLHFCQUFBLEdBQUFzQixTQUFBLENBQUEvRCxJQUFBO1VBTk1wRixNQUFJLEdBQUE2SCxxQkFBQSxDQUFKN0gsSUFBSTtVQUFBLE1BT1JzSCxtQkFBbUIsS0FBS2pMLHlCQUF5QixDQUFDMkksT0FBTztZQUFBbUUsU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0UsU0FBQSxDQUFBbEUsTUFBQTtRQUFBO1VBQ3ZEeUMsVUFBUyxHQUFHLEVBQUFDLG1CQUFBLEdBQUMzSCxNQUFJLGFBQUpBLE1BQUksZ0JBQUE0SCxjQUFBLEdBQUo1SCxNQUFJLENBQUUyQixPQUFPLGNBQUFpRyxjQUFBLHVCQUFiQSxjQUFBLENBQWU1SCxJQUFJLGNBQUEySCxtQkFBQSxjQUFBQSxtQkFBQSxHQUFJLEVBQUUsRUFBRW5NLEdBQUcsQ0FBQyxVQUFBbEYsQ0FBQztZQUFBLE9BQUlELGVBQWUsQ0FBQ0MsQ0FBQyxFQUFFM0IsQ0FBQyxDQUFDO1VBQUEsRUFBQztVQUM3RW1JLFFBQVEsQ0FBQyxVQUFBZ0ksSUFBSSxFQUFJO1lBQ2YsSUFBTXVFLFdBQVcsR0FBRyxJQUFJQyxHQUFHLENBQUN4RSxJQUFJLENBQUN0SixHQUFHLENBQUMsVUFBQW9LLElBQUk7Y0FBQSxVQUFBbE8sTUFBQSxDQUFPa08sSUFBSSxDQUFDcFIsSUFBSSxPQUFBa0QsTUFBQSxDQUFJa08sSUFBSSxDQUFDblAsRUFBRTtZQUFBLENBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQU04UyxRQUFRLEdBQUc3QixVQUFTLENBQUNyTSxNQUFNLENBQUMsVUFBQXVLLElBQUk7Y0FBQSxPQUFJLENBQUN5RCxXQUFXLENBQUNHLEdBQUcsSUFBQTlSLE1BQUEsQ0FBSWtPLElBQUksQ0FBQ3BSLElBQUksT0FBQWtELE1BQUEsQ0FBSWtPLElBQUksQ0FBQ25QLEVBQUUsQ0FBRSxDQUFDO1lBQUEsRUFBQztZQUN0RixVQUFBaUIsTUFBQSxDQUFBeU8sa0JBQUEsQ0FBV3JCLElBQUksR0FBQXFCLGtCQUFBLENBQUtvRCxRQUFRO1VBQzlCLENBQUMsQ0FBQztVQUNGL0gscUJBQXFCLENBQUN4QixNQUFJLENBQUM7VUFBQW1KLFNBQUEsQ0FBQXBFLElBQUE7VUFBQTtRQUFBO1VBQUEsTUFDbEJ0RyxzQkFBc0IsS0FBSyxlQUFlO1lBQUEwSyxTQUFBLENBQUFwRSxJQUFBO1lBQUE7VUFBQTtVQUM3QzFKLE1BQWdDLEdBQUcsQ0FBQyxDQUFDO1VBQzNDLElBQUk4RCxXQUFXLENBQUN2TCxTQUFTLEtBQUssSUFBSSxJQUFJdUwsV0FBVyxDQUFDdkwsU0FBUyxLQUFLSCxTQUFTLElBQUkwTCxXQUFXLENBQUN2TCxTQUFTLEtBQUssRUFBRSxFQUFFO1lBQ3pHeUgsTUFBTSxDQUFDd0ssVUFBVSxHQUFHLENBQUNuUyxNQUFNLENBQUN5TCxXQUFXLENBQUN2TCxTQUFTLENBQUMsQ0FBQztVQUNyRDtVQUNBLElBQUl1TCxXQUFXLENBQUMzTCxRQUFRLEtBQUssSUFBSSxJQUFJMkwsV0FBVyxDQUFDM0wsUUFBUSxLQUFLQyxTQUFTLElBQUkwTCxXQUFXLENBQUMzTCxRQUFRLEtBQUssRUFBRSxFQUFFO1lBQ3RHNkgsTUFBTSxDQUFDeUssU0FBUyxHQUFHLENBQUNwUyxNQUFNLENBQUN5TCxXQUFXLENBQUMzTCxRQUFRLENBQUMsQ0FBQztVQUNuRDtVQUFDMlYsU0FBQSxDQUFBcEUsSUFBQTtVQUFBLE9BQ3NCeEMsdUJBQXVCLENBQUM7WUFDN0M5QyxTQUFTLEVBQUU7Y0FDVHBFLE1BQU0sRUFBQXFLLGFBQUE7Z0JBQUl2UyxRQUFRLEVBQUU7Y0FBSyxHQUFLa0ksTUFBTSxDQUFFO2NBQ3RDMEssVUFBVSxFQUFFO2dCQUFFQyxNQUFNLEVBQUUsQ0FBQ3FCLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRTtnQkFBRXBCLElBQUksRUFBRTtjQUFHO1lBQ3REO1VBQ0YsQ0FBQyxDQUFDO1FBQUE7VUFBQWlDLHNCQUFBLEdBQUFpQixTQUFBLENBQUEvRCxJQUFBO1VBTE1wRixNQUFJLEdBQUFrSSxzQkFBQSxDQUFKbEksSUFBSTtVQUFBLE1BTVJzSCxtQkFBbUIsS0FBS2pMLHlCQUF5QixDQUFDMkksT0FBTztZQUFBbUUsU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0UsU0FBQSxDQUFBbEUsTUFBQTtRQUFBO1VBQ3ZEeUMsV0FBUyxHQUFHLEVBQUFNLHFCQUFBLEdBQUNoSSxNQUFJLGFBQUpBLE1BQUksZ0JBQUFpSSxpQkFBQSxHQUFKakksTUFBSSxDQUFFZ0MsVUFBVSxjQUFBaUcsaUJBQUEsdUJBQWhCQSxpQkFBQSxDQUFrQmpJLElBQUksY0FBQWdJLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksRUFBRSxFQUM1Q3hNLEdBQUcsQ0FBQzNDLHlCQUF5QixDQUFDLENBQzlCd0MsTUFBTSxDQUFDLFVBQUN1SyxJQUFJO1lBQUEsT0FBNkJBLElBQUksS0FBSyxJQUFJO1VBQUEsRUFBQyxDQUN2RHBLLEdBQUcsQ0FBQyxVQUFBcEksSUFBSTtZQUFBLE9BQUltRixtQkFBbUIsQ0FBQ25GLElBQUksRUFBRSxFQUFFLEVBQUVxRix3QkFBd0IsQ0FBQztVQUFBLEVBQUM7VUFDdkVxRSxRQUFRLENBQUMsVUFBQWdJLElBQUksRUFBSTtZQUNmLElBQU11RSxXQUFXLEdBQUcsSUFBSUMsR0FBRyxDQUFDeEUsSUFBSSxDQUFDdEosR0FBRyxDQUFDLFVBQUFvSyxJQUFJO2NBQUEsVUFBQWxPLE1BQUEsQ0FBT2tPLElBQUksQ0FBQ3BSLElBQUksT0FBQWtELE1BQUEsQ0FBSWtPLElBQUksQ0FBQ25QLEVBQUU7WUFBQSxDQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFNOFMsUUFBUSxHQUFHN0IsV0FBUyxDQUFDck0sTUFBTSxDQUFDLFVBQUF1SyxJQUFJO2NBQUEsT0FBSSxDQUFDeUQsV0FBVyxDQUFDRyxHQUFHLElBQUE5UixNQUFBLENBQUlrTyxJQUFJLENBQUNwUixJQUFJLE9BQUFrRCxNQUFBLENBQUlrTyxJQUFJLENBQUNuUCxFQUFFLENBQUUsQ0FBQztZQUFBLEVBQUM7WUFDdEYsVUFBQWlCLE1BQUEsQ0FBQXlPLGtCQUFBLENBQVdyQixJQUFJLEdBQUFxQixrQkFBQSxDQUFLb0QsUUFBUTtVQUM5QixDQUFDLENBQUM7VUFDRjNILDBCQUEwQixDQUFDNUIsTUFBSSxDQUFDO1VBQUFtSixTQUFBLENBQUFwRSxJQUFBO1VBQUE7UUFBQTtVQUFBLE1BQ3ZCdEcsc0JBQXNCLEtBQUssa0JBQWtCO1lBQUEwSyxTQUFBLENBQUFwRSxJQUFBO1lBQUE7VUFBQTtVQUNoRHZCLGVBQWUsR0FDbkJyRSxXQUFXLENBQUMzTCxRQUFRLEtBQUssSUFBSSxJQUFJMkwsV0FBVyxDQUFDM0wsUUFBUSxLQUFLQyxTQUFTLElBQUkwTCxXQUFXLENBQUMzTCxRQUFRLEtBQUssRUFBRSxHQUM5RjtZQUFFaVMsU0FBUyxFQUFFLENBQUMvUixNQUFNLENBQUN5TCxXQUFXLENBQUMzTCxRQUFRLENBQUM7VUFBRSxDQUFDLEdBQzdDQyxTQUFTO1VBQUEwVixTQUFBLENBQUFwRSxJQUFBO1VBQUEsT0FDUXJDLHFCQUFxQixDQUFDO1lBQzNDakQsU0FBUyxFQUFBaUcsYUFBQSxDQUFBQSxhQUFBLEtBQ0hsQyxlQUFlLEdBQUc7Y0FBRTdOLFNBQVMsRUFBRTZOO1lBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7Y0FDekRuQyxJQUFJLEVBQUVnRyxRQUFRO2NBQ2QxQixPQUFPLEVBQUU7WUFBRTtVQUVmLENBQUMsQ0FBQztRQUFBO1VBQUE0QyxzQkFBQSxHQUFBWSxTQUFBLENBQUEvRCxJQUFBO1VBTk1wRixNQUFJLEdBQUF1SSxzQkFBQSxDQUFKdkksSUFBSTtVQUFBLE1BT1JzSCxtQkFBbUIsS0FBS2pMLHlCQUF5QixDQUFDMkksT0FBTztZQUFBbUUsU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0UsU0FBQSxDQUFBbEUsTUFBQTtRQUFBO1VBQ3ZEeUMsV0FBUyxHQUFHLEVBQUFXLG9CQUFBLEdBQUNySSxNQUFJLGFBQUpBLE1BQUksZ0JBQUFzSSxlQUFBLEdBQUp0SSxNQUFJLENBQUVvQyxRQUFRLGNBQUFrRyxlQUFBLHVCQUFkQSxlQUFBLENBQWdCdEksSUFBSSxjQUFBcUksb0JBQUEsY0FBQUEsb0JBQUEsR0FBSSxFQUFFLEVBQzFDN00sR0FBRyxDQUFDL0IsK0JBQStCLENBQUMsQ0FDcEM0QixNQUFNLENBQUMsVUFBQ3VLLElBQUk7WUFBQSxPQUE4QkEsSUFBSSxLQUFLLElBQUk7VUFBQSxFQUFDLENBQ3hEcEssR0FBRyxDQUFDLFVBQUFvSyxJQUFJO1lBQUEsT0FBSTNMLGVBQWUsQ0FBQzJMLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDO1VBQUEsRUFBQztVQUNwRDlJLFFBQVEsQ0FBQyxVQUFBZ0ksSUFBSSxFQUFJO1lBQ2YsSUFBTXVFLFdBQVcsR0FBRyxJQUFJQyxHQUFHLENBQUN4RSxJQUFJLENBQUN0SixHQUFHLENBQUMsVUFBQW9LLElBQUk7Y0FBQSxVQUFBbE8sTUFBQSxDQUFPa08sSUFBSSxDQUFDcFIsSUFBSSxPQUFBa0QsTUFBQSxDQUFJa08sSUFBSSxDQUFDblAsRUFBRTtZQUFBLENBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQU04UyxRQUFRLEdBQUc3QixXQUFTLENBQUNyTSxNQUFNLENBQUMsVUFBQXVLLElBQUk7Y0FBQSxPQUFJLENBQUN5RCxXQUFXLENBQUNHLEdBQUcsSUFBQTlSLE1BQUEsQ0FBSWtPLElBQUksQ0FBQ3BSLElBQUksT0FBQWtELE1BQUEsQ0FBSWtPLElBQUksQ0FBQ25QLEVBQUUsQ0FBRSxDQUFDO1lBQUEsRUFBQztZQUN0RixVQUFBaUIsTUFBQSxDQUFBeU8sa0JBQUEsQ0FBV3JCLElBQUksR0FBQXFCLGtCQUFBLENBQUtvRCxRQUFRO1VBQzlCLENBQUMsQ0FBQztVQUNGdEgsNkJBQTZCLENBQUNqQyxNQUFJLENBQUM7VUFBQW1KLFNBQUEsQ0FBQXBFLElBQUE7VUFBQTtRQUFBO1VBQUEsTUFDMUJ0RyxzQkFBc0IsS0FBSyxRQUFRO1lBQUEwSyxTQUFBLENBQUFwRSxJQUFBO1lBQUE7VUFBQTtVQUN0QzZELFdBQVcsR0FBR3ZLLFdBQVc7VUFDekJ3SyxNQUFNLEdBQUduTSxvQkFBb0IsQ0FBQzFILElBQUksQ0FBQyxDQUFDO1VBQUEsTUFDdEM2VCxNQUFNLElBQUlBLE1BQU0sQ0FBQzFVLE1BQU0sR0FBRy9CLDhCQUE4QjtZQUFBK1csU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0UsU0FBQSxDQUFBbEUsTUFBQTtRQUFBO1VBQ3RENkQsU0FBUyxHQUFHRCxNQUFNLG9CQUFBblIsTUFBQSxDQUNIa1IsV0FBVyxTQUFBbFIsTUFBQSxDQUFNNk8sa0JBQWtCLENBQUNzQyxNQUFNLENBQUMscUJBQUFuUixNQUFBLENBQzNDa1IsV0FBVyxDQUFFO1VBQUFPLFNBQUEsQ0FBQXBFLElBQUE7VUFBQSxPQUNOeFMsU0FBUyxDQUFDO1lBQUUyUyxJQUFJLEVBQUU0RCxTQUFTO1lBQUUzRCxNQUFNLEVBQUU7VUFBTSxDQUFDLENBQUM7UUFBQTtVQUFuRTRELGFBQWEsR0FBQUksU0FBQSxDQUFBL0QsSUFBQTtVQUFBK0QsU0FBQSxDQUFBcEUsSUFBQTtVQUFBLE9BQ3dCZ0UsYUFBYSxDQUFDMUQsSUFBSSxDQUFDLENBQUM7UUFBQTtVQUF6RDJELFNBQTRCLEdBQUFHLFNBQUEsQ0FBQS9ELElBQUE7VUFBQSxNQUM5QmtDLG1CQUFtQixLQUFLakwseUJBQXlCLENBQUMySSxPQUFPO1lBQUFtRSxTQUFBLENBQUFwRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFvRSxTQUFBLENBQUFsRSxNQUFBO1FBQUE7VUFDdkQ1QixXQUFXLEdBQUcsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDMUQsUUFBUSxJQUFJMEQsU0FBUyxDQUFDekQsV0FBVyxJQUFJLElBQUk7VUFDbkVtQyxXQUFTLEdBQUd4TSxnQkFBZ0IsRUFBQXdOLGVBQUEsR0FBQ00sU0FBUyxDQUFDaEosSUFBSSxjQUFBMEksZUFBQSxjQUFBQSxlQUFBLEdBQUksRUFBRSxFQUFFRyxNQUFNLENBQUM7VUFDaEUvTCxRQUFRLENBQUMsVUFBQWdJLElBQUksRUFBSTtZQUNmLElBQU11RSxXQUFXLEdBQUcsSUFBSUMsR0FBRyxDQUFDeEUsSUFBSSxDQUFDdEosR0FBRyxDQUFDLFVBQUFvSyxJQUFJO2NBQUEsVUFBQWxPLE1BQUEsQ0FBT2tPLElBQUksQ0FBQ3BSLElBQUksT0FBQWtELE1BQUEsQ0FBSWtPLElBQUksQ0FBQ25QLEVBQUU7WUFBQSxDQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFNOFMsUUFBUSxHQUFHN0IsV0FBUyxDQUFDck0sTUFBTSxDQUFDLFVBQUF1SyxJQUFJO2NBQUEsT0FBSSxDQUFDeUQsV0FBVyxDQUFDRyxHQUFHLElBQUE5UixNQUFBLENBQUlrTyxJQUFJLENBQUNwUixJQUFJLE9BQUFrRCxNQUFBLENBQUlrTyxJQUFJLENBQUNuUCxFQUFFLENBQUUsQ0FBQztZQUFBLEVBQUM7WUFDdEYsVUFBQWlCLE1BQUEsQ0FBQXlPLGtCQUFBLENBQVdyQixJQUFJLEdBQUFxQixrQkFBQSxDQUFLb0QsUUFBUTtVQUM5QixDQUFDLENBQUM7VUFDRnpMLFVBQVUsQ0FBQ3VGLFdBQVcsQ0FBQztVQUN2Qi9FLGNBQWMsRUFBQXFLLHFCQUFBLEdBQUNLLFNBQVMsQ0FBQ3pELFdBQVcsY0FBQW9ELHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksQ0FBQyxDQUFDO1VBQzFDaksseUJBQXlCLENBQUMyRSxXQUFXLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUFBO1VBQUE4RixTQUFBLENBQUFwRSxJQUFBO1VBQUE7UUFBQTtVQUFBb0UsU0FBQSxDQUFBckUsSUFBQTtVQUFBb0UsR0FBQSxHQUFBQyxTQUFBO1VBQUEsTUFHeEQ3QixtQkFBbUIsS0FBS2pMLHlCQUF5QixDQUFDMkksT0FBTztZQUFBbUUsU0FBQSxDQUFBcEUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0UsU0FBQSxDQUFBbEUsTUFBQTtRQUFBO1VBQzdEd0UsT0FBTyxDQUFDcE0sS0FBSyxDQUFDLG1DQUFtQyxFQUFFO1lBQ2pEcU0sTUFBTSxFQUFFakwsc0JBQXNCO1lBQzlCNEksUUFBUSxFQUFSQSxRQUFRO1lBQ1JoSyxLQUFLLEVBQUE2TDtVQUNQLENBQUMsQ0FBQztVQUNGO1VBQ0E1TCxRQUFRLENBQUMsSUFBSSxDQUFDO1VBQ2RRLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFBQTtVQUFBcUwsU0FBQSxDQUFBckUsSUFBQTtVQUVqQjVHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztVQUFBLE9BQUFpTCxTQUFBLENBQUEzRCxNQUFBO1FBQUE7UUFBQTtVQUFBLE9BQUEyRCxTQUFBLENBQUEvQyxJQUFBO01BQUE7SUFBQSxHQUFBZSxRQUFBO0VBQUEsQ0FFMUIsSUFBRSxDQUNEbEosYUFBYSxFQUNiSixPQUFPLEVBQ1BRLFdBQVcsRUFDWEksc0JBQXNCLEVBQ3RCL0Isb0JBQW9CLEVBQ3BCa0UsbUJBQW1CLEVBQ25CUCxrQkFBa0IsRUFDbEJrQyx1QkFBdUIsRUFDdkJHLHFCQUFxQixFQUNyQnZELFdBQVcsQ0FBQ3ZMLFNBQVMsRUFDckJ1TCxXQUFXLENBQUMzTCxRQUFRLEVBQ3BCaUYsd0JBQXdCLEVBQ3hCeUQsT0FBTyxFQUNQRSxDQUFDLEVBQ0RvRixxQkFBcUIsRUFDckJQLG1CQUFtQixFQUNuQlcsMEJBQTBCLEVBQzFCSyw2QkFBNkIsQ0FDOUIsQ0FBQzs7RUFFRjtFQUNBO0VBQ0EsSUFBTTBILGNBQWMsR0FBR2pZLE1BQU0sQ0FBQ2lSLFdBQVcsQ0FBQztFQUMxQ25SLFNBQVMsQ0FBQyxZQUFNO0lBQ2RtWSxjQUFjLENBQUMzRSxPQUFPLEdBQUdyQyxXQUFXO0VBQ3RDLENBQUMsRUFBRSxDQUFDQSxXQUFXLENBQUMsQ0FBQzs7RUFFakI7RUFDQTtFQUNBLElBQU1pSCxjQUFjLEdBQ2xCcFYsSUFBSSxLQUFLLE1BQU0sSUFBSUEsSUFBSSxLQUFLLE9BQU8sR0FDL0JBLElBQUksTUFBQWtELE1BQUEsQ0FDRGxELElBQUksT0FBQWtELE1BQUEsRUFBQXFFLHFCQUFBLEdBQUlvRCxXQUFXLENBQUN2TCxTQUFTLGNBQUFtSSxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLEVBQUUsT0FBQXJFLE1BQUEsRUFBQXNFLHFCQUFBLEdBQUltRCxXQUFXLENBQUMzTCxRQUFRLGNBQUF3SSxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLEVBQUUsT0FBQXRFLE1BQUEsRUFBQXVFLHFCQUFBLEdBQUlrRCxXQUFXLENBQUN0TCxXQUFXLGNBQUFvSSxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLEVBQUUsT0FBQXZFLE1BQUEsQ0FBSXFILFdBQVcsQ0FBRTs7RUFFNUg7RUFDQXZOLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBSSxDQUFDa0wsb0JBQW9CLENBQUMxSCxJQUFJLENBQUMsQ0FBQyxFQUFFO01BQ2hDMlUsY0FBYyxDQUFDM0UsT0FBTyxDQUFDLENBQUM7SUFDMUI7RUFDRixDQUFDLEVBQUUsQ0FBQ3RJLG9CQUFvQixFQUFFa04sY0FBYyxDQUFDLENBQUM7RUFFMUMsT0FBTztJQUNML00sS0FBSyxFQUFMQSxLQUFLO0lBQ0xJLE9BQU8sRUFBUEEsT0FBTztJQUNQSSxLQUFLLEVBQUxBLEtBQUs7SUFDTEksZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7SUFDaEJJLE9BQU8sRUFBUEEsT0FBTztJQUNQSSxhQUFhLEVBQWJBLGFBQWE7SUFDYmlKLFFBQVEsRUFBUkEsUUFBUTtJQUNSOVIsV0FBVyxFQUFYQSxXQUFXO0lBQ1h5VSxpQkFBaUIsRUFBRXBOLGNBQWM7SUFDakNrRyxXQUFXLEVBQVhBLFdBQVc7SUFDWDlELGtCQUFrQixFQUFsQkE7RUFDRixDQUFDO0FBQ0gsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==