@projectcor/maia-components 2.11.110-0 → 2.26.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 (667) hide show
  1. package/README.md +2 -0
  2. package/package.json +3 -3
  3. package/CHANGELOG.md +0 -642
  4. package/lib/App.js +0 -55
  5. package/lib/components/atoms/ActionableButton.js +0 -60
  6. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +0 -89
  7. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +0 -21
  8. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +0 -9
  9. package/lib/components/atoms/AgentActivityIndicator/index.js +0 -2
  10. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +0 -209
  11. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +0 -93
  12. package/lib/components/atoms/ApprovalBox/index.js +0 -2
  13. package/lib/components/atoms/AttachmentCard/AttachmentCard.js +0 -218
  14. package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +0 -52
  15. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +0 -448
  16. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +0 -58
  17. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +0 -55
  18. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +0 -14
  19. package/lib/components/atoms/AttachmentCard/index.js +0 -4
  20. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +0 -442
  21. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +0 -119
  22. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +0 -222
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +0 -313
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +0 -128
  25. package/lib/components/atoms/AttachmentPreviewModal/index.js +0 -2
  26. package/lib/components/atoms/Backdrop/Backdrop.js +0 -17
  27. package/lib/components/atoms/Backdrop/Backdrop.styles.js +0 -9
  28. package/lib/components/atoms/Backdrop/index.js +0 -2
  29. package/lib/components/atoms/CardItem.js +0 -7
  30. package/lib/components/atoms/CardMenu/CardMenu.js +0 -131
  31. package/lib/components/atoms/CardMenu/index.js +0 -2
  32. package/lib/components/atoms/CardMenu/styles.js +0 -21
  33. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +0 -77
  34. package/lib/components/atoms/ChatClientSelector/index.js +0 -2
  35. package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +0 -9
  36. package/lib/components/atoms/ChatDisclaimerMessage/index.js +0 -2
  37. package/lib/components/atoms/ChatDisclaimerMessage/styles.js +0 -6
  38. package/lib/components/atoms/Checkbox/Checkbox.js +0 -34
  39. package/lib/components/atoms/Checkbox/index.js +0 -2
  40. package/lib/components/atoms/Checkbox/styles.js +0 -39
  41. package/lib/components/atoms/Chip/Chip.js +0 -150
  42. package/lib/components/atoms/Chip/index.js +0 -2
  43. package/lib/components/atoms/Chip/styles.js +0 -43
  44. package/lib/components/atoms/ChipLlm/ChipLlm.js +0 -45
  45. package/lib/components/atoms/ChipLlm/ChipLlm.style.js +0 -21
  46. package/lib/components/atoms/ChipLlm/index.js +0 -2
  47. package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +0 -2
  48. package/lib/components/atoms/ChipStatus/ChipStatus.js +0 -14
  49. package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +0 -27
  50. package/lib/components/atoms/ChipStatus/index.js +0 -2
  51. package/lib/components/atoms/ClearButton.js +0 -6
  52. package/lib/components/atoms/ClientSelector/ClientSelector.js +0 -146
  53. package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +0 -15
  54. package/lib/components/atoms/ClientSelector/index.js +0 -2
  55. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +0 -38
  56. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +0 -188
  57. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +0 -39
  58. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +0 -445
  59. package/lib/components/atoms/ContextMentionChip/index.js +0 -4
  60. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +0 -533
  61. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +0 -10
  62. package/lib/components/atoms/ContextMentionEditor/index.js +0 -2
  63. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +0 -282
  64. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +0 -148
  65. package/lib/components/atoms/ContextMentionItem/index.js +0 -2
  66. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +0 -290
  67. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +0 -108
  68. package/lib/components/atoms/ContextMentionPopover/index.js +0 -3
  69. package/lib/components/atoms/CopyToClipboard.js +0 -70
  70. package/lib/components/atoms/EditableLabel/EditableLabel.js +0 -110
  71. package/lib/components/atoms/EditableLabel/index.js +0 -2
  72. package/lib/components/atoms/EditableLabel/styles.js +0 -7
  73. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +0 -22
  74. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +0 -18
  75. package/lib/components/atoms/EmptySearchClients/index.js +0 -2
  76. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +0 -19
  77. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +0 -15
  78. package/lib/components/atoms/EmptySearchProjects/index.js +0 -2
  79. package/lib/components/atoms/EntitySelector/EntitySelector.js +0 -247
  80. package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +0 -38
  81. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +0 -67
  82. package/lib/components/atoms/EntitySelector/index.js +0 -2
  83. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +0 -14
  84. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +0 -15
  85. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +0 -14
  86. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +0 -15
  87. package/lib/components/atoms/ErrorSearchFaqs/index.js +0 -2
  88. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +0 -18
  89. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +0 -15
  90. package/lib/components/atoms/ErrorSearchProjects/index.js +0 -2
  91. package/lib/components/atoms/Expand/Expand.js +0 -32
  92. package/lib/components/atoms/Expand/index.js +0 -2
  93. package/lib/components/atoms/Fade/Fade.js +0 -56
  94. package/lib/components/atoms/Fade/index.js +0 -2
  95. package/lib/components/atoms/FeedbackButton/FeedbackButton.js +0 -59
  96. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +0 -14
  97. package/lib/components/atoms/FeedbackButton/index.js +0 -2
  98. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +0 -138
  99. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +0 -44
  100. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +0 -43
  101. package/lib/components/atoms/FrequentlyAskedQuestions/index.js +0 -2
  102. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +0 -122
  103. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +0 -43
  104. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +0 -62
  105. package/lib/components/atoms/FrequentlyUsedActions/index.js +0 -2
  106. package/lib/components/atoms/GoBackButton.js +0 -24
  107. package/lib/components/atoms/HelpButton.js +0 -44
  108. package/lib/components/atoms/IconButton.js +0 -56
  109. package/lib/components/atoms/ImagePreview/ImagePreview.js +0 -96
  110. package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +0 -70
  111. package/lib/components/atoms/Input/CustomInput.interface.js +0 -2
  112. package/lib/components/atoms/Input/CustomInput.js +0 -91
  113. package/lib/components/atoms/Input/CustomInput.styles.js +0 -39
  114. package/lib/components/atoms/Input/index.js +0 -2
  115. package/lib/components/atoms/ListMenuOption/ListMenuOption.js +0 -41
  116. package/lib/components/atoms/ListMenuOption/index.js +0 -2
  117. package/lib/components/atoms/ListMenuOption/styles.js +0 -9
  118. package/lib/components/atoms/Loader.js +0 -41
  119. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +0 -11
  120. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +0 -6
  121. package/lib/components/atoms/LoadingFaqs/index.js +0 -2
  122. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +0 -11
  123. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +0 -6
  124. package/lib/components/atoms/LoadingSearchClients/index.js +0 -2
  125. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +0 -14
  126. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +0 -10
  127. package/lib/components/atoms/LoadingSearchProjects/index.js +0 -2
  128. package/lib/components/atoms/LoadingText/LoadingText.js +0 -18
  129. package/lib/components/atoms/LoadingText/index.js +0 -2
  130. package/lib/components/atoms/LoadingText/styles.js +0 -7
  131. package/lib/components/atoms/MAIAButton/MAIAButton.js +0 -33
  132. package/lib/components/atoms/MAIAButton/index.js +0 -2
  133. package/lib/components/atoms/MAIAError/MAIAError.js +0 -15
  134. package/lib/components/atoms/MAIAError/index.js +0 -2
  135. package/lib/components/atoms/MAIAInput/MAIAInput.js +0 -1232
  136. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +0 -266
  137. package/lib/components/atoms/MAIAInput/index.js +0 -2
  138. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +0 -25
  139. package/lib/components/atoms/MAIAInput/styles.js +0 -186
  140. package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +0 -2
  141. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +0 -22
  142. package/lib/components/atoms/MAIAMessage/index.js +0 -2
  143. package/lib/components/atoms/MAIAMessage/styles.js +0 -7
  144. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +0 -23
  145. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +0 -2
  146. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +0 -51
  147. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +0 -26
  148. package/lib/components/atoms/MaiaStreamdown/index.js +0 -2
  149. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +0 -18
  150. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +0 -84
  151. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +0 -15
  152. package/lib/components/atoms/MaiaWrapper/index.js +0 -3
  153. package/lib/components/atoms/MaiaWrapper/styles.js +0 -21
  154. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +0 -2
  155. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +0 -84
  156. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +0 -53
  157. package/lib/components/atoms/ModalClientAccess/index.js +0 -2
  158. package/lib/components/atoms/ModalInfo/ModalInfo.js +0 -52
  159. package/lib/components/atoms/ModalInfo/ModalInfoContent.js +0 -7
  160. package/lib/components/atoms/ModalInfo/index.js +0 -3
  161. package/lib/components/atoms/ModalInfo/styles.js +0 -7
  162. package/lib/components/atoms/ModalProject/ModalProject.interface.js +0 -2
  163. package/lib/components/atoms/ModalProject/ModalProject.js +0 -112
  164. package/lib/components/atoms/ModalProject/ModalProject.style.js +0 -59
  165. package/lib/components/atoms/ModalProject/index.js +0 -2
  166. package/lib/components/atoms/NextPageLoader.js +0 -33
  167. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +0 -28
  168. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +0 -180
  169. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +0 -34
  170. package/lib/components/atoms/OnboardingModalButton/index.js +0 -3
  171. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +0 -131
  172. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +0 -59
  173. package/lib/components/atoms/OptionAccessibility/index.js +0 -2
  174. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +0 -27
  175. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +0 -18
  176. package/lib/components/atoms/OptionCorPermission/index.js +0 -2
  177. package/lib/components/atoms/PrimaryButton.js +0 -31
  178. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +0 -77
  179. package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +0 -61
  180. package/lib/components/atoms/ProjectSelector/index.js +0 -2
  181. package/lib/components/atoms/SecondaryButton.js +0 -20
  182. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -20
  183. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -20
  184. package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
  185. package/lib/components/atoms/Skeleton/Skeleton.js +0 -36
  186. package/lib/components/atoms/Skeleton/index.js +0 -2
  187. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +0 -188
  188. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +0 -69
  189. package/lib/components/atoms/SkillsDropdown/index.js +0 -2
  190. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +0 -16
  191. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +0 -24
  192. package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +0 -18
  193. package/lib/components/atoms/SlashCommandChip/index.js +0 -4
  194. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +0 -210
  195. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +0 -53
  196. package/lib/components/atoms/SlashCommandDropdown/index.js +0 -2
  197. package/lib/components/atoms/Switch/Switch.js +0 -27
  198. package/lib/components/atoms/Switch/Switch.styles.js +0 -22
  199. package/lib/components/atoms/Switch/index.js +0 -2
  200. package/lib/components/atoms/TextArea/CustomTextArea.interface.js +0 -2
  201. package/lib/components/atoms/TextArea/CustomTextArea.js +0 -93
  202. package/lib/components/atoms/TextArea/CustomTextArea.styles.js +0 -25
  203. package/lib/components/atoms/TextArea/TextArea.interfaces.js +0 -2
  204. package/lib/components/atoms/TextArea/TextArea.js +0 -172
  205. package/lib/components/atoms/TextArea/TextArea.styles.js +0 -16
  206. package/lib/components/atoms/TextArea/index.js +0 -2
  207. package/lib/components/atoms/ThirdButton.js +0 -19
  208. package/lib/components/atoms/VideoModal/VideoModal.js +0 -76
  209. package/lib/components/atoms/VideoModal/index.js +0 -2
  210. package/lib/components/atoms/WithAppCfg.js +0 -26
  211. package/lib/components/atoms/WithFeatureValidation.js +0 -23
  212. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +0 -9
  213. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +0 -6
  214. package/lib/components/atoms/WrapperCenterIcon/index.js +0 -2
  215. package/lib/components/atoms/icons/AIIcon.js +0 -23
  216. package/lib/components/atoms/icons/AacFile.js +0 -39
  217. package/lib/components/atoms/icons/AccessibilityIcon.js +0 -42
  218. package/lib/components/atoms/icons/ActionAssignIcon.js +0 -111
  219. package/lib/components/atoms/icons/ActionCalendarIcon.js +0 -112
  220. package/lib/components/atoms/icons/ActionChargeHoursIcon.js +0 -111
  221. package/lib/components/atoms/icons/ActionChatIcon.js +0 -71
  222. package/lib/components/atoms/icons/ActionCreateIcon.js +0 -91
  223. package/lib/components/atoms/icons/ActionCreateReworkIcon.js +0 -39
  224. package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +0 -37
  225. package/lib/components/atoms/icons/ActionEditIcon.js +0 -39
  226. package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +0 -88
  227. package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +0 -37
  228. package/lib/components/atoms/icons/ActionTimeBackIcon.js +0 -112
  229. package/lib/components/atoms/icons/AgentMaiaIcon.js +0 -31
  230. package/lib/components/atoms/icons/Brain.js +0 -77
  231. package/lib/components/atoms/icons/CorAccessIcon.js +0 -41
  232. package/lib/components/atoms/icons/CorLogo.js +0 -76
  233. package/lib/components/atoms/icons/CsvFile.js +0 -41
  234. package/lib/components/atoms/icons/DocFile.js +0 -41
  235. package/lib/components/atoms/icons/DocxFile.js +0 -41
  236. package/lib/components/atoms/icons/EmptyClientIllustration.js +0 -67
  237. package/lib/components/atoms/icons/EmptyHistory.js +0 -46
  238. package/lib/components/atoms/icons/EmptySearchIllustration.js +0 -37
  239. package/lib/components/atoms/icons/EmptyState.js +0 -84
  240. package/lib/components/atoms/icons/EmptyStateAgents.js +0 -58
  241. package/lib/components/atoms/icons/ErrorIcon.js +0 -14
  242. package/lib/components/atoms/icons/ErrorSearchIllustration.js +0 -52
  243. package/lib/components/atoms/icons/ErrorState.js +0 -51
  244. package/lib/components/atoms/icons/FaqChevronIcon.js +0 -39
  245. package/lib/components/atoms/icons/FaqsIcon.js +0 -51
  246. package/lib/components/atoms/icons/FlacIcon.js +0 -39
  247. package/lib/components/atoms/icons/FolderIcon.js +0 -29
  248. package/lib/components/atoms/icons/HomeIcon.js +0 -30
  249. package/lib/components/atoms/icons/ImageFile.js +0 -46
  250. package/lib/components/atoms/icons/M4aFile.js +0 -39
  251. package/lib/components/atoms/icons/MAIAIcon.js +0 -20
  252. package/lib/components/atoms/icons/MAIAIsologo.js +0 -65
  253. package/lib/components/atoms/icons/MDFile.js +0 -41
  254. package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +0 -41
  255. package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +0 -41
  256. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +0 -33
  257. package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +0 -41
  258. package/lib/components/atoms/icons/MaiaInputAddIcon.js +0 -42
  259. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +0 -29
  260. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +0 -33
  261. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +0 -35
  262. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +0 -44
  263. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +0 -29
  264. package/lib/components/atoms/icons/MaiaInputSendIcon.js +0 -29
  265. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +0 -29
  266. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +0 -35
  267. package/lib/components/atoms/icons/MaiaSettingsProject.js +0 -111
  268. package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +0 -193
  269. package/lib/components/atoms/icons/MaiaSparkleIcon.js +0 -75
  270. package/lib/components/atoms/icons/MaiaStoreIcon.js +0 -31
  271. package/lib/components/atoms/icons/Mp3File.js +0 -39
  272. package/lib/components/atoms/icons/Mp4File.js +0 -39
  273. package/lib/components/atoms/icons/MyAgentsNavIcon.js +0 -51
  274. package/lib/components/atoms/icons/NewChat.js +0 -29
  275. package/lib/components/atoms/icons/NotionIcon.js +0 -36
  276. package/lib/components/atoms/icons/OgaFile.js +0 -39
  277. package/lib/components/atoms/icons/OggFile.js +0 -39
  278. package/lib/components/atoms/icons/PdfFile.js +0 -39
  279. package/lib/components/atoms/icons/PlusIcon.js +0 -29
  280. package/lib/components/atoms/icons/PptFile.js +0 -47
  281. package/lib/components/atoms/icons/PptxFile.js +0 -49
  282. package/lib/components/atoms/icons/RetryIcon.js +0 -34
  283. package/lib/components/atoms/icons/SkillIcon.js +0 -30
  284. package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +0 -23
  285. package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +0 -23
  286. package/lib/components/atoms/icons/SkillsNavIcon.js +0 -24
  287. package/lib/components/atoms/icons/SubtaskIcon.js +0 -36
  288. package/lib/components/atoms/icons/TaskLinkIcon.js +0 -27
  289. package/lib/components/atoms/icons/TelescopeIcon.js +0 -60
  290. package/lib/components/atoms/icons/TemplateGradientIcon.js +0 -42
  291. package/lib/components/atoms/icons/TextFile.js +0 -41
  292. package/lib/components/atoms/icons/WavFile.js +0 -39
  293. package/lib/components/atoms/icons/WebmFile.js +0 -50
  294. package/lib/components/atoms/icons/XlsFile.js +0 -42
  295. package/lib/components/atoms/icons/XlsxFile.js +0 -42
  296. package/lib/components/atoms/icons/index.js +0 -53
  297. package/lib/components/atoms/index.js +0 -42
  298. package/lib/components/index.js +0 -11
  299. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +0 -2
  300. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +0 -149
  301. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +0 -53
  302. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +0 -415
  303. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +0 -152
  304. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +0 -374
  305. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +0 -106
  306. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +0 -92
  307. package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +0 -57
  308. package/lib/components/molecules/AbmSection/index.js +0 -4
  309. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +0 -52
  310. package/lib/components/molecules/ChatAIClientSelector/index.js +0 -2
  311. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +0 -119
  312. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +0 -187
  313. package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +0 -6
  314. package/lib/components/molecules/ChatAIContent/index.js +0 -2
  315. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +0 -241
  316. package/lib/components/molecules/ChatAIHistory/index.js +0 -2
  317. package/lib/components/molecules/ChatAIHistory/styles.js +0 -22
  318. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +0 -649
  319. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +0 -115
  320. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +0 -95
  321. package/lib/components/molecules/ChatAIHome/index.js +0 -2
  322. package/lib/components/molecules/ChatAIHome/styles.js +0 -335
  323. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +0 -137
  324. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +0 -853
  325. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +0 -47
  326. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +0 -37
  327. package/lib/components/molecules/ChatAIMessages/README.md +0 -101
  328. package/lib/components/molecules/ChatAIMessages/index.js +0 -2
  329. package/lib/components/molecules/ChatAIMessages/newStyles.js +0 -131
  330. package/lib/components/molecules/ChatAIMessages/styles.js +0 -94
  331. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +0 -1250
  332. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +0 -58
  333. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +0 -127
  334. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +0 -34
  335. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +0 -2
  336. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +0 -189
  337. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +0 -26
  338. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +0 -2
  339. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +0 -453
  340. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +0 -108
  341. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +0 -2
  342. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +0 -48
  343. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +0 -38
  344. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +0 -2
  345. package/lib/components/molecules/ChatAIModal/constants.js +0 -40
  346. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +0 -16
  347. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +0 -12
  348. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +0 -13
  349. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +0 -3
  350. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +0 -57
  351. package/lib/components/molecules/ChatAIModal/index.js +0 -2
  352. package/lib/components/molecules/ChatAIModal/layout.js +0 -74
  353. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +0 -457
  354. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +0 -218
  355. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +0 -384
  356. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +0 -165
  357. package/lib/components/molecules/ChatAIMySkills/index.js +0 -2
  358. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +0 -48
  359. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +0 -49
  360. package/lib/components/molecules/ChatAIProjectSelector/index.js +0 -2
  361. package/lib/components/molecules/ChatFooter/ChatFooter.js +0 -337
  362. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +0 -32
  363. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +0 -14
  364. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +0 -201
  365. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +0 -51
  366. package/lib/components/molecules/ChatFooter/index.js +0 -2
  367. package/lib/components/molecules/ChatFooter/styles.js +0 -23
  368. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +0 -60
  369. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +0 -6
  370. package/lib/components/molecules/ContextMentionInput/index.js +0 -2
  371. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +0 -118
  372. package/lib/components/molecules/MessageFeedback/index.js +0 -2
  373. package/lib/components/molecules/MessageFeedback/styles.js +0 -14
  374. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +0 -127
  375. package/lib/components/molecules/ProjectSummaryChat/index.js +0 -2
  376. package/lib/components/molecules/ProjectSummaryChat/styles.js +0 -8
  377. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +0 -152
  378. package/lib/components/molecules/ProjectSummaryConfig/index.js +0 -2
  379. package/lib/components/molecules/ProjectSummaryConfig/styles.js +0 -86
  380. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +0 -49
  381. package/lib/components/molecules/ProjectSummaryContent/index.js +0 -2
  382. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +0 -19
  383. package/lib/components/molecules/ProjectSummaryModal/index.js +0 -2
  384. package/lib/components/molecules/ProjectSummaryModal/styles.js +0 -2
  385. package/lib/components/molecules/Sidebar/Sidebar.js +0 -716
  386. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +0 -157
  387. package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +0 -48
  388. package/lib/components/molecules/Sidebar/Sidebar.styles.js +0 -75
  389. package/lib/components/molecules/Sidebar/index.js +0 -2
  390. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +0 -1420
  391. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +0 -93
  392. package/lib/components/organisms/AbmAgentModal/index.js +0 -2
  393. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +0 -182
  394. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +0 -34
  395. package/lib/components/organisms/AbmSkillGenerateModal/index.js +0 -2
  396. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +0 -550
  397. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +0 -118
  398. package/lib/components/organisms/AbmSkillModal/index.js +0 -2
  399. package/lib/components/organisms/ChatAI/ChatAI.js +0 -167
  400. package/lib/components/organisms/ChatAI/index.js +0 -2
  401. package/lib/components/organisms/ChatAI/styles.js +0 -7
  402. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +0 -23
  403. package/lib/components/organisms/ClientAIButton/index.js +0 -2
  404. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +0 -86
  405. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +0 -39
  406. package/lib/components/organisms/DeleteAgentModal/index.js +0 -2
  407. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +0 -122
  408. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +0 -47
  409. package/lib/components/organisms/DeleteQuestionModal/index.js +0 -2
  410. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +0 -138
  411. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +0 -69
  412. package/lib/components/organisms/EditQuestionModal/index.js +0 -2
  413. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +0 -113
  414. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +0 -54
  415. package/lib/components/organisms/ModalFileExceeds/index.js +0 -2
  416. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +0 -26
  417. package/lib/components/organisms/ProjectAIButton/index.js +0 -2
  418. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +0 -60
  419. package/lib/components/organisms/ProjectSummary/index.js +0 -2
  420. package/lib/components/organisms/ProjectSummary/styles.js +0 -7
  421. package/lib/components/organisms/SnackBar/Snackbar.interface.js +0 -2
  422. package/lib/components/organisms/SnackBar/Snackbar.js +0 -73
  423. package/lib/components/organisms/SnackBar/Snackbar.styles.js +0 -9
  424. package/lib/components/organisms/SnackBar/index.js +0 -2
  425. package/lib/components/organisms/SourcesInformation/SourceItem.js +0 -18
  426. package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +0 -14
  427. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +0 -66
  428. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +0 -27
  429. package/lib/components/organisms/SourcesInformation/index.js +0 -2
  430. package/lib/constants/config.js +0 -10
  431. package/lib/constants/formatExtensions.js +0 -55
  432. package/lib/constants/gqlClient.js +0 -4
  433. package/lib/constants/maiaHourAgentAccess.js +0 -15
  434. package/lib/constants/maiaTaskPanelAccess.js +0 -24
  435. package/lib/constants/maiaTaskPanelOutsideClick.js +0 -9
  436. package/lib/constants/maiaTaskPanelZIndex.js +0 -19
  437. package/lib/constants/permissions/config.js +0 -72
  438. package/lib/constants/permissions/index.js +0 -3
  439. package/lib/constants/permissions/types.js +0 -2
  440. package/lib/constants/permissions/utils.js +0 -18
  441. package/lib/constants/plannerSyncEvents.js +0 -15
  442. package/lib/constants/taskLinkIcon.js +0 -15
  443. package/lib/constants/taskUrls.js +0 -11
  444. package/lib/context/cor-user.js +0 -31
  445. package/lib/context/global-context.js +0 -39
  446. package/lib/dev/DevChatAI.js +0 -101
  447. package/lib/dev/DevContextMentionInput.js +0 -67
  448. package/lib/dev/ProjectSummary.js +0 -9
  449. package/lib/dev/Providers.js +0 -27
  450. package/lib/exports.js +0 -2
  451. package/lib/hooks/README.md +0 -192
  452. package/lib/hooks/index.js +0 -30
  453. package/lib/hooks/useAccessClient/index.js +0 -2
  454. package/lib/hooks/useAccessClient/useAccessClient.js +0 -81
  455. package/lib/hooks/useAgentModel/index.js +0 -2
  456. package/lib/hooks/useAgentModel/useAgentModel.js +0 -62
  457. package/lib/hooks/useAgentModel/useCreateAgent.js +0 -128
  458. package/lib/hooks/useAgentModel/useDeleteAgent.js +0 -88
  459. package/lib/hooks/useAgentModel/useUpdateAgent.js +0 -129
  460. package/lib/hooks/useAgentSuggestions.js +0 -60
  461. package/lib/hooks/useCaretPosition.js +0 -65
  462. package/lib/hooks/useChatManager/index.js +0 -2
  463. package/lib/hooks/useChatManager/useChatManager.interface.js +0 -2
  464. package/lib/hooks/useChatManager/useChatManager.js +0 -1782
  465. package/lib/hooks/useChatMessages/index.js +0 -2
  466. package/lib/hooks/useChatMessages/useChatMessages.interface.js +0 -2
  467. package/lib/hooks/useChatMessages/useChatMessages.js +0 -722
  468. package/lib/hooks/useChats/index.js +0 -2
  469. package/lib/hooks/useChats/useChats.interfaces.js +0 -2
  470. package/lib/hooks/useChats/useChats.js +0 -187
  471. package/lib/hooks/useClientSearch.js +0 -163
  472. package/lib/hooks/useContextMentions.js +0 -500
  473. package/lib/hooks/useContextPinPopover.js +0 -228
  474. package/lib/hooks/useDebounce.js +0 -18
  475. package/lib/hooks/useEntitySearch.js +0 -1053
  476. package/lib/hooks/useEvent.js +0 -93
  477. package/lib/hooks/useFrequentlyAskedQuestions.js +0 -150
  478. package/lib/hooks/useFrequentlyUsedActions.js +0 -94
  479. package/lib/hooks/useKnowledge/deleteKnowledge.js +0 -69
  480. package/lib/hooks/useKnowledge/downloadKnowledge.js +0 -81
  481. package/lib/hooks/useKnowledge/index.js +0 -4
  482. package/lib/hooks/useKnowledge/saveKnowledge.js +0 -107
  483. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +0 -156
  484. package/lib/hooks/useMaiaTaskPanelZIndex.js +0 -17
  485. package/lib/hooks/useMentionAllowedTypes.js +0 -120
  486. package/lib/hooks/useMentionPopover.js +0 -342
  487. package/lib/hooks/useMinimizedPillBottomOffset.js +0 -110
  488. package/lib/hooks/useModal/index.js +0 -2
  489. package/lib/hooks/useModal/useModal.interfaces.js +0 -2
  490. package/lib/hooks/useModal/useModal.js +0 -47
  491. package/lib/hooks/useOnboardingNavigation.js +0 -20
  492. package/lib/hooks/useOrchestratorStream/index.js +0 -2
  493. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +0 -2
  494. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +0 -269
  495. package/lib/hooks/useProjectSearch.js +0 -183
  496. package/lib/hooks/useProjectSummary.js +0 -101
  497. package/lib/hooks/useProjectSummaryConfig.js +0 -211
  498. package/lib/hooks/useProjects.js +0 -46
  499. package/lib/hooks/useRecentClientsSearch.js +0 -150
  500. package/lib/hooks/useRecentContexts.js +0 -86
  501. package/lib/hooks/useResize.js +0 -29
  502. package/lib/hooks/useSkillsCatalog.js +0 -66
  503. package/lib/hooks/useSlashCommands.js +0 -84
  504. package/lib/hooks/useSmoothStreamText/index.js +0 -2
  505. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +0 -197
  506. package/lib/hooks/useSnackBarManager/useSnackBarManager.js +0 -41
  507. package/lib/hooks/useStreamResponse.js +0 -112
  508. package/lib/hooks/useStreamdownStyles.js +0 -13
  509. package/lib/hooks/useStreamingMessage/index.js +0 -2
  510. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +0 -18
  511. package/lib/hooks/useT.js +0 -17
  512. package/lib/hooks/useTabTaskDefault.js +0 -33
  513. package/lib/hooks/useTaskPanel.js +0 -22
  514. package/lib/hooks/useTextOverflowEllipsisTooltip.js +0 -34
  515. package/lib/hooks/useToggle.js +0 -19
  516. package/lib/hooks/useToggleFavorite/index.js +0 -2
  517. package/lib/hooks/useToggleFavorite/useToggleFavorite.js +0 -83
  518. package/lib/index.css +0 -76
  519. package/lib/index.js +0 -30
  520. package/lib/lang/br/index.js +0 -783
  521. package/lib/lang/en/index.js +0 -783
  522. package/lib/lang/es/index.js +0 -784
  523. package/lib/lang/fr/index.js +0 -604
  524. package/lib/lang/index.js +0 -24
  525. package/lib/lang/utils.js +0 -33
  526. package/lib/mocks/mockChats.js +0 -395
  527. package/lib/mocks/mockOrchestrator.js +0 -5
  528. package/lib/mocks/mockProject.js +0 -11
  529. package/lib/mocks/mockProjectSummary.js +0 -6
  530. package/lib/mocks/mockedUser.js +0 -169
  531. package/lib/services/apolloClient.js +0 -3
  532. package/lib/services/appcues.js +0 -19
  533. package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +0 -31
  534. package/lib/services/corpilot/ProjectSummary/index.js +0 -5
  535. package/lib/services/corpilot/client.js +0 -27
  536. package/lib/services/corpilot/index.js +0 -5
  537. package/lib/services/maia/Access/updateAccess.js +0 -59
  538. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +0 -46
  539. package/lib/services/maia/Actions/getSlashCommands.js +0 -39
  540. package/lib/services/maia/Actions/index.js +0 -7
  541. package/lib/services/maia/Agents/createAgent.js +0 -39
  542. package/lib/services/maia/Agents/deleteAgent.js +0 -38
  543. package/lib/services/maia/Agents/fetchAgentDetail.js +0 -122
  544. package/lib/services/maia/Agents/getAgentById.js +0 -162
  545. package/lib/services/maia/Agents/getAgentModels.js +0 -112
  546. package/lib/services/maia/Agents/getAgentSuggestions.js +0 -44
  547. package/lib/services/maia/Agents/getAgents.js +0 -718
  548. package/lib/services/maia/Agents/setAgentToolGroups.js +0 -42
  549. package/lib/services/maia/Agents/toggleFavorite.js +0 -34
  550. package/lib/services/maia/Agents/updateAgent.js +0 -39
  551. package/lib/services/maia/Chats/deleteChat.js +0 -32
  552. package/lib/services/maia/Chats/getChatMessages.js +0 -144
  553. package/lib/services/maia/Chats/getChatsByUserId.js +0 -82
  554. package/lib/services/maia/Chats/index.js +0 -15
  555. package/lib/services/maia/Chats/markSessionAsRead.js +0 -32
  556. package/lib/services/maia/Chats/patchChat.js +0 -43
  557. package/lib/services/maia/Chats/wasHelpfulChat.js +0 -31
  558. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +0 -55
  559. package/lib/services/maia/Faqs/index.js +0 -5
  560. package/lib/services/maia/Knowledge/delete.js +0 -41
  561. package/lib/services/maia/Knowledge/download.js +0 -48
  562. package/lib/services/maia/Knowledge/index.js +0 -3
  563. package/lib/services/maia/Knowledge/save.js +0 -43
  564. package/lib/services/maia/Orchestrator/index.js +0 -7
  565. package/lib/services/maia/Orchestrator/orchestrator.js +0 -246
  566. package/lib/services/maia/RecentClients/getRecentClients.js +0 -43
  567. package/lib/services/maia/RecentClients/index.js +0 -6
  568. package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
  569. package/lib/services/maia/RecentContexts/index.js +0 -6
  570. package/lib/services/maia/RecentProjects/getRecentProjects.js +0 -55
  571. package/lib/services/maia/RecentProjects/index.js +0 -6
  572. package/lib/services/maia/RecentTasks/getRecentTasks.js +0 -54
  573. package/lib/services/maia/RecentTasks/index.js +0 -6
  574. package/lib/services/maia/RecentUsers/getRecentUsers.js +0 -59
  575. package/lib/services/maia/RecentUsers/index.js +0 -6
  576. package/lib/services/maia/Skills/createSkill.js +0 -39
  577. package/lib/services/maia/Skills/deleteSkill.js +0 -38
  578. package/lib/services/maia/Skills/generateSkill.js +0 -41
  579. package/lib/services/maia/Skills/getSkills.js +0 -120
  580. package/lib/services/maia/Skills/updateSkill.js +0 -39
  581. package/lib/services/maia/client.js +0 -27
  582. package/lib/services/maia/index.js +0 -17
  583. package/lib/services/query/ClientSearchQuery.js +0 -5
  584. package/lib/services/query/entitySearchQuery.js +0 -18
  585. package/lib/services/query/index.js +0 -2
  586. package/lib/services/query/projectSearchByValueQuery.js +0 -5
  587. package/lib/services/query/taskUserTabQuery.js +0 -8
  588. package/lib/services/query/usersDirectoryQuery.js +0 -19
  589. package/lib/services/types.js +0 -6
  590. package/lib/services/utils/fetchCOR.js +0 -117
  591. package/lib/services/utils/getCookie.js +0 -10
  592. package/lib/services/utils/index.js +0 -3
  593. package/lib/services/utils/mapChatMessages.js +0 -287
  594. package/lib/services/utils/validateIsMaia.js +0 -4
  595. package/lib/store/chatsSidebarOptimistic.js +0 -92
  596. package/lib/store/chatsStore.types.js +0 -2
  597. package/lib/store/chatsStoreLifecycle.js +0 -8
  598. package/lib/store/faqsStore.types.js +0 -2
  599. package/lib/store/index.js +0 -4
  600. package/lib/store/maiaLastChatPersistence.js +0 -35
  601. package/lib/store/sessions/activeView.js +0 -22
  602. package/lib/store/sessions/index.js +0 -9
  603. package/lib/store/sessions/sessionHitlContext.js +0 -15
  604. package/lib/store/sessions/sessionNotificationSound.js +0 -57
  605. package/lib/store/sessions/sessionNotifications.js +0 -110
  606. package/lib/store/sessions/sessionNotifications.types.js +0 -2
  607. package/lib/store/sessions/sessionStreamManager.js +0 -715
  608. package/lib/store/sessions/sessionStreamingText.js +0 -80
  609. package/lib/store/sessions/sessions.types.js +0 -35
  610. package/lib/store/sessions/useSessionMeta.js +0 -39
  611. package/lib/store/sessions/useSessionStreamingText.js +0 -18
  612. package/lib/store/sessions/useSessionsStore.js +0 -197
  613. package/lib/store/useChatsStore.js +0 -387
  614. package/lib/store/useFaqsStore.js +0 -27
  615. package/lib/streamdownStyles.js +0 -9
  616. package/lib/styles/StyledCleanContainer.js +0 -7
  617. package/lib/styles/cascade.js +0 -14
  618. package/lib/styles/config.js +0 -47
  619. package/lib/styles/shared/scrollable.js +0 -3
  620. package/lib/styles/transitions.js +0 -21
  621. package/lib/types/Action.js +0 -2
  622. package/lib/types/AgentSuggestion.js +0 -2
  623. package/lib/types/Chat.js +0 -10
  624. package/lib/types/Client.js +0 -2
  625. package/lib/types/FrequentlyAskedQuestion.js +0 -2
  626. package/lib/types/Project.js +0 -2
  627. package/lib/types/ProjectSummaryConfigKeys.js +0 -9
  628. package/lib/types/Task.js +0 -2
  629. package/lib/types/agent.js +0 -2
  630. package/lib/types/agentModal.js +0 -2
  631. package/lib/types/contextMention.js +0 -37
  632. package/lib/types/global.d.js +0 -2
  633. package/lib/types/skill.js +0 -2
  634. package/lib/types/streamActivity.js +0 -2
  635. package/lib/types/userType.d.js +0 -2
  636. package/lib/utils/actionCategoryMap.js +0 -37
  637. package/lib/utils/actionIconMap.js +0 -61
  638. package/lib/utils/agentDisplayName.js +0 -42
  639. package/lib/utils/chatInputFiles.js +0 -52
  640. package/lib/utils/contextMentionIcons.js +0 -134
  641. package/lib/utils/contextMentionLabel.js +0 -4
  642. package/lib/utils/contextMentionTriggers.js +0 -51
  643. package/lib/utils/contextMentionTypeLabel.js +0 -17
  644. package/lib/utils/corConnectorMentionTypes.js +0 -41
  645. package/lib/utils/ensureStreamdownStyles.js +0 -21
  646. package/lib/utils/entityLinkRender.js +0 -135
  647. package/lib/utils/fileDownloadHelper.js +0 -40
  648. package/lib/utils/formatQuickActionMessage.js +0 -16
  649. package/lib/utils/formatUnreadCount.js +0 -6
  650. package/lib/utils/getUnitFileSize.js +0 -13
  651. package/lib/utils/hitlAnalytics.js +0 -65
  652. package/lib/utils/hoursPlannerQuickActionType.js +0 -64
  653. package/lib/utils/imagePreprocessor.js +0 -108
  654. package/lib/utils/index.js +0 -3
  655. package/lib/utils/maiaHostOpen.js +0 -19
  656. package/lib/utils/maiaStreamdownRehypePlugins.js +0 -27
  657. package/lib/utils/mapBackendLang.js +0 -8
  658. package/lib/utils/normalizeAgentConnectors.js +0 -70
  659. package/lib/utils/openTaskInCorPanel.js +0 -22
  660. package/lib/utils/orchestratorSubagents.js +0 -11
  661. package/lib/utils/renderContextMentions.js +0 -420
  662. package/lib/utils/retryCompletion.js +0 -85
  663. package/lib/utils/slashCommandMarker.js +0 -30
  664. package/lib/utils/sortManagerHoursHomeFuas.js +0 -14
  665. package/lib/utils/sseStreamContent.js +0 -17
  666. package/lib/utils/streamActivityMessages.js +0 -359
  667. package/lib/utils/validateTrimmedFields.js +0 -8
@@ -1,1232 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
- 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; }
4
- 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; }
5
- /* eslint-disable no-restricted-syntax */
6
- /* eslint-disable no-continue */
7
- /* eslint-disable no-void */
8
- /* eslint-disable react/no-array-index-key */
9
- /* eslint-disable no-lonely-if */
10
- /* eslint-disable @typescript-eslint/no-explicit-any */
11
- /* eslint-disable prefer-destructuring */
12
- /* eslint-disable jsx-a11y/click-events-have-key-events */
13
- /* eslint-disable jsx-a11y/no-static-element-interactions */
14
- import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
15
- import { createPortal } from 'react-dom';
16
- import { Popover } from '@mui/material';
17
- import { Check } from '@projectcor/icons/lib/components/Check';
18
- import { Cross } from '@projectcor/icons/lib/components/Cross';
19
- import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
20
- import { ActiveToolChipIconButton, ActiveToolChipLabel, ActiveToolChipRoot, PlusMenuDivider, PlusMenuInnerColumn, PlusMenuItemButton, PlusMenuItemLabel, PlusMenuPaper, PlusMenuToolsRow, PlusToggleButton, SkillsToggleButton, SCInputChipsRow, SCInputMetaIconButton, SCInputMetaIndicators, SCMIAttachment, SCMIAttachmentDeleteIcon, SCMIAttachmentFileIcon, SCMIAttachmentIcon, SCMIAttachmentName, StyledMAIAInputWrapper, StyledMAIASendButton, StyledMAIAMainToolbarGrid, SCInputEditorCell, SCInputToolbarRow, StyledMAIAPlusToolbarCell, StyledMAIASendToolbarCell, StyledMAIAStopButton, StyledMAIAStopIcon, StyledMAIADropOverlay } from './styles';
21
- import { getMaiaInputEditorMaxHeight, MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX } from './maiaInputLayout';
22
- import { useGlobalContext } from '../../../context/global-context';
23
- import { ModalFileExceeds } from '../../organisms/ModalFileExceeds';
24
- import { SlashCommandDropdown } from '../SlashCommandDropdown';
25
- import { SkillsDropdown } from '../SkillsDropdown';
26
- import { useSlashCommands } from '../../../hooks/useSlashCommands';
27
- import { useSkillsCatalog } from '../../../hooks/useSkillsCatalog';
28
- import { canAccessToSkills } from '../../../constants/permissions';
29
- import { useUser } from '../../../context/cor-user';
30
- import { resolveQuickActionType } from '../../../utils/hoursPlannerQuickActionType';
31
- import { useT } from '../../../hooks/useT';
32
- import { MaiaInputAddIcon } from '../icons/MaiaInputAddIcon';
33
- import { MaiaInputAttachIcon } from '../icons/MaiaInputAttachIcon';
34
- import { MaiaInputAttachmentImageIcon } from '../icons/MaiaInputAttachmentImageIcon';
35
- import { MaiaInputDeepSearchIcon } from '../icons/MaiaInputDeepSearchIcon';
36
- import { CorAccessIcon } from '../icons/CorAccessIcon';
37
- import { MaiaInputMentionIcon } from '../icons/MaiaInputMentionIcon';
38
- import { MaiaInputRobotIcon } from '../icons/MaiaInputRobotIcon';
39
- import { MaiaInputSendIcon } from '../icons/MaiaInputSendIcon';
40
- import { MaiaInputSlashIcon } from '../icons/MaiaInputSlashIcon';
41
- import { SkillIcon } from '../icons/SkillIcon';
42
- import { MaiaInputWebSearchIcon } from '../icons/MaiaInputWebSearchIcon';
43
- import { EVENTS, useEvent } from '../../../hooks/useEvent';
44
- import { getChatToolsMenuAgentType } from '../../../utils/hitlAnalytics';
45
- import { MAIA_CHAT_INPUT_UI } from '../../../styles/config';
46
- import { allowedFileTypes, fileTypes, getMaxAttachmentSizeMb, MAX_CHAT_INPUT_ATTACHMENTS } from '../../../constants/formatExtensions';
47
- import { APPCUES_EVENTS, trackAppcuesEvent } from '../../../services/appcues';
48
- import { Chip } from '../Chip';
49
- import { ContextMentionEditor } from '../ContextMentionEditor';
50
- import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
51
- // eslint-disable-next-line import/no-cycle
52
- import { useMentionPopover } from '../../../hooks/useMentionPopover';
53
- import { useCaretPosition } from '../../../hooks/useCaretPosition';
54
- import { dataTransferHasFiles, filesFromDataTransfer } from '../../../utils/chatInputFiles';
55
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
56
- var TOOL_CHIP_EXIT_MS = 220;
57
- var SLASH_DROPDOWN_WIDTH_PX = 340;
58
- var SLASH_DROPDOWN_MAX_HEIGHT_PX = 416;
59
- var SLASH_DROPDOWN_GAP_ABOVE_INPUT_PX = 4;
60
- var SLASH_DROPDOWN_VIEWPORT_EDGE_PX = 8;
61
- var SKILLS_DROPDOWN_WIDTH_PX = 339;
62
- var SLASH_DROPDOWN_GAP_PX = 4;
63
- var SLASH_DROPDOWN_VIEWPORT_PAD_PX = 8;
64
- export var MAIAInput = function MAIAInput(_ref) {
65
- var _agent$entity, _contextChip$items, _contextChip$items2, _agent$connectors, _agent$model_display_, _contextChip$items3;
66
- var onSendMessage = _ref.onSendMessage,
67
- className = _ref.className,
68
- disabled = _ref.disabled,
69
- isStreaming = _ref.isStreaming,
70
- isWriting = _ref.isWriting,
71
- onStopGeneration = _ref.onStopGeneration,
72
- placeholder = _ref.placeholder,
73
- onChange = _ref.onChange,
74
- onFocus = _ref.onFocus,
75
- _ref$alignButtons = _ref.alignButtons,
76
- alignButtons = _ref$alignButtons === void 0 ? 'vertical' : _ref$alignButtons,
77
- onFileAttach = _ref.onFileAttach,
78
- onDeleteAttachment = _ref.onDeleteAttachment,
79
- _ref$attachments = _ref.attachments,
80
- attachments = _ref$attachments === void 0 ? [] : _ref$attachments,
81
- chatId = _ref.chatId,
82
- newChatKey = _ref.newChatKey,
83
- tooltipZIndex = _ref.tooltipZIndex,
84
- externalPopoverAnchorRef = _ref.popoverAnchorRef,
85
- layoutMode = _ref.layoutMode,
86
- contextChip = _ref.contextChip;
87
- var _useT = useT(),
88
- t = _useT.t;
89
- var editorRef = useRef(null);
90
- var fileInputRef = useRef(null);
91
- var chipsRowRef = useRef(null);
92
- var toolbarRowRef = useRef(null);
93
- var internalWrapperRef = useRef(null);
94
- var wrapperRef = externalPopoverAnchorRef !== null && externalPopoverAnchorRef !== void 0 ? externalPopoverAnchorRef : internalWrapperRef;
95
- var _useState = useState(false),
96
- _useState2 = _slicedToArray(_useState, 2),
97
- hasTypingPresence = _useState2[0],
98
- setHasTypingPresence = _useState2[1];
99
- var _useState3 = useState(0),
100
- _useState4 = _slicedToArray(_useState3, 2),
101
- chipsRowHeight = _useState4[0],
102
- setChipsRowHeight = _useState4[1];
103
- var _useState5 = useState(MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX),
104
- _useState6 = _slicedToArray(_useState5, 2),
105
- toolbarRowHeight = _useState6[0],
106
- setToolbarRowHeight = _useState6[1];
107
- var _useState7 = useState({
108
- isOpen: false,
109
- excludedFiles: [],
110
- exceededFiles: [],
111
- fileSizes: {}
112
- }),
113
- _useState8 = _slicedToArray(_useState7, 2),
114
- modalProps = _useState8[0],
115
- setModalProps = _useState8[1];
116
- var eventAmplitude = useEvent();
117
- var _useGlobalContext = useGlobalContext(),
118
- toggleWebSearch = _useGlobalContext.toggleWebSearch,
119
- isWebSearchActive = _useGlobalContext.isWebSearchActive,
120
- toggleDeepSearch = _useGlobalContext.toggleDeepSearch,
121
- isDeepSearchActive = _useGlobalContext.isDeepSearchActive,
122
- agent = _useGlobalContext.agent,
123
- initialDraft = _useGlobalContext.initialDraft,
124
- deepLinkSendPendingRef = _useGlobalContext.deepLinkSendPendingRef;
125
- var plusMenuZIndex = useMaiaTaskPanelZIndex(1300, 'overlay');
126
- var initialDraftAppliedRef = useRef(false);
127
- var _useMentionPopover = useMentionPopover({
128
- editorRef: editorRef,
129
- popoverAnchorRef: wrapperRef
130
- }),
131
- popoverOpen = _useMentionPopover.popoverOpen,
132
- resetMentionOpenTracking = _useMentionPopover.resetMentionOpenTracking,
133
- handleTrigger = _useMentionPopover.handleTrigger,
134
- handlePopoverKeyDown = _useMentionPopover.handleKeyDown,
135
- popoverNode = _useMentionPopover.popoverNode;
136
- var _useState9 = useState(null),
137
- _useState0 = _slicedToArray(_useState9, 2),
138
- plusMenuAnchor = _useState0[0],
139
- setPlusMenuAnchor = _useState0[1];
140
- var _useState1 = useState(false),
141
- _useState10 = _slicedToArray(_useState1, 2),
142
- activeToolChipHovered = _useState10[0],
143
- setActiveToolChipHovered = _useState10[1];
144
- var _useState11 = useState(false),
145
- _useState12 = _slicedToArray(_useState11, 2),
146
- toolChipExiting = _useState12[0],
147
- setToolChipExiting = _useState12[1];
148
- var _useState13 = useState(false),
149
- _useState14 = _slicedToArray(_useState13, 2),
150
- isFileDragActive = _useState14[0],
151
- setIsFileDragActive = _useState14[1];
152
- var toolChipExitTimerRef = useRef(null);
153
- var fileDragCounterRef = useRef(0);
154
- var searchModeActiveRef = useRef({
155
- web: false,
156
- deep: false
157
- });
158
- var plusMenuOpen = Boolean(plusMenuAnchor);
159
-
160
- // Inicializar las referencias como undefined para detectar el primer cambio correctamente
161
- var previousAgentIdRef = useRef(undefined);
162
- var previousChatIdRef = useRef(undefined);
163
- var previousNewChatKeyRef = useRef(undefined);
164
- var previousLayoutModeRef = useRef(undefined);
165
- var analyticsAgentType = getChatToolsMenuAgentType(agent);
166
- var analyticsCloneEntityPayload = (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' ? {
167
- entity: (_agent$entity = agent.entity) !== null && _agent$entity !== void 0 ? _agent$entity : null
168
- } : {};
169
-
170
- // Slash commands aplican a clones especialistas y al orchestrator global (este agrega los de sus subagentes).
171
- // Los custom y los clone global/maiaker no los tienen habilitados.
172
- var _useSlashCommands = useSlashCommands((agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global' || (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' && (agent === null || agent === void 0 ? void 0 : agent.entity) !== 'global' ? agent === null || agent === void 0 ? void 0 : agent.id : undefined),
173
- slashCommands = _useSlashCommands.commands;
174
- var _useState15 = useState(false),
175
- _useState16 = _slicedToArray(_useState15, 2),
176
- showSlashDropdown = _useState16[0],
177
- setShowSlashDropdown = _useState16[1];
178
- var _useState17 = useState(''),
179
- _useState18 = _slicedToArray(_useState17, 2),
180
- slashQuery = _useState18[0],
181
- setSlashQuery = _useState18[1];
182
- var slashMenuWasOpenRef = useRef(false);
183
- var slashDropdownZIndex = useMaiaTaskPanelZIndex(1200, 'overlay');
184
- var getCaretRect = useCaretPosition();
185
- var _useState19 = useState({
186
- bottom: 0,
187
- left: 0,
188
- maxHeight: SLASH_DROPDOWN_MAX_HEIGHT_PX
189
- }),
190
- _useState20 = _slicedToArray(_useState19, 2),
191
- slashDropdownPos = _useState20[0],
192
- setSlashDropdownPos = _useState20[1];
193
- var user = useUser();
194
- var showSkillsButton = canAccessToSkills(user);
195
- var skillsButtonRef = useRef(null);
196
- var skillsMenuWasOpenRef = useRef(false);
197
- var _useSkillsCatalog = useSkillsCatalog(),
198
- skills = _useSkillsCatalog.skills,
199
- skillsLoading = _useSkillsCatalog.loading,
200
- skillsError = _useSkillsCatalog.error,
201
- fetchSkills = _useSkillsCatalog.fetchSkills;
202
- var _useState21 = useState(false),
203
- _useState22 = _slicedToArray(_useState21, 2),
204
- showSkillsDropdown = _useState22[0],
205
- setShowSkillsDropdown = _useState22[1];
206
- var _useState23 = useState(''),
207
- _useState24 = _slicedToArray(_useState23, 2),
208
- skillsQuery = _useState24[0],
209
- setSkillsQuery = _useState24[1];
210
- var _useState25 = useState({
211
- bottom: 0,
212
- right: 0,
213
- maxHeight: SLASH_DROPDOWN_MAX_HEIGHT_PX
214
- }),
215
- _useState26 = _slicedToArray(_useState25, 2),
216
- skillsDropdownPos = _useState26[0],
217
- setSkillsDropdownPos = _useState26[1];
218
- var positionSlashDropdown = useCallback(function () {
219
- var _wrapperRef$current, _caret$top, _caret$left;
220
- var wrapperRect = (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.getBoundingClientRect();
221
- var caret = getCaretRect('/');
222
- var topSource = (_caret$top = caret === null || caret === void 0 ? void 0 : caret.top) !== null && _caret$top !== void 0 ? _caret$top : wrapperRect && wrapperRect.width > 0 ? wrapperRect.top : null;
223
- var leftSource = (_caret$left = caret === null || caret === void 0 ? void 0 : caret.left) !== null && _caret$left !== void 0 ? _caret$left : wrapperRect && wrapperRect.width > 0 ? wrapperRect.left : null;
224
- if (topSource == null || leftSource == null) return;
225
- var viewportH = window.innerHeight;
226
- var viewportW = window.innerWidth;
227
- var left = Math.max(SLASH_DROPDOWN_VIEWPORT_PAD_PX, Math.min(viewportW - SLASH_DROPDOWN_WIDTH_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX, leftSource));
228
- var availableHeightPx = topSource - SLASH_DROPDOWN_GAP_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX;
229
- var maxHeight = Math.min(SLASH_DROPDOWN_MAX_HEIGHT_PX, Math.max(0, availableHeightPx));
230
- setSlashDropdownPos({
231
- left: left,
232
- bottom: viewportH - topSource + SLASH_DROPDOWN_GAP_PX,
233
- maxHeight: maxHeight
234
- });
235
- }, [wrapperRef, getCaretRect]);
236
- useLayoutEffect(function () {
237
- if (!showSlashDropdown) return undefined;
238
- positionSlashDropdown();
239
- var handler = function handler() {
240
- return positionSlashDropdown();
241
- };
242
- window.addEventListener('scroll', handler, true);
243
- window.addEventListener('resize', handler);
244
- return function () {
245
- window.removeEventListener('scroll', handler, true);
246
- window.removeEventListener('resize', handler);
247
- };
248
- }, [showSlashDropdown, slashQuery, positionSlashDropdown]);
249
-
250
- /** El popover de skills se ancla al borde derecho del input (a diferencia del de slash). */
251
- var positionSkillsDropdown = useCallback(function () {
252
- var _wrapperRef$current2;
253
- var rect = (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.getBoundingClientRect();
254
- if (!rect || rect.width <= 0) return;
255
- var viewportH = window.innerHeight;
256
- var viewportW = window.innerWidth;
257
- var right = Math.max(SLASH_DROPDOWN_VIEWPORT_EDGE_PX, Math.min(viewportW - SKILLS_DROPDOWN_WIDTH_PX - SLASH_DROPDOWN_VIEWPORT_EDGE_PX, viewportW - rect.right));
258
- var availableHeightPx = rect.top - SLASH_DROPDOWN_GAP_ABOVE_INPUT_PX - SLASH_DROPDOWN_VIEWPORT_EDGE_PX;
259
- setSkillsDropdownPos({
260
- right: right,
261
- bottom: viewportH - rect.top + SLASH_DROPDOWN_GAP_ABOVE_INPUT_PX,
262
- maxHeight: Math.min(SLASH_DROPDOWN_MAX_HEIGHT_PX, Math.max(0, availableHeightPx))
263
- });
264
- }, [wrapperRef]);
265
- useLayoutEffect(function () {
266
- if (!showSkillsDropdown) return undefined;
267
- positionSkillsDropdown();
268
- var handler = function handler() {
269
- return positionSkillsDropdown();
270
- };
271
- window.addEventListener('scroll', handler, true);
272
- window.addEventListener('resize', handler);
273
- return function () {
274
- window.removeEventListener('scroll', handler, true);
275
- window.removeEventListener('resize', handler);
276
- };
277
- }, [showSkillsDropdown, positionSkillsDropdown]);
278
-
279
- /** Tras elegir o quitar búsqueda web/profunda: volver al textarea (Popover/menu puede robar foco). */
280
- var scheduleInputFocusAfterToolAction = function scheduleInputFocusAfterToolAction() {
281
- if (disabled) {
282
- return;
283
- }
284
- requestAnimationFrame(function () {
285
- window.setTimeout(function () {
286
- var _editorRef$current;
287
- (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 || _editorRef$current.focus();
288
- }, 0);
289
- });
290
- };
291
- var closePlusMenu = function closePlusMenu() {
292
- setPlusMenuAnchor(null);
293
- scheduleInputFocusAfterToolAction();
294
- };
295
- var cancelPendingToolChipExit = function cancelPendingToolChipExit() {
296
- if (toolChipExitTimerRef.current !== null) {
297
- clearTimeout(toolChipExitTimerRef.current);
298
- toolChipExitTimerRef.current = null;
299
- }
300
- setToolChipExiting(false);
301
- };
302
- var handlePlusButtonMouseDown = function handlePlusButtonMouseDown(e) {
303
- // Evita que el botón robe el foco del input al abrir el menú.
304
- e.preventDefault();
305
- };
306
- var handlePlusButtonClick = function handlePlusButtonClick(e) {
307
- e.stopPropagation();
308
- if (plusMenuAnchor) {
309
- closePlusMenu();
310
- return;
311
- }
312
- setPlusMenuAnchor(e.currentTarget);
313
- eventAmplitude(EVENTS.aiChatPlusOpen, _objectSpread({
314
- agent_type: analyticsAgentType
315
- }, analyticsCloneEntityPayload));
316
- };
317
- var handleMentionButtonClick = function handleMentionButtonClick(e) {
318
- var _editorRef$current2;
319
- e.stopPropagation();
320
- if (disabled) return;
321
- closePlusMenu();
322
- (_editorRef$current2 = editorRef.current) === null || _editorRef$current2 === void 0 || _editorRef$current2.insertMentionTrigger();
323
- };
324
- var handlePlusMenuAttach = function handlePlusMenuAttach() {
325
- var _fileInputRef$current;
326
- closePlusMenu();
327
- eventAmplitude(EVENTS.aiChatTools, _objectSpread({
328
- agent_type: analyticsAgentType,
329
- option: 'files'
330
- }, analyticsCloneEntityPayload));
331
- if (attachments.length >= MAX_CHAT_INPUT_ATTACHMENTS) return;
332
- (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 || _fileInputRef$current.click();
333
- };
334
- var beginToolChipExit = function beginToolChipExit() {
335
- if (toolChipExitTimerRef.current !== null) {
336
- return;
337
- }
338
- var wasWeb = isWebSearchActive;
339
- var wasDeep = isDeepSearchActive;
340
- if (!wasWeb && !wasDeep) {
341
- return;
342
- }
343
- setToolChipExiting(true);
344
- toolChipExitTimerRef.current = setTimeout(function () {
345
- toolChipExitTimerRef.current = null;
346
- var _searchModeActiveRef$ = searchModeActiveRef.current,
347
- web = _searchModeActiveRef$.web,
348
- deep = _searchModeActiveRef$.deep;
349
- if (wasWeb && web) {
350
- toggleWebSearch();
351
- } else if (wasDeep && deep) {
352
- toggleDeepSearch();
353
- }
354
- setToolChipExiting(false);
355
- scheduleInputFocusAfterToolAction();
356
- }, TOOL_CHIP_EXIT_MS);
357
- };
358
- var handlePlusMenuWebSearch = function handlePlusMenuWebSearch() {
359
- closePlusMenu();
360
- if (isWebSearchActive) {
361
- beginToolChipExit();
362
- return;
363
- }
364
- cancelPendingToolChipExit();
365
- if (isDeepSearchActive) {
366
- toggleDeepSearch();
367
- }
368
- toggleWebSearch();
369
- eventAmplitude(EVENTS.aiChatTools, _objectSpread({
370
- agent_type: analyticsAgentType,
371
- option: 'search'
372
- }, analyticsCloneEntityPayload));
373
- scheduleInputFocusAfterToolAction();
374
- };
375
- var handlePlusMenuDeepSearch = function handlePlusMenuDeepSearch() {
376
- closePlusMenu();
377
- if (isDeepSearchActive) {
378
- beginToolChipExit();
379
- return;
380
- }
381
- cancelPendingToolChipExit();
382
- if (isWebSearchActive) {
383
- toggleWebSearch();
384
- }
385
- toggleDeepSearch();
386
- eventAmplitude(EVENTS.aiChatTools, _objectSpread({
387
- agent_type: analyticsAgentType,
388
- option: 'deep_search'
389
- }, analyticsCloneEntityPayload));
390
- scheduleInputFocusAfterToolAction();
391
- };
392
- var handlePlusMenuQuickActions = function handlePlusMenuQuickActions() {
393
- var _editorRef$current3;
394
- setPlusMenuAnchor(null);
395
- if (disabled) return;
396
- (_editorRef$current3 = editorRef.current) === null || _editorRef$current3 === void 0 || _editorRef$current3.insertSlashTrigger();
397
- };
398
- useEffect(function () {
399
- if (!disabled) {
400
- var _editorRef$current4;
401
- (_editorRef$current4 = editorRef.current) === null || _editorRef$current4 === void 0 || _editorRef$current4.focus();
402
- }
403
- }, [disabled]);
404
- useEffect(function () {
405
- initialDraftAppliedRef.current = false;
406
- }, [initialDraft]);
407
- useEffect(function () {
408
- var _editorRef$current5;
409
- var draft = initialDraft === null || initialDraft === void 0 ? void 0 : initialDraft.trim();
410
- if (!draft || initialDraftAppliedRef.current || disabled) {
411
- return;
412
- }
413
- initialDraftAppliedRef.current = true;
414
- if (deepLinkSendPendingRef) {
415
- deepLinkSendPendingRef.current = true;
416
- }
417
- (_editorRef$current5 = editorRef.current) === null || _editorRef$current5 === void 0 || _editorRef$current5.setPlainText(draft);
418
- setHasTypingPresence(true);
419
- if (!disabled) {
420
- var _editorRef$current6;
421
- (_editorRef$current6 = editorRef.current) === null || _editorRef$current6 === void 0 || _editorRef$current6.focus();
422
- }
423
- }, [initialDraft, disabled, deepLinkSendPendingRef]);
424
- var sendDisabled = useMemo(function () {
425
- return !hasTypingPresence && attachments.length === 0;
426
- }, [hasTypingPresence, attachments.length]);
427
- useEffect(function () {
428
- searchModeActiveRef.current = {
429
- web: isWebSearchActive,
430
- deep: isDeepSearchActive
431
- };
432
- }, [isWebSearchActive, isDeepSearchActive]);
433
- useEffect(function () {
434
- return function () {
435
- if (toolChipExitTimerRef.current !== null) {
436
- clearTimeout(toolChipExitTimerRef.current);
437
- }
438
- };
439
- }, []);
440
- useEffect(function () {
441
- if (!isWebSearchActive && !isDeepSearchActive) {
442
- setActiveToolChipHovered(false);
443
- }
444
- }, [isWebSearchActive, isDeepSearchActive]);
445
-
446
- // Auto-focus cuando cambia el agente o la conversación, o al montar el componente
447
- useEffect(function () {
448
- var agentChanged = previousAgentIdRef.current !== (agent === null || agent === void 0 ? void 0 : agent.id);
449
- var previousChatId = previousChatIdRef.current;
450
- var currentChatId = chatId;
451
- var chatChanged = previousChatId !== currentChatId;
452
- var changedFromNewChatToOldChat = (previousChatId === undefined || previousChatId === null) && currentChatId !== undefined && currentChatId !== null;
453
- var newChatStarted = previousNewChatKeyRef.current !== newChatKey;
454
- var isInitialMount = previousAgentIdRef.current === undefined && previousChatIdRef.current === undefined;
455
- if ((agentChanged || chatChanged || changedFromNewChatToOldChat || newChatStarted || isInitialMount) && !disabled) {
456
- var delay = isInitialMount || changedFromNewChatToOldChat ? 200 : 100;
457
- setTimeout(function () {
458
- var _editorRef$current7;
459
- if (!disabled) (_editorRef$current7 = editorRef.current) === null || _editorRef$current7 === void 0 || _editorRef$current7.focus();
460
- }, delay);
461
- }
462
- previousAgentIdRef.current = agent === null || agent === void 0 ? void 0 : agent.id;
463
- previousChatIdRef.current = chatId;
464
- previousNewChatKeyRef.current = newChatKey;
465
- }, [agent === null || agent === void 0 ? void 0 : agent.id, chatId, newChatKey, disabled]);
466
-
467
- // Auto-focus cuando cambia la disposición del modal (sidebar / fullscreen / floating)
468
- useEffect(function () {
469
- if (!layoutMode) {
470
- return undefined;
471
- }
472
- var previousLayoutMode = previousLayoutModeRef.current;
473
- previousLayoutModeRef.current = layoutMode;
474
- if (previousLayoutMode === undefined || previousLayoutMode === layoutMode || disabled) {
475
- return undefined;
476
- }
477
- var timeoutId = window.setTimeout(function () {
478
- if (!disabled) {
479
- var _editorRef$current8;
480
- (_editorRef$current8 = editorRef.current) === null || _editorRef$current8 === void 0 || _editorRef$current8.focus();
481
- }
482
- }, 200);
483
- return function () {
484
- return window.clearTimeout(timeoutId);
485
- };
486
- }, [layoutMode, disabled]);
487
-
488
- // Appcues: notify that the input is visible for specialist agents (clone + project/client)
489
- useEffect(function () {
490
- var isSpecialistAgent = (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client');
491
- if (!wrapperRef.current || !isSpecialistAgent) return undefined;
492
- var observer = new IntersectionObserver(function (_ref2) {
493
- var _ref3 = _slicedToArray(_ref2, 1),
494
- entry = _ref3[0];
495
- if (entry.isIntersecting) {
496
- trackAppcuesEvent(APPCUES_EVENTS.maiaContextMentionInit);
497
- observer.disconnect();
498
- }
499
- }, {
500
- threshold: 0.1
501
- });
502
- observer.observe(wrapperRef.current);
503
- return function () {
504
- return observer.disconnect();
505
- };
506
- }, [agent === null || agent === void 0 ? void 0 : agent.id, agent === null || agent === void 0 ? void 0 : agent.type, agent === null || agent === void 0 ? void 0 : agent.entity]);
507
-
508
- // Clear input when session changes (user switches to a different chat)
509
- useEffect(function () {
510
- var handleSessionChange = function handleSessionChange() {
511
- var _editorRef$current9;
512
- if (deepLinkSendPendingRef) {
513
- deepLinkSendPendingRef.current = false;
514
- }
515
- (_editorRef$current9 = editorRef.current) === null || _editorRef$current9 === void 0 || _editorRef$current9.clear();
516
- setHasTypingPresence(false);
517
- setShowSlashDropdown(false);
518
- setSlashQuery('');
519
- resetMentionOpenTracking();
520
- };
521
- document.addEventListener('chat-session-changed', handleSessionChange);
522
- return function () {
523
- return document.removeEventListener('chat-session-changed', handleSessionChange);
524
- };
525
- }, [resetMentionOpenTracking, deepLinkSendPendingRef]);
526
-
527
- // Mantener foco al seleccionar un contexto reciente (el click en el pill lo roba al input).
528
- useEffect(function () {
529
- var handleRefocus = function handleRefocus() {
530
- if (disabled) return;
531
- requestAnimationFrame(function () {
532
- var _editorRef$current0;
533
- (_editorRef$current0 = editorRef.current) === null || _editorRef$current0 === void 0 || _editorRef$current0.focus();
534
- });
535
- };
536
- document.addEventListener('maia-input-refocus', handleRefocus);
537
- return function () {
538
- return document.removeEventListener('maia-input-refocus', handleRefocus);
539
- };
540
- }, [disabled]);
541
- useEffect(function () {
542
- var handleInsertSkillMention = function handleInsertSkillMention(event) {
543
- var _editorRef$current1, _editorRef$current10;
544
- var _ref4 = event.detail || {},
545
- skill = _ref4.skill;
546
- if (!skill || disabled) return;
547
- var normalizedName = skill.name.replace(/^(@\/|#)/, '');
548
- (_editorRef$current1 = editorRef.current) === null || _editorRef$current1 === void 0 || _editorRef$current1.clear();
549
- (_editorRef$current10 = editorRef.current) === null || _editorRef$current10 === void 0 || _editorRef$current10.appendMentionAtEnd({
550
- id: skill.id,
551
- type: 'skill',
552
- label: "#".concat(normalizedName)
553
- });
554
- requestAnimationFrame(function () {
555
- var _editorRef$current11;
556
- (_editorRef$current11 = editorRef.current) === null || _editorRef$current11 === void 0 || _editorRef$current11.focus();
557
- });
558
- };
559
- document.addEventListener('maia-insert-skill-mention', handleInsertSkillMention);
560
- return function () {
561
- return document.removeEventListener('maia-insert-skill-mention', handleInsertSkillMention);
562
- };
563
- }, [disabled]);
564
- var handleSendMessage = useCallback(function () {
565
- var _editorRef$current12, _state$text, _state$mentions, _editorRef$current13;
566
- var state = (_editorRef$current12 = editorRef.current) === null || _editorRef$current12 === void 0 ? void 0 : _editorRef$current12.serialize();
567
- var text = (_state$text = state === null || state === void 0 ? void 0 : state.text) !== null && _state$text !== void 0 ? _state$text : '';
568
- if (!text.trim() && !attachments.length) return;
569
- var mentions = (_state$mentions = state === null || state === void 0 ? void 0 : state.mentions) !== null && _state$mentions !== void 0 ? _state$mentions : [];
570
- onSendMessage(text, attachments, mentions);
571
- (_editorRef$current13 = editorRef.current) === null || _editorRef$current13 === void 0 || _editorRef$current13.clear();
572
- setHasTypingPresence(false);
573
- setShowSlashDropdown(false);
574
- setSlashQuery('');
575
- setShowSkillsDropdown(false);
576
- setSkillsQuery('');
577
- skillsMenuWasOpenRef.current = false;
578
- resetMentionOpenTracking();
579
- }, [attachments, onSendMessage, resetMentionOpenTracking]);
580
- var handleSelectSlashCommand = useCallback(function (command) {
581
- var _editorRef$current14, _state$text2, _editorRef$current16;
582
- eventAmplitude(EVENTS.aiChatQuickActionSelect, {
583
- type_quick_action: resolveQuickActionType(command),
584
- origin_quick_action: 'slash_menu'
585
- });
586
- var state = (_editorRef$current14 = editorRef.current) === null || _editorRef$current14 === void 0 ? void 0 : _editorRef$current14.serialize();
587
- var text = (_state$text2 = state === null || state === void 0 ? void 0 : state.text) !== null && _state$text2 !== void 0 ? _state$text2 : '';
588
- var triggerPart = "/".concat(slashQuery);
589
- var beforeTrigger = text.endsWith(triggerPart) ? text.slice(0, -triggerPart.length) : text;
590
- var isEmptyBeforeTrigger = beforeTrigger.trim() === '';
591
- if (isEmptyBeforeTrigger) {
592
- var _editorRef$current15;
593
- onSendMessage(command.title, attachments, undefined, undefined, undefined, undefined, command.id);
594
- (_editorRef$current15 = editorRef.current) === null || _editorRef$current15 === void 0 || _editorRef$current15.clear();
595
- setHasTypingPresence(false);
596
- setShowSlashDropdown(false);
597
- setSlashQuery('');
598
- slashMenuWasOpenRef.current = false;
599
- resetMentionOpenTracking();
600
- return;
601
- }
602
- (_editorRef$current16 = editorRef.current) === null || _editorRef$current16 === void 0 || _editorRef$current16.insertSlashCommand({
603
- id: command.id,
604
- label: command.title
605
- });
606
- setShowSlashDropdown(false);
607
- setSlashQuery('');
608
- slashMenuWasOpenRef.current = false;
609
- }, [attachments, onSendMessage, resetMentionOpenTracking, slashQuery, eventAmplitude]);
610
- var handleCloseSlashDropdown = function handleCloseSlashDropdown() {
611
- setShowSlashDropdown(false);
612
- slashMenuWasOpenRef.current = false;
613
- };
614
- var handleCloseSkillsDropdown = useCallback(function () {
615
- setShowSkillsDropdown(false);
616
- setSkillsQuery('');
617
- skillsMenuWasOpenRef.current = false;
618
- }, []);
619
-
620
- /** Abre el listado desde el botón: inserta `#` en el editor para que el trigger quede activo. */
621
- var handleSkillsButtonClick = function handleSkillsButtonClick(e) {
622
- var _editorRef$current17;
623
- e.stopPropagation();
624
- if (disabled) return;
625
- if (showSkillsDropdown) {
626
- handleCloseSkillsDropdown();
627
- return;
628
- }
629
- closePlusMenu();
630
- (_editorRef$current17 = editorRef.current) === null || _editorRef$current17 === void 0 || _editorRef$current17.insertSkillTrigger();
631
- };
632
- var handleSelectSkill = useCallback(function (skill) {
633
- var _editorRef$current18;
634
- (_editorRef$current18 = editorRef.current) === null || _editorRef$current18 === void 0 || _editorRef$current18.insertSkillMention({
635
- id: skill.id,
636
- type: 'skill',
637
- label: "#".concat(skill.name)
638
- });
639
- setShowSkillsDropdown(false);
640
- setSkillsQuery('');
641
- skillsMenuWasOpenRef.current = false;
642
- }, []);
643
- var handleCreateSkill = useCallback(function () {
644
- setShowSkillsDropdown(false);
645
- setSkillsQuery('');
646
- skillsMenuWasOpenRef.current = false;
647
- document.dispatchEvent(new CustomEvent('abm-skill-modal-set-values', {
648
- detail: {
649
- skillValues: {
650
- values: {
651
- isEditing: false,
652
- intent: 'write'
653
- },
654
- isOpen: true
655
- }
656
- }
657
- }));
658
- }, []);
659
- var handleEditorInput = useCallback(function (_ref5) {
660
- var text = _ref5.text,
661
- trigger = _ref5.trigger,
662
- slashTrigger = _ref5.slashTrigger,
663
- hashTrigger = _ref5.hashTrigger;
664
- setHasTypingPresence(text.trim().length > 0);
665
- onChange === null || onChange === void 0 || onChange();
666
- handleTrigger(trigger);
667
- if (slashTrigger !== null && slashTrigger !== void 0 && slashTrigger.active && slashCommands.length > 0) {
668
- if (!slashMenuWasOpenRef.current) {
669
- eventAmplitude(EVENTS.aiChatQuickActionOpen);
670
- slashMenuWasOpenRef.current = true;
671
- }
672
- setShowSlashDropdown(true);
673
- setSlashQuery(slashTrigger.query);
674
- } else {
675
- slashMenuWasOpenRef.current = false;
676
- setShowSlashDropdown(false);
677
- setSlashQuery('');
678
- }
679
- if (hashTrigger !== null && hashTrigger !== void 0 && hashTrigger.active && showSkillsButton) {
680
- // Fetch on-open: una sola llamada por apertura del listado.
681
- if (!skillsMenuWasOpenRef.current) {
682
- skillsMenuWasOpenRef.current = true;
683
- void fetchSkills();
684
- }
685
- setShowSkillsDropdown(true);
686
- setSkillsQuery(hashTrigger.query);
687
- } else {
688
- skillsMenuWasOpenRef.current = false;
689
- setShowSkillsDropdown(false);
690
- setSkillsQuery('');
691
- }
692
- }, [onChange, handleTrigger, slashCommands, eventAmplitude, showSkillsButton, fetchSkills]);
693
- var handleKeyDown = useCallback(function (e) {
694
- if (handlePopoverKeyDown(e)) return;
695
- if (e.key === 'Enter' && !e.shiftKey && !popoverOpen) {
696
- e.preventDefault();
697
- if (!sendDisabled && !disabled) handleSendMessage();
698
- }
699
- }, [handlePopoverKeyDown, popoverOpen, sendDisabled, disabled, handleSendMessage]);
700
- var addFiles = function addFiles(incoming) {
701
- if (!incoming.length || disabled) return;
702
- var exceededFiles = [];
703
- var excludedFiles = [];
704
- var fileSizes = {};
705
- var filesInserted = attachments.length;
706
- var isNewFormat = function isNewFormat(extension) {
707
- return ['.png', '.jpg', '.jpeg', '.pdf'].includes(extension);
708
- };
709
- var isOldFormat = function isOldFormat(extension) {
710
- return ['.txt', '.md', '.csv', '.doc', '.docx', '.xlsx', '.xls', '.ppt', '.pptx'].includes(extension);
711
- };
712
- var isAudioFormat = function isAudioFormat(extension) {
713
- return ['.flac', '.m4a', '.mp3', '.mp4', '.oga', '.ogg', '.wav', '.webm'].includes(extension);
714
- };
715
- var exceedsMaxSize = function exceedsMaxSize(extension, size) {
716
- return size > getMaxAttachmentSizeMb(extension) * 1024 * 1024;
717
- };
718
- incoming.forEach(function (file) {
719
- var _fileNameParts$pop;
720
- var excludedFile = false;
721
- var fileNameParts = file.name.split('.');
722
- var fileExtension = fileNameParts.length > 1 ? ".".concat((_fileNameParts$pop = fileNameParts.pop()) === null || _fileNameParts$pop === void 0 ? void 0 : _fileNameParts$pop.toLowerCase()) : '';
723
- if (!(allowedFileTypes !== null && allowedFileTypes !== void 0 && allowedFileTypes.includes(fileExtension))) {
724
- return;
725
- }
726
- fileSizes[file.name] = file.size;
727
- if (isNewFormat(fileExtension)) {
728
- if (exceedsMaxSize(fileExtension, file.size)) {
729
- exceededFiles.push(file.name);
730
- excludedFile = true;
731
- }
732
- if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
733
- excludedFiles.push(file.name);
734
- excludedFile = true;
735
- }
736
- } else if (isOldFormat(fileExtension)) {
737
- if (exceedsMaxSize(fileExtension, file.size)) {
738
- exceededFiles.push(file.name);
739
- excludedFile = true;
740
- }
741
- if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
742
- excludedFiles.push(file.name);
743
- excludedFile = true;
744
- }
745
- } else if (isAudioFormat(fileExtension)) {
746
- if (exceedsMaxSize(fileExtension, file.size)) {
747
- exceededFiles.push(file.name);
748
- excludedFile = true;
749
- }
750
- if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
751
- excludedFiles.push(file.name);
752
- excludedFile = true;
753
- }
754
- }
755
- if (!excludedFile) {
756
- filesInserted += 1;
757
- var typeFile = file.type || fileTypes[fileExtension];
758
- var parsedFile = new File([file], file.name, {
759
- type: typeFile
760
- });
761
- onFileAttach === null || onFileAttach === void 0 || onFileAttach(parsedFile);
762
- }
763
- });
764
- if (excludedFiles.length || exceededFiles.length) {
765
- setModalProps({
766
- isOpen: true,
767
- excludedFiles: excludedFiles,
768
- exceededFiles: exceededFiles,
769
- fileSizes: fileSizes
770
- });
771
- }
772
- };
773
- var handleFileSelect = function handleFileSelect(e) {
774
- var files = e.target.files;
775
- if (files) {
776
- addFiles(Array.from(files));
777
- }
778
- if (fileInputRef.current) {
779
- fileInputRef.current.value = '';
780
- }
781
- };
782
- var resetFileDrag = function resetFileDrag() {
783
- fileDragCounterRef.current = 0;
784
- setIsFileDragActive(false);
785
- };
786
- var handleDragEnter = function handleDragEnter(e) {
787
- if (!dataTransferHasFiles(e.dataTransfer)) return;
788
- e.preventDefault();
789
- e.stopPropagation();
790
- if (disabled) return;
791
- fileDragCounterRef.current += 1;
792
- setIsFileDragActive(true);
793
- };
794
- var handleDragLeave = function handleDragLeave(e) {
795
- if (!isFileDragActive && !dataTransferHasFiles(e.dataTransfer)) return;
796
- e.preventDefault();
797
- e.stopPropagation();
798
- fileDragCounterRef.current = Math.max(0, fileDragCounterRef.current - 1);
799
- if (fileDragCounterRef.current === 0) {
800
- setIsFileDragActive(false);
801
- }
802
- };
803
- var handleDragOver = function handleDragOver(e) {
804
- if (!dataTransferHasFiles(e.dataTransfer)) return;
805
- e.preventDefault();
806
- e.stopPropagation();
807
- if (disabled) return;
808
- e.dataTransfer.dropEffect = 'copy';
809
- };
810
- var handleDrop = function handleDrop(e) {
811
- if (!dataTransferHasFiles(e.dataTransfer)) {
812
- resetFileDrag();
813
- return;
814
- }
815
- e.preventDefault();
816
- e.stopPropagation();
817
- resetFileDrag();
818
- if (disabled) return;
819
- addFiles(filesFromDataTransfer(e.dataTransfer));
820
- };
821
- var handlePasteFiles = function handlePasteFiles(files) {
822
- addFiles(files);
823
- };
824
- var handleWrapperPaste = function handleWrapperPaste(e) {
825
- var _wrapperRef$current3;
826
- var editorEl = (_wrapperRef$current3 = wrapperRef.current) === null || _wrapperRef$current3 === void 0 ? void 0 : _wrapperRef$current3.querySelector('[contenteditable="true"]');
827
- if (editorEl && editorEl.contains(e.target)) return;
828
- var files = filesFromDataTransfer(e.clipboardData);
829
- if (!files.length) return;
830
- e.preventDefault();
831
- addFiles(files);
832
- };
833
- var handleDeleteAttachment = function handleDeleteAttachment(fileId) {
834
- onDeleteAttachment === null || onDeleteAttachment === void 0 || onDeleteAttachment(fileId);
835
- };
836
- var handleStopGeneration = function handleStopGeneration() {
837
- eventAmplitude(EVENTS.aiChatStopResponse);
838
- onStopGeneration === null || onStopGeneration === void 0 || onStopGeneration();
839
- };
840
- var showChipsRow = Boolean((contextChip === null || contextChip === void 0 || (_contextChip$items = contextChip.items) === null || _contextChip$items === void 0 ? void 0 : _contextChip$items.length) || attachments.length);
841
- useLayoutEffect(function () {
842
- var chipsEl = chipsRowRef.current;
843
- var toolbarEl = toolbarRowRef.current;
844
- var updateHeights = function updateHeights() {
845
- var nextChips = showChipsRow && chipsEl ? Math.ceil(chipsEl.getBoundingClientRect().height) : 0;
846
- var nextToolbar = toolbarEl ? Math.ceil(toolbarEl.getBoundingClientRect().height) : MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX;
847
- setChipsRowHeight(function (prev) {
848
- return prev === nextChips ? prev : nextChips;
849
- });
850
- setToolbarRowHeight(function (prev) {
851
- return prev === nextToolbar ? prev : nextToolbar;
852
- });
853
- };
854
- updateHeights();
855
- var observer = new ResizeObserver(updateHeights);
856
- if (showChipsRow && chipsEl) observer.observe(chipsEl);
857
- if (toolbarEl) observer.observe(toolbarEl);
858
- return function () {
859
- return observer.disconnect();
860
- };
861
- }, [showChipsRow, contextChip === null || contextChip === void 0 || (_contextChip$items2 = contextChip.items) === null || _contextChip$items2 === void 0 ? void 0 : _contextChip$items2.length, attachments.length]);
862
- var editorMaxHeight = useMemo(function () {
863
- return getMaiaInputEditorMaxHeight({
864
- chipsRowHeightPx: chipsRowHeight,
865
- toolbarRowHeightPx: toolbarRowHeight
866
- });
867
- }, [chipsRowHeight, toolbarRowHeight]);
868
- var toolbarIconColor = '#808080';
869
- var plusMenuIconColor = MAIA_CHAT_INPUT_UI.menuIcon;
870
- var isCustomAgent = (agent === null || agent === void 0 ? void 0 : agent.type) === 'custom';
871
- var hasCorAccess = Boolean(isCustomAgent && (agent === null || agent === void 0 || (_agent$connectors = agent.connectors) === null || _agent$connectors === void 0 ? void 0 : _agent$connectors.some(function (connector) {
872
- return connector.group === 'COR' && connector.slugs.some(function (slug) {
873
- return typeof slug === 'string' && slug.trim().length > 0;
874
- });
875
- })));
876
- var agentModelName = isCustomAgent ? (agent === null || agent === void 0 || (_agent$model_display_ = agent.model_display_name) === null || _agent$model_display_ === void 0 ? void 0 : _agent$model_display_.trim()) || null : null;
877
- var showCustomMetaIndicators = hasCorAccess || Boolean(agentModelName);
878
- var showMentionButton = (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' || hasCorAccess;
879
- var activeToolChipLeadingIcon;
880
- if (activeToolChipHovered) {
881
- activeToolChipLeadingIcon = /*#__PURE__*/_jsx(Cross, {
882
- color: MAIA_CHAT_INPUT_UI.chipCloseIcon,
883
- width: 18,
884
- height: 18
885
- });
886
- } else if (isWebSearchActive) {
887
- activeToolChipLeadingIcon = /*#__PURE__*/_jsx(MaiaInputWebSearchIcon, {
888
- color: plusMenuIconColor,
889
- width: 18,
890
- height: 18
891
- });
892
- } else {
893
- activeToolChipLeadingIcon = /*#__PURE__*/_jsx(MaiaInputDeepSearchIcon, {
894
- color: plusMenuIconColor,
895
- width: 18,
896
- height: 18
897
- });
898
- }
899
- return /*#__PURE__*/_jsxs(_Fragment, {
900
- children: [/*#__PURE__*/_jsxs(StyledMAIAInputWrapper, {
901
- ref: wrapperRef,
902
- disabled: false,
903
- alignButtons: alignButtons,
904
- hasAttachments: !!attachments.length,
905
- $fileDragActive: isFileDragActive,
906
- "data-appcues": "maia_chat_input",
907
- "data-maia-streaming": isStreaming ? 'true' : 'false',
908
- onPaste: handleWrapperPaste,
909
- onDragEnter: handleDragEnter,
910
- onDragLeave: handleDragLeave,
911
- onDragOver: handleDragOver,
912
- onDrop: handleDrop,
913
- children: [showChipsRow && /*#__PURE__*/_jsxs(SCInputChipsRow, {
914
- ref: chipsRowRef,
915
- children: [contextChip !== null && contextChip !== void 0 && (_contextChip$items3 = contextChip.items) !== null && _contextChip$items3 !== void 0 && _contextChip$items3.length ? /*#__PURE__*/_jsx(Chip, {
916
- items: contextChip.items,
917
- type: contextChip.type,
918
- leadingIcon: contextChip.leadingIcon,
919
- tooltipZIndex: tooltipZIndex
920
- }) : null, attachments.map(function (attachment, index) {
921
- var _attachment$type;
922
- var isImage = ((_attachment$type = attachment.type) === null || _attachment$type === void 0 ? void 0 : _attachment$type.startsWith('image/')) || /\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(attachment.name || '');
923
- var chipIcon = isImage ? /*#__PURE__*/_jsx(MaiaInputAttachmentImageIcon, {
924
- color: "#808080",
925
- width: 12,
926
- height: 12
927
- }) : /*#__PURE__*/_jsx(MaiaInputAttachIcon, {
928
- color: "#808080",
929
- width: 13,
930
- height: 13
931
- });
932
- return /*#__PURE__*/_jsx(Tooltip, {
933
- title: attachment.name,
934
- zIndex: tooltipZIndex,
935
- children: /*#__PURE__*/_jsxs(SCMIAttachment, {
936
- children: [/*#__PURE__*/_jsxs(SCMIAttachmentIcon, {
937
- children: [/*#__PURE__*/_jsx(SCMIAttachmentFileIcon, {
938
- children: chipIcon
939
- }), /*#__PURE__*/_jsx(SCMIAttachmentDeleteIcon, {
940
- type: "button",
941
- "aria-label": t('chat.removeAttachmentAria', {
942
- defaultValue: 'Quitar archivo'
943
- }),
944
- onClick: function onClick() {
945
- return handleDeleteAttachment(attachment.id);
946
- },
947
- children: /*#__PURE__*/_jsx(Cross, {
948
- color: "#666666",
949
- width: 14,
950
- height: 14
951
- })
952
- })]
953
- }), /*#__PURE__*/_jsx(SCMIAttachmentName, {
954
- children: attachment.name
955
- })]
956
- })
957
- }, "".concat(attachment.id, "-").concat(index));
958
- })]
959
- }), /*#__PURE__*/_jsxs(StyledMAIAMainToolbarGrid, {
960
- children: [/*#__PURE__*/_jsx(SCInputEditorCell, {
961
- children: /*#__PURE__*/_jsx(ContextMentionEditor, {
962
- ref: editorRef,
963
- disabled: disabled,
964
- placeholder: placeholder,
965
- maxHeight: editorMaxHeight,
966
- onInput: handleEditorInput,
967
- onKeyDown: handleKeyDown,
968
- onFocus: onFocus,
969
- onPasteFiles: handlePasteFiles
970
- })
971
- }), /*#__PURE__*/_jsxs(SCInputToolbarRow, {
972
- ref: toolbarRowRef,
973
- children: [/*#__PURE__*/_jsx(StyledMAIAPlusToolbarCell, {
974
- children: /*#__PURE__*/_jsxs(PlusMenuToolsRow, {
975
- children: [/*#__PURE__*/_jsx(PlusToggleButton, {
976
- type: "button",
977
- $menuOpen: plusMenuOpen,
978
- onMouseDown: handlePlusButtonMouseDown,
979
- onClick: handlePlusButtonClick,
980
- "aria-label": t('chat.openPlusMenuAria'),
981
- "aria-haspopup": "true",
982
- "aria-expanded": plusMenuOpen,
983
- children: /*#__PURE__*/_jsx(MaiaInputAddIcon, {
984
- color: toolbarIconColor,
985
- width: 18,
986
- height: 18
987
- })
988
- }), showMentionButton && /*#__PURE__*/_jsx(PlusToggleButton, {
989
- type: "button",
990
- $menuOpen: false,
991
- onClick: handleMentionButtonClick,
992
- disabled: disabled,
993
- "aria-label": t('chat.openMentionAria'),
994
- children: /*#__PURE__*/_jsx(MaiaInputMentionIcon, {
995
- color: toolbarIconColor,
996
- width: 18,
997
- height: 18
998
- })
999
- }), showSkillsButton && /*#__PURE__*/_jsxs(SkillsToggleButton, {
1000
- ref: skillsButtonRef,
1001
- type: "button",
1002
- onMouseDown: handlePlusButtonMouseDown,
1003
- onClick: handleSkillsButtonClick,
1004
- disabled: disabled,
1005
- "aria-haspopup": "listbox",
1006
- "aria-expanded": showSkillsDropdown,
1007
- children: [/*#__PURE__*/_jsx(SkillIcon, {
1008
- width: 16,
1009
- height: 16,
1010
- color: toolbarIconColor
1011
- }), t('mySkills.dropdownButton')]
1012
- }), /*#__PURE__*/_jsx(Popover, {
1013
- open: plusMenuOpen,
1014
- anchorEl: plusMenuAnchor,
1015
- onClose: closePlusMenu,
1016
- disableAutoFocus: true,
1017
- disableEnforceFocus: true,
1018
- disableRestoreFocus: true,
1019
- anchorOrigin: {
1020
- vertical: 'top',
1021
- horizontal: 'left'
1022
- },
1023
- transformOrigin: {
1024
- vertical: 'bottom',
1025
- horizontal: 'left'
1026
- },
1027
- sx: {
1028
- zIndex: plusMenuZIndex
1029
- },
1030
- slotProps: {
1031
- paper: {
1032
- elevation: 0,
1033
- sx: {
1034
- overflow: 'visible',
1035
- borderRadius: '4px',
1036
- boxShadow: 'none',
1037
- backgroundColor: 'transparent',
1038
- marginTop: '-4px'
1039
- }
1040
- }
1041
- },
1042
- children: /*#__PURE__*/_jsx(PlusMenuPaper, {
1043
- children: /*#__PURE__*/_jsxs(PlusMenuInnerColumn, {
1044
- children: [/*#__PURE__*/_jsxs(PlusMenuItemButton, {
1045
- type: "button",
1046
- onClick: handlePlusMenuAttach,
1047
- children: [/*#__PURE__*/_jsx(MaiaInputAttachIcon, {
1048
- color: plusMenuIconColor,
1049
- width: 21,
1050
- height: 20
1051
- }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1052
- children: t('chat.plusMenuAttach')
1053
- })]
1054
- }), /*#__PURE__*/_jsx(PlusMenuDivider, {}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
1055
- type: "button",
1056
- onClick: handlePlusMenuWebSearch,
1057
- children: [/*#__PURE__*/_jsx(MaiaInputWebSearchIcon, {
1058
- color: plusMenuIconColor,
1059
- width: 20,
1060
- height: 20
1061
- }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1062
- children: t('chat.searchWeb')
1063
- }), isWebSearchActive ? /*#__PURE__*/_jsx(Check, {
1064
- color: plusMenuIconColor,
1065
- width: 16,
1066
- height: 16
1067
- }) : null]
1068
- }), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
1069
- type: "button",
1070
- onClick: handlePlusMenuDeepSearch,
1071
- children: [/*#__PURE__*/_jsx(MaiaInputDeepSearchIcon, {
1072
- color: plusMenuIconColor,
1073
- width: 20,
1074
- height: 20
1075
- }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1076
- children: t('chat.plusMenuDeepInvestigation')
1077
- }), isDeepSearchActive ? /*#__PURE__*/_jsx(Check, {
1078
- color: plusMenuIconColor,
1079
- width: 16,
1080
- height: 16
1081
- }) : null]
1082
- }), /*#__PURE__*/_jsx(PlusMenuDivider, {}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
1083
- type: "button",
1084
- onClick: handlePlusMenuQuickActions,
1085
- children: [/*#__PURE__*/_jsx(MaiaInputSlashIcon, {
1086
- color: plusMenuIconColor,
1087
- width: 20,
1088
- height: 20
1089
- }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1090
- children: t('chat.plusMenuQuickActions')
1091
- })]
1092
- })]
1093
- })
1094
- })
1095
- }), (isWebSearchActive || isDeepSearchActive) && /*#__PURE__*/_jsxs(ActiveToolChipRoot, {
1096
- $hovered: activeToolChipHovered,
1097
- $exiting: toolChipExiting,
1098
- onMouseEnter: function onMouseEnter() {
1099
- return setActiveToolChipHovered(true);
1100
- },
1101
- onMouseLeave: function onMouseLeave() {
1102
- return setActiveToolChipHovered(false);
1103
- },
1104
- children: [/*#__PURE__*/_jsx(ActiveToolChipIconButton, {
1105
- type: "button",
1106
- $closeShown: activeToolChipHovered,
1107
- "aria-label": t('chat.removeActiveToolAria'),
1108
- onClick: function onClick(e) {
1109
- e.stopPropagation();
1110
- beginToolChipExit();
1111
- },
1112
- children: activeToolChipLeadingIcon
1113
- }), /*#__PURE__*/_jsx(ActiveToolChipLabel, {
1114
- children: isWebSearchActive ? t('chat.searchWeb') : t('chat.plusMenuDeepInvestigation')
1115
- })]
1116
- })]
1117
- })
1118
- }), /*#__PURE__*/_jsxs(StyledMAIASendToolbarCell, {
1119
- children: [showCustomMetaIndicators && /*#__PURE__*/_jsxs(SCInputMetaIndicators, {
1120
- children: [hasCorAccess && /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
1121
- title: t('chat.footer.corAccessTooltip')
1122
- }, tooltipZIndex != null ? {
1123
- zIndex: tooltipZIndex
1124
- } : {}), {}, {
1125
- children: /*#__PURE__*/_jsx(SCInputMetaIconButton, {
1126
- "aria-label": t('chat.footer.corAccessLabel'),
1127
- children: /*#__PURE__*/_jsx(CorAccessIcon, {
1128
- width: 15,
1129
- height: 14,
1130
- color: toolbarIconColor
1131
- })
1132
- })
1133
- })), agentModelName && /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
1134
- title: t('chipLlm.tooltip', {
1135
- model: agentModelName
1136
- })
1137
- }, tooltipZIndex != null ? {
1138
- zIndex: tooltipZIndex
1139
- } : {}), {}, {
1140
- children: /*#__PURE__*/_jsx(SCInputMetaIconButton, {
1141
- "aria-label": agentModelName,
1142
- children: /*#__PURE__*/_jsx(MaiaInputRobotIcon, {
1143
- width: 18,
1144
- height: 18,
1145
- color: toolbarIconColor
1146
- })
1147
- })
1148
- }))]
1149
- }), isWriting ? /*#__PURE__*/_jsx(Tooltip, {
1150
- title: t('chat.stop'),
1151
- zIndex: tooltipZIndex,
1152
- children: /*#__PURE__*/_jsx(StyledMAIAStopButton, {
1153
- disabled: false,
1154
- onClick: handleStopGeneration,
1155
- className: className,
1156
- children: /*#__PURE__*/_jsx(StyledMAIAStopIcon, {})
1157
- })
1158
- }) : /*#__PURE__*/_jsx(Tooltip, {
1159
- title: t('chat.send'),
1160
- zIndex: tooltipZIndex,
1161
- children: /*#__PURE__*/_jsx("span", {
1162
- style: {
1163
- display: 'inline-flex',
1164
- alignItems: 'center'
1165
- },
1166
- children: /*#__PURE__*/_jsx(StyledMAIASendButton, {
1167
- onClick: handleSendMessage,
1168
- className: className,
1169
- disabled: sendDisabled || disabled,
1170
- hasValues: hasTypingPresence || attachments.length > 0,
1171
- children: /*#__PURE__*/_jsx(MaiaInputSendIcon, {
1172
- color: "#BFBFBF",
1173
- width: 16,
1174
- height: 16
1175
- })
1176
- })
1177
- })
1178
- })]
1179
- })]
1180
- })]
1181
- }), /*#__PURE__*/_jsx("input", {
1182
- ref: fileInputRef,
1183
- type: "file",
1184
- multiple: true,
1185
- accept: ".txt,.md,.csv,.doc,.docx,.ppt,.pptx,.png,.jpg,.jpeg,.pdf,.xlsx,.xls,.flac,.m4a,.mp3,.mp4,.oga,.ogg,.wav,.webm",
1186
- onChange: handleFileSelect,
1187
- style: {
1188
- display: 'none'
1189
- }
1190
- }), isFileDragActive && /*#__PURE__*/_jsx(StyledMAIADropOverlay, {
1191
- children: t('chat.dropFilesHere')
1192
- })]
1193
- }), modalProps.isOpen && /*#__PURE__*/_jsx(ModalFileExceeds, {
1194
- onClose: function onClose() {
1195
- return setModalProps({
1196
- isOpen: false,
1197
- excludedFiles: [],
1198
- exceededFiles: [],
1199
- fileSizes: {}
1200
- });
1201
- },
1202
- excludedFiles: modalProps.excludedFiles,
1203
- exceededFiles: modalProps.exceededFiles,
1204
- fileSizes: modalProps.fileSizes
1205
- }), popoverNode && /*#__PURE__*/createPortal(popoverNode, document.body), showSlashDropdown && /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(SlashCommandDropdown, {
1206
- commands: slashCommands,
1207
- query: slashQuery,
1208
- onSelect: handleSelectSlashCommand,
1209
- onClose: handleCloseSlashDropdown,
1210
- bottom: slashDropdownPos.bottom,
1211
- left: slashDropdownPos.left,
1212
- maxHeight: slashDropdownPos.maxHeight,
1213
- zIndex: slashDropdownZIndex,
1214
- anchorRef: wrapperRef
1215
- }), document.body), showSkillsDropdown && /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(SkillsDropdown, {
1216
- skills: skills,
1217
- query: skillsQuery,
1218
- loading: skillsLoading,
1219
- error: skillsError,
1220
- canCreate: showSkillsButton,
1221
- onSelect: handleSelectSkill,
1222
- onCreate: handleCreateSkill,
1223
- onClose: handleCloseSkillsDropdown,
1224
- bottom: skillsDropdownPos.bottom,
1225
- right: skillsDropdownPos.right,
1226
- maxHeight: skillsDropdownPos.maxHeight,
1227
- zIndex: slashDropdownZIndex,
1228
- anchorRef: wrapperRef
1229
- }), document.body)]
1230
- });
1231
- };
1232
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImNyZWF0ZVBvcnRhbCIsIlBvcG92ZXIiLCJDaGVjayIsIkNyb3NzIiwiVG9vbHRpcCIsIkFjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbiIsIkFjdGl2ZVRvb2xDaGlwTGFiZWwiLCJBY3RpdmVUb29sQ2hpcFJvb3QiLCJQbHVzTWVudURpdmlkZXIiLCJQbHVzTWVudUlubmVyQ29sdW1uIiwiUGx1c01lbnVJdGVtQnV0dG9uIiwiUGx1c01lbnVJdGVtTGFiZWwiLCJQbHVzTWVudVBhcGVyIiwiUGx1c01lbnVUb29sc1JvdyIsIlBsdXNUb2dnbGVCdXR0b24iLCJTa2lsbHNUb2dnbGVCdXR0b24iLCJTQ0lucHV0Q2hpcHNSb3ciLCJTQ0lucHV0TWV0YUljb25CdXR0b24iLCJTQ0lucHV0TWV0YUluZGljYXRvcnMiLCJTQ01JQXR0YWNobWVudCIsIlNDTUlBdHRhY2htZW50RGVsZXRlSWNvbiIsIlNDTUlBdHRhY2htZW50RmlsZUljb24iLCJTQ01JQXR0YWNobWVudEljb24iLCJTQ01JQXR0YWNobWVudE5hbWUiLCJTdHlsZWRNQUlBSW5wdXRXcmFwcGVyIiwiU3R5bGVkTUFJQVNlbmRCdXR0b24iLCJTdHlsZWRNQUlBTWFpblRvb2xiYXJHcmlkIiwiU0NJbnB1dEVkaXRvckNlbGwiLCJTQ0lucHV0VG9vbGJhclJvdyIsIlN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGwiLCJTdHlsZWRNQUlBU2VuZFRvb2xiYXJDZWxsIiwiU3R5bGVkTUFJQVN0b3BCdXR0b24iLCJTdHlsZWRNQUlBU3RvcEljb24iLCJTdHlsZWRNQUlBRHJvcE92ZXJsYXkiLCJnZXRNYWlhSW5wdXRFZGl0b3JNYXhIZWlnaHQiLCJNQUlBX0lOUFVUX1RPT0xCQVJfUk9XX0hFSUdIVF9QWCIsInVzZUdsb2JhbENvbnRleHQiLCJNb2RhbEZpbGVFeGNlZWRzIiwiU2xhc2hDb21tYW5kRHJvcGRvd24iLCJTa2lsbHNEcm9wZG93biIsInVzZVNsYXNoQ29tbWFuZHMiLCJ1c2VTa2lsbHNDYXRhbG9nIiwiY2FuQWNjZXNzVG9Ta2lsbHMiLCJ1c2VVc2VyIiwicmVzb2x2ZVF1aWNrQWN0aW9uVHlwZSIsInVzZVQiLCJNYWlhSW5wdXRBZGRJY29uIiwiTWFpYUlucHV0QXR0YWNoSWNvbiIsIk1haWFJbnB1dEF0dGFjaG1lbnRJbWFnZUljb24iLCJNYWlhSW5wdXREZWVwU2VhcmNoSWNvbiIsIkNvckFjY2Vzc0ljb24iLCJNYWlhSW5wdXRNZW50aW9uSWNvbiIsIk1haWFJbnB1dFJvYm90SWNvbiIsIk1haWFJbnB1dFNlbmRJY29uIiwiTWFpYUlucHV0U2xhc2hJY29uIiwiU2tpbGxJY29uIiwiTWFpYUlucHV0V2ViU2VhcmNoSWNvbiIsIkVWRU5UUyIsInVzZUV2ZW50IiwiZ2V0Q2hhdFRvb2xzTWVudUFnZW50VHlwZSIsIk1BSUFfQ0hBVF9JTlBVVF9VSSIsImFsbG93ZWRGaWxlVHlwZXMiLCJmaWxlVHlwZXMiLCJnZXRNYXhBdHRhY2htZW50U2l6ZU1iIiwiTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMiLCJBUFBDVUVTX0VWRU5UUyIsInRyYWNrQXBwY3Vlc0V2ZW50IiwiQ2hpcCIsIkNvbnRleHRNZW50aW9uRWRpdG9yIiwidXNlTWFpYVRhc2tQYW5lbFpJbmRleCIsInVzZU1lbnRpb25Qb3BvdmVyIiwidXNlQ2FyZXRQb3NpdGlvbiIsImRhdGFUcmFuc2Zlckhhc0ZpbGVzIiwiZmlsZXNGcm9tRGF0YVRyYW5zZmVyIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwiVE9PTF9DSElQX0VYSVRfTVMiLCJTTEFTSF9EUk9QRE9XTl9XSURUSF9QWCIsIlNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFgiLCJTTEFTSF9EUk9QRE9XTl9HQVBfQUJPVkVfSU5QVVRfUFgiLCJTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9FREdFX1BYIiwiU0tJTExTX0RST1BET1dOX1dJRFRIX1BYIiwiU0xBU0hfRFJPUERPV05fR0FQX1BYIiwiU0xBU0hfRFJPUERPV05fVklFV1BPUlRfUEFEX1BYIiwiTUFJQUlucHV0IiwiX3JlZiIsIl9hZ2VudCRlbnRpdHkiLCJfY29udGV4dENoaXAkaXRlbXMiLCJfY29udGV4dENoaXAkaXRlbXMyIiwiX2FnZW50JGNvbm5lY3RvcnMiLCJfYWdlbnQkbW9kZWxfZGlzcGxheV8iLCJfY29udGV4dENoaXAkaXRlbXMzIiwib25TZW5kTWVzc2FnZSIsImNsYXNzTmFtZSIsImRpc2FibGVkIiwiaXNTdHJlYW1pbmciLCJpc1dyaXRpbmciLCJvblN0b3BHZW5lcmF0aW9uIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsIm9uRm9jdXMiLCJfcmVmJGFsaWduQnV0dG9ucyIsImFsaWduQnV0dG9ucyIsIm9uRmlsZUF0dGFjaCIsIm9uRGVsZXRlQXR0YWNobWVudCIsIl9yZWYkYXR0YWNobWVudHMiLCJhdHRhY2htZW50cyIsImNoYXRJZCIsIm5ld0NoYXRLZXkiLCJ0b29sdGlwWkluZGV4IiwiZXh0ZXJuYWxQb3BvdmVyQW5jaG9yUmVmIiwicG9wb3ZlckFuY2hvclJlZiIsImxheW91dE1vZGUiLCJjb250ZXh0Q2hpcCIsIl91c2VUIiwidCIsImVkaXRvclJlZiIsImZpbGVJbnB1dFJlZiIsImNoaXBzUm93UmVmIiwidG9vbGJhclJvd1JlZiIsImludGVybmFsV3JhcHBlclJlZiIsIndyYXBwZXJSZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJoYXNUeXBpbmdQcmVzZW5jZSIsInNldEhhc1R5cGluZ1ByZXNlbmNlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJjaGlwc1Jvd0hlaWdodCIsInNldENoaXBzUm93SGVpZ2h0IiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJ0b29sYmFyUm93SGVpZ2h0Iiwic2V0VG9vbGJhclJvd0hlaWdodCIsIl91c2VTdGF0ZTciLCJpc09wZW4iLCJleGNsdWRlZEZpbGVzIiwiZXhjZWVkZWRGaWxlcyIsImZpbGVTaXplcyIsIl91c2VTdGF0ZTgiLCJtb2RhbFByb3BzIiwic2V0TW9kYWxQcm9wcyIsImV2ZW50QW1wbGl0dWRlIiwiX3VzZUdsb2JhbENvbnRleHQiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInRvZ2dsZURlZXBTZWFyY2giLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJhZ2VudCIsImluaXRpYWxEcmFmdCIsImRlZXBMaW5rU2VuZFBlbmRpbmdSZWYiLCJwbHVzTWVudVpJbmRleCIsImluaXRpYWxEcmFmdEFwcGxpZWRSZWYiLCJfdXNlTWVudGlvblBvcG92ZXIiLCJwb3BvdmVyT3BlbiIsInJlc2V0TWVudGlvbk9wZW5UcmFja2luZyIsImhhbmRsZVRyaWdnZXIiLCJoYW5kbGVQb3BvdmVyS2V5RG93biIsImhhbmRsZUtleURvd24iLCJwb3BvdmVyTm9kZSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwicGx1c01lbnVBbmNob3IiLCJzZXRQbHVzTWVudUFuY2hvciIsIl91c2VTdGF0ZTEiLCJfdXNlU3RhdGUxMCIsImFjdGl2ZVRvb2xDaGlwSG92ZXJlZCIsInNldEFjdGl2ZVRvb2xDaGlwSG92ZXJlZCIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJ0b29sQ2hpcEV4aXRpbmciLCJzZXRUb29sQ2hpcEV4aXRpbmciLCJfdXNlU3RhdGUxMyIsIl91c2VTdGF0ZTE0IiwiaXNGaWxlRHJhZ0FjdGl2ZSIsInNldElzRmlsZURyYWdBY3RpdmUiLCJ0b29sQ2hpcEV4aXRUaW1lclJlZiIsImZpbGVEcmFnQ291bnRlclJlZiIsInNlYXJjaE1vZGVBY3RpdmVSZWYiLCJ3ZWIiLCJkZWVwIiwicGx1c01lbnVPcGVuIiwiQm9vbGVhbiIsInByZXZpb3VzQWdlbnRJZFJlZiIsInVuZGVmaW5lZCIsInByZXZpb3VzQ2hhdElkUmVmIiwicHJldmlvdXNOZXdDaGF0S2V5UmVmIiwicHJldmlvdXNMYXlvdXRNb2RlUmVmIiwiYW5hbHl0aWNzQWdlbnRUeXBlIiwiYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkIiwidHlwZSIsImVudGl0eSIsIl91c2VTbGFzaENvbW1hbmRzIiwiaWQiLCJzbGFzaENvbW1hbmRzIiwiY29tbWFuZHMiLCJfdXNlU3RhdGUxNSIsIl91c2VTdGF0ZTE2Iiwic2hvd1NsYXNoRHJvcGRvd24iLCJzZXRTaG93U2xhc2hEcm9wZG93biIsIl91c2VTdGF0ZTE3IiwiX3VzZVN0YXRlMTgiLCJzbGFzaFF1ZXJ5Iiwic2V0U2xhc2hRdWVyeSIsInNsYXNoTWVudVdhc09wZW5SZWYiLCJzbGFzaERyb3Bkb3duWkluZGV4IiwiZ2V0Q2FyZXRSZWN0IiwiX3VzZVN0YXRlMTkiLCJib3R0b20iLCJsZWZ0IiwibWF4SGVpZ2h0IiwiX3VzZVN0YXRlMjAiLCJzbGFzaERyb3Bkb3duUG9zIiwic2V0U2xhc2hEcm9wZG93blBvcyIsInVzZXIiLCJzaG93U2tpbGxzQnV0dG9uIiwic2tpbGxzQnV0dG9uUmVmIiwic2tpbGxzTWVudVdhc09wZW5SZWYiLCJfdXNlU2tpbGxzQ2F0YWxvZyIsInNraWxscyIsInNraWxsc0xvYWRpbmciLCJsb2FkaW5nIiwic2tpbGxzRXJyb3IiLCJlcnJvciIsImZldGNoU2tpbGxzIiwiX3VzZVN0YXRlMjEiLCJfdXNlU3RhdGUyMiIsInNob3dTa2lsbHNEcm9wZG93biIsInNldFNob3dTa2lsbHNEcm9wZG93biIsIl91c2VTdGF0ZTIzIiwiX3VzZVN0YXRlMjQiLCJza2lsbHNRdWVyeSIsInNldFNraWxsc1F1ZXJ5IiwiX3VzZVN0YXRlMjUiLCJyaWdodCIsIl91c2VTdGF0ZTI2Iiwic2tpbGxzRHJvcGRvd25Qb3MiLCJzZXRTa2lsbHNEcm9wZG93blBvcyIsInBvc2l0aW9uU2xhc2hEcm9wZG93biIsIl93cmFwcGVyUmVmJGN1cnJlbnQiLCJfY2FyZXQkdG9wIiwiX2NhcmV0JGxlZnQiLCJ3cmFwcGVyUmVjdCIsImN1cnJlbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjYXJldCIsInRvcFNvdXJjZSIsInRvcCIsIndpZHRoIiwibGVmdFNvdXJjZSIsInZpZXdwb3J0SCIsIndpbmRvdyIsImlubmVySGVpZ2h0Iiwidmlld3BvcnRXIiwiaW5uZXJXaWR0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJhdmFpbGFibGVIZWlnaHRQeCIsImhhbmRsZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBvc2l0aW9uU2tpbGxzRHJvcGRvd24iLCJfd3JhcHBlclJlZiRjdXJyZW50MiIsInJlY3QiLCJzY2hlZHVsZUlucHV0Rm9jdXNBZnRlclRvb2xBY3Rpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiX2VkaXRvclJlZiRjdXJyZW50IiwiZm9jdXMiLCJjbG9zZVBsdXNNZW51IiwiY2FuY2VsUGVuZGluZ1Rvb2xDaGlwRXhpdCIsImNsZWFyVGltZW91dCIsImhhbmRsZVBsdXNCdXR0b25Nb3VzZURvd24iLCJlIiwicHJldmVudERlZmF1bHQiLCJoYW5kbGVQbHVzQnV0dG9uQ2xpY2siLCJzdG9wUHJvcGFnYXRpb24iLCJjdXJyZW50VGFyZ2V0IiwiYWlDaGF0UGx1c09wZW4iLCJfb2JqZWN0U3ByZWFkIiwiYWdlbnRfdHlwZSIsImhhbmRsZU1lbnRpb25CdXR0b25DbGljayIsIl9lZGl0b3JSZWYkY3VycmVudDIiLCJpbnNlcnRNZW50aW9uVHJpZ2dlciIsImhhbmRsZVBsdXNNZW51QXR0YWNoIiwiX2ZpbGVJbnB1dFJlZiRjdXJyZW50IiwiYWlDaGF0VG9vbHMiLCJvcHRpb24iLCJsZW5ndGgiLCJjbGljayIsImJlZ2luVG9vbENoaXBFeGl0Iiwid2FzV2ViIiwid2FzRGVlcCIsIl9zZWFyY2hNb2RlQWN0aXZlUmVmJCIsImhhbmRsZVBsdXNNZW51V2ViU2VhcmNoIiwiaGFuZGxlUGx1c01lbnVEZWVwU2VhcmNoIiwiaGFuZGxlUGx1c01lbnVRdWlja0FjdGlvbnMiLCJfZWRpdG9yUmVmJGN1cnJlbnQzIiwiaW5zZXJ0U2xhc2hUcmlnZ2VyIiwiX2VkaXRvclJlZiRjdXJyZW50NCIsIl9lZGl0b3JSZWYkY3VycmVudDUiLCJkcmFmdCIsInRyaW0iLCJzZXRQbGFpblRleHQiLCJfZWRpdG9yUmVmJGN1cnJlbnQ2Iiwic2VuZERpc2FibGVkIiwiYWdlbnRDaGFuZ2VkIiwicHJldmlvdXNDaGF0SWQiLCJjdXJyZW50Q2hhdElkIiwiY2hhdENoYW5nZWQiLCJjaGFuZ2VkRnJvbU5ld0NoYXRUb09sZENoYXQiLCJuZXdDaGF0U3RhcnRlZCIsImlzSW5pdGlhbE1vdW50IiwiZGVsYXkiLCJfZWRpdG9yUmVmJGN1cnJlbnQ3IiwicHJldmlvdXNMYXlvdXRNb2RlIiwidGltZW91dElkIiwiX2VkaXRvclJlZiRjdXJyZW50OCIsImlzU3BlY2lhbGlzdEFnZW50Iiwib2JzZXJ2ZXIiLCJJbnRlcnNlY3Rpb25PYnNlcnZlciIsIl9yZWYyIiwiX3JlZjMiLCJlbnRyeSIsImlzSW50ZXJzZWN0aW5nIiwibWFpYUNvbnRleHRNZW50aW9uSW5pdCIsImRpc2Nvbm5lY3QiLCJ0aHJlc2hvbGQiLCJvYnNlcnZlIiwiaGFuZGxlU2Vzc2lvbkNoYW5nZSIsIl9lZGl0b3JSZWYkY3VycmVudDkiLCJjbGVhciIsImRvY3VtZW50IiwiaGFuZGxlUmVmb2N1cyIsIl9lZGl0b3JSZWYkY3VycmVudDAiLCJoYW5kbGVJbnNlcnRTa2lsbE1lbnRpb24iLCJldmVudCIsIl9lZGl0b3JSZWYkY3VycmVudDEiLCJfZWRpdG9yUmVmJGN1cnJlbnQxMCIsIl9yZWY0IiwiZGV0YWlsIiwic2tpbGwiLCJub3JtYWxpemVkTmFtZSIsIm5hbWUiLCJyZXBsYWNlIiwiYXBwZW5kTWVudGlvbkF0RW5kIiwibGFiZWwiLCJjb25jYXQiLCJfZWRpdG9yUmVmJGN1cnJlbnQxMSIsImhhbmRsZVNlbmRNZXNzYWdlIiwiX2VkaXRvclJlZiRjdXJyZW50MTIiLCJfc3RhdGUkdGV4dCIsIl9zdGF0ZSRtZW50aW9ucyIsIl9lZGl0b3JSZWYkY3VycmVudDEzIiwic3RhdGUiLCJzZXJpYWxpemUiLCJ0ZXh0IiwibWVudGlvbnMiLCJoYW5kbGVTZWxlY3RTbGFzaENvbW1hbmQiLCJjb21tYW5kIiwiX2VkaXRvclJlZiRjdXJyZW50MTQiLCJfc3RhdGUkdGV4dDIiLCJfZWRpdG9yUmVmJGN1cnJlbnQxNiIsImFpQ2hhdFF1aWNrQWN0aW9uU2VsZWN0IiwidHlwZV9xdWlja19hY3Rpb24iLCJvcmlnaW5fcXVpY2tfYWN0aW9uIiwidHJpZ2dlclBhcnQiLCJiZWZvcmVUcmlnZ2VyIiwiZW5kc1dpdGgiLCJzbGljZSIsImlzRW1wdHlCZWZvcmVUcmlnZ2VyIiwiX2VkaXRvclJlZiRjdXJyZW50MTUiLCJ0aXRsZSIsImluc2VydFNsYXNoQ29tbWFuZCIsImhhbmRsZUNsb3NlU2xhc2hEcm9wZG93biIsImhhbmRsZUNsb3NlU2tpbGxzRHJvcGRvd24iLCJoYW5kbGVTa2lsbHNCdXR0b25DbGljayIsIl9lZGl0b3JSZWYkY3VycmVudDE3IiwiaW5zZXJ0U2tpbGxUcmlnZ2VyIiwiaGFuZGxlU2VsZWN0U2tpbGwiLCJfZWRpdG9yUmVmJGN1cnJlbnQxOCIsImluc2VydFNraWxsTWVudGlvbiIsImhhbmRsZUNyZWF0ZVNraWxsIiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50Iiwic2tpbGxWYWx1ZXMiLCJ2YWx1ZXMiLCJpc0VkaXRpbmciLCJpbnRlbnQiLCJoYW5kbGVFZGl0b3JJbnB1dCIsIl9yZWY1IiwidHJpZ2dlciIsInNsYXNoVHJpZ2dlciIsImhhc2hUcmlnZ2VyIiwiYWN0aXZlIiwiYWlDaGF0UXVpY2tBY3Rpb25PcGVuIiwicXVlcnkiLCJrZXkiLCJzaGlmdEtleSIsImFkZEZpbGVzIiwiaW5jb21pbmciLCJmaWxlc0luc2VydGVkIiwiaXNOZXdGb3JtYXQiLCJleHRlbnNpb24iLCJpbmNsdWRlcyIsImlzT2xkRm9ybWF0IiwiaXNBdWRpb0Zvcm1hdCIsImV4Y2VlZHNNYXhTaXplIiwic2l6ZSIsImZvckVhY2giLCJmaWxlIiwiX2ZpbGVOYW1lUGFydHMkcG9wIiwiZXhjbHVkZWRGaWxlIiwiZmlsZU5hbWVQYXJ0cyIsInNwbGl0IiwiZmlsZUV4dGVuc2lvbiIsInBvcCIsInRvTG93ZXJDYXNlIiwicHVzaCIsInR5cGVGaWxlIiwicGFyc2VkRmlsZSIsIkZpbGUiLCJoYW5kbGVGaWxlU2VsZWN0IiwiZmlsZXMiLCJ0YXJnZXQiLCJBcnJheSIsImZyb20iLCJ2YWx1ZSIsInJlc2V0RmlsZURyYWciLCJoYW5kbGVEcmFnRW50ZXIiLCJkYXRhVHJhbnNmZXIiLCJoYW5kbGVEcmFnTGVhdmUiLCJoYW5kbGVEcmFnT3ZlciIsImRyb3BFZmZlY3QiLCJoYW5kbGVEcm9wIiwiaGFuZGxlUGFzdGVGaWxlcyIsImhhbmRsZVdyYXBwZXJQYXN0ZSIsIl93cmFwcGVyUmVmJGN1cnJlbnQzIiwiZWRpdG9yRWwiLCJxdWVyeVNlbGVjdG9yIiwiY29udGFpbnMiLCJjbGlwYm9hcmREYXRhIiwiaGFuZGxlRGVsZXRlQXR0YWNobWVudCIsImZpbGVJZCIsImhhbmRsZVN0b3BHZW5lcmF0aW9uIiwiYWlDaGF0U3RvcFJlc3BvbnNlIiwic2hvd0NoaXBzUm93IiwiaXRlbXMiLCJjaGlwc0VsIiwidG9vbGJhckVsIiwidXBkYXRlSGVpZ2h0cyIsIm5leHRDaGlwcyIsImNlaWwiLCJoZWlnaHQiLCJuZXh0VG9vbGJhciIsInByZXYiLCJSZXNpemVPYnNlcnZlciIsImVkaXRvck1heEhlaWdodCIsImNoaXBzUm93SGVpZ2h0UHgiLCJ0b29sYmFyUm93SGVpZ2h0UHgiLCJ0b29sYmFySWNvbkNvbG9yIiwicGx1c01lbnVJY29uQ29sb3IiLCJtZW51SWNvbiIsImlzQ3VzdG9tQWdlbnQiLCJoYXNDb3JBY2Nlc3MiLCJjb25uZWN0b3JzIiwic29tZSIsImNvbm5lY3RvciIsImdyb3VwIiwic2x1Z3MiLCJzbHVnIiwiYWdlbnRNb2RlbE5hbWUiLCJtb2RlbF9kaXNwbGF5X25hbWUiLCJzaG93Q3VzdG9tTWV0YUluZGljYXRvcnMiLCJzaG93TWVudGlvbkJ1dHRvbiIsImFjdGl2ZVRvb2xDaGlwTGVhZGluZ0ljb24iLCJjb2xvciIsImNoaXBDbG9zZUljb24iLCJjaGlsZHJlbiIsInJlZiIsImhhc0F0dGFjaG1lbnRzIiwiJGZpbGVEcmFnQWN0aXZlIiwib25QYXN0ZSIsIm9uRHJhZ0VudGVyIiwib25EcmFnTGVhdmUiLCJvbkRyYWdPdmVyIiwib25Ecm9wIiwibGVhZGluZ0ljb24iLCJtYXAiLCJhdHRhY2htZW50IiwiaW5kZXgiLCJfYXR0YWNobWVudCR0eXBlIiwiaXNJbWFnZSIsInN0YXJ0c1dpdGgiLCJ0ZXN0IiwiY2hpcEljb24iLCJ6SW5kZXgiLCJkZWZhdWx0VmFsdWUiLCJvbkNsaWNrIiwib25JbnB1dCIsIm9uS2V5RG93biIsIm9uUGFzdGVGaWxlcyIsIiRtZW51T3BlbiIsIm9uTW91c2VEb3duIiwib3BlbiIsImFuY2hvckVsIiwib25DbG9zZSIsImRpc2FibGVBdXRvRm9jdXMiLCJkaXNhYmxlRW5mb3JjZUZvY3VzIiwiZGlzYWJsZVJlc3RvcmVGb2N1cyIsImFuY2hvck9yaWdpbiIsInZlcnRpY2FsIiwiaG9yaXpvbnRhbCIsInRyYW5zZm9ybU9yaWdpbiIsInN4Iiwic2xvdFByb3BzIiwicGFwZXIiLCJlbGV2YXRpb24iLCJvdmVyZmxvdyIsImJvcmRlclJhZGl1cyIsImJveFNoYWRvdyIsImJhY2tncm91bmRDb2xvciIsIm1hcmdpblRvcCIsIiRob3ZlcmVkIiwiJGV4aXRpbmciLCJvbk1vdXNlRW50ZXIiLCJvbk1vdXNlTGVhdmUiLCIkY2xvc2VTaG93biIsIm1vZGVsIiwic3R5bGUiLCJkaXNwbGF5IiwiYWxpZ25JdGVtcyIsImhhc1ZhbHVlcyIsIm11bHRpcGxlIiwiYWNjZXB0IiwiYm9keSIsIm9uU2VsZWN0IiwiYW5jaG9yUmVmIiwiY2FuQ3JlYXRlIiwib25DcmVhdGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9NQUlBSW5wdXQvTUFJQUlucHV0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLXN5bnRheCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29udGludWUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZvaWQgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbG9uZWx5LWlmICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQge1xuICBDaGFuZ2VFdmVudCxcbiAgQ2xpcGJvYXJkRXZlbnQsXG4gIERyYWdFdmVudCxcbiAgS2V5Ym9hcmRFdmVudCxcbiAgTW91c2VFdmVudCxcbiAgUmVhY3ROb2RlLFxuICBNdXRhYmxlUmVmT2JqZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VMYXlvdXRFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IHsgUG9wb3ZlciB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnXG5pbXBvcnQgeyBDaGVjayB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0NoZWNrJ1xuaW1wb3J0IHsgQ3Jvc3MgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9Dcm9zcydcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICdAcHJvamVjdGNvci90b29sdGlwdjIvbGliL2NvbXBvbmVudHMvVG9vbHRpcCdcblxuaW1wb3J0IHtcbiAgQWN0aXZlVG9vbENoaXBJY29uQnV0dG9uLFxuICBBY3RpdmVUb29sQ2hpcExhYmVsLFxuICBBY3RpdmVUb29sQ2hpcFJvb3QsXG4gIFBsdXNNZW51RGl2aWRlcixcbiAgUGx1c01lbnVJbm5lckNvbHVtbixcbiAgUGx1c01lbnVJdGVtQnV0dG9uLFxuICBQbHVzTWVudUl0ZW1MYWJlbCxcbiAgUGx1c01lbnVQYXBlcixcbiAgUGx1c01lbnVUb29sc1JvdyxcbiAgUGx1c1RvZ2dsZUJ1dHRvbixcbiAgU2tpbGxzVG9nZ2xlQnV0dG9uLFxuICBTQ0lucHV0Q2hpcHNSb3csXG4gIFNDSW5wdXRNZXRhSWNvbkJ1dHRvbixcbiAgU0NJbnB1dE1ldGFJbmRpY2F0b3JzLFxuICBTQ01JQXR0YWNobWVudCxcbiAgU0NNSUF0dGFjaG1lbnREZWxldGVJY29uLFxuICBTQ01JQXR0YWNobWVudEZpbGVJY29uLFxuICBTQ01JQXR0YWNobWVudEljb24sXG4gIFNDTUlBdHRhY2htZW50TmFtZSxcbiAgU3R5bGVkTUFJQUlucHV0V3JhcHBlcixcbiAgU3R5bGVkTUFJQVNlbmRCdXR0b24sXG4gIFN0eWxlZE1BSUFNYWluVG9vbGJhckdyaWQsXG4gIFNDSW5wdXRFZGl0b3JDZWxsLFxuICBTQ0lucHV0VG9vbGJhclJvdyxcbiAgU3R5bGVkTUFJQVBsdXNUb29sYmFyQ2VsbCxcbiAgU3R5bGVkTUFJQVNlbmRUb29sYmFyQ2VsbCxcbiAgU3R5bGVkTUFJQVN0b3BCdXR0b24sXG4gIFN0eWxlZE1BSUFTdG9wSWNvbixcbiAgU3R5bGVkTUFJQURyb3BPdmVybGF5LFxufSBmcm9tICcuL3N0eWxlcydcbmltcG9ydCB7IGdldE1haWFJbnB1dEVkaXRvck1heEhlaWdodCwgTUFJQV9JTlBVVF9UT09MQkFSX1JPV19IRUlHSFRfUFggfSBmcm9tICcuL21haWFJbnB1dExheW91dCdcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgTW9kYWxGaWxlRXhjZWVkcyB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9Nb2RhbEZpbGVFeGNlZWRzJ1xuaW1wb3J0IHsgU2xhc2hDb21tYW5kRHJvcGRvd24gfSBmcm9tICcuLi9TbGFzaENvbW1hbmREcm9wZG93bidcbmltcG9ydCB7IFNraWxsc0Ryb3Bkb3duIH0gZnJvbSAnLi4vU2tpbGxzRHJvcGRvd24nXG5pbXBvcnQgeyB1c2VTbGFzaENvbW1hbmRzIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU2xhc2hDb21tYW5kcydcbmltcG9ydCB7IHVzZVNraWxsc0NhdGFsb2cgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VTa2lsbHNDYXRhbG9nJ1xuaW1wb3J0IHsgY2FuQWNjZXNzVG9Ta2lsbHMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvcGVybWlzc2lvbnMnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB0eXBlIHsgU2tpbGwgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9za2lsbCdcbmltcG9ydCB7IHJlc29sdmVRdWlja0FjdGlvblR5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ob3Vyc1BsYW5uZXJRdWlja0FjdGlvblR5cGUnXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0FjdGlvbidcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VUJ1xuaW1wb3J0IHsgTWFpYUlucHV0QWRkSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dEFkZEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRBdHRhY2hJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0QXR0YWNoSWNvbidcbmltcG9ydCB7IE1haWFJbnB1dEF0dGFjaG1lbnRJbWFnZUljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRBdHRhY2htZW50SW1hZ2VJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0RGVlcFNlYXJjaEljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXREZWVwU2VhcmNoSWNvbidcbmltcG9ydCB7IENvckFjY2Vzc0ljb24gfSBmcm9tICcuLi9pY29ucy9Db3JBY2Nlc3NJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0TWVudGlvbkljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRNZW50aW9uSWNvbidcbmltcG9ydCB7IE1haWFJbnB1dFJvYm90SWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dFJvYm90SWNvbidcbmltcG9ydCB7IE1haWFJbnB1dFNlbmRJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0U2VuZEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRTbGFzaEljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRTbGFzaEljb24nXG5pbXBvcnQgeyBTa2lsbEljb24gfSBmcm9tICcuLi9pY29ucy9Ta2lsbEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRXZWJTZWFyY2hJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0V2ViU2VhcmNoSWNvbidcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IGdldENoYXRUb29sc01lbnVBZ2VudFR5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9oaXRsQW5hbHl0aWNzJ1xuaW1wb3J0IHsgTUFJQV9DSEFUX0lOUFVUX1VJIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL2NvbmZpZydcbmltcG9ydCB7XG4gIGFsbG93ZWRGaWxlVHlwZXMsXG4gIGZpbGVUeXBlcyxcbiAgZ2V0TWF4QXR0YWNobWVudFNpemVNYixcbiAgTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMsXG59IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9mb3JtYXRFeHRlbnNpb25zJ1xuaW1wb3J0IHsgQVBQQ1VFU19FVkVOVFMsIHRyYWNrQXBwY3Vlc0V2ZW50IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBwY3VlcydcbmltcG9ydCB7IENoaXAgfSBmcm9tICcuLi9DaGlwJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb25FZGl0b3IsIENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlIH0gZnJvbSAnLi4vQ29udGV4dE1lbnRpb25FZGl0b3InXG5pbXBvcnQgeyB1c2VNYWlhVGFza1BhbmVsWkluZGV4IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWFpYVRhc2tQYW5lbFpJbmRleCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tY3ljbGVcbmltcG9ydCB7IHVzZU1lbnRpb25Qb3BvdmVyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWVudGlvblBvcG92ZXInXG5pbXBvcnQgeyB1c2VDYXJldFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQ2FyZXRQb3NpdGlvbidcbmltcG9ydCB7IENvbnRleHRFbnRpdHlUeXBlLCBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgZGF0YVRyYW5zZmVySGFzRmlsZXMsIGZpbGVzRnJvbURhdGFUcmFuc2ZlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NoYXRJbnB1dEZpbGVzJ1xuXG5jb25zdCBUT09MX0NISVBfRVhJVF9NUyA9IDIyMFxuY29uc3QgU0xBU0hfRFJPUERPV05fV0lEVEhfUFggPSAzNDBcbmNvbnN0IFNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFggPSA0MTZcbmNvbnN0IFNMQVNIX0RST1BET1dOX0dBUF9BQk9WRV9JTlBVVF9QWCA9IDRcbmNvbnN0IFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX0VER0VfUFggPSA4XG5jb25zdCBTS0lMTFNfRFJPUERPV05fV0lEVEhfUFggPSAzMzlcbmNvbnN0IFNMQVNIX0RST1BET1dOX0dBUF9QWCA9IDRcbmNvbnN0IFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCA9IDhcblxudHlwZSBBdHRhY2htZW50RmlsZSA9IHtcbiAgZmlsZTogRmlsZVxuICBvcmlnaW5hbEZpbGU/OiBGaWxlXG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHNpemU6IG51bWJlclxuICB0eXBlOiBzdHJpbmdcbiAgaWNvbj86IFJlYWN0Tm9kZVxufVxuXG50eXBlIE1BSUFJbnB1dFByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uU2VuZE1lc3NhZ2U6IChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICBmYXFJZD86IHN0cmluZyxcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICBmdWFJZD86IHN0cmluZyxcbiAgICBzY0lkPzogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBvblN0b3BHZW5lcmF0aW9uPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgaXNXcml0aW5nPzogYm9vbGVhblxuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICBvbkNoYW5nZT86ICgpID0+IHZvaWRcbiAgb25Gb2N1cz86ICgpID0+IHZvaWRcbiAgYWxpZ25CdXR0b25zPzogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1xuICBvbkZpbGVBdHRhY2g/OiAoZmlsZTogRmlsZSkgPT4gdm9pZFxuICBvbkRlbGV0ZUF0dGFjaG1lbnQ/OiAoZmlsZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGNoYXRJZD86IHN0cmluZ1xuICBuZXdDaGF0S2V5PzogbnVtYmVyXG4gIHRvb2x0aXBaSW5kZXg/OiBudW1iZXJcbiAgLyoqIEV4cG9uZSBlbCB3cmFwcGVyIGRlbCBpbnB1dCBwYXJhIGFuY2xhciBwb3BvdmVycyAobWVuY2lvbmVzLCBwaW4gZGUgY29udGV4dG8pLiAqL1xuICBwb3BvdmVyQW5jaG9yUmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+XG4gIGxheW91dE1vZGU/OiAnc2lkZWJhcicgfCAnZnVsbHNjcmVlbicgfCAnZmxvYXRpbmcnXG4gIC8qKiBDaGlwIGRlIGNvbnRleHRvICh0YXJlYS9wcm95ZWN0by9jbGllbnRlL2dsb2JhbCkgbW9zdHJhZG8gZW4gbGEgdG9vbGJhciBkZWwgaW5wdXQuICovXG4gIGNvbnRleHRDaGlwPzoge1xuICAgIGl0ZW1zOiBzdHJpbmdbXVxuICAgIHR5cGU/OiBDb250ZXh0RW50aXR5VHlwZVxuICAgIGxlYWRpbmdJY29uPzogUmVhY3ROb2RlXG4gIH0gfCBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBNQUlBSW5wdXQgPSAoe1xuICBvblNlbmRNZXNzYWdlLFxuICBjbGFzc05hbWUsXG4gIGRpc2FibGVkLFxuICBpc1N0cmVhbWluZyxcbiAgaXNXcml0aW5nLFxuICBvblN0b3BHZW5lcmF0aW9uLFxuICBwbGFjZWhvbGRlcixcbiAgb25DaGFuZ2UsXG4gIG9uRm9jdXMsXG4gIGFsaWduQnV0dG9ucyA9ICd2ZXJ0aWNhbCcsXG4gIG9uRmlsZUF0dGFjaCxcbiAgb25EZWxldGVBdHRhY2htZW50LFxuICBhdHRhY2htZW50cyA9IFtdLFxuICBjaGF0SWQsXG4gIG5ld0NoYXRLZXksXG4gIHRvb2x0aXBaSW5kZXgsXG4gIHBvcG92ZXJBbmNob3JSZWY6IGV4dGVybmFsUG9wb3ZlckFuY2hvclJlZixcbiAgbGF5b3V0TW9kZSxcbiAgY29udGV4dENoaXAsXG59OiBNQUlBSW5wdXRQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8Q29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGU+KG51bGwpXG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICBjb25zdCBjaGlwc1Jvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgdG9vbGJhclJvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgaW50ZXJuYWxXcmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCB3cmFwcGVyUmVmID0gZXh0ZXJuYWxQb3BvdmVyQW5jaG9yUmVmID8/IGludGVybmFsV3JhcHBlclJlZlxuICBjb25zdCBbaGFzVHlwaW5nUHJlc2VuY2UsIHNldEhhc1R5cGluZ1ByZXNlbmNlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY2hpcHNSb3dIZWlnaHQsIHNldENoaXBzUm93SGVpZ2h0XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFt0b29sYmFyUm93SGVpZ2h0LCBzZXRUb29sYmFyUm93SGVpZ2h0XSA9IHVzZVN0YXRlKE1BSUFfSU5QVVRfVE9PTEJBUl9ST1dfSEVJR0hUX1BYKVxuICBjb25zdCBbbW9kYWxQcm9wcywgc2V0TW9kYWxQcm9wc10gPSB1c2VTdGF0ZSh7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBleGNsdWRlZEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICBleGNlZWRlZEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICBmaWxlU2l6ZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gIH0pXG4gIGNvbnN0IGV2ZW50QW1wbGl0dWRlID0gdXNlRXZlbnQoKVxuICBjb25zdCB7XG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZURlZXBTZWFyY2gsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGFnZW50LFxuICAgIGluaXRpYWxEcmFmdCxcbiAgICBkZWVwTGlua1NlbmRQZW5kaW5nUmVmLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IHBsdXNNZW51WkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxMzAwLCAnb3ZlcmxheScpXG4gIGNvbnN0IGluaXRpYWxEcmFmdEFwcGxpZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qge1xuICAgIHBvcG92ZXJPcGVuLFxuICAgIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZyxcbiAgICBoYW5kbGVUcmlnZ2VyLFxuICAgIGhhbmRsZUtleURvd246IGhhbmRsZVBvcG92ZXJLZXlEb3duLFxuICAgIHBvcG92ZXJOb2RlLFxuICB9ID0gdXNlTWVudGlvblBvcG92ZXIoe1xuICAgIGVkaXRvclJlZixcbiAgICBwb3BvdmVyQW5jaG9yUmVmOiB3cmFwcGVyUmVmLFxuICB9KVxuXG4gIGNvbnN0IFtwbHVzTWVudUFuY2hvciwgc2V0UGx1c01lbnVBbmNob3JdID0gdXNlU3RhdGU8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbYWN0aXZlVG9vbENoaXBIb3ZlcmVkLCBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt0b29sQ2hpcEV4aXRpbmcsIHNldFRvb2xDaGlwRXhpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzRmlsZURyYWdBY3RpdmUsIHNldElzRmlsZURyYWdBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHRvb2xDaGlwRXhpdFRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbClcbiAgY29uc3QgZmlsZURyYWdDb3VudGVyUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNlYXJjaE1vZGVBY3RpdmVSZWYgPSB1c2VSZWYoeyB3ZWI6IGZhbHNlLCBkZWVwOiBmYWxzZSB9KVxuICBjb25zdCBwbHVzTWVudU9wZW4gPSBCb29sZWFuKHBsdXNNZW51QW5jaG9yKVxuXG4gIC8vIEluaWNpYWxpemFyIGxhcyByZWZlcmVuY2lhcyBjb21vIHVuZGVmaW5lZCBwYXJhIGRldGVjdGFyIGVsIHByaW1lciBjYW1iaW8gY29ycmVjdGFtZW50ZVxuICBjb25zdCBwcmV2aW91c0FnZW50SWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIGNvbnN0IHByZXZpb3VzQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBjb25zdCBwcmV2aW91c05ld0NoYXRLZXlSZWYgPSB1c2VSZWY8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIGNvbnN0IHByZXZpb3VzTGF5b3V0TW9kZVJlZiA9IHVzZVJlZjxNQUlBSW5wdXRQcm9wc1snbGF5b3V0TW9kZSddPih1bmRlZmluZWQpXG5cbiAgY29uc3QgYW5hbHl0aWNzQWdlbnRUeXBlID0gZ2V0Q2hhdFRvb2xzTWVudUFnZW50VHlwZShhZ2VudClcbiAgY29uc3QgYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkID0gYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgPyB7IGVudGl0eTogYWdlbnQuZW50aXR5ID8/IG51bGwgfSA6IHt9XG5cbiAgLy8gU2xhc2ggY29tbWFuZHMgYXBsaWNhbiBhIGNsb25lcyBlc3BlY2lhbGlzdGFzIHkgYWwgb3JjaGVzdHJhdG9yIGdsb2JhbCAoZXN0ZSBhZ3JlZ2EgbG9zIGRlIHN1cyBzdWJhZ2VudGVzKS5cbiAgLy8gTG9zIGN1c3RvbSB5IGxvcyBjbG9uZSBnbG9iYWwvbWFpYWtlciBubyBsb3MgdGllbmVuIGhhYmlsaXRhZG9zLlxuICBjb25zdCB7IGNvbW1hbmRzOiBzbGFzaENvbW1hbmRzIH0gPSB1c2VTbGFzaENvbW1hbmRzKFxuICAgIChhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCcpIHx8XG4gICAgICAoYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiYgYWdlbnQ/LmVudGl0eSAhPT0gJ2dsb2JhbCcpXG4gICAgICA/IGFnZW50Py5pZFxuICAgICAgOiB1bmRlZmluZWRcbiAgKVxuICBjb25zdCBbc2hvd1NsYXNoRHJvcGRvd24sIHNldFNob3dTbGFzaERyb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2xhc2hRdWVyeSwgc2V0U2xhc2hRdWVyeV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3Qgc2xhc2hNZW51V2FzT3BlblJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2xhc2hEcm9wZG93blpJbmRleCA9IHVzZU1haWFUYXNrUGFuZWxaSW5kZXgoMTIwMCwgJ292ZXJsYXknKVxuICBjb25zdCBnZXRDYXJldFJlY3QgPSB1c2VDYXJldFBvc2l0aW9uKClcbiAgY29uc3QgW3NsYXNoRHJvcGRvd25Qb3MsIHNldFNsYXNoRHJvcGRvd25Qb3NdID0gdXNlU3RhdGUoe1xuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIG1heEhlaWdodDogU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCxcbiAgfSlcblxuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHNob3dTa2lsbHNCdXR0b24gPSBjYW5BY2Nlc3NUb1NraWxscyh1c2VyKVxuICBjb25zdCBza2lsbHNCdXR0b25SZWYgPSB1c2VSZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBza2lsbHNNZW51V2FzT3BlblJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgeyBza2lsbHMsIGxvYWRpbmc6IHNraWxsc0xvYWRpbmcsIGVycm9yOiBza2lsbHNFcnJvciwgZmV0Y2hTa2lsbHMgfSA9IHVzZVNraWxsc0NhdGFsb2coKVxuICBjb25zdCBbc2hvd1NraWxsc0Ryb3Bkb3duLCBzZXRTaG93U2tpbGxzRHJvcGRvd25dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtza2lsbHNRdWVyeSwgc2V0U2tpbGxzUXVlcnldID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtza2lsbHNEcm9wZG93blBvcywgc2V0U2tpbGxzRHJvcGRvd25Qb3NdID0gdXNlU3RhdGUoe1xuICAgIGJvdHRvbTogMCxcbiAgICByaWdodDogMCxcbiAgICBtYXhIZWlnaHQ6IFNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFgsXG4gIH0pXG5cbiAgY29uc3QgcG9zaXRpb25TbGFzaERyb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gd3JhcHBlclJlZi5jdXJyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGNhcmV0ID0gZ2V0Q2FyZXRSZWN0KCcvJylcbiAgICBjb25zdCB0b3BTb3VyY2UgPSBjYXJldD8udG9wID8/ICh3cmFwcGVyUmVjdCAmJiB3cmFwcGVyUmVjdC53aWR0aCA+IDAgPyB3cmFwcGVyUmVjdC50b3AgOiBudWxsKVxuICAgIGNvbnN0IGxlZnRTb3VyY2UgPSBjYXJldD8ubGVmdCA/PyAod3JhcHBlclJlY3QgJiYgd3JhcHBlclJlY3Qud2lkdGggPiAwID8gd3JhcHBlclJlY3QubGVmdCA6IG51bGwpXG4gICAgaWYgKHRvcFNvdXJjZSA9PSBudWxsIHx8IGxlZnRTb3VyY2UgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICBjb25zdCB2aWV3cG9ydEggPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICBjb25zdCB2aWV3cG9ydFcgPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heChcbiAgICAgIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCxcbiAgICAgIE1hdGgubWluKHZpZXdwb3J0VyAtIFNMQVNIX0RST1BET1dOX1dJRFRIX1BYIC0gU0xBU0hfRFJPUERPV05fVklFV1BPUlRfUEFEX1BYLCBsZWZ0U291cmNlKVxuICAgIClcbiAgICBjb25zdCBhdmFpbGFibGVIZWlnaHRQeCA9IHRvcFNvdXJjZSAtIFNMQVNIX0RST1BET1dOX0dBUF9QWCAtIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWFxuICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgubWluKFNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFgsIE1hdGgubWF4KDAsIGF2YWlsYWJsZUhlaWdodFB4KSlcblxuICAgIHNldFNsYXNoRHJvcGRvd25Qb3Moe1xuICAgICAgbGVmdCxcbiAgICAgIGJvdHRvbTogdmlld3BvcnRIIC0gdG9wU291cmNlICsgU0xBU0hfRFJPUERPV05fR0FQX1BYLFxuICAgICAgbWF4SGVpZ2h0LFxuICAgIH0pXG4gIH0sIFt3cmFwcGVyUmVmLCBnZXRDYXJldFJlY3RdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzaG93U2xhc2hEcm9wZG93bikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcG9zaXRpb25TbGFzaERyb3Bkb3duKClcblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiBwb3NpdGlvblNsYXNoRHJvcGRvd24oKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVyKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZXIpXG4gICAgfVxuICB9LCBbc2hvd1NsYXNoRHJvcGRvd24sIHNsYXNoUXVlcnksIHBvc2l0aW9uU2xhc2hEcm9wZG93bl0pXG5cbiAgLyoqIEVsIHBvcG92ZXIgZGUgc2tpbGxzIHNlIGFuY2xhIGFsIGJvcmRlIGRlcmVjaG8gZGVsIGlucHV0IChhIGRpZmVyZW5jaWEgZGVsIGRlIHNsYXNoKS4gKi9cbiAgY29uc3QgcG9zaXRpb25Ta2lsbHNEcm9wZG93biA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCByZWN0ID0gd3JhcHBlclJlZi5jdXJyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGlmICghcmVjdCB8fCByZWN0LndpZHRoIDw9IDApIHJldHVyblxuXG4gICAgY29uc3Qgdmlld3BvcnRIID0gd2luZG93LmlubmVySGVpZ2h0XG4gICAgY29uc3Qgdmlld3BvcnRXID0gd2luZG93LmlubmVyV2lkdGhcbiAgICBjb25zdCByaWdodCA9IE1hdGgubWF4KFxuICAgICAgU0xBU0hfRFJPUERPV05fVklFV1BPUlRfRURHRV9QWCxcbiAgICAgIE1hdGgubWluKHZpZXdwb3J0VyAtIFNLSUxMU19EUk9QRE9XTl9XSURUSF9QWCAtIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX0VER0VfUFgsIHZpZXdwb3J0VyAtIHJlY3QucmlnaHQpXG4gICAgKVxuICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodFB4ID0gcmVjdC50b3AgLSBTTEFTSF9EUk9QRE9XTl9HQVBfQUJPVkVfSU5QVVRfUFggLSBTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9FREdFX1BYXG5cbiAgICBzZXRTa2lsbHNEcm9wZG93blBvcyh7XG4gICAgICByaWdodCxcbiAgICAgIGJvdHRvbTogdmlld3BvcnRIIC0gcmVjdC50b3AgKyBTTEFTSF9EUk9QRE9XTl9HQVBfQUJPVkVfSU5QVVRfUFgsXG4gICAgICBtYXhIZWlnaHQ6IE1hdGgubWluKFNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFgsIE1hdGgubWF4KDAsIGF2YWlsYWJsZUhlaWdodFB4KSksXG4gICAgfSlcbiAgfSwgW3dyYXBwZXJSZWZdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzaG93U2tpbGxzRHJvcGRvd24pIHJldHVybiB1bmRlZmluZWRcblxuICAgIHBvc2l0aW9uU2tpbGxzRHJvcGRvd24oKVxuXG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHBvc2l0aW9uU2tpbGxzRHJvcGRvd24oKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVyKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZXIpXG4gICAgfVxuICB9LCBbc2hvd1NraWxsc0Ryb3Bkb3duLCBwb3NpdGlvblNraWxsc0Ryb3Bkb3duXSlcblxuICAvKiogVHJhcyBlbGVnaXIgbyBxdWl0YXIgYsO6c3F1ZWRhIHdlYi9wcm9mdW5kYTogdm9sdmVyIGFsIHRleHRhcmVhIChQb3BvdmVyL21lbnUgcHVlZGUgcm9iYXIgZm9jbykuICovXG4gIGNvbnN0IHNjaGVkdWxlSW5wdXRGb2N1c0FmdGVyVG9vbEFjdGlvbiA9ICgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKVxuICAgICAgfSwgMClcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgY2xvc2VQbHVzTWVudSA9ICgpID0+IHtcbiAgICBzZXRQbHVzTWVudUFuY2hvcihudWxsKVxuICAgIHNjaGVkdWxlSW5wdXRGb2N1c0FmdGVyVG9vbEFjdGlvbigpXG4gIH1cblxuICBjb25zdCBjYW5jZWxQZW5kaW5nVG9vbENoaXBFeGl0ID0gKCkgPT4ge1xuICAgIGlmICh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudClcbiAgICAgIHRvb2xDaGlwRXhpdFRpbWVyUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgfVxuICAgIHNldFRvb2xDaGlwRXhpdGluZyhmYWxzZSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVBsdXNCdXR0b25Nb3VzZURvd24gPSAoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICAvLyBFdml0YSBxdWUgZWwgYm90w7NuIHJvYmUgZWwgZm9jbyBkZWwgaW5wdXQgYWwgYWJyaXIgZWwgbWVuw7ouXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQbHVzQnV0dG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKHBsdXNNZW51QW5jaG9yKSB7XG4gICAgICBjbG9zZVBsdXNNZW51KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzZXRQbHVzTWVudUFuY2hvcihlLmN1cnJlbnRUYXJnZXQpXG4gICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFBsdXNPcGVuLCB7IGFnZW50X3R5cGU6IGFuYWx5dGljc0FnZW50VHlwZSwgLi4uYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkIH0pXG4gIH1cblxuICBjb25zdCBoYW5kbGVNZW50aW9uQnV0dG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0TWVudGlvblRyaWdnZXIoKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGx1c01lbnVBdHRhY2ggPSAoKSA9PiB7XG4gICAgY2xvc2VQbHVzTWVudSgpXG4gICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFRvb2xzLCB7XG4gICAgICBhZ2VudF90eXBlOiBhbmFseXRpY3NBZ2VudFR5cGUsXG4gICAgICBvcHRpb246ICdmaWxlcycsXG4gICAgICAuLi5hbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQsXG4gICAgfSlcbiAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoID49IE1BWF9DSEFUX0lOUFVUX0FUVEFDSE1FTlRTKSByZXR1cm5cbiAgICBmaWxlSW5wdXRSZWYuY3VycmVudD8uY2xpY2soKVxuICB9XG5cbiAgY29uc3QgYmVnaW5Ub29sQ2hpcEV4aXQgPSAoKSA9PiB7XG4gICAgaWYgKHRvb2xDaGlwRXhpdFRpbWVyUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB3YXNXZWIgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGNvbnN0IHdhc0RlZXAgPSBpc0RlZXBTZWFyY2hBY3RpdmVcbiAgICBpZiAoIXdhc1dlYiAmJiAhd2FzRGVlcCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFRvb2xDaGlwRXhpdGluZyh0cnVlKVxuICAgIHRvb2xDaGlwRXhpdFRpbWVyUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRvb2xDaGlwRXhpdFRpbWVyUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBjb25zdCB7IHdlYiwgZGVlcCB9ID0gc2VhcmNoTW9kZUFjdGl2ZVJlZi5jdXJyZW50XG4gICAgICBpZiAod2FzV2ViICYmIHdlYikge1xuICAgICAgICB0b2dnbGVXZWJTZWFyY2goKVxuICAgICAgfSBlbHNlIGlmICh3YXNEZWVwICYmIGRlZXApIHtcbiAgICAgICAgdG9nZ2xlRGVlcFNlYXJjaCgpXG4gICAgICB9XG4gICAgICBzZXRUb29sQ2hpcEV4aXRpbmcoZmFsc2UpXG4gICAgICBzY2hlZHVsZUlucHV0Rm9jdXNBZnRlclRvb2xBY3Rpb24oKVxuICAgIH0sIFRPT0xfQ0hJUF9FWElUX01TKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGx1c01lbnVXZWJTZWFyY2ggPSAoKSA9PiB7XG4gICAgY2xvc2VQbHVzTWVudSgpXG4gICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB7XG4gICAgICBiZWdpblRvb2xDaGlwRXhpdCgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FuY2VsUGVuZGluZ1Rvb2xDaGlwRXhpdCgpXG4gICAgaWYgKGlzRGVlcFNlYXJjaEFjdGl2ZSkge1xuICAgICAgdG9nZ2xlRGVlcFNlYXJjaCgpXG4gICAgfVxuICAgIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFRvb2xzLCB7XG4gICAgICBhZ2VudF90eXBlOiBhbmFseXRpY3NBZ2VudFR5cGUsXG4gICAgICBvcHRpb246ICdzZWFyY2gnLFxuICAgICAgLi4uYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkLFxuICAgIH0pXG4gICAgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVBsdXNNZW51RGVlcFNlYXJjaCA9ICgpID0+IHtcbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBpZiAoaXNEZWVwU2VhcmNoQWN0aXZlKSB7XG4gICAgICBiZWdpblRvb2xDaGlwRXhpdCgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FuY2VsUGVuZGluZ1Rvb2xDaGlwRXhpdCgpXG4gICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB7XG4gICAgICB0b2dnbGVXZWJTZWFyY2goKVxuICAgIH1cbiAgICB0b2dnbGVEZWVwU2VhcmNoKClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0VG9vbHMsIHtcbiAgICAgIGFnZW50X3R5cGU6IGFuYWx5dGljc0FnZW50VHlwZSxcbiAgICAgIG9wdGlvbjogJ2RlZXBfc2VhcmNoJyxcbiAgICAgIC4uLmFuYWx5dGljc0Nsb25lRW50aXR5UGF5bG9hZCxcbiAgICB9KVxuICAgIHNjaGVkdWxlSW5wdXRGb2N1c0FmdGVyVG9vbEFjdGlvbigpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQbHVzTWVudVF1aWNrQWN0aW9ucyA9ICgpID0+IHtcbiAgICBzZXRQbHVzTWVudUFuY2hvcihudWxsKVxuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/Lmluc2VydFNsYXNoVHJpZ2dlcigpXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgfVxuICB9LCBbZGlzYWJsZWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaW5pdGlhbERyYWZ0QXBwbGllZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfSwgW2luaXRpYWxEcmFmdF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBkcmFmdCA9IGluaXRpYWxEcmFmdD8udHJpbSgpXG4gICAgaWYgKCFkcmFmdCB8fCBpbml0aWFsRHJhZnRBcHBsaWVkUmVmLmN1cnJlbnQgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0aWFsRHJhZnRBcHBsaWVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgaWYgKGRlZXBMaW5rU2VuZFBlbmRpbmdSZWYpIHtcbiAgICAgIGRlZXBMaW5rU2VuZFBlbmRpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICB9XG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LnNldFBsYWluVGV4dChkcmFmdClcbiAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZSh0cnVlKVxuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgfVxuICB9LCBbaW5pdGlhbERyYWZ0LCBkaXNhYmxlZCwgZGVlcExpbmtTZW5kUGVuZGluZ1JlZl0pXG5cbiAgY29uc3Qgc2VuZERpc2FibGVkID0gdXNlTWVtbyhcbiAgICAoKSA9PiAhaGFzVHlwaW5nUHJlc2VuY2UgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwLFxuICAgIFtoYXNUeXBpbmdQcmVzZW5jZSwgYXR0YWNobWVudHMubGVuZ3RoXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZWFyY2hNb2RlQWN0aXZlUmVmLmN1cnJlbnQgPSB7IHdlYjogaXNXZWJTZWFyY2hBY3RpdmUsIGRlZXA6IGlzRGVlcFNlYXJjaEFjdGl2ZSB9XG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc1dlYlNlYXJjaEFjdGl2ZSAmJiAhaXNEZWVwU2VhcmNoQWN0aXZlKSB7XG4gICAgICBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWQoZmFsc2UpXG4gICAgfVxuICB9LCBbaXNXZWJTZWFyY2hBY3RpdmUsIGlzRGVlcFNlYXJjaEFjdGl2ZV0pXG5cbiAgLy8gQXV0by1mb2N1cyBjdWFuZG8gY2FtYmlhIGVsIGFnZW50ZSBvIGxhIGNvbnZlcnNhY2nDs24sIG8gYWwgbW9udGFyIGVsIGNvbXBvbmVudGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBhZ2VudENoYW5nZWQgPSBwcmV2aW91c0FnZW50SWRSZWYuY3VycmVudCAhPT0gYWdlbnQ/LmlkXG4gICAgY29uc3QgcHJldmlvdXNDaGF0SWQgPSBwcmV2aW91c0NoYXRJZFJlZi5jdXJyZW50XG4gICAgY29uc3QgY3VycmVudENoYXRJZCA9IGNoYXRJZFxuICAgIGNvbnN0IGNoYXRDaGFuZ2VkID0gcHJldmlvdXNDaGF0SWQgIT09IGN1cnJlbnRDaGF0SWRcbiAgICBjb25zdCBjaGFuZ2VkRnJvbU5ld0NoYXRUb09sZENoYXQgPVxuICAgICAgKHByZXZpb3VzQ2hhdElkID09PSB1bmRlZmluZWQgfHwgcHJldmlvdXNDaGF0SWQgPT09IG51bGwpICYmIGN1cnJlbnRDaGF0SWQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q2hhdElkICE9PSBudWxsXG4gICAgY29uc3QgbmV3Q2hhdFN0YXJ0ZWQgPSBwcmV2aW91c05ld0NoYXRLZXlSZWYuY3VycmVudCAhPT0gbmV3Q2hhdEtleVxuICAgIGNvbnN0IGlzSW5pdGlhbE1vdW50ID0gcHJldmlvdXNBZ2VudElkUmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZCAmJiBwcmV2aW91c0NoYXRJZFJlZi5jdXJyZW50ID09PSB1bmRlZmluZWRcblxuICAgIGlmICgoYWdlbnRDaGFuZ2VkIHx8IGNoYXRDaGFuZ2VkIHx8IGNoYW5nZWRGcm9tTmV3Q2hhdFRvT2xkQ2hhdCB8fCBuZXdDaGF0U3RhcnRlZCB8fCBpc0luaXRpYWxNb3VudCkgJiYgIWRpc2FibGVkKSB7XG4gICAgICBjb25zdCBkZWxheSA9IGlzSW5pdGlhbE1vdW50IHx8IGNoYW5nZWRGcm9tTmV3Q2hhdFRvT2xkQ2hhdCA/IDIwMCA6IDEwMFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghZGlzYWJsZWQpIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9LCBkZWxheSlcbiAgICB9XG5cbiAgICBwcmV2aW91c0FnZW50SWRSZWYuY3VycmVudCA9IGFnZW50Py5pZFxuICAgIHByZXZpb3VzQ2hhdElkUmVmLmN1cnJlbnQgPSBjaGF0SWRcbiAgICBwcmV2aW91c05ld0NoYXRLZXlSZWYuY3VycmVudCA9IG5ld0NoYXRLZXlcbiAgfSwgW2FnZW50Py5pZCwgY2hhdElkLCBuZXdDaGF0S2V5LCBkaXNhYmxlZF0pXG5cbiAgLy8gQXV0by1mb2N1cyBjdWFuZG8gY2FtYmlhIGxhIGRpc3Bvc2ljacOzbiBkZWwgbW9kYWwgKHNpZGViYXIgLyBmdWxsc2NyZWVuIC8gZmxvYXRpbmcpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFsYXlvdXRNb2RlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMYXlvdXRNb2RlID0gcHJldmlvdXNMYXlvdXRNb2RlUmVmLmN1cnJlbnRcbiAgICBwcmV2aW91c0xheW91dE1vZGVSZWYuY3VycmVudCA9IGxheW91dE1vZGVcblxuICAgIGlmIChwcmV2aW91c0xheW91dE1vZGUgPT09IHVuZGVmaW5lZCB8fCBwcmV2aW91c0xheW91dE1vZGUgPT09IGxheW91dE1vZGUgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9XG4gICAgfSwgMjAwKVxuXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkKVxuICB9LCBbbGF5b3V0TW9kZSwgZGlzYWJsZWRdKVxuXG4gIC8vIEFwcGN1ZXM6IG5vdGlmeSB0aGF0IHRoZSBpbnB1dCBpcyB2aXNpYmxlIGZvciBzcGVjaWFsaXN0IGFnZW50cyAoY2xvbmUgKyBwcm9qZWN0L2NsaWVudClcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBpc1NwZWNpYWxpc3RBZ2VudCA9IGFnZW50Py50eXBlID09PSAnY2xvbmUnICYmIChhZ2VudD8uZW50aXR5ID09PSAncHJvamVjdCcgfHwgYWdlbnQ/LmVudGl0eSA9PT0gJ2NsaWVudCcpXG4gICAgaWYgKCF3cmFwcGVyUmVmLmN1cnJlbnQgfHwgIWlzU3BlY2lhbGlzdEFnZW50KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihcbiAgICAgIChbZW50cnldKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgIHRyYWNrQXBwY3Vlc0V2ZW50KEFQUENVRVNfRVZFTlRTLm1haWFDb250ZXh0TWVudGlvbkluaXQpXG4gICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IHRocmVzaG9sZDogMC4xIH1cbiAgICApXG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKHdyYXBwZXJSZWYuY3VycmVudClcbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gIH0sIFthZ2VudD8uaWQsIGFnZW50Py50eXBlLCBhZ2VudD8uZW50aXR5XSlcblxuICAvLyBDbGVhciBpbnB1dCB3aGVuIHNlc3Npb24gY2hhbmdlcyAodXNlciBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCBjaGF0KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoZGVlcExpbmtTZW5kUGVuZGluZ1JlZikge1xuICAgICAgICBkZWVwTGlua1NlbmRQZW5kaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmNsZWFyKClcbiAgICAgIHNldEhhc1R5cGluZ1ByZXNlbmNlKGZhbHNlKVxuICAgICAgc2V0U2hvd1NsYXNoRHJvcGRvd24oZmFsc2UpXG4gICAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgICAgcmVzZXRNZW50aW9uT3BlblRyYWNraW5nKClcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGF0LXNlc3Npb24tY2hhbmdlZCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSlcbiAgfSwgW3Jlc2V0TWVudGlvbk9wZW5UcmFja2luZywgZGVlcExpbmtTZW5kUGVuZGluZ1JlZl0pXG5cbiAgLy8gTWFudGVuZXIgZm9jbyBhbCBzZWxlY2Npb25hciB1biBjb250ZXh0byByZWNpZW50ZSAoZWwgY2xpY2sgZW4gZWwgcGlsbCBsbyByb2JhIGFsIGlucHV0KS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVSZWZvY3VzID0gKCkgPT4ge1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtaW5wdXQtcmVmb2N1cycsIGhhbmRsZVJlZm9jdXMpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5wdXQtcmVmb2N1cycsIGhhbmRsZVJlZm9jdXMpXG4gIH0sIFtkaXNhYmxlZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVJbnNlcnRTa2lsbE1lbnRpb24gPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHNraWxsIH0gPSAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8eyBza2lsbDogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfSB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAoIXNraWxsIHx8IGRpc2FibGVkKSByZXR1cm5cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBza2lsbC5uYW1lLnJlcGxhY2UoL14oQFxcL3wjKS8sICcnKVxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmNsZWFyKClcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5hcHBlbmRNZW50aW9uQXRFbmQoe1xuICAgICAgICBpZDogc2tpbGwuaWQsXG4gICAgICAgIHR5cGU6ICdza2lsbCcsXG4gICAgICAgIGxhYmVsOiBgIyR7bm9ybWFsaXplZE5hbWV9YCxcbiAgICAgIH0pXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLWluc2VydC1za2lsbC1tZW50aW9uJywgaGFuZGxlSW5zZXJ0U2tpbGxNZW50aW9uKVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLWluc2VydC1za2lsbC1tZW50aW9uJywgaGFuZGxlSW5zZXJ0U2tpbGxNZW50aW9uKVxuICB9LCBbZGlzYWJsZWRdKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gZWRpdG9yUmVmLmN1cnJlbnQ/LnNlcmlhbGl6ZSgpXG4gICAgY29uc3QgdGV4dCA9IHN0YXRlPy50ZXh0ID8/ICcnXG4gICAgaWYgKCF0ZXh0LnRyaW0oKSAmJiAhYXR0YWNobWVudHMubGVuZ3RoKSByZXR1cm5cbiAgICBjb25zdCBtZW50aW9ucyA9IHN0YXRlPy5tZW50aW9ucyA/PyBbXVxuICAgIG9uU2VuZE1lc3NhZ2UodGV4dCwgYXR0YWNobWVudHMsIG1lbnRpb25zKVxuICAgIGVkaXRvclJlZi5jdXJyZW50Py5jbGVhcigpXG4gICAgc2V0SGFzVHlwaW5nUHJlc2VuY2UoZmFsc2UpXG4gICAgc2V0U2hvd1NsYXNoRHJvcGRvd24oZmFsc2UpXG4gICAgc2V0U2xhc2hRdWVyeSgnJylcbiAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24oZmFsc2UpXG4gICAgc2V0U2tpbGxzUXVlcnkoJycpXG4gICAgc2tpbGxzTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgcmVzZXRNZW50aW9uT3BlblRyYWNraW5nKClcbiAgfSwgW2F0dGFjaG1lbnRzLCBvblNlbmRNZXNzYWdlLCByZXNldE1lbnRpb25PcGVuVHJhY2tpbmddKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFNsYXNoQ29tbWFuZCA9IHVzZUNhbGxiYWNrKFxuICAgIChjb21tYW5kOiBBY3Rpb24pID0+IHtcbiAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRRdWlja0FjdGlvblNlbGVjdCwge1xuICAgICAgICB0eXBlX3F1aWNrX2FjdGlvbjogcmVzb2x2ZVF1aWNrQWN0aW9uVHlwZShjb21tYW5kKSxcbiAgICAgICAgb3JpZ2luX3F1aWNrX2FjdGlvbjogJ3NsYXNoX21lbnUnLFxuICAgICAgfSlcblxuICAgICAgY29uc3Qgc3RhdGUgPSBlZGl0b3JSZWYuY3VycmVudD8uc2VyaWFsaXplKClcbiAgICAgIGNvbnN0IHRleHQgPSBzdGF0ZT8udGV4dCA/PyAnJ1xuICAgICAgY29uc3QgdHJpZ2dlclBhcnQgPSBgLyR7c2xhc2hRdWVyeX1gXG4gICAgICBjb25zdCBiZWZvcmVUcmlnZ2VyID0gdGV4dC5lbmRzV2l0aCh0cmlnZ2VyUGFydCkgPyB0ZXh0LnNsaWNlKDAsIC10cmlnZ2VyUGFydC5sZW5ndGgpIDogdGV4dFxuICAgICAgY29uc3QgaXNFbXB0eUJlZm9yZVRyaWdnZXIgPSBiZWZvcmVUcmlnZ2VyLnRyaW0oKSA9PT0gJydcblxuICAgICAgaWYgKGlzRW1wdHlCZWZvcmVUcmlnZ2VyKSB7XG4gICAgICAgIG9uU2VuZE1lc3NhZ2UoY29tbWFuZC50aXRsZSwgYXR0YWNobWVudHMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29tbWFuZC5pZClcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmNsZWFyKClcbiAgICAgICAgc2V0SGFzVHlwaW5nUHJlc2VuY2UoZmFsc2UpXG4gICAgICAgIHNldFNob3dTbGFzaERyb3Bkb3duKGZhbHNlKVxuICAgICAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgICAgICBzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/Lmluc2VydFNsYXNoQ29tbWFuZCh7IGlkOiBjb21tYW5kLmlkLCBsYWJlbDogY29tbWFuZC50aXRsZSB9KVxuICAgICAgc2V0U2hvd1NsYXNoRHJvcGRvd24oZmFsc2UpXG4gICAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgICAgc2xhc2hNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICB9LFxuICAgIFthdHRhY2htZW50cywgb25TZW5kTWVzc2FnZSwgcmVzZXRNZW50aW9uT3BlblRyYWNraW5nLCBzbGFzaFF1ZXJ5LCBldmVudEFtcGxpdHVkZV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlU2xhc2hEcm9wZG93biA9ICgpID0+IHtcbiAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICBzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xvc2VTa2lsbHNEcm9wZG93biA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24oZmFsc2UpXG4gICAgc2V0U2tpbGxzUXVlcnkoJycpXG4gICAgc2tpbGxzTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gIH0sIFtdKVxuXG4gIC8qKiBBYnJlIGVsIGxpc3RhZG8gZGVzZGUgZWwgYm90w7NuOiBpbnNlcnRhIGAjYCBlbiBlbCBlZGl0b3IgcGFyYSBxdWUgZWwgdHJpZ2dlciBxdWVkZSBhY3Rpdm8uICovXG4gIGNvbnN0IGhhbmRsZVNraWxsc0J1dHRvbkNsaWNrID0gKGU6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuXG4gICAgaWYgKHNob3dTa2lsbHNEcm9wZG93bikge1xuICAgICAgaGFuZGxlQ2xvc2VTa2lsbHNEcm9wZG93bigpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2xvc2VQbHVzTWVudSgpXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/Lmluc2VydFNraWxsVHJpZ2dlcigpXG4gIH1cblxuICBjb25zdCBoYW5kbGVTZWxlY3RTa2lsbCA9IHVzZUNhbGxiYWNrKChza2lsbDogU2tpbGwpID0+IHtcbiAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2tpbGxNZW50aW9uKHsgaWQ6IHNraWxsLmlkLCB0eXBlOiAnc2tpbGwnLCBsYWJlbDogYCMke3NraWxsLm5hbWV9YCB9KVxuICAgIHNldFNob3dTa2lsbHNEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTa2lsbHNRdWVyeSgnJylcbiAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlQ3JlYXRlU2tpbGwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2hvd1NraWxsc0Ryb3Bkb3duKGZhbHNlKVxuICAgIHNldFNraWxsc1F1ZXJ5KCcnKVxuICAgIHNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2FibS1za2lsbC1tb2RhbC1zZXQtdmFsdWVzJywge1xuICAgICAgICBkZXRhaWw6IHsgc2tpbGxWYWx1ZXM6IHsgdmFsdWVzOiB7IGlzRWRpdGluZzogZmFsc2UsIGludGVudDogJ3dyaXRlJyB9LCBpc09wZW46IHRydWUgfSB9LFxuICAgICAgfSlcbiAgICApXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZUVkaXRvcklucHV0ID0gdXNlQ2FsbGJhY2soXG4gICAgKHtcbiAgICAgIHRleHQsXG4gICAgICB0cmlnZ2VyLFxuICAgICAgc2xhc2hUcmlnZ2VyLFxuICAgICAgaGFzaFRyaWdnZXIsXG4gICAgfToge1xuICAgICAgdGV4dDogc3RyaW5nXG4gICAgICBtZW50aW9uczogQ29udGV4dE1lbnRpb25bXVxuICAgICAgdHJpZ2dlcjogeyBhY3RpdmU6IGJvb2xlYW47IHF1ZXJ5OiBzdHJpbmc7IGF0UnVuTGVuZ3RoOiBudW1iZXIgfVxuICAgICAgc2xhc2hUcmlnZ2VyPzogeyBhY3RpdmU6IGJvb2xlYW47IHF1ZXJ5OiBzdHJpbmcgfVxuICAgICAgaGFzaFRyaWdnZXI/OiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZyB9XG4gICAgfSkgPT4ge1xuICAgICAgc2V0SGFzVHlwaW5nUHJlc2VuY2UodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgIG9uQ2hhbmdlPy4oKVxuICAgICAgaGFuZGxlVHJpZ2dlcih0cmlnZ2VyKVxuXG4gICAgICBpZiAoc2xhc2hUcmlnZ2VyPy5hY3RpdmUgJiYgc2xhc2hDb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghc2xhc2hNZW51V2FzT3BlblJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFF1aWNrQWN0aW9uT3BlbilcbiAgICAgICAgICBzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgc2V0U2hvd1NsYXNoRHJvcGRvd24odHJ1ZSlcbiAgICAgICAgc2V0U2xhc2hRdWVyeShzbGFzaFRyaWdnZXIucXVlcnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICAgICAgc2V0U2xhc2hRdWVyeSgnJylcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc2hUcmlnZ2VyPy5hY3RpdmUgJiYgc2hvd1NraWxsc0J1dHRvbikge1xuICAgICAgICAvLyBGZXRjaCBvbi1vcGVuOiB1bmEgc29sYSBsbGFtYWRhIHBvciBhcGVydHVyYSBkZWwgbGlzdGFkby5cbiAgICAgICAgaWYgKCFza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgc2tpbGxzTWVudVdhc09wZW5SZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgICB2b2lkIGZldGNoU2tpbGxzKClcbiAgICAgICAgfVxuICAgICAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24odHJ1ZSlcbiAgICAgICAgc2V0U2tpbGxzUXVlcnkoaGFzaFRyaWdnZXIucXVlcnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgc2V0U2hvd1NraWxsc0Ryb3Bkb3duKGZhbHNlKVxuICAgICAgICBzZXRTa2lsbHNRdWVyeSgnJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkNoYW5nZSwgaGFuZGxlVHJpZ2dlciwgc2xhc2hDb21tYW5kcywgZXZlbnRBbXBsaXR1ZGUsIHNob3dTa2lsbHNCdXR0b24sIGZldGNoU2tpbGxzXVxuICApXG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBLZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKGhhbmRsZVBvcG92ZXJLZXlEb3duKGUpKSByZXR1cm5cbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSAmJiAhcG9wb3Zlck9wZW4pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGlmICghc2VuZERpc2FibGVkICYmICFkaXNhYmxlZCkgaGFuZGxlU2VuZE1lc3NhZ2UoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZVBvcG92ZXJLZXlEb3duLCBwb3BvdmVyT3Blbiwgc2VuZERpc2FibGVkLCBkaXNhYmxlZCwgaGFuZGxlU2VuZE1lc3NhZ2VdXG4gIClcblxuICBjb25zdCBhZGRGaWxlcyA9IChpbmNvbWluZzogRmlsZVtdKSA9PiB7XG4gICAgaWYgKCFpbmNvbWluZy5sZW5ndGggfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgY29uc3QgZXhjZWVkZWRGaWxlczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IGV4Y2x1ZGVkRmlsZXM6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBmaWxlU2l6ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fVxuICAgIGxldCBmaWxlc0luc2VydGVkID0gYXR0YWNobWVudHMubGVuZ3RoXG5cbiAgICBjb25zdCBpc05ld0Zvcm1hdCA9IChleHRlbnNpb246IHN0cmluZykgPT4gWycucG5nJywgJy5qcGcnLCAnLmpwZWcnLCAnLnBkZiddLmluY2x1ZGVzKGV4dGVuc2lvbilcbiAgICBjb25zdCBpc09sZEZvcm1hdCA9IChleHRlbnNpb246IHN0cmluZykgPT5cbiAgICAgIFsnLnR4dCcsICcubWQnLCAnLmNzdicsICcuZG9jJywgJy5kb2N4JywgJy54bHN4JywgJy54bHMnLCAnLnBwdCcsICcucHB0eCddLmluY2x1ZGVzKGV4dGVuc2lvbilcbiAgICBjb25zdCBpc0F1ZGlvRm9ybWF0ID0gKGV4dGVuc2lvbjogc3RyaW5nKSA9PlxuICAgICAgWycuZmxhYycsICcubTRhJywgJy5tcDMnLCAnLm1wNCcsICcub2dhJywgJy5vZ2cnLCAnLndhdicsICcud2VibSddLmluY2x1ZGVzKGV4dGVuc2lvbilcblxuICAgIGNvbnN0IGV4Y2VlZHNNYXhTaXplID0gKGV4dGVuc2lvbjogc3RyaW5nLCBzaXplOiBudW1iZXIpID0+IHNpemUgPiBnZXRNYXhBdHRhY2htZW50U2l6ZU1iKGV4dGVuc2lvbikgKiAxMDI0ICogMTAyNFxuXG4gICAgaW5jb21pbmcuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGxldCBleGNsdWRlZEZpbGUgPSBmYWxzZVxuICAgICAgY29uc3QgZmlsZU5hbWVQYXJ0cyA9IGZpbGUubmFtZS5zcGxpdCgnLicpXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZmlsZU5hbWVQYXJ0cy5sZW5ndGggPiAxID8gYC4ke2ZpbGVOYW1lUGFydHMucG9wKCk/LnRvTG93ZXJDYXNlKCl9YCA6ICcnXG5cbiAgICAgIGlmICghYWxsb3dlZEZpbGVUeXBlcz8uaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZpbGVTaXplc1tmaWxlLm5hbWVdID0gZmlsZS5zaXplXG5cbiAgICAgIGlmIChpc05ld0Zvcm1hdChmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgICBpZiAoZXhjZWVkc01heFNpemUoZmlsZUV4dGVuc2lvbiwgZmlsZS5zaXplKSkge1xuICAgICAgICAgIGV4Y2VlZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVzSW5zZXJ0ZWQgKyAxID4gTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMpIHtcbiAgICAgICAgICBleGNsdWRlZEZpbGVzLnB1c2goZmlsZS5uYW1lKVxuICAgICAgICAgIGV4Y2x1ZGVkRmlsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc09sZEZvcm1hdChmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgICBpZiAoZXhjZWVkc01heFNpemUoZmlsZUV4dGVuc2lvbiwgZmlsZS5zaXplKSkge1xuICAgICAgICAgIGV4Y2VlZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVzSW5zZXJ0ZWQgKyAxID4gTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMpIHtcbiAgICAgICAgICBleGNsdWRlZEZpbGVzLnB1c2goZmlsZS5uYW1lKVxuICAgICAgICAgIGV4Y2x1ZGVkRmlsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0F1ZGlvRm9ybWF0KGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIGlmIChleGNlZWRzTWF4U2l6ZShmaWxlRXh0ZW5zaW9uLCBmaWxlLnNpemUpKSB7XG4gICAgICAgICAgZXhjZWVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNJbnNlcnRlZCArIDEgPiBNQVhfQ0hBVF9JTlBVVF9BVFRBQ0hNRU5UUykge1xuICAgICAgICAgIGV4Y2x1ZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZXhjbHVkZWRGaWxlKSB7XG4gICAgICAgIGZpbGVzSW5zZXJ0ZWQgKz0gMVxuICAgICAgICBjb25zdCB0eXBlRmlsZSA9IGZpbGUudHlwZSB8fCBmaWxlVHlwZXNbZmlsZUV4dGVuc2lvbl1cbiAgICAgICAgY29uc3QgcGFyc2VkRmlsZSA9IG5ldyBGaWxlKFtmaWxlXSwgZmlsZS5uYW1lLCB7IHR5cGU6IHR5cGVGaWxlIH0pXG4gICAgICAgIG9uRmlsZUF0dGFjaD8uKHBhcnNlZEZpbGUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChleGNsdWRlZEZpbGVzLmxlbmd0aCB8fCBleGNlZWRlZEZpbGVzLmxlbmd0aCkge1xuICAgICAgc2V0TW9kYWxQcm9wcyh7IGlzT3BlbjogdHJ1ZSwgZXhjbHVkZWRGaWxlcywgZXhjZWVkZWRGaWxlcywgZmlsZVNpemVzIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRmlsZVNlbGVjdCA9IChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IGZpbGVzID0gZS50YXJnZXQuZmlsZXNcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIGFkZEZpbGVzKEFycmF5LmZyb20oZmlsZXMpKVxuICAgIH1cbiAgICBpZiAoZmlsZUlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gJydcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNldEZpbGVEcmFnID0gKCkgPT4ge1xuICAgIGZpbGVEcmFnQ291bnRlclJlZi5jdXJyZW50ID0gMFxuICAgIHNldElzRmlsZURyYWdBY3RpdmUoZmFsc2UpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEcmFnRW50ZXIgPSAoZTogRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmICghZGF0YVRyYW5zZmVySGFzRmlsZXMoZS5kYXRhVHJhbnNmZXIpKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBmaWxlRHJhZ0NvdW50ZXJSZWYuY3VycmVudCArPSAxXG4gICAgc2V0SXNGaWxlRHJhZ0FjdGl2ZSh0cnVlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJhZ0xlYXZlID0gKGU6IERyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBpZiAoIWlzRmlsZURyYWdBY3RpdmUgJiYgIWRhdGFUcmFuc2Zlckhhc0ZpbGVzKGUuZGF0YVRyYW5zZmVyKSkgcmV0dXJuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGZpbGVEcmFnQ291bnRlclJlZi5jdXJyZW50ID0gTWF0aC5tYXgoMCwgZmlsZURyYWdDb3VudGVyUmVmLmN1cnJlbnQgLSAxKVxuICAgIGlmIChmaWxlRHJhZ0NvdW50ZXJSZWYuY3VycmVudCA9PT0gMCkge1xuICAgICAgc2V0SXNGaWxlRHJhZ0FjdGl2ZShmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVEcmFnT3ZlciA9IChlOiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXJIYXNGaWxlcyhlLmRhdGFUcmFuc2ZlcikpIHJldHVyblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSdcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyb3AgPSAoZTogRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmICghZGF0YVRyYW5zZmVySGFzRmlsZXMoZS5kYXRhVHJhbnNmZXIpKSB7XG4gICAgICByZXNldEZpbGVEcmFnKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgcmVzZXRGaWxlRHJhZygpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBhZGRGaWxlcyhmaWxlc0Zyb21EYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGFzdGVGaWxlcyA9IChmaWxlczogRmlsZVtdKSA9PiB7XG4gICAgYWRkRmlsZXMoZmlsZXMpXG4gIH1cblxuICBjb25zdCBoYW5kbGVXcmFwcGVyUGFzdGUgPSAoZTogQ2xpcGJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgZWRpdG9yRWwgPSB3cmFwcGVyUmVmLmN1cnJlbnQ/LnF1ZXJ5U2VsZWN0b3IoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJylcbiAgICBpZiAoZWRpdG9yRWwgJiYgZWRpdG9yRWwuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkpIHJldHVyblxuICAgIGNvbnN0IGZpbGVzID0gZmlsZXNGcm9tRGF0YVRyYW5zZmVyKGUuY2xpcGJvYXJkRGF0YSlcbiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgcmV0dXJuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgYWRkRmlsZXMoZmlsZXMpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEZWxldGVBdHRhY2htZW50ID0gKGZpbGVJZDogc3RyaW5nKSA9PiB7XG4gICAgb25EZWxldGVBdHRhY2htZW50Py4oZmlsZUlkKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlU3RvcEdlbmVyYXRpb24gPSAoKSA9PiB7XG4gICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFN0b3BSZXNwb25zZSlcbiAgICBvblN0b3BHZW5lcmF0aW9uPy4oKVxuICB9XG5cbiAgY29uc3Qgc2hvd0NoaXBzUm93ID0gQm9vbGVhbihjb250ZXh0Q2hpcD8uaXRlbXM/Lmxlbmd0aCB8fCBhdHRhY2htZW50cy5sZW5ndGgpXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjaGlwc0VsID0gY2hpcHNSb3dSZWYuY3VycmVudFxuICAgIGNvbnN0IHRvb2xiYXJFbCA9IHRvb2xiYXJSb3dSZWYuY3VycmVudFxuXG4gICAgY29uc3QgdXBkYXRlSGVpZ2h0cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG5leHRDaGlwcyA9IHNob3dDaGlwc1JvdyAmJiBjaGlwc0VsID8gTWF0aC5jZWlsKGNoaXBzRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSA6IDBcbiAgICAgIGNvbnN0IG5leHRUb29sYmFyID0gdG9vbGJhckVsXG4gICAgICAgID8gTWF0aC5jZWlsKHRvb2xiYXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpXG4gICAgICAgIDogTUFJQV9JTlBVVF9UT09MQkFSX1JPV19IRUlHSFRfUFhcblxuICAgICAgc2V0Q2hpcHNSb3dIZWlnaHQocHJldiA9PiAocHJldiA9PT0gbmV4dENoaXBzID8gcHJldiA6IG5leHRDaGlwcykpXG4gICAgICBzZXRUb29sYmFyUm93SGVpZ2h0KHByZXYgPT4gKHByZXYgPT09IG5leHRUb29sYmFyID8gcHJldiA6IG5leHRUb29sYmFyKSlcbiAgICB9XG5cbiAgICB1cGRhdGVIZWlnaHRzKClcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUhlaWdodHMpXG4gICAgaWYgKHNob3dDaGlwc1JvdyAmJiBjaGlwc0VsKSBvYnNlcnZlci5vYnNlcnZlKGNoaXBzRWwpXG4gICAgaWYgKHRvb2xiYXJFbCkgb2JzZXJ2ZXIub2JzZXJ2ZSh0b29sYmFyRWwpXG5cbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gIH0sIFtzaG93Q2hpcHNSb3csIGNvbnRleHRDaGlwPy5pdGVtcz8ubGVuZ3RoLCBhdHRhY2htZW50cy5sZW5ndGhdKVxuXG4gIGNvbnN0IGVkaXRvck1heEhlaWdodCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGdldE1haWFJbnB1dEVkaXRvck1heEhlaWdodCh7XG4gICAgICAgIGNoaXBzUm93SGVpZ2h0UHg6IGNoaXBzUm93SGVpZ2h0LFxuICAgICAgICB0b29sYmFyUm93SGVpZ2h0UHg6IHRvb2xiYXJSb3dIZWlnaHQsXG4gICAgICB9KSxcbiAgICBbY2hpcHNSb3dIZWlnaHQsIHRvb2xiYXJSb3dIZWlnaHRdXG4gIClcblxuICBjb25zdCB0b29sYmFySWNvbkNvbG9yID0gJyM4MDgwODAnXG4gIGNvbnN0IHBsdXNNZW51SWNvbkNvbG9yID0gTUFJQV9DSEFUX0lOUFVUX1VJLm1lbnVJY29uXG4gIGNvbnN0IGlzQ3VzdG9tQWdlbnQgPSBhZ2VudD8udHlwZSA9PT0gJ2N1c3RvbSdcbiAgY29uc3QgaGFzQ29yQWNjZXNzID0gQm9vbGVhbihcbiAgICBpc0N1c3RvbUFnZW50ICYmXG4gICAgYWdlbnQ/LmNvbm5lY3RvcnM/LnNvbWUoXG4gICAgICBjb25uZWN0b3IgPT5cbiAgICAgICAgY29ubmVjdG9yLmdyb3VwID09PSAnQ09SJyAmJiBjb25uZWN0b3Iuc2x1Z3Muc29tZShzbHVnID0+IHR5cGVvZiBzbHVnID09PSAnc3RyaW5nJyAmJiBzbHVnLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgIClcbiAgKVxuICBjb25zdCBhZ2VudE1vZGVsTmFtZSA9IGlzQ3VzdG9tQWdlbnQgPyBhZ2VudD8ubW9kZWxfZGlzcGxheV9uYW1lPy50cmltKCkgfHwgbnVsbCA6IG51bGxcbiAgY29uc3Qgc2hvd0N1c3RvbU1ldGFJbmRpY2F0b3JzID0gaGFzQ29yQWNjZXNzIHx8IEJvb2xlYW4oYWdlbnRNb2RlbE5hbWUpXG4gIGNvbnN0IHNob3dNZW50aW9uQnV0dG9uID0gYWdlbnQ/LnR5cGUgPT09ICdvcmNoZXN0cmF0b3InIHx8IGhhc0NvckFjY2Vzc1xuXG4gIGxldCBhY3RpdmVUb29sQ2hpcExlYWRpbmdJY29uOiBSZWFjdE5vZGVcbiAgaWYgKGFjdGl2ZVRvb2xDaGlwSG92ZXJlZCkge1xuICAgIGFjdGl2ZVRvb2xDaGlwTGVhZGluZ0ljb24gPSA8Q3Jvc3MgY29sb3I9e01BSUFfQ0hBVF9JTlBVVF9VSS5jaGlwQ2xvc2VJY29ufSB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gIH0gZWxzZSBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHtcbiAgICBhY3RpdmVUb29sQ2hpcExlYWRpbmdJY29uID0gPE1haWFJbnB1dFdlYlNlYXJjaEljb24gY29sb3I9e3BsdXNNZW51SWNvbkNvbG9yfSB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gIH0gZWxzZSB7XG4gICAgYWN0aXZlVG9vbENoaXBMZWFkaW5nSWNvbiA9IDxNYWlhSW5wdXREZWVwU2VhcmNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTdHlsZWRNQUlBSW5wdXRXcmFwcGVyXG4gICAgICAgIHJlZj17d3JhcHBlclJlZn1cbiAgICAgICAgZGlzYWJsZWQ9e2ZhbHNlfVxuICAgICAgICBhbGlnbkJ1dHRvbnM9e2FsaWduQnV0dG9uc31cbiAgICAgICAgaGFzQXR0YWNobWVudHM9eyEhYXR0YWNobWVudHMubGVuZ3RofVxuICAgICAgICAkZmlsZURyYWdBY3RpdmU9e2lzRmlsZURyYWdBY3RpdmV9XG4gICAgICAgIGRhdGEtYXBwY3Vlcz1cIm1haWFfY2hhdF9pbnB1dFwiXG4gICAgICAgIGRhdGEtbWFpYS1zdHJlYW1pbmc9e2lzU3RyZWFtaW5nID8gJ3RydWUnIDogJ2ZhbHNlJ31cbiAgICAgICAgb25QYXN0ZT17aGFuZGxlV3JhcHBlclBhc3RlfVxuICAgICAgICBvbkRyYWdFbnRlcj17aGFuZGxlRHJhZ0VudGVyfVxuICAgICAgICBvbkRyYWdMZWF2ZT17aGFuZGxlRHJhZ0xlYXZlfVxuICAgICAgICBvbkRyYWdPdmVyPXtoYW5kbGVEcmFnT3Zlcn1cbiAgICAgICAgb25Ecm9wPXtoYW5kbGVEcm9wfVxuICAgICAgPlxuICAgICAgICB7c2hvd0NoaXBzUm93ICYmIChcbiAgICAgICAgICA8U0NJbnB1dENoaXBzUm93IHJlZj17Y2hpcHNSb3dSZWZ9PlxuICAgICAgICAgICAge2NvbnRleHRDaGlwPy5pdGVtcz8ubGVuZ3RoID8gKFxuICAgICAgICAgICAgICA8Q2hpcFxuICAgICAgICAgICAgICAgIGl0ZW1zPXtjb250ZXh0Q2hpcC5pdGVtc31cbiAgICAgICAgICAgICAgICB0eXBlPXtjb250ZXh0Q2hpcC50eXBlfVxuICAgICAgICAgICAgICAgIGxlYWRpbmdJY29uPXtjb250ZXh0Q2hpcC5sZWFkaW5nSWNvbn1cbiAgICAgICAgICAgICAgICB0b29sdGlwWkluZGV4PXt0b29sdGlwWkluZGV4fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7YXR0YWNobWVudHMubWFwKChhdHRhY2htZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc0ltYWdlID1cbiAgICAgICAgICAgICAgICBhdHRhY2htZW50LnR5cGU/LnN0YXJ0c1dpdGgoJ2ltYWdlLycpIHx8IC9cXC4ocG5nfGpwZT9nfGdpZnx3ZWJwfGJtcHxzdmcpJC9pLnRlc3QoYXR0YWNobWVudC5uYW1lIHx8ICcnKVxuICAgICAgICAgICAgICBjb25zdCBjaGlwSWNvbiA9IGlzSW1hZ2UgPyAoXG4gICAgICAgICAgICAgICAgPE1haWFJbnB1dEF0dGFjaG1lbnRJbWFnZUljb24gY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9ezEyfSBoZWlnaHQ9ezEyfSAvPlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxNYWlhSW5wdXRBdHRhY2hJY29uIGNvbG9yPVwiIzgwODA4MFwiIHdpZHRoPXsxM30gaGVpZ2h0PXsxM30gLz5cbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9e2F0dGFjaG1lbnQubmFtZX0ga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2luZGV4fWB9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgICAgICA8U0NNSUF0dGFjaG1lbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxTQ01JQXR0YWNobWVudEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDTUlBdHRhY2htZW50RmlsZUljb24+e2NoaXBJY29ufTwvU0NNSUF0dGFjaG1lbnRGaWxlSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NNSUF0dGFjaG1lbnREZWxldGVJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NoYXQucmVtb3ZlQXR0YWNobWVudEFyaWEnLCB7IGRlZmF1bHRWYWx1ZTogJ1F1aXRhciBhcmNoaXZvJyB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZURlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudC5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPENyb3NzIGNvbG9yPVwiIzY2NjY2NlwiIHdpZHRoPXsxNH0gaGVpZ2h0PXsxNH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NDTUlBdHRhY2htZW50RGVsZXRlSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TQ01JQXR0YWNobWVudEljb24+XG4gICAgICAgICAgICAgICAgICAgIDxTQ01JQXR0YWNobWVudE5hbWU+e2F0dGFjaG1lbnQubmFtZX08L1NDTUlBdHRhY2htZW50TmFtZT5cbiAgICAgICAgICAgICAgICAgIDwvU0NNSUF0dGFjaG1lbnQ+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1NDSW5wdXRDaGlwc1Jvdz5cbiAgICAgICAgKX1cbiAgICAgICAgPFN0eWxlZE1BSUFNYWluVG9vbGJhckdyaWQ+XG4gICAgICAgICAgPFNDSW5wdXRFZGl0b3JDZWxsPlxuICAgICAgICAgICAgPENvbnRleHRNZW50aW9uRWRpdG9yXG4gICAgICAgICAgICAgIHJlZj17ZWRpdG9yUmVmfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgbWF4SGVpZ2h0PXtlZGl0b3JNYXhIZWlnaHR9XG4gICAgICAgICAgICAgIG9uSW5wdXQ9e2hhbmRsZUVkaXRvcklucHV0fVxuICAgICAgICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgICAgICAgIG9uUGFzdGVGaWxlcz17aGFuZGxlUGFzdGVGaWxlc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9TQ0lucHV0RWRpdG9yQ2VsbD5cbiAgICAgICAgICA8U0NJbnB1dFRvb2xiYXJSb3cgcmVmPXt0b29sYmFyUm93UmVmfT5cbiAgICAgICAgICAgIDxTdHlsZWRNQUlBUGx1c1Rvb2xiYXJDZWxsPlxuICAgICAgICAgICAgICA8UGx1c01lbnVUb29sc1Jvdz5cbiAgICAgICAgICAgICAgICA8UGx1c1RvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAkbWVudU9wZW49e3BsdXNNZW51T3Blbn1cbiAgICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXtoYW5kbGVQbHVzQnV0dG9uTW91c2VEb3dufVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlUGx1c0J1dHRvbkNsaWNrfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgnY2hhdC5vcGVuUGx1c01lbnVBcmlhJyl9XG4gICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXtwbHVzTWVudU9wZW59XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dEFkZEljb24gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgICAgICAgICAgICAgICA8L1BsdXNUb2dnbGVCdXR0b24+XG4gICAgICAgICAgICAgICAge3Nob3dNZW50aW9uQnV0dG9uICYmIChcbiAgICAgICAgICAgICAgICAgIDxQbHVzVG9nZ2xlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAkbWVudU9wZW49e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVNZW50aW9uQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgnY2hhdC5vcGVuTWVudGlvbkFyaWEnKX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dE1lbnRpb25JY29uIGNvbG9yPXt0b29sYmFySWNvbkNvbG9yfSB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gICAgICAgICAgICAgICAgICA8L1BsdXNUb2dnbGVCdXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7c2hvd1NraWxsc0J1dHRvbiAmJiAoXG4gICAgICAgICAgICAgICAgICA8U2tpbGxzVG9nZ2xlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHJlZj17c2tpbGxzQnV0dG9uUmVmfVxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25Nb3VzZURvd249e2hhbmRsZVBsdXNCdXR0b25Nb3VzZURvd259XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNraWxsc0J1dHRvbkNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17c2hvd1NraWxsc0Ryb3Bkb3dufVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U2tpbGxJY29uIHdpZHRoPXsxNn0gaGVpZ2h0PXsxNn0gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IC8+XG4gICAgICAgICAgICAgICAgICAgIHt0KCdteVNraWxscy5kcm9wZG93bkJ1dHRvbicpfVxuICAgICAgICAgICAgICAgICAgPC9Ta2lsbHNUb2dnbGVCdXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8UG9wb3ZlclxuICAgICAgICAgICAgICAgICAgb3Blbj17cGx1c01lbnVPcGVufVxuICAgICAgICAgICAgICAgICAgYW5jaG9yRWw9e3BsdXNNZW51QW5jaG9yfVxuICAgICAgICAgICAgICAgICAgb25DbG9zZT17Y2xvc2VQbHVzTWVudX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVBdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVFbmZvcmNlRm9jdXNcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVSZXN0b3JlRm9jdXNcbiAgICAgICAgICAgICAgICAgIGFuY2hvck9yaWdpbj17eyB2ZXJ0aWNhbDogJ3RvcCcsIGhvcml6b250YWw6ICdsZWZ0JyB9fVxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luPXt7IHZlcnRpY2FsOiAnYm90dG9tJywgaG9yaXpvbnRhbDogJ2xlZnQnIH19XG4gICAgICAgICAgICAgICAgICBzeD17eyB6SW5kZXg6IHBsdXNNZW51WkluZGV4IH19XG4gICAgICAgICAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgICAgICAgICAgcGFwZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb246IDAsXG4gICAgICAgICAgICAgICAgICAgICAgc3g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm94U2hhZG93OiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6ICctNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8UGx1c01lbnVQYXBlcj5cbiAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SW5uZXJDb2x1bW4+XG4gICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlUGx1c01lbnVBdHRhY2h9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dEF0dGFjaEljb24gY29sb3I9e3BsdXNNZW51SWNvbkNvbG9yfSB3aWR0aD17MjF9IGhlaWdodD17MjB9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtTGFiZWw+e3QoJ2NoYXQucGx1c01lbnVBdHRhY2gnKX08L1BsdXNNZW51SXRlbUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvUGx1c01lbnVJdGVtQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudURpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudVdlYlNlYXJjaH0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0V2ViU2VhcmNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsyMH0gaGVpZ2h0PXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1MYWJlbD57dCgnY2hhdC5zZWFyY2hXZWInKX08L1BsdXNNZW51SXRlbUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzV2ViU2VhcmNoQWN0aXZlID8gPENoZWNrIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSAvPiA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudUl0ZW1CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlUGx1c01lbnVEZWVwU2VhcmNofT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNYWlhSW5wdXREZWVwU2VhcmNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsyMH0gaGVpZ2h0PXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1MYWJlbD57dCgnY2hhdC5wbHVzTWVudURlZXBJbnZlc3RpZ2F0aW9uJyl9PC9QbHVzTWVudUl0ZW1MYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc0RlZXBTZWFyY2hBY3RpdmUgPyA8Q2hlY2sgY29sb3I9e3BsdXNNZW51SWNvbkNvbG9yfSB3aWR0aD17MTZ9IGhlaWdodD17MTZ9IC8+IDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1BsdXNNZW51SXRlbUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVEaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlUGx1c01lbnVRdWlja0FjdGlvbnN9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dFNsYXNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsyMH0gaGVpZ2h0PXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1MYWJlbD57dCgnY2hhdC5wbHVzTWVudVF1aWNrQWN0aW9ucycpfTwvUGx1c01lbnVJdGVtTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudUl0ZW1CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvUGx1c01lbnVJbm5lckNvbHVtbj5cbiAgICAgICAgICAgICAgICAgIDwvUGx1c01lbnVQYXBlcj5cbiAgICAgICAgICAgICAgICA8L1BvcG92ZXI+XG4gICAgICAgICAgICAgICAgeyhpc1dlYlNlYXJjaEFjdGl2ZSB8fCBpc0RlZXBTZWFyY2hBY3RpdmUpICYmIChcbiAgICAgICAgICAgICAgICAgIDxBY3RpdmVUb29sQ2hpcFJvb3RcbiAgICAgICAgICAgICAgICAgICAgJGhvdmVyZWQ9e2FjdGl2ZVRvb2xDaGlwSG92ZXJlZH1cbiAgICAgICAgICAgICAgICAgICAgJGV4aXRpbmc9e3Rvb2xDaGlwRXhpdGluZ31cbiAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWQodHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KCkgPT4gc2V0QWN0aXZlVG9vbENoaXBIb3ZlcmVkKGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPEFjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICRjbG9zZVNob3duPXthY3RpdmVUb29sQ2hpcEhvdmVyZWR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgnY2hhdC5yZW1vdmVBY3RpdmVUb29sQXJpYScpfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5Ub29sQ2hpcEV4aXQoKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7YWN0aXZlVG9vbENoaXBMZWFkaW5nSWNvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9BY3RpdmVUb29sQ2hpcEljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxBY3RpdmVUb29sQ2hpcExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIHtpc1dlYlNlYXJjaEFjdGl2ZSA/IHQoJ2NoYXQuc2VhcmNoV2ViJykgOiB0KCdjaGF0LnBsdXNNZW51RGVlcEludmVzdGlnYXRpb24nKX1cbiAgICAgICAgICAgICAgICAgICAgPC9BY3RpdmVUb29sQ2hpcExhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9BY3RpdmVUb29sQ2hpcFJvb3Q+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9QbHVzTWVudVRvb2xzUm93PlxuICAgICAgICAgICAgPC9TdHlsZWRNQUlBUGx1c1Rvb2xiYXJDZWxsPlxuICAgICAgICAgICAgPFN0eWxlZE1BSUFTZW5kVG9vbGJhckNlbGw+XG4gICAgICAgICAgICAgIHtzaG93Q3VzdG9tTWV0YUluZGljYXRvcnMgJiYgKFxuICAgICAgICAgICAgICAgIDxTQ0lucHV0TWV0YUluZGljYXRvcnM+XG4gICAgICAgICAgICAgICAgICB7aGFzQ29yQWNjZXNzICYmIChcbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17dCgnY2hhdC5mb290ZXIuY29yQWNjZXNzVG9vbHRpcCcpfVxuICAgICAgICAgICAgICAgICAgICAgIHsuLi4odG9vbHRpcFpJbmRleCAhPSBudWxsID8geyB6SW5kZXg6IHRvb2x0aXBaSW5kZXggfSA6IHt9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ0lucHV0TWV0YUljb25CdXR0b24gYXJpYS1sYWJlbD17dCgnY2hhdC5mb290ZXIuY29yQWNjZXNzTGFiZWwnKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q29yQWNjZXNzSWNvbiB3aWR0aD17MTV9IGhlaWdodD17MTR9IGNvbG9yPXt0b29sYmFySWNvbkNvbG9yfSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NJbnB1dE1ldGFJY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAge2FnZW50TW9kZWxOYW1lICYmIChcbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17dCgnY2hpcExsbS50b29sdGlwJywgeyBtb2RlbDogYWdlbnRNb2RlbE5hbWUgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgey4uLih0b29sdGlwWkluZGV4ICE9IG51bGwgPyB7IHpJbmRleDogdG9vbHRpcFpJbmRleCB9IDoge30pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDSW5wdXRNZXRhSWNvbkJ1dHRvbiBhcmlhLWxhYmVsPXthZ2VudE1vZGVsTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0Um9ib3RJY29uIHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0lucHV0TWV0YUljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9TQ0lucHV0TWV0YUluZGljYXRvcnM+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtpc1dyaXRpbmcgPyAoXG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3QoJ2NoYXQuc3RvcCcpfSB6SW5kZXg9e3Rvb2x0aXBaSW5kZXh9PlxuICAgICAgICAgICAgICAgICAgPFN0eWxlZE1BSUFTdG9wQnV0dG9uIGRpc2FibGVkPXtmYWxzZX0gb25DbGljaz17aGFuZGxlU3RvcEdlbmVyYXRpb259IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZE1BSUFTdG9wSWNvbiAvPlxuICAgICAgICAgICAgICAgICAgPC9TdHlsZWRNQUlBU3RvcEJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3QoJ2NoYXQuc2VuZCcpfSB6SW5kZXg9e3Rvb2x0aXBaSW5kZXh9PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRNQUlBU2VuZEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNlbmRNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzZW5kRGlzYWJsZWQgfHwgZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWVzPXtoYXNUeXBpbmdQcmVzZW5jZSB8fCBhdHRhY2htZW50cy5sZW5ndGggPiAwfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dFNlbmRJY29uIGNvbG9yPVwiI0JGQkZCRlwiIHdpZHRoPXsxNn0gaGVpZ2h0PXsxNn0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRNQUlBU2VuZEJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1N0eWxlZE1BSUFTZW5kVG9vbGJhckNlbGw+XG4gICAgICAgICAgPC9TQ0lucHV0VG9vbGJhclJvdz5cbiAgICAgICAgPC9TdHlsZWRNQUlBTWFpblRvb2xiYXJHcmlkPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICByZWY9e2ZpbGVJbnB1dFJlZn1cbiAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICBhY2NlcHQ9XCIudHh0LC5tZCwuY3N2LC5kb2MsLmRvY3gsLnBwdCwucHB0eCwucG5nLC5qcGcsLmpwZWcsLnBkZiwueGxzeCwueGxzLC5mbGFjLC5tNGEsLm1wMywubXA0LC5vZ2EsLm9nZywud2F2LC53ZWJtXCJcbiAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlRmlsZVNlbGVjdH1cbiAgICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnbm9uZScgfX1cbiAgICAgICAgLz5cbiAgICAgICAge2lzRmlsZURyYWdBY3RpdmUgJiYgPFN0eWxlZE1BSUFEcm9wT3ZlcmxheT57dCgnY2hhdC5kcm9wRmlsZXNIZXJlJyl9PC9TdHlsZWRNQUlBRHJvcE92ZXJsYXk+fVxuICAgICAgPC9TdHlsZWRNQUlBSW5wdXRXcmFwcGVyPlxuICAgICAge21vZGFsUHJvcHMuaXNPcGVuICYmIChcbiAgICAgICAgPE1vZGFsRmlsZUV4Y2VlZHNcbiAgICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRNb2RhbFByb3BzKHsgaXNPcGVuOiBmYWxzZSwgZXhjbHVkZWRGaWxlczogW10sIGV4Y2VlZGVkRmlsZXM6IFtdLCBmaWxlU2l6ZXM6IHt9IH0pfVxuICAgICAgICAgIGV4Y2x1ZGVkRmlsZXM9e21vZGFsUHJvcHMuZXhjbHVkZWRGaWxlc31cbiAgICAgICAgICBleGNlZWRlZEZpbGVzPXttb2RhbFByb3BzLmV4Y2VlZGVkRmlsZXN9XG4gICAgICAgICAgZmlsZVNpemVzPXttb2RhbFByb3BzLmZpbGVTaXplc31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7cG9wb3Zlck5vZGUgJiYgY3JlYXRlUG9ydGFsKHBvcG92ZXJOb2RlLCBkb2N1bWVudC5ib2R5KX1cbiAgICAgIHtzaG93U2xhc2hEcm9wZG93biAmJlxuICAgICAgICBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgPFNsYXNoQ29tbWFuZERyb3Bkb3duXG4gICAgICAgICAgICBjb21tYW5kcz17c2xhc2hDb21tYW5kc31cbiAgICAgICAgICAgIHF1ZXJ5PXtzbGFzaFF1ZXJ5fVxuICAgICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdFNsYXNoQ29tbWFuZH1cbiAgICAgICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlU2xhc2hEcm9wZG93bn1cbiAgICAgICAgICAgIGJvdHRvbT17c2xhc2hEcm9wZG93blBvcy5ib3R0b219XG4gICAgICAgICAgICBsZWZ0PXtzbGFzaERyb3Bkb3duUG9zLmxlZnR9XG4gICAgICAgICAgICBtYXhIZWlnaHQ9e3NsYXNoRHJvcGRvd25Qb3MubWF4SGVpZ2h0fVxuICAgICAgICAgICAgekluZGV4PXtzbGFzaERyb3Bkb3duWkluZGV4fVxuICAgICAgICAgICAgYW5jaG9yUmVmPXt3cmFwcGVyUmVmfVxuICAgICAgICAgIC8+LFxuICAgICAgICAgIGRvY3VtZW50LmJvZHlcbiAgICAgICAgKX1cbiAgICAgIHtzaG93U2tpbGxzRHJvcGRvd24gJiZcbiAgICAgICAgY3JlYXRlUG9ydGFsKFxuICAgICAgICAgIDxTa2lsbHNEcm9wZG93blxuICAgICAgICAgICAgc2tpbGxzPXtza2lsbHN9XG4gICAgICAgICAgICBxdWVyeT17c2tpbGxzUXVlcnl9XG4gICAgICAgICAgICBsb2FkaW5nPXtza2lsbHNMb2FkaW5nfVxuICAgICAgICAgICAgZXJyb3I9e3NraWxsc0Vycm9yfVxuICAgICAgICAgICAgY2FuQ3JlYXRlPXtzaG93U2tpbGxzQnV0dG9ufVxuICAgICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdFNraWxsfVxuICAgICAgICAgICAgb25DcmVhdGU9e2hhbmRsZUNyZWF0ZVNraWxsfVxuICAgICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2VTa2lsbHNEcm9wZG93bn1cbiAgICAgICAgICAgIGJvdHRvbT17c2tpbGxzRHJvcGRvd25Qb3MuYm90dG9tfVxuICAgICAgICAgICAgcmlnaHQ9e3NraWxsc0Ryb3Bkb3duUG9zLnJpZ2h0fVxuICAgICAgICAgICAgbWF4SGVpZ2h0PXtza2lsbHNEcm9wZG93blBvcy5tYXhIZWlnaHR9XG4gICAgICAgICAgICB6SW5kZXg9e3NsYXNoRHJvcGRvd25aSW5kZXh9XG4gICAgICAgICAgICBhbmNob3JSZWY9e3dyYXBwZXJSZWZ9XG4gICAgICAgICAgLz4sXG4gICAgICAgICAgZG9jdW1lbnQuYm9keVxuICAgICAgICApfVxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQVFFQSxXQUFXLEVBQ1hDLFNBQVMsRUFDVEMsZUFBZSxFQUNmQyxPQUFPLEVBQ1BDLE1BQU0sRUFDTkMsUUFBUSxRQUNILE9BQU87QUFDZCxTQUFTQyxZQUFZLFFBQVEsV0FBVztBQUN4QyxTQUFTQyxPQUFPLFFBQVEsZUFBZTtBQUN2QyxTQUFTQyxLQUFLLFFBQVEsd0NBQXdDO0FBQzlELFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUV0RSxTQUNFQyx3QkFBd0IsRUFDeEJDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxlQUFlLEVBQ2ZDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxpQkFBaUIsRUFDakJDLGFBQWEsRUFDYkMsZ0JBQWdCLEVBQ2hCQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxxQkFBcUIsRUFDckJDLHFCQUFxQixFQUNyQkMsY0FBYyxFQUNkQyx3QkFBd0IsRUFDeEJDLHNCQUFzQixFQUN0QkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLHNCQUFzQixFQUN0QkMsb0JBQW9CLEVBQ3BCQyx5QkFBeUIsRUFDekJDLGlCQUFpQixFQUNqQkMsaUJBQWlCLEVBQ2pCQyx5QkFBeUIsRUFDekJDLHlCQUF5QixFQUN6QkMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsRUFDbEJDLHFCQUFxQixRQUNoQixVQUFVO0FBQ2pCLFNBQVNDLDJCQUEyQixFQUFFQyxnQ0FBZ0MsUUFBUSxtQkFBbUI7QUFDakcsU0FBU0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBQ2xFLFNBQVNDLGdCQUFnQixRQUFRLGtD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