@projectcor/maia-components 2.50.1-2 → 2.51.1

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