@projectcor/maia-components 2.44.5-0 → 2.45.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 (428) hide show
  1. package/README.md +2 -0
  2. package/lib/App.js +19 -44
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +51 -5
  4. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +76 -18
  5. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +31 -3
  6. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +4 -2
  7. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +255 -15
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +34 -5
  9. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
  10. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
  11. package/lib/components/atoms/MAIAInput/MAIAInput.js +10 -4
  12. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +60 -8
  13. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +15 -3
  14. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
  15. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +16 -21
  16. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +5 -7
  17. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +52 -72
  18. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +1 -6
  19. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -36
  20. package/lib/components/index.js +1 -2
  21. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +29 -5
  22. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +40 -6
  23. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +90 -18
  24. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +15 -5
  25. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
  26. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +6 -21
  27. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +47 -19
  28. package/lib/components/molecules/ChatAIMessages/newStyles.js +26 -29
  29. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +4 -147
  30. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +108 -64
  31. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +2 -3
  32. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
  33. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
  34. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +86 -76
  35. package/lib/components/molecules/ChatFooter/ChatFooter.js +3 -5
  36. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +44 -9
  37. package/lib/components/molecules/Sidebar/Sidebar.js +23 -41
  38. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +171 -56
  39. package/lib/constants/permissions/index.js +2 -2
  40. package/lib/constants/permissions/utils.js +1 -4
  41. package/lib/dev/DevReasoningTimeline.js +37 -68
  42. package/lib/dev/Providers.js +3 -5
  43. package/lib/hooks/useChatManager/useChatManager.js +351 -76
  44. package/lib/hooks/useChatMessages/useChatMessages.js +82 -12
  45. package/lib/hooks/useClientSearch.js +32 -4
  46. package/lib/hooks/useContextMentions.js +163 -2
  47. package/lib/hooks/useContextPinPopover.js +75 -16
  48. package/lib/hooks/useEntitySearch.js +391 -38
  49. package/lib/hooks/useFrequentlyUsedActions.js +22 -60
  50. package/lib/hooks/useMentionPopover.js +35 -9
  51. package/lib/hooks/useMinimizedPillBottomOffset.js +45 -15
  52. package/lib/hooks/useProjectSearch.js +58 -4
  53. package/lib/hooks/useProjectSummaryConfig.js +52 -14
  54. package/lib/hooks/useRecentClientsSearch.js +32 -4
  55. package/lib/index.js +2 -5
  56. package/lib/lang/approvalBoxToolActions.js +492 -0
  57. package/lib/lang/br/index.js +23 -59
  58. package/lib/lang/en/index.js +23 -59
  59. package/lib/lang/es/index.js +23 -59
  60. package/lib/lang/fr/index.js +23 -59
  61. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  62. package/lib/services/maia/Agents/getAgents.js +242 -78
  63. package/lib/services/maia/Orchestrator/orchestrator.js +121 -38
  64. package/lib/store/sessions/sessionNotifications.js +41 -35
  65. package/lib/store/sessions/sessionStreamManager.js +52 -40
  66. package/lib/styles/cascade.js +3 -29
  67. package/lib/styles/transitions.js +1 -3
  68. package/lib/types/agentModal.js +1 -1
  69. package/lib/types/global.d.js +1 -1
  70. package/lib/utils/hoursPlannerQuickActionType.js +1 -74
  71. package/lib/utils/imagePreprocessor.js +37 -12
  72. package/lib/utils/streamActivityMessages.js +60 -32
  73. package/package.json +1 -1
  74. package/lib/components/atoms/ActionableButton.spec.js +0 -111
  75. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
  76. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
  77. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
  78. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
  79. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +0 -65
  80. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -66
  81. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -211
  82. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
  83. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +0 -55
  84. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -41
  85. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -253
  86. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
  87. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +0 -31
  88. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -33
  89. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -25
  90. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +0 -4
  91. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
  92. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
  93. package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
  94. package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
  95. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
  96. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  97. package/lib/components/atoms/Chip/Chip.spec.js +0 -82
  98. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
  99. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -88
  100. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  101. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
  102. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +0 -227
  103. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -77
  104. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
  105. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +0 -31
  106. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -48
  107. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -231
  108. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
  109. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
  110. package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
  111. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
  112. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
  113. package/lib/components/atoms/Expand/Expand.spec.js +0 -57
  114. package/lib/components/atoms/Fade/Fade.spec.js +0 -31
  115. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
  116. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
  117. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
  118. package/lib/components/atoms/HelpButton.spec.js +0 -87
  119. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
  120. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
  121. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
  122. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
  123. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
  124. package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
  125. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  126. package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
  127. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +0 -12
  128. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -26
  129. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -430
  130. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +0 -50
  131. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -20
  132. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -53
  133. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -22
  134. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
  135. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
  136. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
  137. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
  138. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
  139. package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
  140. package/lib/components/atoms/NextPageLoader.spec.js +0 -37
  141. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
  142. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +0 -17
  143. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
  144. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
  145. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -86
  146. package/lib/components/atoms/PrimaryButton.spec.js +0 -42
  147. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
  148. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
  149. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
  150. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -132
  151. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -162
  152. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
  153. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
  154. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -4
  155. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +0 -10
  156. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
  157. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
  158. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
  159. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
  160. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  161. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
  162. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
  163. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  164. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
  165. package/lib/components/atoms/TextArea/TextArea.spec.js +0 -68
  166. package/lib/components/atoms/ThirdButton.spec.js +0 -29
  167. package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
  168. package/lib/components/atoms/WithAppCfg.spec.js +0 -60
  169. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +0 -37
  170. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
  171. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -371
  172. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +0 -39
  173. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -57
  174. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -227
  175. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +0 -86
  176. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -108
  177. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -254
  178. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +0 -17
  179. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
  180. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
  181. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
  182. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
  183. package/lib/components/molecules/AgentInputBlock/index.js +0 -5
  184. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
  185. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
  186. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
  187. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
  188. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
  189. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
  190. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
  191. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
  192. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
  193. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
  194. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  195. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +0 -54
  196. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -77
  197. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -410
  198. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  199. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -471
  200. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -659
  201. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +0 -5
  202. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
  203. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
  204. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
  205. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +0 -30
  206. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -95
  207. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
  208. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
  209. package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
  210. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
  211. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
  212. package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
  213. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -172
  214. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
  215. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
  216. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -355
  217. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
  218. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +0 -48
  219. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -82
  220. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
  221. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  222. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  223. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
  224. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
  225. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
  226. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
  227. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -453
  228. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +0 -198
  229. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -385
  230. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1125
  231. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
  232. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
  233. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  234. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
  235. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -231
  236. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  237. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
  238. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
  239. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
  240. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -267
  241. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -261
  242. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -194
  243. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -105
  244. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -73
  245. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
  246. package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
  247. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
  248. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  249. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
  250. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  251. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  252. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  253. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
  254. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
  255. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
  256. package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
  257. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
  258. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
  259. package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
  260. package/lib/constants/permissions/utils.spec.js +0 -128
  261. package/lib/dev/DevMaiaPage.js +0 -30
  262. package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
  263. package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
  264. package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
  265. package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
  266. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -231
  267. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
  268. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -313
  269. package/lib/hooks/useAgentSuggestions.spec.js +0 -89
  270. package/lib/hooks/useCaretPosition.spec.js +0 -58
  271. package/lib/hooks/useChatManager/useChatManager.helpers.js +0 -353
  272. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -506
  273. package/lib/hooks/useChatManager/useChatManager.spec.js +0 -1261
  274. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +0 -109
  275. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -176
  276. package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -379
  277. package/lib/hooks/useChats/useChats.spec.js +0 -208
  278. package/lib/hooks/useClientSearch.helpers.js +0 -36
  279. package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
  280. package/lib/hooks/useClientSearch.spec.js +0 -86
  281. package/lib/hooks/useContextMentions.helpers.js +0 -152
  282. package/lib/hooks/useContextMentions.helpers.spec.js +0 -143
  283. package/lib/hooks/useContextMentions.spec.js +0 -239
  284. package/lib/hooks/useContextMentions.types.js +0 -2
  285. package/lib/hooks/useContextPinPopover.helpers.js +0 -95
  286. package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -115
  287. package/lib/hooks/useContextPinPopover.spec.js +0 -159
  288. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
  289. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
  290. package/lib/hooks/useDebounce.spec.js +0 -42
  291. package/lib/hooks/useEntitySearch.helpers.js +0 -359
  292. package/lib/hooks/useEntitySearch.helpers.spec.js +0 -321
  293. package/lib/hooks/useEntitySearch.spec.js +0 -443
  294. package/lib/hooks/useEvent.spec.js +0 -45
  295. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
  296. package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
  297. package/lib/hooks/useIsMaiaPageRoute.js +0 -26
  298. package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
  299. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
  300. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
  301. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
  302. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
  303. package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
  304. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
  305. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  306. package/lib/hooks/useMentionPopover.helpers.js +0 -41
  307. package/lib/hooks/useMentionPopover.helpers.spec.js +0 -71
  308. package/lib/hooks/useMentionPopover.spec.js +0 -215
  309. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +0 -47
  310. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -132
  311. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
  312. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
  313. package/lib/hooks/useModal/useModal.spec.js +0 -73
  314. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -192
  315. package/lib/hooks/useProjectSearch.helpers.js +0 -61
  316. package/lib/hooks/useProjectSearch.helpers.spec.js +0 -70
  317. package/lib/hooks/useProjectSearch.spec.js +0 -91
  318. package/lib/hooks/useProjectSummary.spec.js +0 -193
  319. package/lib/hooks/useProjectSummaryConfig.helpers.js +0 -62
  320. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -92
  321. package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
  322. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
  323. package/lib/hooks/useRecentClientsSearch.helpers.js +0 -33
  324. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
  325. package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
  326. package/lib/hooks/useRecentContexts.spec.js +0 -139
  327. package/lib/hooks/useResize.spec.js +0 -37
  328. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  329. package/lib/hooks/useSlashCommands.spec.js +0 -139
  330. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
  331. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  332. package/lib/hooks/useStreamResponse.spec.js +0 -199
  333. package/lib/hooks/useT.spec.js +0 -20
  334. package/lib/hooks/useToggle.spec.js +0 -33
  335. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
  336. package/lib/services/maia/Access/updateAccess.spec.js +0 -137
  337. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
  338. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
  339. package/lib/services/maia/Agents/connectors.spec.js +0 -359
  340. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  341. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
  342. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  343. package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
  344. package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
  345. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
  346. package/lib/services/maia/Agents/getAgents.helpers.js +0 -181
  347. package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -211
  348. package/lib/services/maia/Agents/getAgents.spec.js +0 -697
  349. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  350. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
  351. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  352. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  353. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  354. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  355. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  356. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  357. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  358. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  359. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  360. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  361. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  362. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +0 -130
  363. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -153
  364. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
  365. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  366. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
  367. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  368. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  369. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  370. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  371. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  372. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  373. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  374. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  375. package/lib/services/maia/client.spec.js +0 -56
  376. package/lib/services/utils/fetchCOR.spec.js +0 -211
  377. package/lib/services/utils/getCookie.spec.js +0 -20
  378. package/lib/services/utils/mapChatMessages.spec.js +0 -254
  379. package/lib/store/chatsSidebarOptimistic.spec.js +0 -112
  380. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  381. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  382. package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
  383. package/lib/store/sessions/sessionNotifications.helpers.js +0 -45
  384. package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
  385. package/lib/store/sessions/sessionNotifications.spec.js +0 -106
  386. package/lib/store/sessions/sessionStreamManager.spec.js +0 -503
  387. package/lib/store/sessions/sessions.types.spec.js +0 -16
  388. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  389. package/lib/store/useChatsStore.spec.js +0 -619
  390. package/lib/store/useFaqsStore.spec.js +0 -57
  391. package/lib/test/mockSseStream.js +0 -121
  392. package/lib/test/streamdownCodeMock.js +0 -6
  393. package/lib/test/streamdownMock.js +0 -12
  394. package/lib/utils/actionCategoryMap.spec.js +0 -18
  395. package/lib/utils/agentDisplayName.spec.js +0 -44
  396. package/lib/utils/autoApproveStorage.spec.js +0 -25
  397. package/lib/utils/chatInputFiles.spec.js +0 -39
  398. package/lib/utils/contextMentionIcons.spec.js +0 -41
  399. package/lib/utils/contextMentionLabel.spec.js +0 -13
  400. package/lib/utils/contextMentionTriggers.spec.js +0 -38
  401. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  402. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  403. package/lib/utils/entityLinkRender.spec.js +0 -72
  404. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  405. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  406. package/lib/utils/formatUnreadCount.spec.js +0 -12
  407. package/lib/utils/getUnitFileSize.spec.js +0 -18
  408. package/lib/utils/hitlAnalytics.spec.js +0 -100
  409. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
  410. package/lib/utils/imagePreprocessor.helpers.js +0 -28
  411. package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
  412. package/lib/utils/imagePreprocessor.spec.js +0 -112
  413. package/lib/utils/maiaPageRoute.js +0 -24
  414. package/lib/utils/maiaPageRoute.spec.js +0 -23
  415. package/lib/utils/mapBackendLang.spec.js +0 -19
  416. package/lib/utils/navigateContextEntity.spec.js +0 -50
  417. package/lib/utils/normalizeAgentConnectors.spec.js +0 -107
  418. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  419. package/lib/utils/reasoningMappers.spec.js +0 -103
  420. package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
  421. package/lib/utils/renderContextMentions.spec.js +0 -158
  422. package/lib/utils/retryCompletion.spec.js +0 -99
  423. package/lib/utils/skillContentSize.spec.js +0 -13
  424. package/lib/utils/slashCommandMarker.spec.js +0 -43
  425. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  426. package/lib/utils/sseStreamContent.spec.js +0 -31
  427. package/lib/utils/streamActivityMessages.spec.js +0 -227
  428. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -1,1125 +0,0 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _regeneratorRuntime from "@babel/runtime/regenerator";
4
- 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; }
5
- 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; }
6
- import { act, fireEvent, renderWithProviders, screen, waitFor } from '../../../test/test-utils';
7
- import { ensurePortalRoot } from '../../../test/portalRoot';
8
- import { GlobalContextTestProvider } from '../../../test/global-context';
9
- import { AbmAgentModal } from './AbmAgentModal';
10
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
- var handleCreateAgent = jest.fn();
12
- var handleUpdateAgent = jest.fn();
13
- var handleSnackbarError = jest.fn();
14
- var handleSnackbarSuccess = jest.fn();
15
- var handleAccessClient = jest.fn();
16
- var accessClientHook = {
17
- success: false,
18
- resetSuccessUpdateAccess: jest.fn(function () {
19
- accessClientHook.success = false;
20
- })
21
- };
22
- var createAgentHook = {
23
- isLoading: false,
24
- success: false,
25
- resetSuccess: jest.fn(function () {
26
- createAgentHook.success = false;
27
- })
28
- };
29
- var deleteAgentHook = {
30
- success: false,
31
- resetSuccess: jest.fn(function () {
32
- deleteAgentHook.success = false;
33
- })
34
- };
35
- var updateAgentHook = {
36
- success: false,
37
- resetSuccess: jest.fn(function () {
38
- updateAgentHook.success = false;
39
- })
40
- };
41
- jest.mock('@projectcor/cor-commons/lib/components/spinner-lottie', function () {
42
- return {
43
- SpinnerLottie: function SpinnerLottie() {
44
- return /*#__PURE__*/_jsx("div", {
45
- children: "spinner"
46
- });
47
- }
48
- };
49
- });
50
- jest.mock('../../../hooks/useEvent', function () {
51
- return {
52
- EVENTS: {
53
- confirmAction: 'AI_CHAT_ABM_CONFIRM',
54
- "delete": 'AI_CHAT_ABM_DELETE_AGENT'
55
- },
56
- useEvent: function useEvent() {
57
- return jest.fn();
58
- }
59
- };
60
- });
61
- jest.mock('../../../hooks/useSnackBarManager/useSnackBarManager', function () {
62
- return {
63
- useSnackBarManager: function useSnackBarManager() {
64
- return {
65
- handleSnackbarError: handleSnackbarError,
66
- handleSnackbarSuccess: handleSnackbarSuccess
67
- };
68
- }
69
- };
70
- });
71
- jest.mock('../../../context/cor-user', function () {
72
- return {
73
- useUser: function useUser() {
74
- return {
75
- id: 99,
76
- permissions: {
77
- ai_agents: {
78
- create: true,
79
- edit: true,
80
- "delete": true
81
- }
82
- }
83
- };
84
- }
85
- };
86
- });
87
- jest.mock('../../../hooks/useMaiaTaskPanelZIndex', function () {
88
- return {
89
- useMaiaTaskPanelZIndex: function useMaiaTaskPanelZIndex() {
90
- return 1200;
91
- }
92
- };
93
- });
94
- jest.mock('../../../services/maia/Agents/getAgentById', function () {
95
- return {
96
- useGetAgentById: function useGetAgentById() {
97
- return {
98
- loading: false,
99
- handleGetAgentById: jest.fn(),
100
- agent: null,
101
- handleCleanAgent: jest.fn(),
102
- error: null
103
- };
104
- }
105
- };
106
- });
107
- jest.mock('../../../hooks/useAgentModel/useAgentModel', function () {
108
- var agentModels = [{
109
- id: 1,
110
- display_name: 'GPT',
111
- model_name: 'gpt'
112
- }];
113
- return {
114
- useAgentModel: function useAgentModel() {
115
- return {
116
- agentModels: agentModels,
117
- getAllAgentModels: jest.fn()
118
- };
119
- }
120
- };
121
- });
122
- jest.mock('../../../hooks/useAgentModel/useCreateAgent', function () {
123
- return {
124
- useCreateAgent: function useCreateAgent() {
125
- return {
126
- handleCreateAgent: handleCreateAgent,
127
- isLoading: createAgentHook.isLoading,
128
- success: createAgentHook.success,
129
- resetSuccess: createAgentHook.resetSuccess
130
- };
131
- }
132
- };
133
- });
134
- jest.mock('../../../hooks/useAgentModel/useUpdateAgent', function () {
135
- return {
136
- useUpdateAgent: function useUpdateAgent() {
137
- return {
138
- handleUpdateAgent: handleUpdateAgent,
139
- success: updateAgentHook.success,
140
- resetSuccess: updateAgentHook.resetSuccess
141
- };
142
- }
143
- };
144
- });
145
- jest.mock('../../../hooks/useAgentModel/useDeleteAgent', function () {
146
- return {
147
- useDeleteAgent: function useDeleteAgent() {
148
- return {
149
- handleDeleteAgent: jest.fn(),
150
- success: deleteAgentHook.success,
151
- resetSuccess: deleteAgentHook.resetSuccess
152
- };
153
- }
154
- };
155
- });
156
- jest.mock('../../../hooks/useKnowledge', function () {
157
- return {
158
- useKnowledgeOperations: function useKnowledgeOperations() {
159
- return {
160
- handleCreateKnowledges: jest.fn(),
161
- handleDeleteKnowledges: jest.fn(),
162
- handleDeleteAndCreateKnowledges: jest.fn(),
163
- isLoading: false,
164
- error: null,
165
- successDelete: false,
166
- handleResetSuccessSave: jest.fn(),
167
- handleResetSuccessDelete: jest.fn()
168
- };
169
- }
170
- };
171
- });
172
- jest.mock('../../../hooks/useAccessClient/useAccessClient', function () {
173
- return {
174
- useAccessClient: function useAccessClient() {
175
- return {
176
- handleAccessClient: handleAccessClient,
177
- isLoading: false,
178
- success: accessClientHook.success,
179
- handleResetSuccess: accessClientHook.resetSuccessUpdateAccess
180
- };
181
- }
182
- };
183
- });
184
- jest.mock('../../../hooks', function () {
185
- return {
186
- useToggleFavorite: function useToggleFavorite() {
187
- return {
188
- toggleFavorite: jest.fn()
189
- };
190
- }
191
- };
192
- });
193
- jest.mock('../../molecules/AbmSection', function () {
194
- return {
195
- AbmGeneralSection: function AbmGeneralSection(_ref) {
196
- var values = _ref.values,
197
- handleSetAgentValues = _ref.handleSetAgentValues;
198
- return /*#__PURE__*/_jsxs("div", {
199
- children: [/*#__PURE__*/_jsx("input", {
200
- "aria-label": "agent-name",
201
- value: values.general.name || '',
202
- onChange: function onChange(event) {
203
- return handleSetAgentValues({
204
- key: 'name',
205
- value: event.target.value
206
- });
207
- }
208
- }), /*#__PURE__*/_jsx("textarea", {
209
- "aria-label": "agent-prompt",
210
- value: values.general.userPrompt || '',
211
- onChange: function onChange(event) {
212
- return handleSetAgentValues({
213
- key: 'userPrompt',
214
- value: event.target.value
215
- });
216
- }
217
- })]
218
- });
219
- },
220
- AbmKnowledgeSection: function AbmKnowledgeSection(_ref2) {
221
- var handleSetAgentValues = _ref2.handleSetAgentValues;
222
- return /*#__PURE__*/_jsxs("div", {
223
- children: ["knowledge", /*#__PURE__*/_jsx("button", {
224
- type: "button",
225
- onClick: function onClick() {
226
- return handleSetAgentValues({
227
- key: 'knowledge',
228
- value: [{
229
- id: 'file-1',
230
- name: 'guide.pdf',
231
- size: 10,
232
- type: 'application/pdf',
233
- status: 'pending',
234
- file: new File([], 'guide.pdf')
235
- }]
236
- });
237
- },
238
- children: "add-knowledge-file"
239
- })]
240
- });
241
- }
242
- };
243
- });
244
- jest.mock('../../molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection', function () {
245
- return {
246
- AbmAccessibilitySection: function AbmAccessibilitySection(_ref3) {
247
- var handleSetAgentValues = _ref3.handleSetAgentValues;
248
- return /*#__PURE__*/_jsxs("div", {
249
- children: ["accessibility", /*#__PURE__*/_jsx("button", {
250
- type: "button",
251
- onClick: function onClick() {
252
- return handleSetAgentValues({
253
- key: 'accessibility',
254
- value: {
255
- accessType: 'clients',
256
- clients: [{
257
- id: '1',
258
- name: 'Active Co',
259
- is_active: true,
260
- is_deleted: false
261
- }],
262
- corAccess: {
263
- clientes: true,
264
- proyectos: false,
265
- tareas: false
266
- }
267
- }
268
- });
269
- },
270
- children: "set-client-access"
271
- })]
272
- });
273
- }
274
- };
275
- });
276
- jest.mock('../../molecules/AbmSection/AbmLoaderFiles', function () {
277
- return {
278
- AbmLoaderFiles: function AbmLoaderFiles(_ref4) {
279
- var onTimeout = _ref4.onTimeout;
280
- return /*#__PURE__*/_jsxs("div", {
281
- children: ["loader-files", /*#__PURE__*/_jsx("button", {
282
- type: "button",
283
- onClick: onTimeout,
284
- children: "files-timeout"
285
- })]
286
- });
287
- }
288
- };
289
- });
290
- jest.mock('../DeleteQuestionModal/DeleteQuestionModal', function () {
291
- return {
292
- DeleteQuestionModal: function DeleteQuestionModal() {
293
- return /*#__PURE__*/_jsx("div", {
294
- children: "delete-modal"
295
- });
296
- }
297
- };
298
- });
299
- var hasMaiaExternalConnectorsAccessMock = jest.fn(function () {
300
- return false;
301
- });
302
- jest.mock('../../../constants/maiaExternalConnectorsAccess', function () {
303
- return {
304
- hasMaiaExternalConnectorsAccess: function hasMaiaExternalConnectorsAccess() {
305
- return hasMaiaExternalConnectorsAccessMock();
306
- }
307
- };
308
- });
309
- var getAgentConnectorsMock = jest.fn();
310
- jest.mock('../../../services/maia/Agents/connectors', function () {
311
- return {
312
- getAgentConnectors: function getAgentConnectors() {
313
- return getAgentConnectorsMock.apply(void 0, arguments);
314
- }
315
- };
316
- });
317
- var flags = window;
318
- var openAgent = function openAgent() {
319
- var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
320
- values = _ref5.values,
321
- initialSection = _ref5.initialSection,
322
- prefetchedAgentById = _ref5.prefetchedAgentById;
323
- act(function () {
324
- document.dispatchEvent(new CustomEvent('abm-agent-modal-set-values', {
325
- detail: {
326
- agentValues: {
327
- values: values !== null && values !== void 0 ? values : {
328
- isEditing: false,
329
- general: {
330
- name: '',
331
- userPrompt: ''
332
- }
333
- },
334
- initialSection: initialSection,
335
- prefetchedAgentById: prefetchedAgentById
336
- }
337
- }
338
- }));
339
- });
340
- };
341
- var prefetchedCustomAgent = {
342
- type: 'custom',
343
- emoji: '🤖',
344
- name: 'Support',
345
- introduction: 'Hi',
346
- inputPlaceholder: 'Ask',
347
- isActive: true,
348
- modelAiId: 1,
349
- id: 'agent-1',
350
- userPrompt: 'You help users',
351
- is_favorite: false,
352
- createdBy: 99,
353
- knowledgeBases: [],
354
- access: 'company',
355
- clients: [],
356
- toolGroupSlugs: []
357
- };
358
- var clickModalClose = function clickModalClose() {
359
- var _title$parentElement;
360
- var title = screen.getByText(/newAgent|editAgent/);
361
- var header = (_title$parentElement = title.parentElement) === null || _title$parentElement === void 0 ? void 0 : _title$parentElement.parentElement;
362
- var closeButton = header === null || header === void 0 ? void 0 : header.lastElementChild;
363
- if (!closeButton) {
364
- throw new Error('Close button not found');
365
- }
366
- fireEvent.click(closeButton);
367
- };
368
- var agentProps = {
369
- addAgent: jest.fn(),
370
- removeAgent: jest.fn(),
371
- updateAgent: jest.fn(),
372
- updateAgentFavorite: jest.fn(),
373
- selectFirstAgent: jest.fn()
374
- };
375
- describe('AbmAgentModal', function () {
376
- var cleanupPortal;
377
- beforeEach(function () {
378
- cleanupPortal = ensurePortalRoot('abm-agent-modal');
379
- handleCreateAgent.mockClear();
380
- handleUpdateAgent.mockClear();
381
- handleSnackbarError.mockClear();
382
- handleSnackbarSuccess.mockClear();
383
- handleAccessClient.mockClear();
384
- accessClientHook.success = false;
385
- accessClientHook.resetSuccessUpdateAccess.mockClear();
386
- createAgentHook.isLoading = false;
387
- createAgentHook.success = false;
388
- deleteAgentHook.success = false;
389
- updateAgentHook.success = false;
390
- delete flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
391
- hasMaiaExternalConnectorsAccessMock.mockReturnValue(false);
392
- getAgentConnectorsMock.mockReset();
393
- jest.spyOn(window, 'confirm').mockReturnValue(true);
394
- });
395
- afterEach(function () {
396
- jest.restoreAllMocks();
397
- cleanupPortal();
398
- });
399
- it('stays closed until the open event', function () {
400
- var _renderWithProviders = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
401
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
402
- })),
403
- container = _renderWithProviders.container;
404
- expect(container).toBeEmptyDOMElement();
405
- });
406
- it('keeps save disabled without name or prompt', function () {
407
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
408
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
409
- }));
410
- openAgent();
411
- expect(screen.getByRole('button', {
412
- name: 'createAgentLabelButton'
413
- })).toBeDisabled();
414
- });
415
- it('does not create without the multi-agents flag', function () {
416
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
417
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
418
- }));
419
- openAgent();
420
- fireEvent.change(screen.getByLabelText('agent-name'), {
421
- target: {
422
- value: 'Custom'
423
- }
424
- });
425
- fireEvent.change(screen.getByLabelText('agent-prompt'), {
426
- target: {
427
- value: 'Sos un agente'
428
- }
429
- });
430
- fireEvent.click(screen.getByRole('button', {
431
- name: 'createAgentLabelButton'
432
- }));
433
- expect(handleCreateAgent).not.toHaveBeenCalled();
434
- });
435
- it('creates the agent when the flag is on and the form is valid', function () {
436
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
437
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
438
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
439
- }));
440
- openAgent();
441
- fireEvent.change(screen.getByLabelText('agent-name'), {
442
- target: {
443
- value: 'Custom'
444
- }
445
- });
446
- fireEvent.change(screen.getByLabelText('agent-prompt'), {
447
- target: {
448
- value: 'Sos un agente'
449
- }
450
- });
451
- fireEvent.click(screen.getByRole('button', {
452
- name: 'createAgentLabelButton'
453
- }));
454
- expect(handleCreateAgent).toHaveBeenCalled();
455
- });
456
- it('blocks edit when the multi-agents flag is off', function () {
457
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
458
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
459
- }));
460
- openAgent({
461
- values: {
462
- isEditing: true,
463
- general: {
464
- id: 'a1',
465
- name: 'X',
466
- userPrompt: 'Y'
467
- }
468
- }
469
- });
470
- expect(handleSnackbarError).toHaveBeenCalledWith('errorAccessDenied');
471
- expect(screen.queryByRole('button', {
472
- name: 'saveChanges'
473
- })).not.toBeInTheDocument();
474
- });
475
- it('switches sidebar sections', function () {
476
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
477
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
478
- }));
479
- openAgent();
480
- expect(screen.getByLabelText('agent-name')).toBeInTheDocument();
481
- fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
482
- expect(screen.getByText('knowledge')).toBeInTheDocument();
483
- expect(screen.queryByLabelText('agent-name')).not.toBeInTheDocument();
484
- fireEvent.click(document.getElementById('abm-agent-modal-accessibility'));
485
- expect(screen.getByText('accessibility')).toBeInTheDocument();
486
- });
487
- it('opens on the requested initial section', function () {
488
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
489
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
490
- }));
491
- openAgent({
492
- initialSection: 'knowledge'
493
- });
494
- expect(screen.getByText('knowledge')).toBeInTheDocument();
495
- });
496
- it('closes the modal when there are no pending changes', function () {
497
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
498
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
499
- }));
500
- openAgent();
501
- clickModalClose();
502
- expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
503
- expect(window.confirm).not.toHaveBeenCalled();
504
- });
505
- it('closes the modal when pending changes are confirmed on close', function () {
506
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
507
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
508
- }));
509
- openAgent();
510
- fireEvent.change(screen.getByLabelText('agent-name'), {
511
- target: {
512
- value: 'Draft'
513
- }
514
- });
515
- clickModalClose();
516
- expect(window.confirm).toHaveBeenCalled();
517
- expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
518
- });
519
- it('keeps the modal open when closing with pending changes is cancelled', function () {
520
- jest.spyOn(window, 'confirm').mockReturnValue(false);
521
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
522
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
523
- }));
524
- openAgent();
525
- fireEvent.change(screen.getByLabelText('agent-name'), {
526
- target: {
527
- value: 'Draft'
528
- }
529
- });
530
- clickModalClose();
531
- expect(window.confirm).toHaveBeenCalled();
532
- expect(screen.getByText('newAgent')).toBeInTheDocument();
533
- });
534
- it('loads edit mode from prefetched agent data when the flag is on', function () {
535
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
536
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
537
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
538
- }));
539
- openAgent({
540
- values: {
541
- isEditing: true,
542
- general: {
543
- id: 'agent-1'
544
- }
545
- },
546
- prefetchedAgentById: prefetchedCustomAgent
547
- });
548
- expect(screen.getByText('editAgent')).toBeInTheDocument();
549
- expect(screen.getByLabelText('agent-name')).toHaveValue('Support');
550
- expect(screen.getByRole('button', {
551
- name: 'saveChanges'
552
- })).toBeDisabled();
553
- expect(screen.getByRole('button', {
554
- name: 'deleteAgent'
555
- })).toBeInTheDocument();
556
- });
557
- it('fetches external connectors when opening edit mode with the connectors feature', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
558
- return _regeneratorRuntime.wrap(function (_context) {
559
- while (1) switch (_context.prev = _context.next) {
560
- case 0:
561
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
562
- hasMaiaExternalConnectorsAccessMock.mockReturnValue(true);
563
- getAgentConnectorsMock.mockResolvedValue([{
564
- slug: 'jira_cloud',
565
- requires_auth: false,
566
- enabled_for_agent: true,
567
- user_authorized: false
568
- }]);
569
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
570
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
571
- }));
572
- openAgent({
573
- values: {
574
- isEditing: true,
575
- general: {
576
- id: 'agent-1'
577
- }
578
- },
579
- prefetchedAgentById: prefetchedCustomAgent
580
- });
581
- _context.next = 1;
582
- return waitFor(function () {
583
- expect(getAgentConnectorsMock).toHaveBeenCalledWith('agent-1');
584
- });
585
- case 1:
586
- case "end":
587
- return _context.stop();
588
- }
589
- }, _callee);
590
- })));
591
- it('updates the agent after editing prefetched data', function () {
592
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
593
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
594
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
595
- }));
596
- openAgent({
597
- values: {
598
- isEditing: true,
599
- general: {
600
- id: 'agent-1'
601
- }
602
- },
603
- prefetchedAgentById: prefetchedCustomAgent
604
- });
605
- fireEvent.change(screen.getByLabelText('agent-name'), {
606
- target: {
607
- value: 'Support v2'
608
- }
609
- });
610
- fireEvent.click(screen.getByRole('button', {
611
- name: 'saveChanges'
612
- }));
613
- expect(handleUpdateAgent).toHaveBeenCalled();
614
- });
615
- it('keeps save disabled when selected clients are inactive', function () {
616
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
617
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
618
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
619
- }));
620
- openAgent({
621
- values: {
622
- isEditing: true,
623
- general: {
624
- id: 'agent-1',
625
- name: 'Support',
626
- userPrompt: 'Help'
627
- },
628
- accessibility: {
629
- accessType: 'clients',
630
- clients: [{
631
- id: '1',
632
- name: 'Inactive Co',
633
- is_active: false,
634
- is_deleted: false
635
- }]
636
- }
637
- },
638
- prefetchedAgentById: _objectSpread(_objectSpread({}, prefetchedCustomAgent), {}, {
639
- access: 'clients',
640
- clients: [{
641
- id: 1,
642
- name: 'Inactive Co',
643
- is_active: false,
644
- is_deleted: false
645
- }]
646
- })
647
- });
648
- fireEvent.change(screen.getByLabelText('agent-name'), {
649
- target: {
650
- value: 'Support v2'
651
- }
652
- });
653
- expect(screen.getByRole('button', {
654
- name: 'saveChanges'
655
- })).toBeDisabled();
656
- });
657
- it('opens the delete confirmation modal from edit mode', function () {
658
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
659
- renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
660
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
661
- }));
662
- openAgent({
663
- values: {
664
- isEditing: true,
665
- general: {
666
- id: 'agent-1'
667
- }
668
- },
669
- prefetchedAgentById: prefetchedCustomAgent
670
- });
671
- fireEvent.click(screen.getByRole('button', {
672
- name: 'deleteAgent'
673
- }));
674
- expect(screen.getByText('delete-modal')).toBeInTheDocument();
675
- });
676
- it('finishes the happy path after update succeeds', function () {
677
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
678
- var updateAgent = jest.fn();
679
- var selectAgent = jest.fn();
680
- var onRefetchSession = jest.fn();
681
- document.addEventListener('refetch-session', onRefetchSession);
682
- var selectedAgent = {
683
- id: 'agent-1',
684
- name: 'Support',
685
- type: 'custom'
686
- };
687
- var _renderWithProviders2 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
688
- value: {
689
- agent: selectedAgent,
690
- selectAgent: selectAgent
691
- },
692
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
693
- updateAgent: updateAgent
694
- }))
695
- })),
696
- rerender = _renderWithProviders2.rerender;
697
- openAgent({
698
- values: {
699
- isEditing: true,
700
- general: {
701
- id: 'agent-1'
702
- }
703
- },
704
- prefetchedAgentById: prefetchedCustomAgent
705
- });
706
- fireEvent.change(screen.getByLabelText('agent-name'), {
707
- target: {
708
- value: 'Support v2'
709
- }
710
- });
711
- fireEvent.click(screen.getByRole('button', {
712
- name: 'saveChanges'
713
- }));
714
- expect(handleUpdateAgent).toHaveBeenCalled();
715
- updateAgentHook.success = {
716
- id: 'agent-1',
717
- type: 'custom',
718
- name: 'Support v2'
719
- };
720
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
721
- value: {
722
- agent: selectedAgent,
723
- selectAgent: selectAgent
724
- },
725
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
726
- updateAgent: updateAgent
727
- }))
728
- }));
729
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
730
- expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
731
- id: 'agent-1',
732
- name: 'Support v2'
733
- }));
734
- expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
735
- id: 'agent-1'
736
- }));
737
- expect(updateAgentHook.resetSuccess).toHaveBeenCalled();
738
- expect(onRefetchSession).toHaveBeenCalledTimes(1);
739
- expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
740
- document.removeEventListener('refetch-session', onRefetchSession);
741
- });
742
- it('finishes the happy path after create succeeds', function () {
743
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
744
- var addAgent = jest.fn();
745
- var selectAgent = jest.fn();
746
- var _renderWithProviders3 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
747
- value: {
748
- selectAgent: selectAgent
749
- },
750
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
751
- addAgent: addAgent
752
- }))
753
- })),
754
- rerender = _renderWithProviders3.rerender;
755
- openAgent();
756
- fireEvent.change(screen.getByLabelText('agent-name'), {
757
- target: {
758
- value: 'Custom'
759
- }
760
- });
761
- fireEvent.change(screen.getByLabelText('agent-prompt'), {
762
- target: {
763
- value: 'Sos un agente'
764
- }
765
- });
766
- fireEvent.click(screen.getByRole('button', {
767
- name: 'createAgentLabelButton'
768
- }));
769
- expect(handleCreateAgent).toHaveBeenCalled();
770
- createAgentHook.success = {
771
- id: 'created-1',
772
- type: 'custom'
773
- };
774
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
775
- value: {
776
- selectAgent: selectAgent
777
- },
778
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
779
- addAgent: addAgent
780
- }))
781
- }));
782
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
783
- expect(addAgent).toHaveBeenCalledWith(expect.objectContaining({
784
- id: 'created-1'
785
- }));
786
- expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
787
- id: 'created-1'
788
- }));
789
- expect(createAgentHook.resetSuccess).toHaveBeenCalled();
790
- expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
791
- });
792
- it('closes and removes the agent after delete succeeds', function () {
793
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
794
- var removeAgent = jest.fn();
795
- var _renderWithProviders4 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
796
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
797
- removeAgent: removeAgent
798
- }))
799
- })),
800
- rerender = _renderWithProviders4.rerender;
801
- openAgent({
802
- values: {
803
- isEditing: true,
804
- general: {
805
- id: 'agent-1'
806
- }
807
- },
808
- prefetchedAgentById: prefetchedCustomAgent
809
- });
810
- deleteAgentHook.success = true;
811
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
812
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
813
- removeAgent: removeAgent
814
- }))
815
- }));
816
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentDeleted');
817
- expect(removeAgent).toHaveBeenCalledWith('agent-1');
818
- expect(deleteAgentHook.resetSuccess).toHaveBeenCalled();
819
- expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
820
- });
821
- it('requests client access after create when visibility is not company', function () {
822
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
823
- var _renderWithProviders5 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
824
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
825
- })),
826
- rerender = _renderWithProviders5.rerender;
827
- openAgent({
828
- values: {
829
- isEditing: false,
830
- general: {
831
- name: '',
832
- userPrompt: ''
833
- },
834
- accessibility: {
835
- accessType: 'clients',
836
- clients: [{
837
- id: '1',
838
- name: 'Active Co',
839
- is_active: true,
840
- is_deleted: false
841
- }]
842
- }
843
- }
844
- });
845
- fireEvent.change(screen.getByLabelText('agent-name'), {
846
- target: {
847
- value: 'Custom'
848
- }
849
- });
850
- fireEvent.change(screen.getByLabelText('agent-prompt'), {
851
- target: {
852
- value: 'Sos un agente'
853
- }
854
- });
855
- fireEvent.click(screen.getByRole('button', {
856
- name: 'createAgentLabelButton'
857
- }));
858
- createAgentHook.success = {
859
- id: 'created-1',
860
- type: 'custom'
861
- };
862
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
863
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
864
- }));
865
- expect(handleAccessClient).toHaveBeenCalledWith('created-1', expect.objectContaining({
866
- accessType: 'clients'
867
- }));
868
- expect(handleSnackbarSuccess).not.toHaveBeenCalledWith('confirmAgentCreated');
869
- expect(screen.getByText('newAgent')).toBeInTheDocument();
870
- });
871
- it('closes edit after client access succeeds on update', function () {
872
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
873
- var updateAgent = jest.fn();
874
- var selectAgent = jest.fn();
875
- var _renderWithProviders6 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
876
- value: {
877
- agent: {
878
- id: 'agent-1',
879
- name: 'Support',
880
- type: 'custom'
881
- },
882
- selectAgent: selectAgent
883
- },
884
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
885
- updateAgent: updateAgent
886
- }))
887
- })),
888
- rerender = _renderWithProviders6.rerender;
889
- openAgent({
890
- values: {
891
- isEditing: true,
892
- general: {
893
- id: 'agent-1'
894
- }
895
- },
896
- prefetchedAgentById: prefetchedCustomAgent
897
- });
898
- fireEvent.change(screen.getByLabelText('agent-name'), {
899
- target: {
900
- value: 'Support v2'
901
- }
902
- });
903
- fireEvent.click(document.getElementById('abm-agent-modal-accessibility'));
904
- fireEvent.click(screen.getByRole('button', {
905
- name: 'set-client-access'
906
- }));
907
- fireEvent.click(screen.getByRole('button', {
908
- name: 'saveChanges'
909
- }));
910
- expect(handleUpdateAgent).toHaveBeenCalled();
911
- updateAgentHook.success = {
912
- id: 'agent-1',
913
- type: 'custom',
914
- name: 'Support v2'
915
- };
916
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
917
- value: {
918
- agent: {
919
- id: 'agent-1',
920
- name: 'Support',
921
- type: 'custom'
922
- },
923
- selectAgent: selectAgent
924
- },
925
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
926
- updateAgent: updateAgent
927
- }))
928
- }));
929
- expect(handleAccessClient).toHaveBeenCalledWith('agent-1', expect.objectContaining({
930
- accessType: 'clients'
931
- }));
932
- accessClientHook.success = {
933
- ok: true
934
- };
935
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
936
- value: {
937
- agent: {
938
- id: 'agent-1',
939
- name: 'Support',
940
- type: 'custom'
941
- },
942
- selectAgent: selectAgent
943
- },
944
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
945
- updateAgent: updateAgent
946
- }))
947
- }));
948
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
949
- expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
950
- id: 'agent-1'
951
- }));
952
- expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
953
- id: 'agent-1'
954
- }));
955
- expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
956
- });
957
- it('closes create after client access succeeds', function () {
958
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
959
- var addAgent = jest.fn();
960
- var selectAgent = jest.fn();
961
- var _renderWithProviders7 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
962
- value: {
963
- selectAgent: selectAgent
964
- },
965
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
966
- addAgent: addAgent
967
- }))
968
- })),
969
- rerender = _renderWithProviders7.rerender;
970
- openAgent({
971
- values: {
972
- isEditing: false,
973
- general: {
974
- name: '',
975
- userPrompt: ''
976
- },
977
- accessibility: {
978
- accessType: 'clients',
979
- clients: [{
980
- id: '1',
981
- name: 'Active Co',
982
- is_active: true,
983
- is_deleted: false
984
- }]
985
- }
986
- }
987
- });
988
- fireEvent.change(screen.getByLabelText('agent-name'), {
989
- target: {
990
- value: 'Custom'
991
- }
992
- });
993
- fireEvent.change(screen.getByLabelText('agent-prompt'), {
994
- target: {
995
- value: 'Sos un agente'
996
- }
997
- });
998
- fireEvent.click(screen.getByRole('button', {
999
- name: 'createAgentLabelButton'
1000
- }));
1001
- createAgentHook.success = {
1002
- id: 'created-1',
1003
- type: 'custom'
1004
- };
1005
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1006
- value: {
1007
- selectAgent: selectAgent
1008
- },
1009
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1010
- addAgent: addAgent
1011
- }))
1012
- }));
1013
- accessClientHook.success = {
1014
- ok: true
1015
- };
1016
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1017
- value: {
1018
- selectAgent: selectAgent
1019
- },
1020
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1021
- addAgent: addAgent
1022
- }))
1023
- }));
1024
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
1025
- expect(addAgent).toHaveBeenCalledWith(expect.objectContaining({
1026
- id: 'created-1'
1027
- }));
1028
- expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
1029
- id: 'created-1'
1030
- }));
1031
- expect(accessClientHook.resetSuccessUpdateAccess).toHaveBeenCalled();
1032
- expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
1033
- });
1034
- it('closes create after knowledge processing times out', function () {
1035
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1036
- var _renderWithProviders8 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1037
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1038
- })),
1039
- rerender = _renderWithProviders8.rerender;
1040
- openAgent();
1041
- fireEvent.change(screen.getByLabelText('agent-name'), {
1042
- target: {
1043
- value: 'Custom'
1044
- }
1045
- });
1046
- fireEvent.change(screen.getByLabelText('agent-prompt'), {
1047
- target: {
1048
- value: 'Sos un agente'
1049
- }
1050
- });
1051
- fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
1052
- fireEvent.click(screen.getByRole('button', {
1053
- name: 'add-knowledge-file'
1054
- }));
1055
- fireEvent.click(screen.getByRole('button', {
1056
- name: 'createAgentLabelButton'
1057
- }));
1058
- createAgentHook.success = {
1059
- id: 'created-1',
1060
- type: 'custom'
1061
- };
1062
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1063
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1064
- }));
1065
- expect(screen.getByText('loader-files')).toBeInTheDocument();
1066
- fireEvent.click(screen.getByRole('button', {
1067
- name: 'files-timeout'
1068
- }));
1069
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
1070
- expect(createAgentHook.resetSuccess).toHaveBeenCalled();
1071
- expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
1072
- });
1073
- it('closes edit after knowledge processing times out', function () {
1074
- flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1075
- var updateAgent = jest.fn();
1076
- var _renderWithProviders9 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1077
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1078
- updateAgent: updateAgent
1079
- }))
1080
- })),
1081
- rerender = _renderWithProviders9.rerender;
1082
- openAgent({
1083
- values: {
1084
- isEditing: true,
1085
- general: {
1086
- id: 'agent-1'
1087
- }
1088
- },
1089
- prefetchedAgentById: prefetchedCustomAgent
1090
- });
1091
- fireEvent.change(screen.getByLabelText('agent-name'), {
1092
- target: {
1093
- value: 'Support v2'
1094
- }
1095
- });
1096
- fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
1097
- fireEvent.click(screen.getByRole('button', {
1098
- name: 'add-knowledge-file'
1099
- }));
1100
- fireEvent.click(screen.getByRole('button', {
1101
- name: 'saveChanges'
1102
- }));
1103
- updateAgentHook.success = {
1104
- id: 'agent-1',
1105
- type: 'custom',
1106
- name: 'Support v2'
1107
- };
1108
- rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1109
- children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1110
- updateAgent: updateAgent
1111
- }))
1112
- }));
1113
- expect(screen.getByText('loader-files')).toBeInTheDocument();
1114
- fireEvent.click(screen.getByRole('button', {
1115
- name: 'files-timeout'
1116
- }));
1117
- expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
1118
- expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
1119
- id: 'agent-1'
1120
- }));
1121
- expect(updateAgentHook.resetSuccess).toHaveBeenCalled();
1122
- expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
1123
- });
1124
- });
1125
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3QiLCJmaXJlRXZlbnQiLCJyZW5kZXJXaXRoUHJvdmlkZXJzIiwic2NyZWVuIiwid2FpdEZvciIsImVuc3VyZVBvcnRhbFJvb3QiLCJHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIiwiQWJtQWdlbnRNb2RhbCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJoYW5kbGVDcmVhdGVBZ2VudCIsImplc3QiLCJmbiIsImhhbmRsZVVwZGF0ZUFnZW50IiwiaGFuZGxlU25hY2tiYXJFcnJvciIsImhhbmRsZVNuYWNrYmFyU3VjY2VzcyIsImhhbmRsZUFjY2Vzc0NsaWVudCIsImFjY2Vzc0NsaWVudEhvb2siLCJzdWNjZXNzIiwicmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzIiwiY3JlYXRlQWdlbnRIb29rIiwiaXNMb2FkaW5nIiwicmVzZXRTdWNjZXNzIiwiZGVsZXRlQWdlbnRIb29rIiwidXBkYXRlQWdlbnRIb29rIiwibW9jayIsIlNwaW5uZXJMb3R0aWUiLCJjaGlsZHJlbiIsIkVWRU5UUyIsImNvbmZpcm1BY3Rpb24iLCJ1c2VFdmVudCIsInVzZVNuYWNrQmFyTWFuYWdlciIsInVzZVVzZXIiLCJpZCIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJ1c2VHZXRBZ2VudEJ5SWQiLCJsb2FkaW5nIiwiaGFuZGxlR2V0QWdlbnRCeUlkIiwiYWdlbnQiLCJoYW5kbGVDbGVhbkFnZW50IiwiZXJyb3IiLCJhZ2VudE1vZGVscyIsImRpc3BsYXlfbmFtZSIsIm1vZGVsX25hbWUiLCJ1c2VBZ2VudE1vZGVsIiwiZ2V0QWxsQWdlbnRNb2RlbHMiLCJ1c2VDcmVhdGVBZ2VudCIsInVzZVVwZGF0ZUFnZW50IiwidXNlRGVsZXRlQWdlbnQiLCJoYW5kbGVEZWxldGVBZ2VudCIsInVzZUtub3dsZWRnZU9wZXJhdGlvbnMiLCJoYW5kbGVDcmVhdGVLbm93bGVkZ2VzIiwiaGFuZGxlRGVsZXRlS25vd2xlZGdlcyIsImhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMiLCJzdWNjZXNzRGVsZXRlIiwiaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSIsImhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSIsInVzZUFjY2Vzc0NsaWVudCIsImhhbmRsZVJlc2V0U3VjY2VzcyIsInVzZVRvZ2dsZUZhdm9yaXRlIiwidG9nZ2xlRmF2b3JpdGUiLCJBYm1HZW5lcmFsU2VjdGlvbiIsIl9yZWYiLCJ2YWx1ZXMiLCJoYW5kbGVTZXRBZ2VudFZhbHVlcyIsInZhbHVlIiwiZ2VuZXJhbCIsIm5hbWUiLCJvbkNoYW5nZSIsImV2ZW50Iiwia2V5IiwidGFyZ2V0IiwidXNlclByb21wdCIsIkFibUtub3dsZWRnZVNlY3Rpb24iLCJfcmVmMiIsInR5cGUiLCJvbkNsaWNrIiwic2l6ZSIsInN0YXR1cyIsImZpbGUiLCJGaWxlIiwiQWJtQWNjZXNzaWJpbGl0eVNlY3Rpb24iLCJfcmVmMyIsImFjY2Vzc1R5cGUiLCJjbGllbnRzIiwiaXNfYWN0aXZlIiwiaXNfZGVsZXRlZCIsImNvckFjY2VzcyIsImNsaWVudGVzIiwicHJveWVjdG9zIiwidGFyZWFzIiwiQWJtTG9hZGVyRmlsZXMiLCJfcmVmNCIsIm9uVGltZW91dCIsIkRlbGV0ZVF1ZXN0aW9uTW9kYWwiLCJoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzTW9jayIsImhhc01haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3MiLCJnZXRBZ2VudENvbm5lY3RvcnNNb2NrIiwiZ2V0QWdlbnRDb25uZWN0b3JzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJmbGFncyIsIndpbmRvdyIsIm9wZW5BZ2VudCIsIl9yZWY1IiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW5pdGlhbFNlY3Rpb24iLCJwcmVmZXRjaGVkQWdlbnRCeUlkIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJhZ2VudFZhbHVlcyIsImlzRWRpdGluZyIsInByZWZldGNoZWRDdXN0b21BZ2VudCIsImVtb2ppIiwiaW50cm9kdWN0aW9uIiwiaW5wdXRQbGFjZWhvbGRlciIsImlzQWN0aXZlIiwibW9kZWxBaUlkIiwiaXNfZmF2b3JpdGUiLCJjcmVhdGVkQnkiLCJrbm93bGVkZ2VCYXNlcyIsImFjY2VzcyIsInRvb2xHcm91cFNsdWdzIiwiY2xpY2tNb2RhbENsb3NlIiwiX3RpdGxlJHBhcmVudEVsZW1lbnQiLCJ0aXRsZSIsImdldEJ5VGV4dCIsImhlYWRlciIsInBhcmVudEVsZW1lbnQiLCJjbG9zZUJ1dHRvbiIsImxhc3RFbGVtZW50Q2hpbGQiLCJFcnJvciIsImNsaWNrIiwiYWdlbnRQcm9wcyIsImFkZEFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzZWxlY3RGaXJzdEFnZW50IiwiZGVzY3JpYmUiLCJjbGVhbnVwUG9ydGFsIiwiYmVmb3JlRWFjaCIsIm1vY2tDbGVhciIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJtb2NrUmV0dXJuVmFsdWUiLCJtb2NrUmVzZXQiLCJzcHlPbiIsImFmdGVyRWFjaCIsInJlc3RvcmVBbGxNb2NrcyIsIml0IiwiX3JlbmRlcldpdGhQcm92aWRlcnMiLCJfb2JqZWN0U3ByZWFkIiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUVtcHR5RE9NRWxlbWVudCIsImdldEJ5Um9sZSIsInRvQmVEaXNhYmxlZCIsImNoYW5nZSIsImdldEJ5TGFiZWxUZXh0Iiwibm90IiwidG9IYXZlQmVlbkNhbGxlZCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwicXVlcnlCeVJvbGUiLCJ0b0JlSW5UaGVEb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicXVlcnlCeUxhYmVsVGV4dCIsInF1ZXJ5QnlUZXh0IiwiY29uZmlybSIsInRvSGF2ZVZhbHVlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIm1vY2tSZXNvbHZlZFZhbHVlIiwic2x1ZyIsInJlcXVpcmVzX2F1dGgiLCJlbmFibGVkX2Zvcl9hZ2VudCIsInVzZXJfYXV0aG9yaXplZCIsInN0b3AiLCJhY2Nlc3NpYmlsaXR5Iiwic2VsZWN0QWdlbnQiLCJvblJlZmV0Y2hTZXNzaW9uIiwiYWRkRXZlbnRMaXN0ZW5lciIsInNlbGVjdGVkQWdlbnQiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczIiLCJyZXJlbmRlciIsIm9iamVjdENvbnRhaW5pbmciLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3JlbmRlcldpdGhQcm92aWRlcnMzIiwiX3JlbmRlcldpdGhQcm92aWRlcnM0IiwiX3JlbmRlcldpdGhQcm92aWRlcnM1IiwiX3JlbmRlcldpdGhQcm92aWRlcnM2Iiwib2siLCJfcmVuZGVyV2l0aFByb3ZpZGVyczciLCJfcmVuZGVyV2l0aFByb3ZpZGVyczgiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczkiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9vcmdhbmlzbXMvQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsLnNwZWMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjdCwgZmlyZUV2ZW50LCByZW5kZXJXaXRoUHJvdmlkZXJzLCBzY3JlZW4sIHdhaXRGb3IgfSBmcm9tICcuLi8uLi8uLi90ZXN0L3Rlc3QtdXRpbHMnXG5pbXBvcnQgeyBlbnN1cmVQb3J0YWxSb290IH0gZnJvbSAnLi4vLi4vLi4vdGVzdC9wb3J0YWxSb290J1xuaW1wb3J0IHsgR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Rlc3QvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBYm1BZ2VudE1vZGFsIH0gZnJvbSAnLi9BYm1BZ2VudE1vZGFsJ1xuXG5jb25zdCBoYW5kbGVDcmVhdGVBZ2VudCA9IGplc3QuZm4oKVxuY29uc3QgaGFuZGxlVXBkYXRlQWdlbnQgPSBqZXN0LmZuKClcbmNvbnN0IGhhbmRsZVNuYWNrYmFyRXJyb3IgPSBqZXN0LmZuKClcbmNvbnN0IGhhbmRsZVNuYWNrYmFyU3VjY2VzcyA9IGplc3QuZm4oKVxuY29uc3QgaGFuZGxlQWNjZXNzQ2xpZW50ID0gamVzdC5mbigpXG5cbmNvbnN0IGFjY2Vzc0NsaWVudEhvb2sgPSB7XG4gIHN1Y2Nlc3M6IGZhbHNlIGFzIGZhbHNlIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzczogamVzdC5mbigoKSA9PiB7XG4gICAgYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgfSksXG59XG5cbmNvbnN0IGNyZWF0ZUFnZW50SG9vayA9IHtcbiAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgc3VjY2VzczogZmFsc2UgYXMgZmFsc2UgfCB7IGlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9LFxuICByZXNldFN1Y2Nlc3M6IGplc3QuZm4oKCkgPT4ge1xuICAgIGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgfSksXG59XG5cbmNvbnN0IGRlbGV0ZUFnZW50SG9vayA9IHtcbiAgc3VjY2VzczogZmFsc2UsXG4gIHJlc2V0U3VjY2VzczogamVzdC5mbigoKSA9PiB7XG4gICAgZGVsZXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICB9KSxcbn1cblxuY29uc3QgdXBkYXRlQWdlbnRIb29rID0ge1xuICBzdWNjZXNzOiBmYWxzZSBhcyBmYWxzZSB8IHsgaWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfSxcbiAgcmVzZXRTdWNjZXNzOiBqZXN0LmZuKCgpID0+IHtcbiAgICB1cGRhdGVBZ2VudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gIH0pLFxufVxuXG5qZXN0Lm1vY2soJ0Bwcm9qZWN0Y29yL2Nvci1jb21tb25zL2xpYi9jb21wb25lbnRzL3NwaW5uZXItbG90dGllJywgKCkgPT4gKHtcbiAgU3Bpbm5lckxvdHRpZTogKCkgPT4gPGRpdj5zcGlubmVyPC9kaXY+LFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnLCAoKSA9PiAoe1xuICBFVkVOVFM6IHsgY29uZmlybUFjdGlvbjogJ0FJX0NIQVRfQUJNX0NPTkZJUk0nLCBkZWxldGU6ICdBSV9DSEFUX0FCTV9ERUxFVEVfQUdFTlQnIH0sXG4gIHVzZUV2ZW50OiAoKSA9PiBqZXN0LmZuKCksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VTbmFja0Jhck1hbmFnZXIvdXNlU25hY2tCYXJNYW5hZ2VyJywgKCkgPT4gKHtcbiAgdXNlU25hY2tCYXJNYW5hZ2VyOiAoKSA9PiAoe1xuICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInLCAoKSA9PiAoe1xuICB1c2VVc2VyOiAoKSA9PiAoe1xuICAgIGlkOiA5OSxcbiAgICBwZXJtaXNzaW9uczogeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlLCBlZGl0OiB0cnVlLCBkZWxldGU6IHRydWUgfSB9LFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnLCAoKSA9PiAoe1xuICB1c2VNYWlhVGFza1BhbmVsWkluZGV4OiAoKSA9PiAxMjAwLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRCeUlkJywgKCkgPT4gKHtcbiAgdXNlR2V0QWdlbnRCeUlkOiAoKSA9PiAoe1xuICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgIGhhbmRsZUdldEFnZW50QnlJZDogamVzdC5mbigpLFxuICAgIGFnZW50OiBudWxsLFxuICAgIGhhbmRsZUNsZWFuQWdlbnQ6IGplc3QuZm4oKSxcbiAgICBlcnJvcjogbnVsbCxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUFnZW50TW9kZWwnLCAoKSA9PiB7XG4gIGNvbnN0IGFnZW50TW9kZWxzID0gW3sgaWQ6IDEsIGRpc3BsYXlfbmFtZTogJ0dQVCcsIG1vZGVsX25hbWU6ICdncHQnIH1dXG4gIHJldHVybiB7XG4gICAgdXNlQWdlbnRNb2RlbDogKCkgPT4gKHtcbiAgICAgIGFnZW50TW9kZWxzLFxuICAgICAgZ2V0QWxsQWdlbnRNb2RlbHM6IGplc3QuZm4oKSxcbiAgICB9KSxcbiAgfVxufSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUNyZWF0ZUFnZW50JywgKCkgPT4gKHtcbiAgdXNlQ3JlYXRlQWdlbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlQ3JlYXRlQWdlbnQsXG4gICAgaXNMb2FkaW5nOiBjcmVhdGVBZ2VudEhvb2suaXNMb2FkaW5nLFxuICAgIHN1Y2Nlc3M6IGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzLFxuICAgIHJlc2V0U3VjY2VzczogY3JlYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcyxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZVVwZGF0ZUFnZW50JywgKCkgPT4gKHtcbiAgdXNlVXBkYXRlQWdlbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlVXBkYXRlQWdlbnQsXG4gICAgc3VjY2VzczogdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MsXG4gICAgcmVzZXRTdWNjZXNzOiB1cGRhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlRGVsZXRlQWdlbnQnLCAoKSA9PiAoe1xuICB1c2VEZWxldGVBZ2VudDogKCkgPT4gKHtcbiAgICBoYW5kbGVEZWxldGVBZ2VudDogamVzdC5mbigpLFxuICAgIHN1Y2Nlc3M6IGRlbGV0ZUFnZW50SG9vay5zdWNjZXNzLFxuICAgIHJlc2V0U3VjY2VzczogZGVsZXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcyxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VLbm93bGVkZ2UnLCAoKSA9PiAoe1xuICB1c2VLbm93bGVkZ2VPcGVyYXRpb25zOiAoKSA9PiAoe1xuICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXM6IGplc3QuZm4oKSxcbiAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzOiBqZXN0LmZuKCksXG4gICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlczogamVzdC5mbigpLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgZXJyb3I6IG51bGwsXG4gICAgc3VjY2Vzc0RlbGV0ZTogZmFsc2UsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZTogamVzdC5mbigpLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZTogamVzdC5mbigpLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUFjY2Vzc0NsaWVudC91c2VBY2Nlc3NDbGllbnQnLCAoKSA9PiAoe1xuICB1c2VBY2Nlc3NDbGllbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlQWNjZXNzQ2xpZW50LFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgc3VjY2VzczogYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzLFxuICAgIGhhbmRsZVJlc2V0U3VjY2VzczogYWNjZXNzQ2xpZW50SG9vay5yZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gIH0pLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vaG9va3MnLCAoKSA9PiAoe1xuICB1c2VUb2dnbGVGYXZvcml0ZTogKCkgPT4gKHsgdG9nZ2xlRmF2b3JpdGU6IGplc3QuZm4oKSB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uJywgKCkgPT4gKHtcbiAgQWJtR2VuZXJhbFNlY3Rpb246ICh7XG4gICAgdmFsdWVzLFxuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzLFxuICB9OiB7XG4gICAgdmFsdWVzOiB7IGdlbmVyYWw6IHsgbmFtZT86IHN0cmluZzsgdXNlclByb21wdD86IHN0cmluZyB8IG51bGwgfSB9XG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6IChwYXlsb2FkOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAgPGlucHV0XG4gICAgICAgIGFyaWEtbGFiZWw9XCJhZ2VudC1uYW1lXCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlcy5nZW5lcmFsLm5hbWUgfHwgJyd9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7IGtleTogJ25hbWUnLCB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pfVxuICAgICAgLz5cbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICBhcmlhLWxhYmVsPVwiYWdlbnQtcHJvbXB0XCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgfHwgJyd9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7IGtleTogJ3VzZXJQcm9tcHQnLCB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKSxcbiAgQWJtS25vd2xlZGdlU2VjdGlvbjogKHtcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlcyxcbiAgfToge1xuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiAocGF5bG9hZDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd25bXTsgZGVsZXRlS25vd2xlZGdlPzogYm9vbGVhbiB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAga25vd2xlZGdlXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzKHtcbiAgICAgICAgICAgIGtleTogJ2tub3dsZWRnZScsXG4gICAgICAgICAgICB2YWx1ZTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdmaWxlLTEnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdndWlkZS5wZGYnLFxuICAgICAgICAgICAgICAgIHNpemU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCAnZ3VpZGUucGRmJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgYWRkLWtub3dsZWRnZS1maWxlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uJywgKCkgPT4gKHtcbiAgQWJtQWNjZXNzaWJpbGl0eVNlY3Rpb246ICh7XG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXMsXG4gIH06IHtcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlczogKHBheWxvYWQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pID0+IHZvaWRcbiAgfSkgPT4gKFxuICAgIDxkaXY+XG4gICAgICBhY2Nlc3NpYmlsaXR5XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzKHtcbiAgICAgICAgICAgIGtleTogJ2FjY2Vzc2liaWxpdHknLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVHlwZTogJ2NsaWVudHMnLFxuICAgICAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnQWN0aXZlIENvJywgaXNfYWN0aXZlOiB0cnVlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgICAgICAgY29yQWNjZXNzOiB7IGNsaWVudGVzOiB0cnVlLCBwcm95ZWN0b3M6IGZhbHNlLCB0YXJlYXM6IGZhbHNlIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgc2V0LWNsaWVudC1hY2Nlc3NcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vbW9sZWN1bGVzL0FibVNlY3Rpb24vQWJtTG9hZGVyRmlsZXMnLCAoKSA9PiAoe1xuICBBYm1Mb2FkZXJGaWxlczogKHsgb25UaW1lb3V0IH06IHsgb25UaW1lb3V0PzogKCkgPT4gdm9pZCB9KSA9PiAoXG4gICAgPGRpdj5cbiAgICAgIGxvYWRlci1maWxlc1xuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17b25UaW1lb3V0fT5cbiAgICAgICAgZmlsZXMtdGltZW91dFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICksXG59KSlcblxuamVzdC5tb2NrKCcuLi9EZWxldGVRdWVzdGlvbk1vZGFsL0RlbGV0ZVF1ZXN0aW9uTW9kYWwnLCAoKSA9PiAoe1xuICBEZWxldGVRdWVzdGlvbk1vZGFsOiAoKSA9PiA8ZGl2PmRlbGV0ZS1tb2RhbDwvZGl2Pixcbn0pKVxuXG5jb25zdCBoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzTW9jayA9IGplc3QuZm4oKCkgPT4gZmFsc2UpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vY29uc3RhbnRzL21haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3MnLCAoKSA9PiAoe1xuICBoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzOiAoKSA9PiBoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzTW9jaygpLFxufSkpXG5cbmNvbnN0IGdldEFnZW50Q29ubmVjdG9yc01vY2sgPSBqZXN0LmZuKClcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9jb25uZWN0b3JzJywgKCkgPT4gKHtcbiAgZ2V0QWdlbnRDb25uZWN0b3JzOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBnZXRBZ2VudENvbm5lY3RvcnNNb2NrKC4uLmFyZ3MpLFxufSkpXG5cbnR5cGUgTXVsdGlBZ2VudFdpbmRvdyA9IFdpbmRvdyAmIHsgTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUz86IGJvb2xlYW4gfVxuY29uc3QgZmxhZ3MgPSB3aW5kb3cgYXMgTXVsdGlBZ2VudFdpbmRvd1xuXG50eXBlIE9wZW5BZ2VudE9wdGlvbnMgPSB7XG4gIHZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGluaXRpYWxTZWN0aW9uPzogJ2dlbmVyYWwnIHwgJ2tub3dsZWRnZScgfCAnYWNjZXNzaWJpbGl0eSdcbiAgcHJlZmV0Y2hlZEFnZW50QnlJZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbmNvbnN0IG9wZW5BZ2VudCA9ICh7IHZhbHVlcywgaW5pdGlhbFNlY3Rpb24sIHByZWZldGNoZWRBZ2VudEJ5SWQgfTogT3BlbkFnZW50T3B0aW9ucyA9IHt9KSA9PiB7XG4gIGFjdCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnYWJtLWFnZW50LW1vZGFsLXNldC12YWx1ZXMnLCB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGFnZW50VmFsdWVzOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyA/PyB7IGlzRWRpdGluZzogZmFsc2UsIGdlbmVyYWw6IHsgbmFtZTogJycsIHVzZXJQcm9tcHQ6ICcnIH0gfSxcbiAgICAgICAgICAgIGluaXRpYWxTZWN0aW9uLFxuICAgICAgICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApXG4gIH0pXG59XG5cbmNvbnN0IHByZWZldGNoZWRDdXN0b21BZ2VudCA9IHtcbiAgdHlwZTogJ2N1c3RvbScsXG4gIGVtb2ppOiAn8J+klicsXG4gIG5hbWU6ICdTdXBwb3J0JyxcbiAgaW50cm9kdWN0aW9uOiAnSGknLFxuICBpbnB1dFBsYWNlaG9sZGVyOiAnQXNrJyxcbiAgaXNBY3RpdmU6IHRydWUsXG4gIG1vZGVsQWlJZDogMSxcbiAgaWQ6ICdhZ2VudC0xJyxcbiAgdXNlclByb21wdDogJ1lvdSBoZWxwIHVzZXJzJyxcbiAgaXNfZmF2b3JpdGU6IGZhbHNlLFxuICBjcmVhdGVkQnk6IDk5LFxuICBrbm93bGVkZ2VCYXNlczogW10sXG4gIGFjY2VzczogJ2NvbXBhbnknLFxuICBjbGllbnRzOiBbXSxcbiAgdG9vbEdyb3VwU2x1Z3M6IFtdLFxufVxuXG5jb25zdCBjbGlja01vZGFsQ2xvc2UgPSAoKSA9PiB7XG4gIGNvbnN0IHRpdGxlID0gc2NyZWVuLmdldEJ5VGV4dCgvbmV3QWdlbnR8ZWRpdEFnZW50LylcbiAgY29uc3QgaGVhZGVyID0gdGl0bGUucGFyZW50RWxlbWVudD8ucGFyZW50RWxlbWVudFxuICBjb25zdCBjbG9zZUJ1dHRvbiA9IGhlYWRlcj8ubGFzdEVsZW1lbnRDaGlsZFxuICBpZiAoIWNsb3NlQnV0dG9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDbG9zZSBidXR0b24gbm90IGZvdW5kJylcbiAgfVxuICBmaXJlRXZlbnQuY2xpY2soY2xvc2VCdXR0b24pXG59XG5cbmNvbnN0IGFnZW50UHJvcHMgPSB7XG4gIGFkZEFnZW50OiBqZXN0LmZuKCksXG4gIHJlbW92ZUFnZW50OiBqZXN0LmZuKCksXG4gIHVwZGF0ZUFnZW50OiBqZXN0LmZuKCksXG4gIHVwZGF0ZUFnZW50RmF2b3JpdGU6IGplc3QuZm4oKSxcbiAgc2VsZWN0Rmlyc3RBZ2VudDogamVzdC5mbigpLFxufVxuXG5kZXNjcmliZSgnQWJtQWdlbnRNb2RhbCcsICgpID0+IHtcbiAgbGV0IGNsZWFudXBQb3J0YWw6ICgpID0+IHZvaWRcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjbGVhbnVwUG9ydGFsID0gZW5zdXJlUG9ydGFsUm9vdCgnYWJtLWFnZW50LW1vZGFsJylcbiAgICBoYW5kbGVDcmVhdGVBZ2VudC5tb2NrQ2xlYXIoKVxuICAgIGhhbmRsZVVwZGF0ZUFnZW50Lm1vY2tDbGVhcigpXG4gICAgaGFuZGxlU25hY2tiYXJFcnJvci5tb2NrQ2xlYXIoKVxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcy5tb2NrQ2xlYXIoKVxuICAgIGhhbmRsZUFjY2Vzc0NsaWVudC5tb2NrQ2xlYXIoKVxuICAgIGFjY2Vzc0NsaWVudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gICAgYWNjZXNzQ2xpZW50SG9vay5yZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MubW9ja0NsZWFyKClcbiAgICBjcmVhdGVBZ2VudEhvb2suaXNMb2FkaW5nID0gZmFsc2VcbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gICAgZGVsZXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICAgIHVwZGF0ZUFnZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgICBkZWxldGUgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuICAgIGhhc01haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3NNb2NrLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSlcbiAgICBnZXRBZ2VudENvbm5lY3RvcnNNb2NrLm1vY2tSZXNldCgpXG4gICAgamVzdC5zcHlPbih3aW5kb3csICdjb25maXJtJykubW9ja1JldHVyblZhbHVlKHRydWUpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpXG4gICAgY2xlYW51cFBvcnRhbCgpXG4gIH0pXG5cbiAgaXQoJ3N0YXlzIGNsb3NlZCB1bnRpbCB0aGUgb3BlbiBldmVudCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoY29udGFpbmVyKS50b0JlRW1wdHlET01FbGVtZW50KClcbiAgfSlcblxuICBpdCgna2VlcHMgc2F2ZSBkaXNhYmxlZCB3aXRob3V0IG5hbWUgb3IgcHJvbXB0JywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpLnRvQmVEaXNhYmxlZCgpXG4gIH0pXG5cbiAgaXQoJ2RvZXMgbm90IGNyZWF0ZSB3aXRob3V0IHRoZSBtdWx0aS1hZ2VudHMgZmxhZycsICgpID0+IHtcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcbiAgICBvcGVuQWdlbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVDcmVhdGVBZ2VudCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdjcmVhdGVzIHRoZSBhZ2VudCB3aGVuIHRoZSBmbGFnIGlzIG9uIGFuZCB0aGUgZm9ybSBpcyB2YWxpZCcsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0N1c3RvbScgfSB9KVxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1wcm9tcHQnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTb3MgdW4gYWdlbnRlJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2NyZWF0ZUFnZW50TGFiZWxCdXR0b24nIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZUNyZWF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgfSlcblxuICBpdCgnYmxvY2tzIGVkaXQgd2hlbiB0aGUgbXVsdGktYWdlbnRzIGZsYWcgaXMgb2ZmJywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHsgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2ExJywgbmFtZTogJ1gnLCB1c2VyUHJvbXB0OiAnWScgfSB9IH0pXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJFcnJvcikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yQWNjZXNzRGVuaWVkJylcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ3N3aXRjaGVzIHNpZGViYXIgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlJykhKVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdrbm93bGVkZ2UnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwtYWNjZXNzaWJpbGl0eScpISlcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnYWNjZXNzaWJpbGl0eScpKS50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ29wZW5zIG9uIHRoZSByZXF1ZXN0ZWQgaW5pdGlhbCBzZWN0aW9uJywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHsgaW5pdGlhbFNlY3Rpb246ICdrbm93bGVkZ2UnIH0pXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgna25vd2xlZGdlJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIHRoZSBtb2RhbCB3aGVuIHRoZXJlIGFyZSBubyBwZW5kaW5nIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGNsaWNrTW9kYWxDbG9zZSgpXG5cbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdCh3aW5kb3cuY29uZmlybSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgdGhlIG1vZGFsIHdoZW4gcGVuZGluZyBjaGFuZ2VzIGFyZSBjb25maXJtZWQgb24gY2xvc2UnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnRHJhZnQnIH0gfSlcbiAgICBjbGlja01vZGFsQ2xvc2UoKVxuXG4gICAgZXhwZWN0KHdpbmRvdy5jb25maXJtKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdrZWVwcyB0aGUgbW9kYWwgb3BlbiB3aGVuIGNsb3Npbmcgd2l0aCBwZW5kaW5nIGNoYW5nZXMgaXMgY2FuY2VsbGVkJywgKCkgPT4ge1xuICAgIGplc3Quc3B5T24od2luZG93LCAnY29uZmlybScpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSlcblxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0RyYWZ0JyB9IH0pXG4gICAgY2xpY2tNb2RhbENsb3NlKClcblxuICAgIGV4cGVjdCh3aW5kb3cuY29uZmlybSkudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ25ld0FnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnbG9hZHMgZWRpdCBtb2RlIGZyb20gcHJlZmV0Y2hlZCBhZ2VudCBkYXRhIHdoZW4gdGhlIGZsYWcgaXMgb24nLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnZWRpdEFnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJykpLnRvSGF2ZVZhbHVlKCdTdXBwb3J0JylcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKS50b0JlRGlzYWJsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdkZWxldGVBZ2VudCcgfSkpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnZmV0Y2hlcyBleHRlcm5hbCBjb25uZWN0b3JzIHdoZW4gb3BlbmluZyBlZGl0IG1vZGUgd2l0aCB0aGUgY29ubmVjdG9ycyBmZWF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgaGFzTWFpYUV4dGVybmFsQ29ubmVjdG9yc0FjY2Vzc01vY2subW9ja1JldHVyblZhbHVlKHRydWUpXG4gICAgZ2V0QWdlbnRDb25uZWN0b3JzTW9jay5tb2NrUmVzb2x2ZWRWYWx1ZShbXG4gICAgICB7IHNsdWc6ICdqaXJhX2Nsb3VkJywgcmVxdWlyZXNfYXV0aDogZmFsc2UsIGVuYWJsZWRfZm9yX2FnZW50OiB0cnVlLCB1c2VyX2F1dGhvcml6ZWQ6IGZhbHNlIH0sXG4gICAgXSlcblxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEFnZW50Q29ubmVjdG9yc01vY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdhZ2VudC0xJylcbiAgICB9KVxuICB9KVxuXG4gIGl0KCd1cGRhdGVzIHRoZSBhZ2VudCBhZnRlciBlZGl0aW5nIHByZWZldGNoZWQgZGF0YScsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU3VwcG9ydCB2MicgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlVXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdrZWVwcyBzYXZlIGRpc2FibGVkIHdoZW4gc2VsZWN0ZWQgY2xpZW50cyBhcmUgaW5hY3RpdmUnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgaXNFZGl0aW5nOiB0cnVlLFxuICAgICAgICBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScsIG5hbWU6ICdTdXBwb3J0JywgdXNlclByb21wdDogJ0hlbHAnIH0sXG4gICAgICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgICAgICBhY2Nlc3NUeXBlOiAnY2xpZW50cycsXG4gICAgICAgICAgY2xpZW50czogW3sgaWQ6ICcxJywgbmFtZTogJ0luYWN0aXZlIENvJywgaXNfYWN0aXZlOiBmYWxzZSwgaXNfZGVsZXRlZDogZmFsc2UgfV0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDoge1xuICAgICAgICAuLi5wcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgICAgIGFjY2VzczogJ2NsaWVudHMnLFxuICAgICAgICBjbGllbnRzOiBbeyBpZDogMSwgbmFtZTogJ0luYWN0aXZlIENvJywgaXNfYWN0aXZlOiBmYWxzZSwgaXNfZGVsZXRlZDogZmFsc2UgfV0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1N1cHBvcnQgdjInIH0gfSlcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKS50b0JlRGlzYWJsZWQoKVxuICB9KVxuXG4gIGl0KCdvcGVucyB0aGUgZGVsZXRlIGNvbmZpcm1hdGlvbiBtb2RhbCBmcm9tIGVkaXQgbW9kZScsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdkZWxldGVBZ2VudCcgfSkpXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnZGVsZXRlLW1vZGFsJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnZmluaXNoZXMgdGhlIGhhcHB5IHBhdGggYWZ0ZXIgdXBkYXRlIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgdXBkYXRlQWdlbnQgPSBqZXN0LmZuKClcbiAgICBjb25zdCBzZWxlY3RBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uUmVmZXRjaFNlc3Npb24gPSBqZXN0LmZuKClcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWZldGNoLXNlc3Npb24nLCBvblJlZmV0Y2hTZXNzaW9uKVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB0eXBlOiAnY3VzdG9tJyBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHNlbGVjdGVkQWdlbnQsIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1N1cHBvcnQgdjInIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZVVwZGF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkKClcblxuICAgIHVwZGF0ZUFnZW50SG9vay5zdWNjZXNzID0geyBpZDogJ2FnZW50LTEnLCB0eXBlOiAnY3VzdG9tJywgbmFtZTogJ1N1cHBvcnQgdjInIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IGFnZW50OiBzZWxlY3RlZEFnZW50LCBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50VXBkYXRlZCcpXG4gICAgZXhwZWN0KHVwZGF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnYWdlbnQtMScsIG5hbWU6ICdTdXBwb3J0IHYyJyB9KSlcbiAgICBleHBlY3Qoc2VsZWN0QWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3QodXBkYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KG9uUmVmZXRjaFNlc3Npb24pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVmZXRjaC1zZXNzaW9uJywgb25SZWZldGNoU2Vzc2lvbilcbiAgfSlcblxuICBpdCgnZmluaXNoZXMgdGhlIGhhcHB5IHBhdGggYWZ0ZXIgY3JlYXRlIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgYWRkQWdlbnQgPSBqZXN0LmZuKClcbiAgICBjb25zdCBzZWxlY3RBZ2VudCA9IGplc3QuZm4oKVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCgpXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVDcmVhdGVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZCgpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IGFkZEFnZW50PXthZGRBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50Q3JlYXRlZCcpXG4gICAgZXhwZWN0KGFkZEFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnY3JlYXRlZC0xJyB9KSlcbiAgICBleHBlY3Qoc2VsZWN0QWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdjcmVhdGVkLTEnIH0pKVxuICAgIGV4cGVjdChjcmVhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgYW5kIHJlbW92ZXMgdGhlIGFnZW50IGFmdGVyIGRlbGV0ZSBzdWNjZWVkcycsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIGNvbnN0IHJlbW92ZUFnZW50ID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSByZW1vdmVBZ2VudD17cmVtb3ZlQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGRlbGV0ZUFnZW50SG9vay5zdWNjZXNzID0gdHJ1ZVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSByZW1vdmVBZ2VudD17cmVtb3ZlQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NvbmZpcm1BZ2VudERlbGV0ZWQnKVxuICAgIGV4cGVjdChyZW1vdmVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2FnZW50LTEnKVxuICAgIGV4cGVjdChkZWxldGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCdlZGl0QWdlbnQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgncmVxdWVzdHMgY2xpZW50IGFjY2VzcyBhZnRlciBjcmVhdGUgd2hlbiB2aXNpYmlsaXR5IGlzIG5vdCBjb21wYW55JywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgZ2VuZXJhbDogeyBuYW1lOiAnJywgdXNlclByb21wdDogJycgfSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgIGFjY2Vzc1R5cGU6ICdjbGllbnRzJyxcbiAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnQWN0aXZlIENvJywgaXNfYWN0aXZlOiB0cnVlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQ3VzdG9tJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LXByb21wdCcpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1NvcyB1biBhZ2VudGUnIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZUFjY2Vzc0NsaWVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NyZWF0ZWQtMScsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgYWNjZXNzVHlwZTogJ2NsaWVudHMnIH0pKVxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLm5vdC50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50Q3JlYXRlZCcpXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ25ld0FnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIGVkaXQgYWZ0ZXIgY2xpZW50IGFjY2VzcyBzdWNjZWVkcyBvbiB1cGRhdGUnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICBjb25zdCB1cGRhdGVBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IHNlbGVjdEFnZW50ID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB0eXBlOiAnY3VzdG9tJyB9LCBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTdXBwb3J0IHYyJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwtYWNjZXNzaWJpbGl0eScpISlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2V0LWNsaWVudC1hY2Nlc3MnIH0pKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlVXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuXG4gICAgdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSB7IGlkOiAnYWdlbnQtMScsIHR5cGU6ICdjdXN0b20nLCBuYW1lOiAnU3VwcG9ydCB2MicgfVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB0eXBlOiAnY3VzdG9tJyB9LCBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlQWNjZXNzQ2xpZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnYWdlbnQtMScsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgYWNjZXNzVHlwZTogJ2NsaWVudHMnIH0pKVxuXG4gICAgYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzID0geyBvazogdHJ1ZSB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBhZ2VudDogeyBpZDogJ2FnZW50LTEnLCBuYW1lOiAnU3VwcG9ydCcsIHR5cGU6ICdjdXN0b20nIH0sIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRVcGRhdGVkJylcbiAgICBleHBlY3QodXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3Qoc2VsZWN0QWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCdlZGl0QWdlbnQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIGNyZWF0ZSBhZnRlciBjbGllbnQgYWNjZXNzIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgYWRkQWdlbnQgPSBqZXN0LmZuKClcbiAgICBjb25zdCBzZWxlY3RBZ2VudCA9IGplc3QuZm4oKVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgZ2VuZXJhbDogeyBuYW1lOiAnJywgdXNlclByb21wdDogJycgfSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgIGFjY2Vzc1R5cGU6ICdjbGllbnRzJyxcbiAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnQWN0aXZlIENvJywgaXNfYWN0aXZlOiB0cnVlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQ3VzdG9tJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LXByb21wdCcpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1NvcyB1biBhZ2VudGUnIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IGFkZEFnZW50PXthZGRBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBhY2Nlc3NDbGllbnRIb29rLnN1Y2Nlc3MgPSB7IG9rOiB0cnVlIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRDcmVhdGVkJylcbiAgICBleHBlY3QoYWRkQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdjcmVhdGVkLTEnIH0pKVxuICAgIGV4cGVjdChzZWxlY3RBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2NyZWF0ZWQtMScgfSkpXG4gICAgZXhwZWN0KGFjY2Vzc0NsaWVudEhvb2sucmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgY3JlYXRlIGFmdGVyIGtub3dsZWRnZSBwcm9jZXNzaW5nIHRpbWVzIG91dCcsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoKVxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQ3VzdG9tJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LXByb21wdCcpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1NvcyB1biBhZ2VudGUnIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FibS1hZ2VudC1tb2RhbC1rbm93bGVkZ2UnKSEpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2FkZC1rbm93bGVkZ2UtZmlsZScgfSkpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2NyZWF0ZUFnZW50TGFiZWxCdXR0b24nIH0pKVxuXG4gICAgY3JlYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSB7IGlkOiAnY3JlYXRlZC0xJywgdHlwZTogJ2N1c3RvbScgfVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdsb2FkZXItZmlsZXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdmaWxlcy10aW1lb3V0JyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRDcmVhdGVkJylcbiAgICBleHBlY3QoY3JlYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KHNjcmVlbi5xdWVyeUJ5VGV4dCgnbmV3QWdlbnQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIGVkaXQgYWZ0ZXIga25vd2xlZGdlIHByb2Nlc3NpbmcgdGltZXMgb3V0JywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgdXBkYXRlQWdlbnQgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTdXBwb3J0IHYyJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlJykhKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdhZGQta25vd2xlZGdlLWZpbGUnIH0pKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICB1cGRhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdhZ2VudC0xJywgdHlwZTogJ2N1c3RvbScsIG5hbWU6ICdTdXBwb3J0IHYyJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnbG9hZGVyLWZpbGVzJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnZmlsZXMtdGltZW91dCcgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50VXBkYXRlZCcpXG4gICAgZXhwZWN0KHVwZGF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnYWdlbnQtMScgfSkpXG4gICAgZXhwZWN0KHVwZGF0ZUFnZW50SG9vay5yZXNldFN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxTQUFTQSxHQUFHLEVBQUVDLFNBQVMsRUFBRUMsbUJBQW1CLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxRQUFRLDBCQUEwQjtBQUMvRixTQUFTQyxnQkFBZ0IsUUFBUSwwQkFBMEI7QUFDM0QsU0FBU0MseUJBQXlCLFFBQVEsOEJBQThCO0FBQ3hFLFNBQVNDLGFBQWEsUUFBUSxpQkFBaUI7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUEsRUFBQUMsSUFBQSxJQUFBQyxLQUFBO0FBRS9DLElBQU1DLGlCQUFpQixHQUFHQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLElBQU1DLGlCQUFpQixHQUFHRixJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLElBQU1FLG1CQUFtQixHQUFHSCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLElBQU1HLHFCQUFxQixHQUFHSixJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLElBQU1JLGtCQUFrQixHQUFHTCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBRXBDLElBQU1LLGdCQUFnQixHQUFHO0VBQ3ZCQyxPQUFPLEVBQUUsS0FBd0M7RUFDakRDLHdCQUF3QixFQUFFUixJQUFJLENBQUNDLEVBQUUsQ0FBQyxZQUFNO0lBQ3RDSyxnQkFBZ0IsQ0FBQ0MsT0FBTyxHQUFHLEtBQUs7RUFDbEMsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFNRSxlQUFlLEdBQUc7RUFDdEJDLFNBQVMsRUFBRSxLQUFLO0VBQ2hCSCxPQUFPLEVBQUUsS0FBNkM7RUFDdERJLFlBQVksRUFBRVgsSUFBSSxDQUFDQyxFQUFF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