@projectcor/maia-components 2.49.0-beta.1 → 2.49.1-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 (493) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  25. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  26. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  27. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  28. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  29. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  31. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  32. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  33. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  34. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  35. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  36. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  37. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  38. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  39. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  40. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  41. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  42. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  43. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  44. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  45. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  46. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  47. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  48. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  49. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  50. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  51. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  52. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  53. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  54. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  55. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  56. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  57. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  58. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  59. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  60. package/lib/components/atoms/HelpButton.spec.js +87 -0
  61. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  62. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  63. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  64. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  65. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  66. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  67. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  68. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  70. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  71. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  72. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  73. package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
  74. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
  75. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  76. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  77. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  78. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  79. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  80. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  81. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  82. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  83. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  84. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  85. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  86. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  87. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  88. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  89. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  90. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  91. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  92. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  93. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  94. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  95. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  96. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  97. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  98. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
  99. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  100. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
  101. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  102. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  103. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  104. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  105. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  106. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  107. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  108. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  109. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  110. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  111. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  112. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  113. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  114. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  115. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  116. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  117. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  118. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  119. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  120. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  121. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  122. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  123. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  124. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  125. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  126. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  127. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  128. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  129. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  130. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  131. package/lib/components/index.js +2 -1
  132. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  133. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  134. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  135. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
  136. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  137. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  138. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  139. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  140. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  141. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  142. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  143. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  144. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  145. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  146. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  147. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  148. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  149. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  150. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  151. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  152. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  153. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  154. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  155. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  156. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  157. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  158. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  159. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  160. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  161. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  162. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
  163. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  164. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  165. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  166. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  167. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  168. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
  169. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
  170. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
  171. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  172. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  173. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
  174. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
  175. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
  176. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
  177. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  178. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  179. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  180. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  181. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  182. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  183. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  184. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  185. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  186. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  187. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
  188. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  189. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  190. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  191. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  192. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  193. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  194. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  195. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  196. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  197. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  198. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  199. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  200. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  201. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  202. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  203. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  204. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  205. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  206. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  207. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  208. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  209. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  210. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  211. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  212. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  213. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  214. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  215. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  216. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  217. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  218. package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
  219. package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
  220. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  221. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  222. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
  223. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  224. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  225. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  226. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  227. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  228. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  229. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  230. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  231. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  232. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  233. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  234. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  235. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  236. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  237. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  238. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  239. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  240. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  241. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  242. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  243. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  244. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  245. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  246. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  247. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  248. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  249. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  250. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  251. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  252. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  253. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  254. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  255. package/lib/constants/formatExtensions.js +7 -8
  256. package/lib/constants/formatExtensions.spec.js +14 -0
  257. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  258. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  259. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  260. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  261. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  262. package/lib/constants/permissions/index.js +2 -2
  263. package/lib/constants/permissions/utils.js +4 -1
  264. package/lib/constants/permissions/utils.spec.js +128 -0
  265. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  266. package/lib/constants/taskUrls.spec.js +9 -0
  267. package/lib/dev/DevMaiaPage.js +30 -0
  268. package/lib/dev/DevReasoningTimeline.js +75 -86
  269. package/lib/dev/Providers.js +5 -3
  270. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  271. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  272. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  273. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  274. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  275. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  276. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  277. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  278. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  279. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  280. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  281. package/lib/hooks/useCaretPosition.spec.js +58 -0
  282. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  283. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  284. package/lib/hooks/useChatManager/useChatManager.js +272 -745
  285. package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
  286. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  287. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  288. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  289. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  290. package/lib/hooks/useChats/useChats.spec.js +208 -0
  291. package/lib/hooks/useClientSearch.helpers.js +36 -0
  292. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  293. package/lib/hooks/useClientSearch.js +4 -32
  294. package/lib/hooks/useClientSearch.spec.js +86 -0
  295. package/lib/hooks/useContextMentions.helpers.js +212 -0
  296. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  297. package/lib/hooks/useContextMentions.js +5 -223
  298. package/lib/hooks/useContextMentions.spec.js +338 -0
  299. package/lib/hooks/useContextMentions.types.js +2 -0
  300. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  301. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  302. package/lib/hooks/useContextPinPopover.js +16 -75
  303. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  304. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  305. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  306. package/lib/hooks/useDebounce.spec.js +42 -0
  307. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  308. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  309. package/lib/hooks/useEntitySearch.js +52 -436
  310. package/lib/hooks/useEntitySearch.spec.js +718 -0
  311. package/lib/hooks/useEvent.spec.js +45 -0
  312. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  313. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  314. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  315. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  316. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  317. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  318. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  319. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  320. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  321. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  322. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  323. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  324. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  325. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  326. package/lib/hooks/useMentionPopover.js +9 -35
  327. package/lib/hooks/useMentionPopover.spec.js +392 -0
  328. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  329. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  330. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  331. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  332. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  333. package/lib/hooks/useModal/useModal.spec.js +73 -0
  334. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  335. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  336. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  337. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
  338. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  339. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  340. package/lib/hooks/useProjectSearch.js +4 -58
  341. package/lib/hooks/useProjectSearch.spec.js +91 -0
  342. package/lib/hooks/useProjectSummary.spec.js +193 -0
  343. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  344. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  345. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  346. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  347. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  348. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  349. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  350. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  351. package/lib/hooks/useRecentClientsSearch.js +4 -32
  352. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  353. package/lib/hooks/useRecentContexts.spec.js +139 -0
  354. package/lib/hooks/useResize.spec.js +37 -0
  355. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  356. package/lib/hooks/useSlashCommands.spec.js +139 -0
  357. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  358. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  359. package/lib/hooks/useStreamResponse.spec.js +199 -0
  360. package/lib/hooks/useT.spec.js +20 -0
  361. package/lib/hooks/useToggle.spec.js +33 -0
  362. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  363. package/lib/index.js +5 -2
  364. package/lib/lang/br/index.js +26 -7
  365. package/lib/lang/en/index.js +26 -7
  366. package/lib/lang/es/index.js +26 -7
  367. package/lib/lang/fr/index.js +26 -7
  368. package/lib/services/appcues.spec.js +37 -0
  369. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  370. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  371. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  372. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  373. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  374. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  375. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  376. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  377. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  378. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  379. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  380. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  381. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  382. package/lib/services/maia/Agents/getAgents.js +90 -282
  383. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  384. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  385. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  386. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  387. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  388. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  389. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  390. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  391. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  392. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  393. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  394. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  395. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  396. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  397. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  398. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
  399. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  400. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  401. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  402. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  403. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  404. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  405. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  406. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  407. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  408. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  409. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  410. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  411. package/lib/services/maia/client.spec.js +56 -0
  412. package/lib/services/utils/fetchCOR.spec.js +211 -0
  413. package/lib/services/utils/getCookie.spec.js +20 -0
  414. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  415. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  416. package/lib/services/utils/mapChatMessages.js +25 -254
  417. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  418. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  419. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  420. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  421. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  422. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  423. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  424. package/lib/store/sessions/sessionNotifications.js +35 -41
  425. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  426. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  427. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  428. package/lib/store/sessions/sessionStreamManager.js +209 -277
  429. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  430. package/lib/store/sessions/sessions.types.spec.js +16 -0
  431. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  432. package/lib/store/useChatsStore.spec.js +619 -0
  433. package/lib/store/useFaqsStore.spec.js +57 -0
  434. package/lib/styles/cascade.js +29 -3
  435. package/lib/styles/transitions.js +3 -1
  436. package/lib/test/mockSseStream.js +121 -0
  437. package/lib/test/streamdownCodeMock.js +6 -0
  438. package/lib/test/streamdownMock.js +12 -0
  439. package/lib/types/Chat.js +1 -1
  440. package/lib/types/agentModal.js +1 -1
  441. package/lib/types/global.d.js +1 -1
  442. package/lib/types/reasoning.js +1 -1
  443. package/lib/utils/actionCategoryMap.spec.js +18 -0
  444. package/lib/utils/agentDisplayName.spec.js +48 -0
  445. package/lib/utils/autoApproveStorage.spec.js +25 -0
  446. package/lib/utils/chatInputFiles.spec.js +39 -0
  447. package/lib/utils/contextMentionIcons.spec.js +41 -0
  448. package/lib/utils/contextMentionLabel.spec.js +13 -0
  449. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  450. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  451. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  452. package/lib/utils/entityLinkRender.spec.js +72 -0
  453. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  454. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  455. package/lib/utils/formatUnreadCount.spec.js +12 -0
  456. package/lib/utils/getUnitFileSize.spec.js +18 -0
  457. package/lib/utils/hitlAnalytics.spec.js +136 -0
  458. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  459. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  460. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  461. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  462. package/lib/utils/imagePreprocessor.js +12 -37
  463. package/lib/utils/imagePreprocessor.spec.js +112 -0
  464. package/lib/utils/maiaPageRoute.js +24 -0
  465. package/lib/utils/maiaPageRoute.spec.js +23 -0
  466. package/lib/utils/mapBackendLang.spec.js +19 -0
  467. package/lib/utils/navigateContextEntity.spec.js +50 -0
  468. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  469. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  470. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  471. package/lib/utils/reasoningMappers.spec.js +103 -0
  472. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  473. package/lib/utils/renderContextMentions.helpers.js +110 -0
  474. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  475. package/lib/utils/renderContextMentions.js +4 -110
  476. package/lib/utils/renderContextMentions.spec.js +268 -0
  477. package/lib/utils/retryCompletion.spec.js +181 -0
  478. package/lib/utils/skillContentSize.spec.js +13 -0
  479. package/lib/utils/slashCommandMarker.spec.js +43 -0
  480. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  481. package/lib/utils/sseStreamContent.spec.js +31 -0
  482. package/lib/utils/streamActivityMessages.helpers.js +223 -0
  483. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  484. package/lib/utils/streamActivityMessages.js +33 -238
  485. package/lib/utils/streamActivityMessages.spec.js +336 -0
  486. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  487. package/package.json +2 -2
  488. package/README.md +0 -2
  489. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  490. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  491. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  492. package/lib/types/contextCompaction.js +0 -48
  493. package/lib/types/jest-dom.d.js +0 -2
@@ -0,0 +1,398 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ 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; }
3
+ 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; }
4
+ import { Feedback } from '../MessageFeedback/MessageFeedback';
5
+ import { ChatHistoryRole } from '../../../types/Chat';
6
+ import { isStreamingPlaceholderMessageId } from '../../../utils/streamActivityMessages';
7
+ export var turnAnchorOffset = function turnAnchorOffset(viewportHeight) {
8
+ return Math.min(viewportHeight * 0.18, 200);
9
+ };
10
+ export var TURN_SCROLL_DURATION_MS = 600;
11
+ export var TURN_SCROLL_MAX_DURATION_MS = 800;
12
+ export var TURN_SCROLL_LONG_DISTANCE_PX = 1200;
13
+ export var computeTurnScrollDurationMs = function computeTurnScrollDurationMs(distance) {
14
+ return TURN_SCROLL_DURATION_MS + (TURN_SCROLL_MAX_DURATION_MS - TURN_SCROLL_DURATION_MS) * Math.min(1, Math.abs(distance) / TURN_SCROLL_LONG_DISTANCE_PX);
15
+ };
16
+ export var computeDistanceFromBottom = function computeDistanceFromBottom(scrollHeight, spacerHeight, scrollTop, clientHeight) {
17
+ return scrollHeight - spacerHeight - scrollTop - clientHeight;
18
+ };
19
+ export var shouldShowScrollToBottom = function shouldShowScrollToBottom(distanceFromBottom) {
20
+ var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 50;
21
+ return distanceFromBottom > threshold;
22
+ };
23
+ export var SCROLL_GRADIENT_THRESHOLD_PX = 1;
24
+ export var SCROLL_NEAR_BOTTOM_DEFAULT_THRESHOLD = 39;
25
+ export var SCROLL_NEAR_BOTTOM_UP_THRESHOLD = 15;
26
+ export var SCROLL_AT_BOTTOM_TOLERANCE_PX = 100;
27
+ export var SPACER_HEIGHT_EPSILON_PX = 1;
28
+ export var shouldShowTopScrollGradient = function shouldShowTopScrollGradient(scrollTop) {
29
+ var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SCROLL_GRADIENT_THRESHOLD_PX;
30
+ return scrollTop > threshold;
31
+ };
32
+ export var shouldShowBottomScrollGradient = function shouldShowBottomScrollGradient(distanceFromBottom) {
33
+ var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SCROLL_GRADIENT_THRESHOLD_PX;
34
+ return distanceFromBottom > threshold;
35
+ };
36
+ export var isScrollingUpward = function isScrollingUpward(scrollTop, lastScrollTop) {
37
+ return scrollTop < lastScrollTop;
38
+ };
39
+ export var isNearScrollBottom = function isNearScrollBottom(scrollHeight, scrollTop, clientHeight, threshold) {
40
+ return scrollHeight - scrollTop - clientHeight < threshold;
41
+ };
42
+ export var resolveScrollNearBottomThreshold = function resolveScrollNearBottomThreshold(currentThreshold, isScrollingUp, isNearBottom) {
43
+ if (isNearBottom) return SCROLL_NEAR_BOTTOM_DEFAULT_THRESHOLD;
44
+ if (isScrollingUp) return SCROLL_NEAR_BOTTOM_UP_THRESHOLD;
45
+ return currentThreshold;
46
+ };
47
+ export var shouldSkipTurnScrollAnimation = function shouldSkipTurnScrollAnimation(distance) {
48
+ return Math.abs(distance) < 1;
49
+ };
50
+ export var easeOutExpoScrollProgress = function easeOutExpoScrollProgress(progress) {
51
+ return progress === 1 ? 1 : 1 - Math.pow(2, -12 * progress);
52
+ };
53
+ export var computeTurnScrollTargetTop = function computeTurnScrollTargetTop(questionTop, viewportHeight) {
54
+ var offset = turnAnchorOffset(viewportHeight);
55
+ return Math.max(0, questionTop - offset);
56
+ };
57
+ export var shouldSkipTurnSpaceReservation = function shouldSkipTurnSpaceReservation(currentScrollTop, targetScrollTop) {
58
+ return targetScrollTop <= currentScrollTop;
59
+ };
60
+ export var shouldUpdateSpacerHeight = function shouldUpdateSpacerHeight(currentHeight, nextHeight) {
61
+ return Math.abs(currentHeight - nextHeight) >= SPACER_HEIGHT_EPSILON_PX;
62
+ };
63
+ export var computeSyncedTurnSpacerHeight = function computeSyncedTurnSpacerHeight(clientHeight, turnHeight, currentSpacerHeight) {
64
+ var offset = turnAnchorOffset(clientHeight);
65
+ var reserved = Math.max(0, clientHeight - turnHeight - offset);
66
+ return Math.min(currentSpacerHeight, reserved);
67
+ };
68
+ export var shouldDrainTurnSpaceOnScroll = function shouldDrainTurnSpaceOnScroll(anchoredTurnId) {
69
+ return !anchoredTurnId;
70
+ };
71
+ export var shouldReleaseTurnSpace = function shouldReleaseTurnSpace(anchoredTurnId, spacerHeight) {
72
+ return Boolean(anchoredTurnId) || spacerHeight > 0;
73
+ };
74
+ export var shouldPersistMaiaPanelScroll = function shouldPersistMaiaPanelScroll(initialChatId, scrollTop) {
75
+ return Boolean(initialChatId) && scrollTop > 0;
76
+ };
77
+ export var isContainerAtScrollBottom = function isContainerAtScrollBottom(scrollHeight, scrollTop, clientHeight) {
78
+ var tolerance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : SCROLL_AT_BOTTOM_TOLERANCE_PX;
79
+ return scrollHeight - scrollTop <= clientHeight + tolerance;
80
+ };
81
+ export var isNewChatMessageEvent = function isNewChatMessageEvent(lastId, prevId, messagesLength, prevLength) {
82
+ return lastId !== prevId || messagesLength !== prevLength;
83
+ };
84
+ export var hasInitialUserMessageInList = function hasInitialUserMessageInList(messages) {
85
+ return messages.some(function (msg) {
86
+ return msg.id === 'user-initial-message';
87
+ });
88
+ };
89
+ export var isApprovalChatMessage = function isApprovalChatMessage(message) {
90
+ var _message$id;
91
+ return Boolean(message && (((_message$id = message.id) === null || _message$id === void 0 ? void 0 : _message$id.startsWith('approval-')) || message.approval));
92
+ };
93
+ export var isAnswerOrQuestionChatMessageId = function isAnswerOrQuestionChatMessageId(messageId) {
94
+ return Boolean((messageId === null || messageId === void 0 ? void 0 : messageId.startsWith('answer-')) || (messageId === null || messageId === void 0 ? void 0 : messageId.startsWith('question-')));
95
+ };
96
+ export var shouldAutoScrollOnMessagesChange = function shouldAutoScrollOnMessagesChange(params) {
97
+ if (!params.isNewMessage) return 'affordances-only';
98
+ if (params.anchoredTurnId) return 'sync-turn';
99
+ if (params.waitingResponse || params.isWriting) return 'affordances-only';
100
+ if (params.isAnswerOrQuestion && params.isAtBottom) return 'scroll';
101
+ if (!params.isAnswerOrQuestion && !params.isApproval && !params.hasInitialMessage && params.messagesLength > params.prevMessagesLength) {
102
+ return 'scroll';
103
+ }
104
+ return 'affordances-only';
105
+ };
106
+ export var shouldRunStreamTurnSyncEffect = function shouldRunStreamTurnSyncEffect(waitingResponse, isWriting) {
107
+ return waitingResponse || isWriting;
108
+ };
109
+ export var hasMessageLevelStreamIndicator = function hasMessageLevelStreamIndicator(lastMessageId, waitingResponse, isWriting) {
110
+ return Boolean(lastMessageId && isStreamingPlaceholderMessageId(lastMessageId) && (waitingResponse || isWriting));
111
+ };
112
+ export var shouldShowGlobalStreamLoadingIndicator = function shouldShowGlobalStreamLoadingIndicator(hasMessageLevelIndicator, streamLoadingDisplay) {
113
+ return !hasMessageLevelIndicator && Boolean(streamLoadingDisplay);
114
+ };
115
+ export var isCurrentUserMessage = function isCurrentUserMessage(role, userId, authUserId) {
116
+ return role === ChatHistoryRole.USER || userId === authUserId;
117
+ };
118
+ export var isAssistantChatMessage = function isAssistantChatMessage(role, userId) {
119
+ return role === ChatHistoryRole.ASSISTANT || userId === 'assistant';
120
+ };
121
+ export var isActiveStreamingState = function isActiveStreamingState(isStreaming, isStreamingPlaceholder) {
122
+ return Boolean(isStreaming) || isStreamingPlaceholder;
123
+ };
124
+ export var shouldShowStreamingMessageBody = function shouldShowStreamingMessageBody(isActiveStreaming, hasStreamText, streamNarrationInTimeline) {
125
+ return isActiveStreaming && hasStreamText && !streamNarrationInTimeline;
126
+ };
127
+ export var shouldShowStreamActivityIndicator = function shouldShowStreamActivityIndicator(isAssistant, isActiveStreaming, streamActivity) {
128
+ return isAssistant && isActiveStreaming && Boolean(streamActivity);
129
+ };
130
+ export var shouldRenderChangeProjectMessage = function shouldRenderChangeProjectMessage(isChangeProject, options) {
131
+ return Boolean(isChangeProject && options);
132
+ };
133
+ export var shouldShowMessageAttachmentsRow = function shouldShowMessageAttachmentsRow(attachmentCount) {
134
+ return attachmentCount > 0;
135
+ };
136
+ export var shouldRenderMessageTextBody = function shouldRenderMessageTextBody(params) {
137
+ return Boolean(params.messageText || params.showStreamingBody) && !(params.isAssistant && params.attachmentCount > 0);
138
+ };
139
+ export var shouldShowApprovalActions = function shouldShowApprovalActions(approval) {
140
+ return Boolean(approval === null || approval === void 0 ? void 0 : approval.pending_actions);
141
+ };
142
+ export var shouldHideEmptyStreamingBody = function shouldHideEmptyStreamingBody(displayText, isStreaming) {
143
+ return !displayText && !isStreaming;
144
+ };
145
+ export var shouldRenderAssistantFeedback = function shouldRenderAssistantFeedback(params) {
146
+ return params.isAssistant && !params.isError && !params.approval && !params.isStreaming && (!params.isFrontendCancelled || Boolean(params.onRetry));
147
+ };
148
+ export var shouldRenderAssistantSuggestions = function shouldRenderAssistantSuggestions(params) {
149
+ return params.isAssistant && !params.isFrontendCancelled && !params.approval && (!params.isError || params.suggestionsLength > 0);
150
+ };
151
+ export var shouldHideAssistantSuggestions = function shouldHideAssistantSuggestions(isStreaming, isLastMessage, suggestionsDisabled) {
152
+ return Boolean(isStreaming || !isLastMessage || suggestionsDisabled);
153
+ };
154
+ export var shouldRenderCreateAgentActions = function shouldRenderCreateAgentActions(params) {
155
+ return params.isAssistant && !params.isError && !params.isFrontendCancelled && !params.approval && Boolean(params.agentId);
156
+ };
157
+ export var resolveChatListItemStreamingFlags = function resolveChatListItemStreamingFlags(params) {
158
+ var isAssistant = isAssistantChatMessage(params.role, params.userId);
159
+ var isStreamingPlaceholder = isAssistant && params.isLastMessage && isStreamingPlaceholderMessageId(params.messageId);
160
+ return {
161
+ isStreamingPlaceholder: isStreamingPlaceholder,
162
+ isStreaming: isStreamingPlaceholder && (params.waitingResponse || params.isWriting)
163
+ };
164
+ };
165
+ export var countUserMessageAttachments = function countUserMessageAttachments(message) {
166
+ if (!message) return 0;
167
+ var attachmentCount = Array.isArray(message.attachments) ? message.attachments.length : 0;
168
+ var sourceCount = Array.isArray(message.sources) ? message.sources.length : 0;
169
+ return attachmentCount || sourceCount;
170
+ };
171
+ export var shouldIgnoreSuggestionClick = function shouldIgnoreSuggestionClick(suggestion, alreadySelected) {
172
+ return !(suggestion !== null && suggestion !== void 0 && suggestion.trim()) || alreadySelected;
173
+ };
174
+ export var isRetrySuggestionSelection = function isRetrySuggestionSelection(isError, suggestion, retryLabel) {
175
+ return Boolean(isError && suggestion === retryLabel);
176
+ };
177
+ export var resolveRetryAttachmentsFromUserMessage = function resolveRetryAttachmentsFromUserMessage(userMessage) {
178
+ if (Array.isArray(userMessage.attachments)) return userMessage.attachments;
179
+ if (Array.isArray(userMessage.sources)) return userMessage.sources;
180
+ return [];
181
+ };
182
+ export var shouldOpenMessageOption = function shouldOpenMessageOption(selectedOption) {
183
+ return !selectedOption;
184
+ };
185
+ export var resolveAttachmentDownloadBlobStrategy = function resolveAttachmentDownloadBlobStrategy(fileUrl, file) {
186
+ if (fileUrl) return 'remote-url';
187
+ if (file instanceof File) return 'local-file';
188
+ return null;
189
+ };
190
+ export var extractFeedbackSessionId = function extractFeedbackSessionId(messageId) {
191
+ return messageId.split('-').filter(function (questionId) {
192
+ return questionId !== 'answer';
193
+ }).join('-');
194
+ };
195
+ var AUDIO_EXTENSIONS = ['.flac', '.m4a', '.mp3', '.mp4', '.oga', '.ogg', '.wav', '.webm'];
196
+ var AUDIO_TYPES = ['flac', 'm4a', 'mp3', 'mp4', 'oga', 'ogg', 'wav', 'webm'];
197
+ export var isAudioAttachment = function isAudioAttachment(attachment) {
198
+ var _attachment$type, _attachment$name;
199
+ var attachmentType = (attachment === null || attachment === void 0 || (_attachment$type = attachment.type) === null || _attachment$type === void 0 ? void 0 : _attachment$type.toLowerCase()) || '';
200
+ var attachmentName = (attachment === null || attachment === void 0 || (_attachment$name = attachment.name) === null || _attachment$name === void 0 ? void 0 : _attachment$name.toLowerCase()) || '';
201
+ return attachmentType.startsWith('audio/') || AUDIO_TYPES.includes(attachmentType) || AUDIO_EXTENSIONS.some(function (ext) {
202
+ return attachmentName.endsWith(ext);
203
+ });
204
+ };
205
+ export var canOpenAttachmentPreview = function canOpenAttachmentPreview(attachment) {
206
+ return attachment.file instanceof File || attachment.originalFile instanceof File || Boolean(attachment.url_thumbnail || attachment.url_original || attachment.url_file);
207
+ };
208
+ export var findLastQuestionId = function findLastQuestionId(messages) {
209
+ for (var index = messages.length - 1; index >= 0; index -= 1) {
210
+ var _messages$index;
211
+ var messageId = (_messages$index = messages[index]) === null || _messages$index === void 0 ? void 0 : _messages$index.id;
212
+ if (messageId !== null && messageId !== void 0 && messageId.startsWith('question-')) {
213
+ return messageId;
214
+ }
215
+ }
216
+ return null;
217
+ };
218
+ export var computeReservedTurnSpace = function computeReservedTurnSpace(clientHeight, turnHeight, viewportHeight) {
219
+ var offset = turnAnchorOffset(viewportHeight);
220
+ return Math.max(0, clientHeight - turnHeight - offset);
221
+ };
222
+ export var resolveMessageAttachments = function resolveMessageAttachments(attachments, isAssistant, sources) {
223
+ if (attachments && attachments.length > 0) {
224
+ return attachments;
225
+ }
226
+ if (!isAssistant && Array.isArray(sources)) {
227
+ return sources;
228
+ }
229
+ return [];
230
+ };
231
+ export var resolveAttachmentDownloadFileName = function resolveAttachmentDownloadFileName(attachment) {
232
+ var extension = attachment.name.includes('.') ? '' : ".".concat(attachment.type);
233
+ return "".concat(attachment.name).concat(extension);
234
+ };
235
+ export var resolveAttachmentDownloadUrl = function resolveAttachmentDownloadUrl(attachment) {
236
+ return attachment.url_original || attachment.url_file || attachment.url_thumbnail;
237
+ };
238
+ export var shouldSkipEmptyChatListMessage = function shouldSkipEmptyChatListMessage(params) {
239
+ if (params.isStreamingPlaceholder || params.isStreaming) return false;
240
+ if (params.attachmentCount > 0 || params.sourceCount > 0) return false;
241
+ if (params.messageText) return false;
242
+ if (params.projectName) return false;
243
+ if (params.hasApproval) return false;
244
+ return true;
245
+ };
246
+ export var resolveDisableFeedbackFromWasHelpful = function resolveDisableFeedbackFromWasHelpful(wasHelpful) {
247
+ if (wasHelpful === undefined || wasHelpful === null) return null;
248
+ return wasHelpful ? Feedback.THUMBS_UP : Feedback.THUMBS_DOWN;
249
+ };
250
+ export var canRetryAssistantMessage = function canRetryAssistantMessage(params) {
251
+ if (!params.hasUserMessageForRetry || params.isStreaming || params.isError || params.hasApproval) {
252
+ return false;
253
+ }
254
+ return Boolean(params.isFrontendCancelled || !params.isCancelled && params.turnId);
255
+ };
256
+ export var computeRemovableTurnSpace = function computeRemovableTurnSpace(scrollHeight, clientHeight, scrollTop, currentSpacerHeight) {
257
+ if (currentSpacerHeight <= 0) return currentSpacerHeight;
258
+ var removable = Math.max(0, scrollHeight - clientHeight - scrollTop);
259
+ return Math.max(0, currentSpacerHeight - removable);
260
+ };
261
+ export var readSmoothStreamWindowFlags = function readSmoothStreamWindowFlags() {
262
+ if (typeof window === 'undefined') return {};
263
+ return window;
264
+ };
265
+ export var buildSmoothStreamTextOptions = function buildSmoothStreamTextOptions(flags, isStreaming) {
266
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
267
+ enabled: isStreaming,
268
+ maxCharsPerFrame: 24,
269
+ snapToWordBoundary: true
270
+ }, flags.streamLagMs != null && {
271
+ targetLagMs: flags.streamLagMs
272
+ }), flags.streamAdapt != null && {
273
+ adaptToBackendRate: flags.streamAdapt
274
+ }), flags.streamBufferMs != null && {
275
+ targetBufferMs: flags.streamBufferMs
276
+ }), flags.streamMinBuffer != null && {
277
+ minBufferChars: flags.streamMinBuffer
278
+ }), flags.streamWarmupMs != null && {
279
+ warmupMs: flags.streamWarmupMs
280
+ });
281
+ };
282
+ export var resolveStreamingRawText = function resolveStreamingRawText(isStreaming, streamingText, message) {
283
+ return isStreaming ? streamingText : message;
284
+ };
285
+ export var shouldRenderMentionInlineNodes = function shouldRenderMentionInlineNodes(hasMentions, mentionNodes) {
286
+ return Boolean(hasMentions && mentionNodes);
287
+ };
288
+ export var resolveFeedbackPropsForCancelled = function resolveFeedbackPropsForCancelled(isFrontendCancelled, sources, handleFeedbackClick) {
289
+ return {
290
+ sources: isFrontendCancelled ? undefined : sources,
291
+ handleFeedback: isFrontendCancelled ? undefined : handleFeedbackClick
292
+ };
293
+ };
294
+ export var resolveStreamingMessageHookId = function resolveStreamingMessageHookId(isStreaming, messageId) {
295
+ return isStreaming ? messageId : null;
296
+ };
297
+ export var shouldInitializeChat = function shouldInitializeChat(alreadyInitialized) {
298
+ return !alreadyInitialized;
299
+ };
300
+ export var shouldClearLastReservedQuestion = function shouldClearLastReservedQuestion(loadingMessages) {
301
+ return loadingMessages;
302
+ };
303
+ export var shouldScheduleTurnSpaceReservation = function shouldScheduleTurnSpaceReservation(loadingMessages, isLoadingMoreMessages, questionId, lastReservedQuestionId) {
304
+ return !loadingMessages && !isLoadingMoreMessages && Boolean(questionId) && questionId !== lastReservedQuestionId;
305
+ };
306
+ export var shouldSkipMessagesScrollEffect = function shouldSkipMessagesScrollEffect(hasContainer, loadingMessages, isLoadingMoreMessages, isLoadingMoreRef) {
307
+ return !hasContainer || loadingMessages || isLoadingMoreMessages || isLoadingMoreRef;
308
+ };
309
+ export var resolveContainerAtBottom = function resolveContainerAtBottom(container) {
310
+ return container ? isContainerAtScrollBottom(container.scrollHeight, container.scrollTop, container.clientHeight) : false;
311
+ };
312
+ export var shouldRunSessionCacheScrollToBottom = function shouldRunSessionCacheScrollToBottom(loadingMessages, initialChatId, messagesLength, lastScrolledSessionId) {
313
+ return !loadingMessages && Boolean(initialChatId) && messagesLength > 0 && lastScrolledSessionId !== initialChatId;
314
+ };
315
+ export var detectJustFinishedLoadingMessages = function detectJustFinishedLoadingMessages(wasLoading, loadingMessages) {
316
+ return wasLoading && !loadingMessages;
317
+ };
318
+ export var shouldScrollToBottomAfterLoad = function shouldScrollToBottomAfterLoad(justFinishedLoading, messagesLength) {
319
+ return justFinishedLoading && messagesLength > 0;
320
+ };
321
+ export var shouldUpdateScrollAffordancesOnLoadEnd = function shouldUpdateScrollAffordancesOnLoadEnd(loadingMessages) {
322
+ return !loadingMessages;
323
+ };
324
+ export var shouldClearScrollRestoreWithoutChat = function shouldClearScrollRestoreWithoutChat(initialChatId) {
325
+ return !initialChatId;
326
+ };
327
+ export var resolvePendingScrollTopFromSession = function resolvePendingScrollTopFromSession(session, initialChatId) {
328
+ if (!initialChatId || !session) return null;
329
+ if (session.scrollSessionId === initialChatId && typeof session.scrollTop === 'number' && session.scrollTop > 0) {
330
+ return session.scrollTop;
331
+ }
332
+ return null;
333
+ };
334
+ export var shouldApplyPendingScrollRestore = function shouldApplyPendingScrollRestore(loadingMessages, pendingScrollTop, hasContainer) {
335
+ return !loadingMessages && pendingScrollTop != null && pendingScrollTop > 0 && hasContainer;
336
+ };
337
+ export var shouldRestoreScrollOnExpandedChange = function shouldRestoreScrollOnExpandedChange(previousExpanded, expanded, hasContainer) {
338
+ return previousExpanded !== expanded && hasContainer;
339
+ };
340
+ export var resolveMessageListItemKey = function resolveMessageListItemKey(messageId, index) {
341
+ return messageId !== null && messageId !== void 0 ? messageId : "msg-".concat(index);
342
+ };
343
+ export var resolveCreateAgentActionsAgentId = function resolveCreateAgentActionsAgentId(followUp) {
344
+ return followUp === null || followUp === void 0 ? void 0 : followUp.agentId;
345
+ };
346
+ export var resolveStreamingTextHookId = function resolveStreamingTextHookId(isStreaming, isStreamingPlaceholder, messageId) {
347
+ return isStreaming || isStreamingPlaceholder ? messageId : null;
348
+ };
349
+ export var resolveReasoningTraceHookId = function resolveReasoningTraceHookId(isAssistant, isActiveStreaming, id) {
350
+ return isAssistant && isActiveStreaming ? id : '';
351
+ };
352
+ export var resolveScrollOnParentMode = function resolveScrollOnParentMode(expanded) {
353
+ return Boolean(expanded);
354
+ };
355
+ export var resolveLastUserMessageForAttachments = function resolveLastUserMessageForAttachments(messages, authUserId) {
356
+ return messages.filter(function (msg) {
357
+ return msg.role === ChatHistoryRole.USER || msg.user.id === authUserId.toString();
358
+ }).at(-1);
359
+ };
360
+ export var resolveSuggestionAnalyticsAgentType = function resolveSuggestionAnalyticsAgentType(isMarketplaceGlobalAgent, agentType) {
361
+ return isMarketplaceGlobalAgent ? 'marketplace' : agentType;
362
+ };
363
+ export var processChatMessagesScrollFrame = function processChatMessagesScrollFrame(input) {
364
+ var isScrollingUp = isScrollingUpward(input.scrollTop, input.lastScrollTop);
365
+ var isNearBottom = isNearScrollBottom(input.scrollHeight, input.scrollTop, input.clientHeight, input.scrollThreshold);
366
+ var nextScrollThreshold = resolveScrollNearBottomThreshold(input.scrollThreshold, isScrollingUp, isNearBottom);
367
+ return {
368
+ nextScrollThreshold: nextScrollThreshold,
369
+ lastScrollTop: input.scrollTop,
370
+ shouldDrainTurnSpace: shouldDrainTurnSpaceOnScroll(input.anchoredTurnId),
371
+ shouldScheduleScrollPersist: shouldPersistMaiaPanelScroll(input.initialChatId, input.scrollTop),
372
+ shouldNotifyScrollToBottom: isNearBottom
373
+ };
374
+ };
375
+ export var computeMeasureTurnLayout = function computeMeasureTurnLayout(params) {
376
+ var questionScrollTop = params.questionTop - params.containerTop + params.scrollTop;
377
+ var contentBottomScroll = params.contentBottom - params.containerTop + params.scrollTop;
378
+ return {
379
+ questionTop: questionScrollTop,
380
+ turnHeight: contentBottomScroll - questionScrollTop
381
+ };
382
+ };
383
+ export var resolveReserveTurnSpacePlan = function resolveReserveTurnSpacePlan(params) {
384
+ if (shouldSkipTurnSpaceReservation(params.currentScrollTop, params.targetScrollTop)) {
385
+ return {
386
+ kind: 'skip-reservation'
387
+ };
388
+ }
389
+ return {
390
+ kind: 'reserve',
391
+ spacerHeight: computeReservedTurnSpace(params.clientHeight, params.turnHeight, params.clientHeight),
392
+ targetScrollTop: params.targetScrollTop
393
+ };
394
+ };
395
+ export var resolveScrollToBottomTargetTop = function resolveScrollToBottomTargetTop(scrollHeight, clientHeight) {
396
+ return scrollHeight - clientHeight;
397
+ };
398
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQiLCJ0dXJuQW5jaG9yT2Zmc2V0Iiwidmlld3BvcnRIZWlnaHQiLCJNYXRoIiwibWluIiwiVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMiLCJUVVJOX1NDUk9MTF9NQVhfRFVSQVRJT05fTVMiLCJUVVJOX1NDUk9MTF9MT05HX0RJU1RBTkNFX1BYIiwiY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zIiwiZGlzdGFuY2UiLCJhYnMiLCJjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tIiwic2Nyb2xsSGVpZ2h0Iiwic3BhY2VySGVpZ2h0Iiwic2Nyb2xsVG9wIiwiY2xpZW50SGVpZ2h0Iiwic2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tIiwiZGlzdGFuY2VGcm9tQm90dG9tIiwidGhyZXNob2xkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiU0NST0xMX0dSQURJRU5UX1RIUkVTSE9MRF9QWCIsIlNDUk9MTF9ORUFSX0JPVFRPTV9ERUZBVUxUX1RIUkVTSE9MRCIsIlNDUk9MTF9ORUFSX0JPVFRPTV9VUF9USFJFU0hPTEQiLCJTQ1JPTExfQVRfQk9UVE9NX1RPTEVSQU5DRV9QWCIsIlNQQUNFUl9IRUlHSFRfRVBTSUxPTl9QWCIsInNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCIsInNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCIsImlzU2Nyb2xsaW5nVXB3YXJkIiwibGFzdFNjcm9sbFRvcCIsImlzTmVhclNjcm9sbEJvdHRvbSIsInJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkIiwiY3VycmVudFRocmVzaG9sZCIsImlzU2Nyb2xsaW5nVXAiLCJpc05lYXJCb3R0b20iLCJzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbiIsImVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MiLCJwcm9ncmVzcyIsInBvdyIsImNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wIiwicXVlc3Rpb25Ub3AiLCJvZmZzZXQiLCJtYXgiLCJzaG91bGRTa2lwVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJjdXJyZW50U2Nyb2xsVG9wIiwidGFyZ2V0U2Nyb2xsVG9wIiwic2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0IiwiY3VycmVudEhlaWdodCIsIm5leHRIZWlnaHQiLCJjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCIsInR1cm5IZWlnaHQiLCJjdXJyZW50U3BhY2VySGVpZ2h0IiwicmVzZXJ2ZWQiLCJzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsIiwiYW5jaG9yZWRUdXJuSWQiLCJzaG91bGRSZWxlYXNlVHVyblNwYWNlIiwiQm9vbGVhbiIsInNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwiLCJpbml0aWFsQ2hhdElkIiwiaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSIsInRvbGVyYW5jZSIsImlzTmV3Q2hhdE1lc3NhZ2VFdmVudCIsImxhc3RJZCIsInByZXZJZCIsIm1lc3NhZ2VzTGVuZ3RoIiwicHJldkxlbmd0aCIsImhhc0luaXRpYWxVc2VyTWVzc2FnZUluTGlzdCIsIm1lc3NhZ2VzIiwic29tZSIsIm1zZyIsImlkIiwiaXNBcHByb3ZhbENoYXRNZXNzYWdlIiwibWVzc2FnZSIsIl9tZXNzYWdlJGlkIiwic3RhcnRzV2l0aCIsImFwcHJvdmFsIiwiaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCIsIm1lc3NhZ2VJZCIsInNob3VsZEF1dG9TY3JvbGxPbk1lc3NhZ2VzQ2hhbmdlIiwicGFyYW1zIiwiaXNOZXdNZXNzYWdlIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNXcml0aW5nIiwiaXNBbnN3ZXJPclF1ZXN0aW9uIiwiaXNBdEJvdHRvbSIsImlzQXBwcm92YWwiLCJoYXNJbml0aWFsTWVzc2FnZSIsInByZXZNZXNzYWdlc0xlbmd0aCIsInNob3VsZFJ1blN0cmVhbVR1cm5TeW5jRWZmZWN0IiwiaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yIiwibGFzdE1lc3NhZ2VJZCIsInNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yIiwiaGFzTWVzc2FnZUxldmVsSW5kaWNhdG9yIiwic3RyZWFtTG9hZGluZ0Rpc3BsYXkiLCJpc0N1cnJlbnRVc2VyTWVzc2FnZSIsInJvbGUiLCJ1c2VySWQiLCJhdXRoVXNlcklkIiwiVVNFUiIsImlzQXNzaXN0YW50Q2hhdE1lc3NhZ2UiLCJBU1NJU1RBTlQiLCJpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlIiwiaXNTdHJlYW1pbmciLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyIiwic2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5IiwiaXNBY3RpdmVTdHJlYW1pbmciLCJoYXNTdHJlYW1UZXh0Iiwic3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZSIsInNob3VsZFNob3dTdHJlYW1BY3Rpdml0eUluZGljYXRvciIsImlzQXNzaXN0YW50Iiwic3RyZWFtQWN0aXZpdHkiLCJzaG91bGRSZW5kZXJDaGFuZ2VQcm9qZWN0TWVzc2FnZSIsImlzQ2hhbmdlUHJvamVjdCIsIm9wdGlvbnMiLCJzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93IiwiYXR0YWNobWVudENvdW50Iiwic2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5IiwibWVzc2FnZVRleHQiLCJzaG93U3RyZWFtaW5nQm9keSIsInNob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMiLCJwZW5kaW5nX2FjdGlvbnMiLCJzaG91bGRIaWRlRW1wdHlTdHJlYW1pbmdCb2R5IiwiZGlzcGxheVRleHQiLCJzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayIsImlzRXJyb3IiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwib25SZXRyeSIsInNob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zIiwic3VnZ2VzdGlvbnNMZW5ndGgiLCJzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnMiLCJpc0xhc3RNZXNzYWdlIiwic3VnZ2VzdGlvbnNEaXNhYmxlZCIsInNob3VsZFJlbmRlckNyZWF0ZUFnZW50QWN0aW9ucyIsImFnZW50SWQiLCJyZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3MiLCJjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsInNvdXJjZUNvdW50Iiwic291cmNlcyIsInNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljayIsInN1Z2dlc3Rpb24iLCJhbHJlYWR5U2VsZWN0ZWQiLCJ0cmltIiwiaXNSZXRyeVN1Z2dlc3Rpb25TZWxlY3Rpb24iLCJyZXRyeUxhYmVsIiwicmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2UiLCJ1c2VyTWVzc2FnZSIsInNob3VsZE9wZW5NZXNzYWdlT3B0aW9uIiwic2VsZWN0ZWRPcHRpb24iLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5IiwiZmlsZVVybCIsImZpbGUiLCJGaWxlIiwiZXh0cmFjdEZlZWRiYWNrU2Vzc2lvbklkIiwic3BsaXQiLCJmaWx0ZXIiLCJxdWVzdGlvbklkIiwiam9pbiIsIkFVRElPX0VYVEVOU0lPTlMiLCJBVURJT19UWVBFUyIsImlzQXVkaW9BdHRhY2htZW50IiwiYXR0YWNobWVudCIsIl9hdHRhY2htZW50JHR5cGUiLCJfYXR0YWNobWVudCRuYW1lIiwiYXR0YWNobWVudFR5cGUiLCJ0eXBlIiwidG9Mb3dlckNhc2UiLCJhdHRhY2htZW50TmFtZSIsIm5hbWUiLCJpbmNsdWRlcyIsImV4dCIsImVuZHNXaXRoIiwiY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3Iiwib3JpZ2luYWxGaWxlIiwidXJsX3RodW1ibmFpbCIsInVybF9vcmlnaW5hbCIsInVybF9maWxlIiwiZmluZExhc3RRdWVzdGlvbklkIiwiaW5kZXgiLCJfbWVzc2FnZXMkaW5kZXgiLCJjb21wdXRlUmVzZXJ2ZWRUdXJuU3BhY2UiLCJyZXNvbHZlTWVzc2FnZUF0dGFjaG1lbnRzIiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lIiwiZXh0ZW5zaW9uIiwiY29uY2F0IiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCIsInNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSIsInByb2plY3ROYW1lIiwiaGFzQXBwcm92YWwiLCJyZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwiLCJ3YXNIZWxwZnVsIiwiVEhVTUJTX1VQIiwiVEhVTUJTX0RPV04iLCJjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2UiLCJoYXNVc2VyTWVzc2FnZUZvclJldHJ5IiwiaXNDYW5jZWxsZWQiLCJ0dXJuSWQiLCJjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlIiwicmVtb3ZhYmxlIiwicmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzIiwid2luZG93IiwiYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyIsImZsYWdzIiwiX29iamVjdFNwcmVhZCIsImVuYWJsZWQiLCJtYXhDaGFyc1BlckZyYW1lIiwic25hcFRvV29yZEJvdW5kYXJ5Iiwic3RyZWFtTGFnTXMiLCJ0YXJnZXRMYWdNcyIsInN0cmVhbUFkYXB0IiwiYWRhcHRUb0JhY2tlbmRSYXRlIiwic3RyZWFtQnVmZmVyTXMiLCJ0YXJnZXRCdWZmZXJNcyIsInN0cmVhbU1pbkJ1ZmZlciIsIm1pbkJ1ZmZlckNoYXJzIiwic3RyZWFtV2FybXVwTXMiLCJ3YXJtdXBNcyIsInJlc29sdmVTdHJlYW1pbmdSYXdUZXh0Iiwic3RyZWFtaW5nVGV4dCIsInNob3VsZFJlbmRlck1lbnRpb25JbmxpbmVOb2RlcyIsImhhc01lbnRpb25zIiwibWVudGlvbk5vZGVzIiwicmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQiLCJoYW5kbGVGZWVkYmFja0NsaWNrIiwiaGFuZGxlRmVlZGJhY2siLCJyZXNvbHZlU3RyZWFtaW5nTWVzc2FnZUhvb2tJZCIsInNob3VsZEluaXRpYWxpemVDaGF0IiwiYWxyZWFkeUluaXRpYWxpemVkIiwic2hvdWxkQ2xlYXJMYXN0UmVzZXJ2ZWRRdWVzdGlvbiIsImxvYWRpbmdNZXNzYWdlcyIsInNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJsYXN0UmVzZXJ2ZWRRdWVzdGlvbklkIiwic2hvdWxkU2tpcE1lc3NhZ2VzU2Nyb2xsRWZmZWN0IiwiaGFzQ29udGFpbmVyIiwiaXNMb2FkaW5nTW9yZVJlZiIsInJlc29sdmVDb250YWluZXJBdEJvdHRvbSIsImNvbnRhaW5lciIsInNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tIiwibGFzdFNjcm9sbGVkU2Vzc2lvbklkIiwiZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzIiwid2FzTG9hZGluZyIsInNob3VsZFNjcm9sbFRvQm90dG9tQWZ0ZXJMb2FkIiwianVzdEZpbmlzaGVkTG9hZGluZyIsInNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kIiwic2hvdWxkQ2xlYXJTY3JvbGxSZXN0b3JlV2l0aG91dENoYXQiLCJyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uIiwic2Vzc2lvbiIsInNjcm9sbFNlc3Npb25JZCIsInNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUiLCJwZW5kaW5nU2Nyb2xsVG9wIiwic2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UiLCJwcmV2aW91c0V4cGFuZGVkIiwiZXhwYW5kZWQiLCJyZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5IiwicmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQiLCJmb2xsb3dVcCIsInJlc29sdmVTdHJlYW1pbmdUZXh0SG9va0lkIiwicmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkIiwicmVzb2x2ZVNjcm9sbE9uUGFyZW50TW9kZSIsInJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyIsInVzZXIiLCJ0b1N0cmluZyIsImF0IiwicmVzb2x2ZVN1Z2dlc3Rpb25BbmFseXRpY3NBZ2VudFR5cGUiLCJpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQiLCJhZ2VudFR5cGUiLCJwcm9jZXNzQ2hhdE1lc3NhZ2VzU2Nyb2xsRnJhbWUiLCJpbnB1dCIsInNjcm9sbFRocmVzaG9sZCIsIm5leHRTY3JvbGxUaHJlc2hvbGQiLCJzaG91bGREcmFpblR1cm5TcGFjZSIsInNob3VsZFNjaGVkdWxlU2Nyb2xsUGVyc2lzdCIsInNob3VsZE5vdGlmeVNjcm9sbFRvQm90dG9tIiwiY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0IiwicXVlc3Rpb25TY3JvbGxUb3AiLCJjb250YWluZXJUb3AiLCJjb250ZW50Qm90dG9tU2Nyb2xsIiwiY29udGVudEJvdHRvbSIsInJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbiIsImtpbmQiLCJyZXNvbHZlU2Nyb2xsVG9Cb3R0b21UYXJnZXRUb3AiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMuaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdEhpc3RvcnlSb2xlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuXG5leHBvcnQgY29uc3QgdHVybkFuY2hvck9mZnNldCA9ICh2aWV3cG9ydEhlaWdodDogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWluKHZpZXdwb3J0SGVpZ2h0ICogMC4xOCwgMjAwKVxuXG5leHBvcnQgY29uc3QgVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMgPSA2MDBcbmV4cG9ydCBjb25zdCBUVVJOX1NDUk9MTF9NQVhfRFVSQVRJT05fTVMgPSA4MDBcbmV4cG9ydCBjb25zdCBUVVJOX1NDUk9MTF9MT05HX0RJU1RBTkNFX1BYID0gMTIwMFxuXG5leHBvcnQgY29uc3QgY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zID0gKGRpc3RhbmNlOiBudW1iZXIpOiBudW1iZXIgPT5cbiAgVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMgK1xuICAoVFVSTl9TQ1JPTExfTUFYX0RVUkFUSU9OX01TIC0gVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMpICpcbiAgICBNYXRoLm1pbigxLCBNYXRoLmFicyhkaXN0YW5jZSkgLyBUVVJOX1NDUk9MTF9MT05HX0RJU1RBTkNFX1BYKVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZURpc3RhbmNlRnJvbUJvdHRvbSA9IChcbiAgc2Nyb2xsSGVpZ2h0OiBudW1iZXIsXG4gIHNwYWNlckhlaWdodDogbnVtYmVyLFxuICBzY3JvbGxUb3A6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXJcbik6IG51bWJlciA9PiBzY3JvbGxIZWlnaHQgLSBzcGFjZXJIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSA9IChkaXN0YW5jZUZyb21Cb3R0b206IG51bWJlciwgdGhyZXNob2xkID0gNTApOiBib29sZWFuID0+XG4gIGRpc3RhbmNlRnJvbUJvdHRvbSA+IHRocmVzaG9sZFxuXG5leHBvcnQgY29uc3QgU0NST0xMX0dSQURJRU5UX1RIUkVTSE9MRF9QWCA9IDFcbmV4cG9ydCBjb25zdCBTQ1JPTExfTkVBUl9CT1RUT01fREVGQVVMVF9USFJFU0hPTEQgPSAzOVxuZXhwb3J0IGNvbnN0IFNDUk9MTF9ORUFSX0JPVFRPTV9VUF9USFJFU0hPTEQgPSAxNVxuZXhwb3J0IGNvbnN0IFNDUk9MTF9BVF9CT1RUT01fVE9MRVJBTkNFX1BYID0gMTAwXG5leHBvcnQgY29uc3QgU1BBQ0VSX0hFSUdIVF9FUFNJTE9OX1BYID0gMVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50ID0gKHNjcm9sbFRvcDogbnVtYmVyLCB0aHJlc2hvbGQgPSBTQ1JPTExfR1JBRElFTlRfVEhSRVNIT0xEX1BYKTogYm9vbGVhbiA9PlxuICBzY3JvbGxUb3AgPiB0aHJlc2hvbGRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCA9IChcbiAgZGlzdGFuY2VGcm9tQm90dG9tOiBudW1iZXIsXG4gIHRocmVzaG9sZCA9IFNDUk9MTF9HUkFESUVOVF9USFJFU0hPTERfUFhcbik6IGJvb2xlYW4gPT4gZGlzdGFuY2VGcm9tQm90dG9tID4gdGhyZXNob2xkXG5cbmV4cG9ydCBjb25zdCBpc1Njcm9sbGluZ1Vwd2FyZCA9IChzY3JvbGxUb3A6IG51bWJlciwgbGFzdFNjcm9sbFRvcDogbnVtYmVyKTogYm9vbGVhbiA9PiBzY3JvbGxUb3AgPCBsYXN0U2Nyb2xsVG9wXG5cbmV4cG9ydCBjb25zdCBpc05lYXJTY3JvbGxCb3R0b20gPSAoXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyLFxuICBzY3JvbGxUb3A6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHRocmVzaG9sZDogbnVtYmVyXG4pOiBib29sZWFuID0+IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodCA8IHRocmVzaG9sZFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQgPSAoXG4gIGN1cnJlbnRUaHJlc2hvbGQ6IG51bWJlcixcbiAgaXNTY3JvbGxpbmdVcDogYm9vbGVhbixcbiAgaXNOZWFyQm90dG9tOiBib29sZWFuXG4pOiBudW1iZXIgPT4ge1xuICBpZiAoaXNOZWFyQm90dG9tKSByZXR1cm4gU0NST0xMX05FQVJfQk9UVE9NX0RFRkFVTFRfVEhSRVNIT0xEXG4gIGlmIChpc1Njcm9sbGluZ1VwKSByZXR1cm4gU0NST0xMX05FQVJfQk9UVE9NX1VQX1RIUkVTSE9MRFxuICByZXR1cm4gY3VycmVudFRocmVzaG9sZFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2tpcFR1cm5TY3JvbGxBbmltYXRpb24gPSAoZGlzdGFuY2U6IG51bWJlcik6IGJvb2xlYW4gPT4gTWF0aC5hYnMoZGlzdGFuY2UpIDwgMVxuXG5leHBvcnQgY29uc3QgZWFzZU91dEV4cG9TY3JvbGxQcm9ncmVzcyA9IChwcm9ncmVzczogbnVtYmVyKTogbnVtYmVyID0+IChwcm9ncmVzcyA9PT0gMSA/IDEgOiAxIC0gMiAqKiAoLTEyICogcHJvZ3Jlc3MpKVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZVR1cm5TY3JvbGxUYXJnZXRUb3AgPSAocXVlc3Rpb25Ub3A6IG51bWJlciwgdmlld3BvcnRIZWlnaHQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGNvbnN0IG9mZnNldCA9IHR1cm5BbmNob3JPZmZzZXQodmlld3BvcnRIZWlnaHQpXG4gIHJldHVybiBNYXRoLm1heCgwLCBxdWVzdGlvblRvcCAtIG9mZnNldClcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFNraXBUdXJuU3BhY2VSZXNlcnZhdGlvbiA9IChjdXJyZW50U2Nyb2xsVG9wOiBudW1iZXIsIHRhcmdldFNjcm9sbFRvcDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICB0YXJnZXRTY3JvbGxUb3AgPD0gY3VycmVudFNjcm9sbFRvcFxuXG5leHBvcnQgY29uc3Qgc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0ID0gKGN1cnJlbnRIZWlnaHQ6IG51bWJlciwgbmV4dEhlaWdodDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBNYXRoLmFicyhjdXJyZW50SGVpZ2h0IC0gbmV4dEhlaWdodCkgPj0gU1BBQ0VSX0hFSUdIVF9FUFNJTE9OX1BYXG5cbmV4cG9ydCBjb25zdCBjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCA9IChcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHR1cm5IZWlnaHQ6IG51bWJlcixcbiAgY3VycmVudFNwYWNlckhlaWdodDogbnVtYmVyXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBvZmZzZXQgPSB0dXJuQW5jaG9yT2Zmc2V0KGNsaWVudEhlaWdodClcbiAgY29uc3QgcmVzZXJ2ZWQgPSBNYXRoLm1heCgwLCBjbGllbnRIZWlnaHQgLSB0dXJuSGVpZ2h0IC0gb2Zmc2V0KVxuICByZXR1cm4gTWF0aC5taW4oY3VycmVudFNwYWNlckhlaWdodCwgcmVzZXJ2ZWQpXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsID0gKGFuY2hvcmVkVHVybklkOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiA9PiAhYW5jaG9yZWRUdXJuSWRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbGVhc2VUdXJuU3BhY2UgPSAoYW5jaG9yZWRUdXJuSWQ6IHN0cmluZyB8IG51bGwsIHNwYWNlckhlaWdodDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKGFuY2hvcmVkVHVybklkKSB8fCBzcGFjZXJIZWlnaHQgPiAwXG5cbmV4cG9ydCBjb25zdCBzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsID0gKGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNjcm9sbFRvcDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKGluaXRpYWxDaGF0SWQpICYmIHNjcm9sbFRvcCA+IDBcblxuZXhwb3J0IGNvbnN0IGlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20gPSAoXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyLFxuICBzY3JvbGxUb3A6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHRvbGVyYW5jZSA9IFNDUk9MTF9BVF9CT1RUT01fVE9MRVJBTkNFX1BYXG4pOiBib29sZWFuID0+IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCA8PSBjbGllbnRIZWlnaHQgKyB0b2xlcmFuY2VcblxuZXhwb3J0IGNvbnN0IGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCA9IChcbiAgbGFzdElkOiBzdHJpbmcgfCBudWxsLFxuICBwcmV2SWQ6IHN0cmluZyB8IG51bGwsXG4gIG1lc3NhZ2VzTGVuZ3RoOiBudW1iZXIsXG4gIHByZXZMZW5ndGg6IG51bWJlclxuKTogYm9vbGVhbiA9PiBsYXN0SWQgIT09IHByZXZJZCB8fCBtZXNzYWdlc0xlbmd0aCAhPT0gcHJldkxlbmd0aFxuXG5leHBvcnQgY29uc3QgaGFzSW5pdGlhbFVzZXJNZXNzYWdlSW5MaXN0ID0gKG1lc3NhZ2VzOiBBcnJheTx7IGlkPzogc3RyaW5nIH0+KTogYm9vbGVhbiA9PlxuICBtZXNzYWdlcy5zb21lKG1zZyA9PiBtc2cuaWQgPT09ICd1c2VyLWluaXRpYWwtbWVzc2FnZScpXG5cbmV4cG9ydCBjb25zdCBpc0FwcHJvdmFsQ2hhdE1lc3NhZ2UgPSAobWVzc2FnZTogeyBpZD86IHN0cmluZzsgYXBwcm92YWw/OiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKG1lc3NhZ2UgJiYgKG1lc3NhZ2UuaWQ/LnN0YXJ0c1dpdGgoJ2FwcHJvdmFsLScpIHx8IG1lc3NhZ2UuYXBwcm92YWwpKVxuXG5leHBvcnQgY29uc3QgaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCA9IChtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihtZXNzYWdlSWQ/LnN0YXJ0c1dpdGgoJ2Fuc3dlci0nKSB8fCBtZXNzYWdlSWQ/LnN0YXJ0c1dpdGgoJ3F1ZXN0aW9uLScpKVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UgPSAocGFyYW1zOiB7XG4gIGlzTmV3TWVzc2FnZTogYm9vbGVhblxuICBhbmNob3JlZFR1cm5JZDogc3RyaW5nIHwgbnVsbFxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW5cbiAgaXNXcml0aW5nOiBib29sZWFuXG4gIGlzQXRCb3R0b206IGJvb2xlYW5cbiAgaXNBbnN3ZXJPclF1ZXN0aW9uOiBib29sZWFuXG4gIGlzQXBwcm92YWw6IGJvb2xlYW5cbiAgaGFzSW5pdGlhbE1lc3NhZ2U6IGJvb2xlYW5cbiAgbWVzc2FnZXNMZW5ndGg6IG51bWJlclxuICBwcmV2TWVzc2FnZXNMZW5ndGg6IG51bWJlclxufSk6ICdzY3JvbGwnIHwgJ3N5bmMtdHVybicgfCAnYWZmb3JkYW5jZXMtb25seScgPT4ge1xuICBpZiAoIXBhcmFtcy5pc05ld01lc3NhZ2UpIHJldHVybiAnYWZmb3JkYW5jZXMtb25seSdcbiAgaWYgKHBhcmFtcy5hbmNob3JlZFR1cm5JZCkgcmV0dXJuICdzeW5jLXR1cm4nXG4gIGlmIChwYXJhbXMud2FpdGluZ1Jlc3BvbnNlIHx8IHBhcmFtcy5pc1dyaXRpbmcpIHJldHVybiAnYWZmb3JkYW5jZXMtb25seSdcbiAgaWYgKHBhcmFtcy5pc0Fuc3dlck9yUXVlc3Rpb24gJiYgcGFyYW1zLmlzQXRCb3R0b20pIHJldHVybiAnc2Nyb2xsJ1xuICBpZiAoXG4gICAgIXBhcmFtcy5pc0Fuc3dlck9yUXVlc3Rpb24gJiZcbiAgICAhcGFyYW1zLmlzQXBwcm92YWwgJiZcbiAgICAhcGFyYW1zLmhhc0luaXRpYWxNZXNzYWdlICYmXG4gICAgcGFyYW1zLm1lc3NhZ2VzTGVuZ3RoID4gcGFyYW1zLnByZXZNZXNzYWdlc0xlbmd0aFxuICApIHtcbiAgICByZXR1cm4gJ3Njcm9sbCdcbiAgfVxuICByZXR1cm4gJ2FmZm9yZGFuY2VzLW9ubHknXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSdW5TdHJlYW1UdXJuU3luY0VmZmVjdCA9ICh3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW4sIGlzV3JpdGluZzogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgd2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZ1xuXG5leHBvcnQgY29uc3QgaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yID0gKFxuICBsYXN0TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHdhaXRpbmdSZXNwb25zZTogYm9vbGVhbixcbiAgaXNXcml0aW5nOiBib29sZWFuXG4pOiBib29sZWFuID0+IEJvb2xlYW4obGFzdE1lc3NhZ2VJZCAmJiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGxhc3RNZXNzYWdlSWQpICYmICh3YWl0aW5nUmVzcG9uc2UgfHwgaXNXcml0aW5nKSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yID0gKFxuICBoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3I6IGJvb2xlYW4sXG4gIHN0cmVhbUxvYWRpbmdEaXNwbGF5OiB1bmtub3duXG4pOiBib29sZWFuID0+ICFoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3IgJiYgQm9vbGVhbihzdHJlYW1Mb2FkaW5nRGlzcGxheSlcblxuZXhwb3J0IGNvbnN0IGlzQ3VycmVudFVzZXJNZXNzYWdlID0gKHJvbGU6IENoYXRIaXN0b3J5Um9sZSB8IHVuZGVmaW5lZCwgdXNlcklkOiBzdHJpbmcsIGF1dGhVc2VySWQ6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgdXNlcklkID09PSBhdXRoVXNlcklkXG5cbmV4cG9ydCBjb25zdCBpc0Fzc2lzdGFudENoYXRNZXNzYWdlID0gKHJvbGU6IENoYXRIaXN0b3J5Um9sZSB8IHVuZGVmaW5lZCwgdXNlcklkOiBzdHJpbmcpOiBib29sZWFuID0+XG4gIHJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgdXNlcklkID09PSAnYXNzaXN0YW50J1xuXG5leHBvcnQgY29uc3QgaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZSA9IChpc1N0cmVhbWluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihpc1N0cmVhbWluZykgfHwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlclxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5ID0gKFxuICBpc0FjdGl2ZVN0cmVhbWluZzogYm9vbGVhbixcbiAgaGFzU3RyZWFtVGV4dDogYm9vbGVhbixcbiAgc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZTogYm9vbGVhblxuKTogYm9vbGVhbiA9PiBpc0FjdGl2ZVN0cmVhbWluZyAmJiBoYXNTdHJlYW1UZXh0ICYmICFzdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTaG93U3RyZWFtQWN0aXZpdHlJbmRpY2F0b3IgPSAoXG4gIGlzQXNzaXN0YW50OiBib29sZWFuLFxuICBpc0FjdGl2ZVN0cmVhbWluZzogYm9vbGVhbixcbiAgc3RyZWFtQWN0aXZpdHk6IHVua25vd25cbik6IGJvb2xlYW4gPT4gaXNBc3Npc3RhbnQgJiYgaXNBY3RpdmVTdHJlYW1pbmcgJiYgQm9vbGVhbihzdHJlYW1BY3Rpdml0eSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlID0gKFxuICBpc0NoYW5nZVByb2plY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHVua25vd25bXSB8IG51bGwgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4gPT4gQm9vbGVhbihpc0NoYW5nZVByb2plY3QgJiYgb3B0aW9ucylcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dNZXNzYWdlQXR0YWNobWVudHNSb3cgPSAoYXR0YWNobWVudENvdW50OiBudW1iZXIpOiBib29sZWFuID0+IGF0dGFjaG1lbnRDb3VudCA+IDBcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSA9IChwYXJhbXM6IHtcbiAgbWVzc2FnZVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcbiAgc2hvd1N0cmVhbWluZ0JvZHk6IGJvb2xlYW5cbiAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgYXR0YWNobWVudENvdW50OiBudW1iZXJcbn0pOiBib29sZWFuID0+XG4gIEJvb2xlYW4ocGFyYW1zLm1lc3NhZ2VUZXh0IHx8IHBhcmFtcy5zaG93U3RyZWFtaW5nQm9keSkgJiYgIShwYXJhbXMuaXNBc3Npc3RhbnQgJiYgcGFyYW1zLmF0dGFjaG1lbnRDb3VudCA+IDApXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zID0gKGFwcHJvdmFsOiB7IHBlbmRpbmdfYWN0aW9ucz86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gIEJvb2xlYW4oYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucylcblxuZXhwb3J0IGNvbnN0IHNob3VsZEhpZGVFbXB0eVN0cmVhbWluZ0JvZHkgPSAoZGlzcGxheVRleHQ6IHN0cmluZywgaXNTdHJlYW1pbmc6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gICFkaXNwbGF5VGV4dCAmJiAhaXNTdHJlYW1pbmdcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlckFzc2lzdGFudEZlZWRiYWNrID0gKHBhcmFtczoge1xuICBpc0Fzc2lzdGFudDogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBhcHByb3ZhbD86IHVua25vd25cbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbiAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgb25SZXRyeT86ICgpID0+IHZvaWRcbn0pOiBib29sZWFuID0+XG4gIHBhcmFtcy5pc0Fzc2lzdGFudCAmJlxuICAhcGFyYW1zLmlzRXJyb3IgJiZcbiAgIXBhcmFtcy5hcHByb3ZhbCAmJlxuICAhcGFyYW1zLmlzU3RyZWFtaW5nICYmXG4gICghcGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgfHwgQm9vbGVhbihwYXJhbXMub25SZXRyeSkpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyA9IChwYXJhbXM6IHtcbiAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgYXBwcm92YWw/OiB1bmtub3duXG4gIGlzRXJyb3I/OiBib29sZWFuXG4gIHN1Z2dlc3Rpb25zTGVuZ3RoOiBudW1iZXJcbn0pOiBib29sZWFuID0+XG4gIHBhcmFtcy5pc0Fzc2lzdGFudCAmJlxuICAhcGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiZcbiAgIXBhcmFtcy5hcHByb3ZhbCAmJlxuICAoIXBhcmFtcy5pc0Vycm9yIHx8IHBhcmFtcy5zdWdnZXN0aW9uc0xlbmd0aCA+IDApXG5cbmV4cG9ydCBjb25zdCBzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnMgPSAoXG4gIGlzU3RyZWFtaW5nOiBib29sZWFuLFxuICBpc0xhc3RNZXNzYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBzdWdnZXN0aW9uc0Rpc2FibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuID0+IEJvb2xlYW4oaXNTdHJlYW1pbmcgfHwgIWlzTGFzdE1lc3NhZ2UgfHwgc3VnZ2VzdGlvbnNEaXNhYmxlZClcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlckNyZWF0ZUFnZW50QWN0aW9ucyA9IChwYXJhbXM6IHtcbiAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgaXNFcnJvcj86IGJvb2xlYW5cbiAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgYXBwcm92YWw/OiB1bmtub3duXG4gIGFnZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxufSk6IGJvb2xlYW4gPT5cbiAgcGFyYW1zLmlzQXNzaXN0YW50ICYmICFwYXJhbXMuaXNFcnJvciAmJiAhcGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiYgIXBhcmFtcy5hcHByb3ZhbCAmJiBCb29sZWFuKHBhcmFtcy5hZ2VudElkKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzID0gKHBhcmFtczoge1xuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUgfCB1bmRlZmluZWRcbiAgdXNlcklkOiBzdHJpbmdcbiAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgaXNMYXN0TWVzc2FnZTogYm9vbGVhblxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW5cbiAgaXNXcml0aW5nOiBib29sZWFuXG59KTogeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBib29sZWFuOyBpc1N0cmVhbWluZzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgaXNBc3Npc3RhbnQgPSBpc0Fzc2lzdGFudENoYXRNZXNzYWdlKHBhcmFtcy5yb2xlLCBwYXJhbXMudXNlcklkKVxuICBjb25zdCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID1cbiAgICBpc0Fzc2lzdGFudCAmJiBwYXJhbXMuaXNMYXN0TWVzc2FnZSAmJiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKHBhcmFtcy5tZXNzYWdlSWQpXG4gIHJldHVybiB7XG4gICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcixcbiAgICBpc1N0cmVhbWluZzogaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJiAocGFyYW1zLndhaXRpbmdSZXNwb25zZSB8fCBwYXJhbXMuaXNXcml0aW5nKSxcbiAgfVxufVxuXG50eXBlIFVzZXJNZXNzYWdlQXR0YWNobWVudHNTb3VyY2UgPSB7XG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBzb3VyY2VzPzogdW5rbm93blxufVxuXG5leHBvcnQgY29uc3QgY291bnRVc2VyTWVzc2FnZUF0dGFjaG1lbnRzID0gKG1lc3NhZ2U6IFVzZXJNZXNzYWdlQXR0YWNobWVudHNTb3VyY2UgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+IHtcbiAgaWYgKCFtZXNzYWdlKSByZXR1cm4gMFxuICBjb25zdCBhdHRhY2htZW50Q291bnQgPSBBcnJheS5pc0FycmF5KG1lc3NhZ2UuYXR0YWNobWVudHMpID8gbWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGggOiAwXG4gIGNvbnN0IHNvdXJjZUNvdW50ID0gQXJyYXkuaXNBcnJheShtZXNzYWdlLnNvdXJjZXMpID8gbWVzc2FnZS5zb3VyY2VzLmxlbmd0aCA6IDBcbiAgcmV0dXJuIGF0dGFjaG1lbnRDb3VudCB8fCBzb3VyY2VDb3VudFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkSWdub3JlU3VnZ2VzdGlvbkNsaWNrID0gKHN1Z2dlc3Rpb246IHN0cmluZywgYWxyZWFkeVNlbGVjdGVkOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICAhc3VnZ2VzdGlvbj8udHJpbSgpIHx8IGFscmVhZHlTZWxlY3RlZFxuXG5leHBvcnQgY29uc3QgaXNSZXRyeVN1Z2dlc3Rpb25TZWxlY3Rpb24gPSAoXG4gIGlzRXJyb3I6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHN1Z2dlc3Rpb246IHN0cmluZyxcbiAgcmV0cnlMYWJlbDogc3RyaW5nXG4pOiBib29sZWFuID0+IEJvb2xlYW4oaXNFcnJvciAmJiBzdWdnZXN0aW9uID09PSByZXRyeUxhYmVsKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2UgPSAodXNlck1lc3NhZ2U6IHtcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIHNvdXJjZXM/OiB1bmtub3duXG59KTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzKSkgcmV0dXJuIHVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzXG4gIGlmIChBcnJheS5pc0FycmF5KHVzZXJNZXNzYWdlLnNvdXJjZXMpKSByZXR1cm4gdXNlck1lc3NhZ2Uuc291cmNlcyBhcyBBdHRhY2htZW50RmlsZVtdXG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkT3Blbk1lc3NhZ2VPcHRpb24gPSAoc2VsZWN0ZWRPcHRpb246IHVua25vd24pOiBib29sZWFuID0+ICFzZWxlY3RlZE9wdGlvblxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSA9IChcbiAgZmlsZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmaWxlOiB1bmtub3duXG4pOiAncmVtb3RlLXVybCcgfCAnbG9jYWwtZmlsZScgfCBudWxsID0+IHtcbiAgaWYgKGZpbGVVcmwpIHJldHVybiAncmVtb3RlLXVybCdcbiAgaWYgKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSByZXR1cm4gJ2xvY2FsLWZpbGUnXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQgPSAobWVzc2FnZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgbWVzc2FnZUlkXG4gICAgLnNwbGl0KCctJylcbiAgICAuZmlsdGVyKHF1ZXN0aW9uSWQgPT4gcXVlc3Rpb25JZCAhPT0gJ2Fuc3dlcicpXG4gICAgLmpvaW4oJy0nKVxuXG5jb25zdCBBVURJT19FWFRFTlNJT05TID0gWycuZmxhYycsICcubTRhJywgJy5tcDMnLCAnLm1wNCcsICcub2dhJywgJy5vZ2cnLCAnLndhdicsICcud2VibSddIGFzIGNvbnN0XG5jb25zdCBBVURJT19UWVBFUyA9IFsnZmxhYycsICdtNGEnLCAnbXAzJywgJ21wNCcsICdvZ2EnLCAnb2dnJywgJ3dhdicsICd3ZWJtJ10gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzQXVkaW9BdHRhY2htZW50ID0gKGF0dGFjaG1lbnQ6IFBpY2s8QXR0YWNobWVudEZpbGUsICd0eXBlJyB8ICduYW1lJz4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Py50eXBlPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gIGNvbnN0IGF0dGFjaG1lbnROYW1lID0gYXR0YWNobWVudD8ubmFtZT8udG9Mb3dlckNhc2UoKSB8fCAnJ1xuXG4gIHJldHVybiAoXG4gICAgYXR0YWNobWVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykgfHxcbiAgICBBVURJT19UWVBFUy5pbmNsdWRlcyhhdHRhY2htZW50VHlwZSBhcyAodHlwZW9mIEFVRElPX1RZUEVTKVtudW1iZXJdKSB8fFxuICAgIEFVRElPX0VYVEVOU0lPTlMuc29tZShleHQgPT4gYXR0YWNobWVudE5hbWUuZW5kc1dpdGgoZXh0KSlcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3ID0gKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKTogYm9vbGVhbiA9PlxuICBhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gIGF0dGFjaG1lbnQub3JpZ2luYWxGaWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICBCb29sZWFuKGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCB8fCBhdHRhY2htZW50LnVybF9vcmlnaW5hbCB8fCBhdHRhY2htZW50LnVybF9maWxlKVxuXG5leHBvcnQgY29uc3QgZmluZExhc3RRdWVzdGlvbklkID0gKG1lc3NhZ2VzOiBBcnJheTx7IGlkPzogc3RyaW5nIH0+KTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGZvciAobGV0IGluZGV4ID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXggLT0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VzW2luZGV4XT8uaWRcbiAgICBpZiAobWVzc2FnZUlkPy5zdGFydHNXaXRoKCdxdWVzdGlvbi0nKSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2VJZFxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlID0gKGNsaWVudEhlaWdodDogbnVtYmVyLCB0dXJuSGVpZ2h0OiBudW1iZXIsIHZpZXdwb3J0SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBjb25zdCBvZmZzZXQgPSB0dXJuQW5jaG9yT2Zmc2V0KHZpZXdwb3J0SGVpZ2h0KVxuICByZXR1cm4gTWF0aC5tYXgoMCwgY2xpZW50SGVpZ2h0IC0gdHVybkhlaWdodCAtIG9mZnNldClcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMgPSAoXG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdIHwgdW5kZWZpbmVkLFxuICBpc0Fzc2lzdGFudDogYm9vbGVhbixcbiAgc291cmNlczogdW5rbm93blxuKTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnRzXG4gIH1cbiAgaWYgKCFpc0Fzc2lzdGFudCAmJiBBcnJheS5pc0FycmF5KHNvdXJjZXMpKSB7XG4gICAgcmV0dXJuIHNvdXJjZXMgYXMgQXR0YWNobWVudEZpbGVbXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lID0gKGF0dGFjaG1lbnQ6IFBpY2s8QXR0YWNobWVudEZpbGUsICduYW1lJyB8ICd0eXBlJz4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBhdHRhY2htZW50Lm5hbWUuaW5jbHVkZXMoJy4nKSA/ICcnIDogYC4ke2F0dGFjaG1lbnQudHlwZX1gXG4gIHJldHVybiBgJHthdHRhY2htZW50Lm5hbWV9JHtleHRlbnNpb259YFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCA9IChcbiAgYXR0YWNobWVudDogUGljazxBdHRhY2htZW50RmlsZSwgJ3VybF9vcmlnaW5hbCcgfCAndXJsX2ZpbGUnIHwgJ3VybF90aHVtYm5haWwnPlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIHx8IGF0dGFjaG1lbnQudXJsX2ZpbGUgfHwgYXR0YWNobWVudC51cmxfdGh1bWJuYWlsXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2UgPSAocGFyYW1zOiB7XG4gIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGJvb2xlYW5cbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbiAgYXR0YWNobWVudENvdW50OiBudW1iZXJcbiAgc291cmNlQ291bnQ6IG51bWJlclxuICBtZXNzYWdlVGV4dDogc3RyaW5nXG4gIHByb2plY3ROYW1lPzogc3RyaW5nXG4gIGhhc0FwcHJvdmFsOiBib29sZWFuXG59KTogYm9vbGVhbiA9PiB7XG4gIGlmIChwYXJhbXMuaXNTdHJlYW1pbmdQbGFjZWhvbGRlciB8fCBwYXJhbXMuaXNTdHJlYW1pbmcpIHJldHVybiBmYWxzZVxuICBpZiAocGFyYW1zLmF0dGFjaG1lbnRDb3VudCA+IDAgfHwgcGFyYW1zLnNvdXJjZUNvdW50ID4gMCkgcmV0dXJuIGZhbHNlXG4gIGlmIChwYXJhbXMubWVzc2FnZVRleHQpIHJldHVybiBmYWxzZVxuICBpZiAocGFyYW1zLnByb2plY3ROYW1lKSByZXR1cm4gZmFsc2VcbiAgaWYgKHBhcmFtcy5oYXNBcHByb3ZhbCkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwgPSAod2FzSGVscGZ1bDogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBGZWVkYmFjayB8IG51bGwgPT4ge1xuICBpZiAod2FzSGVscGZ1bCA9PT0gdW5kZWZpbmVkIHx8IHdhc0hlbHBmdWwgPT09IG51bGwpIHJldHVybiBudWxsXG4gIHJldHVybiB3YXNIZWxwZnVsID8gRmVlZGJhY2suVEhVTUJTX1VQIDogRmVlZGJhY2suVEhVTUJTX0RPV05cbn1cblxuZXhwb3J0IGNvbnN0IGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSA9IChwYXJhbXM6IHtcbiAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogYm9vbGVhblxuICBpc1N0cmVhbWluZzogYm9vbGVhblxuICBpc0Vycm9yOiBib29sZWFuXG4gIGhhc0FwcHJvdmFsOiBib29sZWFuXG4gIGlzRnJvbnRlbmRDYW5jZWxsZWQ/OiBib29sZWFuXG4gIGlzQ2FuY2VsbGVkPzogYm9vbGVhblxuICB0dXJuSWQ6IHN0cmluZyB8IG51bGxcbn0pOiBib29sZWFuID0+IHtcbiAgaWYgKCFwYXJhbXMuaGFzVXNlck1lc3NhZ2VGb3JSZXRyeSB8fCBwYXJhbXMuaXNTdHJlYW1pbmcgfHwgcGFyYW1zLmlzRXJyb3IgfHwgcGFyYW1zLmhhc0FwcHJvdmFsKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIEJvb2xlYW4ocGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgfHwgKCFwYXJhbXMuaXNDYW5jZWxsZWQgJiYgcGFyYW1zLnR1cm5JZCkpXG59XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlID0gKFxuICBzY3JvbGxIZWlnaHQ6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHNjcm9sbFRvcDogbnVtYmVyLFxuICBjdXJyZW50U3BhY2VySGVpZ2h0OiBudW1iZXJcbik6IG51bWJlciA9PiB7XG4gIGlmIChjdXJyZW50U3BhY2VySGVpZ2h0IDw9IDApIHJldHVybiBjdXJyZW50U3BhY2VySGVpZ2h0XG4gIGNvbnN0IHJlbW92YWJsZSA9IE1hdGgubWF4KDAsIHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCAtIHNjcm9sbFRvcClcbiAgcmV0dXJuIE1hdGgubWF4KDAsIGN1cnJlbnRTcGFjZXJIZWlnaHQgLSByZW1vdmFibGUpXG59XG5cbmV4cG9ydCB0eXBlIFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzID0ge1xuICBzdHJlYW1BZGFwdD86IGJvb2xlYW5cbiAgc3RyZWFtQnVmZmVyTXM/OiBudW1iZXJcbiAgc3RyZWFtTGFnTXM/OiBudW1iZXJcbiAgc3RyZWFtTWluQnVmZmVyPzogbnVtYmVyXG4gIHN0cmVhbVdhcm11cE1zPzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCByZWFkU21vb3RoU3RyZWFtV2luZG93RmxhZ3MgPSAoKTogU21vb3RoU3RyZWFtV2luZG93RmxhZ3MgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB7fVxuICByZXR1cm4gd2luZG93IGFzIHVua25vd24gYXMgU21vb3RoU3RyZWFtV2luZG93RmxhZ3Ncbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMgPSAoXG4gIGZsYWdzOiBTbW9vdGhTdHJlYW1XaW5kb3dGbGFncyxcbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbik6IHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICBtYXhDaGFyc1BlckZyYW1lOiBudW1iZXJcbiAgc25hcFRvV29yZEJvdW5kYXJ5OiBib29sZWFuXG4gIHRhcmdldExhZ01zPzogbnVtYmVyXG4gIGFkYXB0VG9CYWNrZW5kUmF0ZT86IGJvb2xlYW5cbiAgdGFyZ2V0QnVmZmVyTXM/OiBudW1iZXJcbiAgbWluQnVmZmVyQ2hhcnM/OiBudW1iZXJcbiAgd2FybXVwTXM/OiBudW1iZXJcbn0gPT4gKHtcbiAgZW5hYmxlZDogaXNTdHJlYW1pbmcsXG4gIG1heENoYXJzUGVyRnJhbWU6IDI0LFxuICBzbmFwVG9Xb3JkQm91bmRhcnk6IHRydWUsXG4gIC4uLihmbGFncy5zdHJlYW1MYWdNcyAhPSBudWxsICYmIHsgdGFyZ2V0TGFnTXM6IGZsYWdzLnN0cmVhbUxhZ01zIH0pLFxuICAuLi4oZmxhZ3Muc3RyZWFtQWRhcHQgIT0gbnVsbCAmJiB7IGFkYXB0VG9CYWNrZW5kUmF0ZTogZmxhZ3Muc3RyZWFtQWRhcHQgfSksXG4gIC4uLihmbGFncy5zdHJlYW1CdWZmZXJNcyAhPSBudWxsICYmIHsgdGFyZ2V0QnVmZmVyTXM6IGZsYWdzLnN0cmVhbUJ1ZmZlck1zIH0pLFxuICAuLi4oZmxhZ3Muc3RyZWFtTWluQnVmZmVyICE9IG51bGwgJiYgeyBtaW5CdWZmZXJDaGFyczogZmxhZ3Muc3RyZWFtTWluQnVmZmVyIH0pLFxuICAuLi4oZmxhZ3Muc3RyZWFtV2FybXVwTXMgIT0gbnVsbCAmJiB7IHdhcm11cE1zOiBmbGFncy5zdHJlYW1XYXJtdXBNcyB9KSxcbn0pXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtaW5nUmF3VGV4dCA9IChpc1N0cmVhbWluZzogYm9vbGVhbiwgc3RyZWFtaW5nVGV4dDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgaXNTdHJlYW1pbmcgPyBzdHJlYW1pbmdUZXh0IDogbWVzc2FnZVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzID0gKGhhc01lbnRpb25zOiBib29sZWFuLCBtZW50aW9uTm9kZXM6IHVua25vd24pOiBib29sZWFuID0+XG4gIEJvb2xlYW4oaGFzTWVudGlvbnMgJiYgbWVudGlvbk5vZGVzKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQgPSA8VFNvdXJjZXMsIFRIYW5kbGVyPihcbiAgaXNGcm9udGVuZENhbmNlbGxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgc291cmNlczogVFNvdXJjZXMsXG4gIGhhbmRsZUZlZWRiYWNrQ2xpY2s6IFRIYW5kbGVyXG4pOiB7IHNvdXJjZXM6IFRTb3VyY2VzIHwgdW5kZWZpbmVkOyBoYW5kbGVGZWVkYmFjazogVEhhbmRsZXIgfCB1bmRlZmluZWQgfSA9PiAoe1xuICBzb3VyY2VzOiBpc0Zyb250ZW5kQ2FuY2VsbGVkID8gdW5kZWZpbmVkIDogc291cmNlcyxcbiAgaGFuZGxlRmVlZGJhY2s6IGlzRnJvbnRlbmRDYW5jZWxsZWQgPyB1bmRlZmluZWQgOiBoYW5kbGVGZWVkYmFja0NsaWNrLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkID0gKGlzU3RyZWFtaW5nOiBib29sZWFuLCBtZXNzYWdlSWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT5cbiAgaXNTdHJlYW1pbmcgPyBtZXNzYWdlSWQgOiBudWxsXG5cbmV4cG9ydCBjb25zdCBzaG91bGRJbml0aWFsaXplQ2hhdCA9IChhbHJlYWR5SW5pdGlhbGl6ZWQ6IGJvb2xlYW4pOiBib29sZWFuID0+ICFhbHJlYWR5SW5pdGlhbGl6ZWRcblxuZXhwb3J0IGNvbnN0IHNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24gPSAobG9hZGluZ01lc3NhZ2VzOiBib29sZWFuKTogYm9vbGVhbiA9PiBsb2FkaW5nTWVzc2FnZXNcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24gPSAoXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhbixcbiAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzOiBib29sZWFuLFxuICBxdWVzdGlvbklkOiBzdHJpbmcgfCBudWxsLFxuICBsYXN0UmVzZXJ2ZWRRdWVzdGlvbklkOiBzdHJpbmcgfCBudWxsXG4pOiBib29sZWFuID0+ICFsb2FkaW5nTWVzc2FnZXMgJiYgIWlzTG9hZGluZ01vcmVNZXNzYWdlcyAmJiBCb29sZWFuKHF1ZXN0aW9uSWQpICYmIHF1ZXN0aW9uSWQgIT09IGxhc3RSZXNlcnZlZFF1ZXN0aW9uSWRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNraXBNZXNzYWdlc1Njcm9sbEVmZmVjdCA9IChcbiAgaGFzQ29udGFpbmVyOiBib29sZWFuLFxuICBsb2FkaW5nTWVzc2FnZXM6IGJvb2xlYW4sXG4gIGlzTG9hZGluZ01vcmVNZXNzYWdlczogYm9vbGVhbixcbiAgaXNMb2FkaW5nTW9yZVJlZjogYm9vbGVhblxuKTogYm9vbGVhbiA9PiAhaGFzQ29udGFpbmVyIHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZVJlZlxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tID0gKFxuICBjb250YWluZXI6IHsgc2Nyb2xsSGVpZ2h0OiBudW1iZXI7IHNjcm9sbFRvcDogbnVtYmVyOyBjbGllbnRIZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiA9PlxuICBjb250YWluZXIgPyBpc0NvbnRhaW5lckF0U2Nyb2xsQm90dG9tKGNvbnRhaW5lci5zY3JvbGxIZWlnaHQsIGNvbnRhaW5lci5zY3JvbGxUb3AsIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpIDogZmFsc2VcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tID0gKFxuICBsb2FkaW5nTWVzc2FnZXM6IGJvb2xlYW4sXG4gIGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG1lc3NhZ2VzTGVuZ3RoOiBudW1iZXIsXG4gIGxhc3RTY3JvbGxlZFNlc3Npb25JZDogc3RyaW5nIHwgbnVsbFxuKTogYm9vbGVhbiA9PlxuICAhbG9hZGluZ01lc3NhZ2VzICYmIEJvb2xlYW4oaW5pdGlhbENoYXRJZCkgJiYgbWVzc2FnZXNMZW5ndGggPiAwICYmIGxhc3RTY3JvbGxlZFNlc3Npb25JZCAhPT0gaW5pdGlhbENoYXRJZFxuXG5leHBvcnQgY29uc3QgZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzID0gKHdhc0xvYWRpbmc6IGJvb2xlYW4sIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgd2FzTG9hZGluZyAmJiAhbG9hZGluZ01lc3NhZ2VzXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTY3JvbGxUb0JvdHRvbUFmdGVyTG9hZCA9IChqdXN0RmluaXNoZWRMb2FkaW5nOiBib29sZWFuLCBtZXNzYWdlc0xlbmd0aDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBqdXN0RmluaXNoZWRMb2FkaW5nICYmIG1lc3NhZ2VzTGVuZ3RoID4gMFxuXG5leHBvcnQgY29uc3Qgc2hvdWxkVXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNPbkxvYWRFbmQgPSAobG9hZGluZ01lc3NhZ2VzOiBib29sZWFuKTogYm9vbGVhbiA9PiAhbG9hZGluZ01lc3NhZ2VzXG5cbmV4cG9ydCBjb25zdCBzaG91bGRDbGVhclNjcm9sbFJlc3RvcmVXaXRob3V0Q2hhdCA9IChpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiAhaW5pdGlhbENoYXRJZFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBlbmRpbmdTY3JvbGxUb3BGcm9tU2Vzc2lvbiA9IChcbiAgc2Vzc2lvbjogeyBzY3JvbGxTZXNzaW9uSWQ/OiBzdHJpbmc7IHNjcm9sbFRvcD86IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gIGlmICghaW5pdGlhbENoYXRJZCB8fCAhc2Vzc2lvbikgcmV0dXJuIG51bGxcbiAgaWYgKHNlc3Npb24uc2Nyb2xsU2Vzc2lvbklkID09PSBpbml0aWFsQ2hhdElkICYmIHR5cGVvZiBzZXNzaW9uLnNjcm9sbFRvcCA9PT0gJ251bWJlcicgJiYgc2Vzc2lvbi5zY3JvbGxUb3AgPiAwKSB7XG4gICAgcmV0dXJuIHNlc3Npb24uc2Nyb2xsVG9wXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUgPSAoXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhbixcbiAgcGVuZGluZ1Njcm9sbFRvcDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgaGFzQ29udGFpbmVyOiBib29sZWFuXG4pOiBib29sZWFuID0+ICFsb2FkaW5nTWVzc2FnZXMgJiYgcGVuZGluZ1Njcm9sbFRvcCAhPSBudWxsICYmIHBlbmRpbmdTY3JvbGxUb3AgPiAwICYmIGhhc0NvbnRhaW5lclxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UgPSAoXG4gIHByZXZpb3VzRXhwYW5kZWQ6IGJvb2xlYW4sXG4gIGV4cGFuZGVkOiBib29sZWFuLFxuICBoYXNDb250YWluZXI6IGJvb2xlYW5cbik6IGJvb2xlYW4gPT4gcHJldmlvdXNFeHBhbmRlZCAhPT0gZXhwYW5kZWQgJiYgaGFzQ29udGFpbmVyXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5ID0gKG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyKTogc3RyaW5nID0+XG4gIG1lc3NhZ2VJZCA/PyBgbXNnLSR7aW5kZXh9YFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgPSAoXG4gIGZvbGxvd1VwOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IGZvbGxvd1VwPy5hZ2VudElkXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCA9IChcbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW4sXG4gIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGJvb2xlYW4sXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4pOiBzdHJpbmcgfCBudWxsID0+IChpc1N0cmVhbWluZyB8fCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID8gbWVzc2FnZUlkIDogbnVsbClcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZWFzb25pbmdUcmFjZUhvb2tJZCA9IChpc0Fzc2lzdGFudDogYm9vbGVhbiwgaXNBY3RpdmVTdHJlYW1pbmc6IGJvb2xlYW4sIGlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgaXNBc3Npc3RhbnQgJiYgaXNBY3RpdmVTdHJlYW1pbmcgPyBpZCA6ICcnXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2Nyb2xsT25QYXJlbnRNb2RlID0gKGV4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiBCb29sZWFuKGV4cGFuZGVkKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUxhc3RVc2VyTWVzc2FnZUZvckF0dGFjaG1lbnRzID0gPFQgZXh0ZW5kcyB7IHJvbGU/OiBDaGF0SGlzdG9yeVJvbGU7IHVzZXI6IHsgaWQ6IHN0cmluZyB9IH0+KFxuICBtZXNzYWdlczogVFtdLFxuICBhdXRoVXNlcklkOiBzdHJpbmdcbik6IFQgfCB1bmRlZmluZWQgPT5cbiAgbWVzc2FnZXMuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VySWQudG9TdHJpbmcoKSkuYXQoLTEpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3VnZ2VzdGlvbkFuYWx5dGljc0FnZW50VHlwZSA9IChcbiAgaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50OiBib29sZWFuLFxuICBhZ2VudFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IChpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQgPyAnbWFya2V0cGxhY2UnIDogYWdlbnRUeXBlKVxuXG5leHBvcnQgdHlwZSBDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZUlucHV0ID0ge1xuICBzY3JvbGxUb3A6IG51bWJlclxuICBzY3JvbGxIZWlnaHQ6IG51bWJlclxuICBjbGllbnRIZWlnaHQ6IG51bWJlclxuICBsYXN0U2Nyb2xsVG9wOiBudW1iZXJcbiAgc2Nyb2xsVGhyZXNob2xkOiBudW1iZXJcbiAgYW5jaG9yZWRUdXJuSWQ6IHN0cmluZyB8IG51bGxcbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lID0gKGlucHV0OiBDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZUlucHV0KSA9PiB7XG4gIGNvbnN0IGlzU2Nyb2xsaW5nVXAgPSBpc1Njcm9sbGluZ1Vwd2FyZChpbnB1dC5zY3JvbGxUb3AsIGlucHV0Lmxhc3RTY3JvbGxUb3ApXG4gIGNvbnN0IGlzTmVhckJvdHRvbSA9IGlzTmVhclNjcm9sbEJvdHRvbShcbiAgICBpbnB1dC5zY3JvbGxIZWlnaHQsXG4gICAgaW5wdXQuc2Nyb2xsVG9wLFxuICAgIGlucHV0LmNsaWVudEhlaWdodCxcbiAgICBpbnB1dC5zY3JvbGxUaHJlc2hvbGRcbiAgKVxuICBjb25zdCBuZXh0U2Nyb2xsVGhyZXNob2xkID0gcmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQoaW5wdXQuc2Nyb2xsVGhyZXNob2xkLCBpc1Njcm9sbGluZ1VwLCBpc05lYXJCb3R0b20pXG5cbiAgcmV0dXJuIHtcbiAgICBuZXh0U2Nyb2xsVGhyZXNob2xkLFxuICAgIGxhc3RTY3JvbGxUb3A6IGlucHV0LnNjcm9sbFRvcCxcbiAgICBzaG91bGREcmFpblR1cm5TcGFjZTogc2hvdWxkRHJhaW5UdXJuU3BhY2VPblNjcm9sbChpbnB1dC5hbmNob3JlZFR1cm5JZCksXG4gICAgc2hvdWxkU2NoZWR1bGVTY3JvbGxQZXJzaXN0OiBzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsKGlucHV0LmluaXRpYWxDaGF0SWQsIGlucHV0LnNjcm9sbFRvcCksXG4gICAgc2hvdWxkTm90aWZ5U2Nyb2xsVG9Cb3R0b206IGlzTmVhckJvdHRvbSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0ID0gKHBhcmFtczoge1xuICBjb250YWluZXJUb3A6IG51bWJlclxuICBxdWVzdGlvblRvcDogbnVtYmVyXG4gIGNvbnRlbnRCb3R0b206IG51bWJlclxuICBzY3JvbGxUb3A6IG51bWJlclxufSk6IHsgcXVlc3Rpb25Ub3A6IG51bWJlcjsgdHVybkhlaWdodDogbnVtYmVyIH0gPT4ge1xuICBjb25zdCBxdWVzdGlvblNjcm9sbFRvcCA9IHBhcmFtcy5xdWVzdGlvblRvcCAtIHBhcmFtcy5jb250YWluZXJUb3AgKyBwYXJhbXMuc2Nyb2xsVG9wXG4gIGNvbnN0IGNvbnRlbnRCb3R0b21TY3JvbGwgPSBwYXJhbXMuY29udGVudEJvdHRvbSAtIHBhcmFtcy5jb250YWluZXJUb3AgKyBwYXJhbXMuc2Nyb2xsVG9wXG4gIHJldHVybiB7IHF1ZXN0aW9uVG9wOiBxdWVzdGlvblNjcm9sbFRvcCwgdHVybkhlaWdodDogY29udGVudEJvdHRvbVNjcm9sbCAtIHF1ZXN0aW9uU2Nyb2xsVG9wIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzZXJ2ZVR1cm5TcGFjZVBsYW4gPVxuICB7IGtpbmQ6ICdza2lwLXJlc2VydmF0aW9uJyB9IHwgeyBraW5kOiAncmVzZXJ2ZSc7IHNwYWNlckhlaWdodDogbnVtYmVyOyB0YXJnZXRTY3JvbGxUb3A6IG51bWJlciB9XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVzZXJ2ZVR1cm5TcGFjZVBsYW4gPSAocGFyYW1zOiB7XG4gIGN1cnJlbnRTY3JvbGxUb3A6IG51bWJlclxuICB0YXJnZXRTY3JvbGxUb3A6IG51bWJlclxuICBjbGllbnRIZWlnaHQ6IG51bWJlclxuICB0dXJuSGVpZ2h0OiBudW1iZXJcbn0pOiBSZXNlcnZlVHVyblNwYWNlUGxhbiA9PiB7XG4gIGlmIChzaG91bGRTa2lwVHVyblNwYWNlUmVzZXJ2YXRpb24ocGFyYW1zLmN1cnJlbnRTY3JvbGxUb3AsIHBhcmFtcy50YXJnZXRTY3JvbGxUb3ApKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ3NraXAtcmVzZXJ2YXRpb24nIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdyZXNlcnZlJyxcbiAgICBzcGFjZXJIZWlnaHQ6IGNvbXB1dGVSZXNlcnZlZFR1cm5TcGFjZShwYXJhbXMuY2xpZW50SGVpZ2h0LCBwYXJhbXMudHVybkhlaWdodCwgcGFyYW1zLmNsaWVudEhlaWdodCksXG4gICAgdGFyZ2V0U2Nyb2xsVG9wOiBwYXJhbXMudGFyZ2V0U2Nyb2xsVG9wLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2Nyb2xsVG9Cb3R0b21UYXJnZXRUb3AgPSAoc2Nyb2xsSGVpZ2h0OiBudW1iZXIsIGNsaWVu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