@projectcor/maia-components 2.52.0 → 2.52.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App.js +44 -19
- package/lib/components/atoms/ActionableButton.spec.js +111 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +3 -1
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +3 -1
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +24 -14
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +28 -10
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +19 -15
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +169 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +8 -4
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
- package/lib/components/atoms/Chip/Chip.spec.js +82 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +15 -13
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.spec.js +107 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
- package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
- package/lib/components/atoms/Expand/Expand.spec.js +57 -0
- package/lib/components/atoms/Fade/Fade.js +10 -6
- package/lib/components/atoms/Fade/Fade.spec.js +66 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
- package/lib/components/atoms/HelpButton.spec.js +87 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +3 -2
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +3 -2
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +123 -99
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +719 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +9 -4
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
- package/lib/components/atoms/NextPageLoader.spec.js +37 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +4 -5
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
- package/lib/components/atoms/PrimaryButton.spec.js +42 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +25 -10
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +78 -43
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +37 -15
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
- package/lib/components/atoms/Switch/Switch.spec.js +41 -0
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
- package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
- package/lib/components/atoms/ThirdButton.spec.js +29 -0
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
- package/lib/components/atoms/WithAppCfg.spec.js +82 -0
- package/lib/components/index.js +2 -1
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +3 -2
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +780 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +6 -4
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +25 -16
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
- package/lib/components/molecules/AgentInputBlock/index.js +5 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +93 -72
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
- package/lib/components/molecules/ChatAIHome/styles.js +85 -78
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +967 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +30 -14
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +646 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
- package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +8 -1
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1395 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +23 -8
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1434 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +63 -367
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.js +69 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.spec.js +144 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentDropdown.js +95 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentSelector.js +174 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.js +99 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.spec.js +65 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
- package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
- package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
- package/lib/components/molecules/ChatAIMultipleChoice/ChatAIMultipleChoice.spec.js +102 -0
- package/lib/components/molecules/ChatAIMultipleChoice/ChatAIMultipleChoiceAnswer.spec.js +49 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +548 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +5 -2
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +526 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +217 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +291 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +284 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +343 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +197 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
- package/lib/components/organisms/ChatAIPage/index.js +3 -0
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
- package/lib/components/organisms/ProjectSummary/ProjectSummary.js +11 -7
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +4 -1
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
- package/lib/constants/formatExtensions.spec.js +15 -0
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
- package/lib/constants/maiaFeatureAccess.spec.js +30 -0
- package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
- package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
- package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +4 -1
- package/lib/constants/permissions/utils.spec.js +128 -0
- package/lib/constants/plannerSyncEvents.spec.js +31 -0
- package/lib/constants/taskUrls.spec.js +9 -0
- package/lib/dev/DevMaiaPage.js +30 -0
- package/lib/dev/DevReasoningTimeline.js +68 -37
- package/lib/dev/Providers.js +5 -3
- package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
- package/lib/hooks/useAgentModel/useUpdateAgent.js +7 -6
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
- package/lib/hooks/useAgentSuggestions.spec.js +89 -0
- package/lib/hooks/useCaretPosition.spec.js +58 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.js +3 -3
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
- package/lib/hooks/useChatManager/useChatManager.js +8 -7
- package/lib/hooks/useChatManager/useChatManager.spec.js +2467 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
- package/lib/hooks/useChats/useChats.spec.js +208 -0
- package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
- package/lib/hooks/useClientSearch.spec.js +86 -0
- package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
- package/lib/hooks/useContextMentions.spec.js +338 -0
- package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
- package/lib/hooks/useContextPinPopover.spec.js +159 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.spec.js +257 -0
- package/lib/hooks/useDebounce.spec.js +42 -0
- package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
- package/lib/hooks/useEntitySearch.js +3 -1
- package/lib/hooks/useEntitySearch.spec.js +718 -0
- package/lib/hooks/useEvent.spec.js +45 -0
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
- package/lib/hooks/useFrequentlyUsedActions.js +61 -22
- package/lib/hooks/useFrequentlyUsedActions.spec.js +293 -0
- package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
- package/lib/hooks/useKnowledge/downloadKnowledge.js +4 -4
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
- package/lib/hooks/useKnowledge/useKnowledgeOperations.js +16 -15
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
- package/lib/hooks/useLatestRef.spec.js +50 -0
- package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
- package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
- package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
- package/lib/hooks/useMentionPopover.spec.js +392 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
- package/lib/hooks/useModal/useModal.spec.js +73 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +485 -0
- package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
- package/lib/hooks/useProjectSearch.spec.js +91 -0
- package/lib/hooks/useProjectSummary.spec.js +193 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
- package/lib/hooks/useProjectSummaryConfig.js +10 -5
- package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
- package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
- package/lib/hooks/useRecentContexts.spec.js +139 -0
- package/lib/hooks/useResize.spec.js +37 -0
- package/lib/hooks/useSkillsCatalog.spec.js +88 -0
- package/lib/hooks/useSlashCommands.spec.js +139 -0
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
- package/lib/hooks/useStreamResponse.spec.js +199 -0
- package/lib/hooks/useT.spec.js +20 -0
- package/lib/hooks/useToggle.spec.js +33 -0
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
- package/lib/index.js +5 -2
- package/lib/lang/br/index.js +26 -1
- package/lib/lang/en/index.js +26 -1
- package/lib/lang/es/index.js +26 -1
- package/lib/lang/fr/index.js +26 -1
- package/lib/services/appcues.spec.js +37 -0
- package/lib/services/maia/Access/updateAccess.spec.js +137 -0
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +121 -0
- package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
- package/lib/services/maia/Agents/connectors.js +3 -1
- package/lib/services/maia/Agents/connectors.spec.js +496 -0
- package/lib/services/maia/Agents/createAgent.spec.js +55 -0
- package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
- package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
- package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
- package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
- package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
- package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
- package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +181 -0
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
- package/lib/services/maia/Chats/patchChat.spec.js +41 -0
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
- package/lib/services/maia/Knowledge/delete.spec.js +45 -0
- package/lib/services/maia/Knowledge/download.spec.js +78 -0
- package/lib/services/maia/Knowledge/save.spec.js +58 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +261 -0
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
- package/lib/services/maia/Skills/createSkill.spec.js +68 -0
- package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
- package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
- package/lib/services/maia/Skills/getSkills.spec.js +152 -0
- package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
- package/lib/services/maia/client.spec.js +56 -0
- package/lib/services/utils/fetchCOR.spec.js +211 -0
- package/lib/services/utils/getCookie.spec.js +20 -0
- package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
- package/lib/services/utils/mapChatMessages.multipleChoice.spec.js +87 -0
- package/lib/services/utils/mapChatMessages.spec.js +254 -0
- package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
- package/lib/store/maiaLastChatPersistence.spec.js +22 -0
- package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
- package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
- package/lib/store/sessions/sessionNotifications.spec.js +106 -0
- package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
- package/lib/store/sessions/sessionStreamManager.js +51 -55
- package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
- package/lib/store/sessions/sessions.types.spec.js +16 -0
- package/lib/store/sessions/useSessionsStore.spec.js +135 -0
- package/lib/store/useChatsStore.js +4 -3
- package/lib/store/useChatsStore.spec.js +690 -0
- package/lib/store/useFaqsStore.spec.js +57 -0
- package/lib/store/useMultipleChoiceStore.spec.js +44 -0
- package/lib/styles/cascade.js +29 -3
- package/lib/styles/transitions.js +3 -1
- package/lib/types/global.d.js +1 -1
- package/lib/utils/actionCategoryMap.spec.js +18 -0
- package/lib/utils/agentDisplayName.spec.js +48 -0
- package/lib/utils/autoApproveStorage.spec.js +25 -0
- package/lib/utils/chatInputFiles.spec.js +39 -0
- package/lib/utils/contextMentionIcons.spec.js +41 -0
- package/lib/utils/contextMentionLabel.spec.js +13 -0
- package/lib/utils/contextMentionTriggers.spec.js +44 -0
- package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
- package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
- package/lib/utils/entityLinkRender.spec.js +72 -0
- package/lib/utils/fileDownloadHelper.spec.js +67 -0
- package/lib/utils/formatQuickActionMessage.spec.js +27 -0
- package/lib/utils/formatUnreadCount.spec.js +12 -0
- package/lib/utils/getUnitFileSize.spec.js +18 -0
- package/lib/utils/hitlAnalytics.spec.js +136 -0
- package/lib/utils/hoursPlannerQuickActionType.js +116 -1
- package/lib/utils/hoursPlannerQuickActionType.spec.js +124 -0
- package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
- package/lib/utils/imagePreprocessor.js +14 -3
- package/lib/utils/imagePreprocessor.spec.js +112 -0
- package/lib/utils/maiaPageRoute.spec.js +23 -0
- package/lib/utils/mapBackendLang.spec.js +19 -0
- package/lib/utils/navigateContextEntity.js +2 -2
- package/lib/utils/navigateContextEntity.spec.js +50 -0
- package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
- package/lib/utils/openTaskInCorPanel.js +2 -2
- package/lib/utils/openTaskInCorPanel.spec.js +43 -0
- package/lib/utils/orchestratorSubagents.spec.js +32 -0
- package/lib/utils/reasoningMappers.spec.js +103 -0
- package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
- package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
- package/lib/utils/renderContextMentions.spec.js +268 -0
- package/lib/utils/retryCompletion.spec.js +181 -0
- package/lib/utils/skillContentSize.spec.js +13 -0
- package/lib/utils/slashCommandMarker.spec.js +43 -0
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
- package/lib/utils/sseStreamContent.spec.js +31 -0
- package/lib/utils/streamActivityMessages.helpers.js +5 -4
- package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
- package/lib/utils/streamActivityMessages.js +32 -20
- package/lib/utils/streamActivityMessages.spec.js +336 -0
- package/lib/utils/validateTrimmedFields.spec.js +26 -0
- package/package.json +1 -1
- package/README.md +0 -2
|
@@ -0,0 +1,967 @@
|
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
var _excluded = ["multipleChoiceAnswer"];
|
|
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 { Feedback } from '../MessageFeedback/MessageFeedback';
|
|
7
|
+
import { ChatHistoryRole } from '../../../types/Chat';
|
|
8
|
+
import { canOpenAttachmentPreview, canRetryAssistantMessage, computeDistanceFromBottom, computeRemovableTurnSpace, computeReservedTurnSpace, computeSyncedTurnSpacerHeight, computeTurnScrollDurationMs, computeTurnScrollTargetTop, countUserMessageAttachments, easeOutExpoScrollProgress, extractFeedbackSessionId, findLastQuestionId, hasInitialUserMessageInList, hasMessageLevelStreamIndicator, isActiveStreamingState, isAnswerOrQuestionChatMessageId, isApprovalChatMessage, isAssistantChatMessage, isAudioAttachment, isContainerAtScrollBottom, isCurrentUserMessage, isNearScrollBottom, isNewChatMessageEvent, isRetrySuggestionSelection, isScrollingUpward, resolveAttachmentDownloadBlobStrategy, resolveAttachmentDownloadFileName, resolveAttachmentDownloadUrl, resolveChatListItemStreamingFlags, resolveDisableFeedbackFromWasHelpful, resolveMessageAttachments, resolveRetryAttachmentsFromUserMessage, resolveScrollNearBottomThreshold, shouldAutoScrollOnMessagesChange, shouldDrainTurnSpaceOnScroll, shouldHideAssistantSuggestions, shouldHideEmptyStreamingBody, extractMultipleChoiceQuestion, isSamePendingMultipleChoice, resolvePendingMultipleChoice, resolveAnsweredMultipleChoices, resolveTurnAnchorId, shouldIgnoreSuggestionClick, shouldOpenMessageOption, shouldPersistMaiaPanelScroll, shouldReleaseTurnSpace, shouldRenderAssistantFeedback, shouldRenderAssistantSuggestions, shouldRenderChangeProjectMessage, shouldRenderCreateAgentActions, shouldRenderMessageTextBody, shouldRunStreamTurnSyncEffect, shouldShowApprovalActions, shouldShowBottomScrollGradient, shouldShowGlobalStreamLoadingIndicator, shouldShowMessageAttachmentsRow, shouldShowScrollToBottom, shouldShowStreamActivityIndicator, shouldShowStreamingMessageBody, shouldShowTopScrollGradient, shouldSkipEmptyChatListMessage, shouldSkipTurnScrollAnimation, shouldSkipTurnSpaceReservation, shouldUpdateSpacerHeight, turnAnchorOffset, buildSmoothStreamTextOptions, computeMeasureTurnLayout, detectJustFinishedLoadingMessages, processChatMessagesScrollFrame, readSmoothStreamWindowFlags, resolveContainerAtBottom, resolveStreamingMessageHookId, resolveCreateAgentActionsAgentId, resolveLastUserMessageForAttachments, resolveFeedbackPropsForCancelled, resolveReserveTurnSpacePlan, resolveScrollToBottomTargetTop, resolveMessageListItemKey, resolvePendingScrollTopFromSession, resolveReasoningTraceHookId, resolveScrollOnParentMode, resolveStreamingRawText, resolveStreamingTextHookId, resolveSuggestionAnalyticsAgentType, shouldApplyPendingScrollRestore, shouldClearLastReservedQuestion, shouldClearScrollRestoreWithoutChat, shouldInitializeChat, shouldRenderMentionInlineNodes, shouldRestoreScrollOnExpandedChange, shouldRunSessionCacheScrollToBottom, shouldScheduleTurnSpaceReservation, shouldScrollToBottomAfterLoad, shouldSkipMessagesScrollEffect, shouldUpdateScrollAffordancesOnLoadEnd } from './ChatAIMessages.helpers';
|
|
9
|
+
describe('ChatAIMessages.helpers', function () {
|
|
10
|
+
describe('turnAnchorOffset', function () {
|
|
11
|
+
it('caps the offset at 200px', function () {
|
|
12
|
+
expect(turnAnchorOffset(500)).toBe(90);
|
|
13
|
+
expect(turnAnchorOffset(2000)).toBe(200);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('computeTurnScrollDurationMs', function () {
|
|
17
|
+
it('scales duration with scroll distance', function () {
|
|
18
|
+
expect(computeTurnScrollDurationMs(0)).toBe(600);
|
|
19
|
+
expect(computeTurnScrollDurationMs(1200)).toBe(800);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('scroll affordances', function () {
|
|
23
|
+
it('computes distance from bottom excluding spacer height', function () {
|
|
24
|
+
expect(computeDistanceFromBottom(1000, 200, 300, 400)).toBe(100);
|
|
25
|
+
});
|
|
26
|
+
it('shows the scroll button only when far enough from the bottom', function () {
|
|
27
|
+
expect(shouldShowScrollToBottom(60)).toBe(true);
|
|
28
|
+
expect(shouldShowScrollToBottom(20)).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
it('toggles top and bottom scroll gradients past the threshold', function () {
|
|
31
|
+
expect(shouldShowTopScrollGradient(0)).toBe(false);
|
|
32
|
+
expect(shouldShowTopScrollGradient(2)).toBe(true);
|
|
33
|
+
expect(shouldShowBottomScrollGradient(0)).toBe(false);
|
|
34
|
+
expect(shouldShowBottomScrollGradient(5)).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it('detects upward scroll and near-bottom with adaptive threshold', function () {
|
|
37
|
+
expect(isScrollingUpward(10, 20)).toBe(true);
|
|
38
|
+
expect(isNearScrollBottom(500, 400, 100, 50)).toBe(true);
|
|
39
|
+
expect(resolveScrollNearBottomThreshold(39, true, false)).toBe(15);
|
|
40
|
+
expect(resolveScrollNearBottomThreshold(15, false, true)).toBe(39);
|
|
41
|
+
expect(resolveScrollNearBottomThreshold(25, false, false)).toBe(25);
|
|
42
|
+
});
|
|
43
|
+
it('skips tiny turn scroll animations and eases progress', function () {
|
|
44
|
+
expect(shouldSkipTurnScrollAnimation(0.5)).toBe(true);
|
|
45
|
+
expect(shouldSkipTurnScrollAnimation(10)).toBe(false);
|
|
46
|
+
expect(easeOutExpoScrollProgress(1)).toBe(1);
|
|
47
|
+
expect(easeOutExpoScrollProgress(0)).toBe(0);
|
|
48
|
+
});
|
|
49
|
+
it('computes turn scroll targets and reservation skips', function () {
|
|
50
|
+
expect(computeTurnScrollTargetTop(300, 500)).toBe(210);
|
|
51
|
+
expect(shouldSkipTurnSpaceReservation(100, 50)).toBe(true);
|
|
52
|
+
expect(shouldSkipTurnSpaceReservation(50, 100)).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('updates spacer height only when the delta is meaningful', function () {
|
|
55
|
+
expect(shouldUpdateSpacerHeight(100, 100.5)).toBe(false);
|
|
56
|
+
expect(shouldUpdateSpacerHeight(100, 102)).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it('syncs turn spacer height without growing reserved space', function () {
|
|
59
|
+
expect(computeSyncedTurnSpacerHeight(800, 600, 200)).toBe(56);
|
|
60
|
+
expect(computeSyncedTurnSpacerHeight(800, 600, 40)).toBe(40);
|
|
61
|
+
});
|
|
62
|
+
it('drains or releases turn space based on anchor state', function () {
|
|
63
|
+
expect(shouldDrainTurnSpaceOnScroll(null)).toBe(true);
|
|
64
|
+
expect(shouldDrainTurnSpaceOnScroll('question-1')).toBe(false);
|
|
65
|
+
expect(shouldReleaseTurnSpace(null, 0)).toBe(false);
|
|
66
|
+
expect(shouldReleaseTurnSpace('question-1', 0)).toBe(true);
|
|
67
|
+
expect(shouldReleaseTurnSpace(null, 50)).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('persists panel scroll only for active sessions scrolled away from top', function () {
|
|
70
|
+
expect(shouldPersistMaiaPanelScroll('chat-1', 10)).toBe(true);
|
|
71
|
+
expect(shouldPersistMaiaPanelScroll('chat-1', 0)).toBe(false);
|
|
72
|
+
expect(shouldPersistMaiaPanelScroll(null, 10)).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
it('detects bottom alignment with tolerance', function () {
|
|
75
|
+
expect(isContainerAtScrollBottom(1000, 900, 100)).toBe(true);
|
|
76
|
+
expect(isContainerAtScrollBottom(1000, 700, 100)).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('message list scroll decisions', function () {
|
|
80
|
+
it('detects new message events', function () {
|
|
81
|
+
expect(isNewChatMessageEvent('a', 'a', 3, 3)).toBe(false);
|
|
82
|
+
expect(isNewChatMessageEvent('b', 'a', 3, 3)).toBe(true);
|
|
83
|
+
expect(isNewChatMessageEvent('a', 'a', 4, 3)).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it('classifies approval and answer/question ids', function () {
|
|
86
|
+
expect(isApprovalChatMessage({
|
|
87
|
+
id: 'approval-1'
|
|
88
|
+
})).toBe(true);
|
|
89
|
+
expect(isApprovalChatMessage({
|
|
90
|
+
id: 'answer-1',
|
|
91
|
+
approval: {}
|
|
92
|
+
})).toBe(true);
|
|
93
|
+
expect(isApprovalChatMessage({
|
|
94
|
+
id: 'answer-1'
|
|
95
|
+
})).toBe(false);
|
|
96
|
+
expect(isAnswerOrQuestionChatMessageId('question-9')).toBe(true);
|
|
97
|
+
expect(isAnswerOrQuestionChatMessageId('other')).toBe(false);
|
|
98
|
+
});
|
|
99
|
+
it('finds the initial user message marker', function () {
|
|
100
|
+
expect(hasInitialUserMessageInList([{
|
|
101
|
+
id: 'user-initial-message'
|
|
102
|
+
}])).toBe(true);
|
|
103
|
+
expect(hasInitialUserMessageInList([{
|
|
104
|
+
id: 'question-1'
|
|
105
|
+
}])).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
it('returns scroll, sync-turn or affordances-only', function () {
|
|
108
|
+
expect(shouldAutoScrollOnMessagesChange({
|
|
109
|
+
isNewMessage: false,
|
|
110
|
+
anchoredTurnId: null,
|
|
111
|
+
waitingResponse: false,
|
|
112
|
+
isWriting: false,
|
|
113
|
+
isAtBottom: true,
|
|
114
|
+
isAnswerOrQuestion: true,
|
|
115
|
+
isApproval: false,
|
|
116
|
+
hasInitialMessage: false,
|
|
117
|
+
messagesLength: 2,
|
|
118
|
+
prevMessagesLength: 2
|
|
119
|
+
})).toBe('affordances-only');
|
|
120
|
+
expect(shouldAutoScrollOnMessagesChange({
|
|
121
|
+
isNewMessage: true,
|
|
122
|
+
anchoredTurnId: 'question-1',
|
|
123
|
+
waitingResponse: false,
|
|
124
|
+
isWriting: false,
|
|
125
|
+
isAtBottom: false,
|
|
126
|
+
isAnswerOrQuestion: false,
|
|
127
|
+
isApproval: false,
|
|
128
|
+
hasInitialMessage: false,
|
|
129
|
+
messagesLength: 3,
|
|
130
|
+
prevMessagesLength: 2
|
|
131
|
+
})).toBe('sync-turn');
|
|
132
|
+
expect(shouldAutoScrollOnMessagesChange({
|
|
133
|
+
isNewMessage: true,
|
|
134
|
+
anchoredTurnId: null,
|
|
135
|
+
waitingResponse: true,
|
|
136
|
+
isWriting: false,
|
|
137
|
+
isAtBottom: true,
|
|
138
|
+
isAnswerOrQuestion: true,
|
|
139
|
+
isApproval: false,
|
|
140
|
+
hasInitialMessage: false,
|
|
141
|
+
messagesLength: 3,
|
|
142
|
+
prevMessagesLength: 2
|
|
143
|
+
})).toBe('affordances-only');
|
|
144
|
+
expect(shouldAutoScrollOnMessagesChange({
|
|
145
|
+
isNewMessage: true,
|
|
146
|
+
anchoredTurnId: null,
|
|
147
|
+
waitingResponse: false,
|
|
148
|
+
isWriting: false,
|
|
149
|
+
isAtBottom: true,
|
|
150
|
+
isAnswerOrQuestion: true,
|
|
151
|
+
isApproval: false,
|
|
152
|
+
hasInitialMessage: false,
|
|
153
|
+
messagesLength: 3,
|
|
154
|
+
prevMessagesLength: 2
|
|
155
|
+
})).toBe('scroll');
|
|
156
|
+
expect(shouldAutoScrollOnMessagesChange({
|
|
157
|
+
isNewMessage: true,
|
|
158
|
+
anchoredTurnId: null,
|
|
159
|
+
waitingResponse: false,
|
|
160
|
+
isWriting: false,
|
|
161
|
+
isAtBottom: false,
|
|
162
|
+
isAnswerOrQuestion: false,
|
|
163
|
+
isApproval: false,
|
|
164
|
+
hasInitialMessage: false,
|
|
165
|
+
messagesLength: 4,
|
|
166
|
+
prevMessagesLength: 3
|
|
167
|
+
})).toBe('scroll');
|
|
168
|
+
});
|
|
169
|
+
it('controls stream sync and global loading indicators', function () {
|
|
170
|
+
expect(shouldRunStreamTurnSyncEffect(false, false)).toBe(false);
|
|
171
|
+
expect(shouldRunStreamTurnSyncEffect(true, false)).toBe(true);
|
|
172
|
+
expect(hasMessageLevelStreamIndicator('answer-turn-1-streaming', true, false)).toBe(true);
|
|
173
|
+
expect(hasMessageLevelStreamIndicator('answer-1', true, false)).toBe(false);
|
|
174
|
+
expect(shouldShowGlobalStreamLoadingIndicator(false, {
|
|
175
|
+
type: 'writing'
|
|
176
|
+
})).toBe(true);
|
|
177
|
+
expect(shouldShowGlobalStreamLoadingIndicator(true, {
|
|
178
|
+
type: 'writing'
|
|
179
|
+
})).toBe(false);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('message item rendering guards', function () {
|
|
183
|
+
it('resolves user and assistant roles', function () {
|
|
184
|
+
expect(isCurrentUserMessage(ChatHistoryRole.USER, '9', '9')).toBe(true);
|
|
185
|
+
expect(isCurrentUserMessage(ChatHistoryRole.ASSISTANT, '1', '1')).toBe(true);
|
|
186
|
+
expect(isAssistantChatMessage(ChatHistoryRole.ASSISTANT, 'assistant')).toBe(true);
|
|
187
|
+
expect(isAssistantChatMessage(ChatHistoryRole.USER, 'assistant')).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
it('derives streaming body and activity indicator flags', function () {
|
|
190
|
+
expect(isActiveStreamingState(false, true)).toBe(true);
|
|
191
|
+
expect(shouldShowStreamingMessageBody(true, true, false)).toBe(true);
|
|
192
|
+
expect(shouldShowStreamingMessageBody(true, true, true)).toBe(false);
|
|
193
|
+
expect(shouldShowStreamActivityIndicator(true, true, {
|
|
194
|
+
type: 'writing'
|
|
195
|
+
})).toBe(true);
|
|
196
|
+
expect(shouldShowStreamActivityIndicator(false, true, {
|
|
197
|
+
type: 'writing'
|
|
198
|
+
})).toBe(false);
|
|
199
|
+
});
|
|
200
|
+
it('guards change-project, attachments, text body and approval UI', function () {
|
|
201
|
+
expect(shouldRenderChangeProjectMessage(true, [{
|
|
202
|
+
id: 1
|
|
203
|
+
}])).toBe(true);
|
|
204
|
+
expect(shouldRenderChangeProjectMessage(true, null)).toBe(false);
|
|
205
|
+
expect(shouldShowMessageAttachmentsRow(0)).toBe(false);
|
|
206
|
+
expect(shouldShowMessageAttachmentsRow(2)).toBe(true);
|
|
207
|
+
expect(shouldRenderMessageTextBody({
|
|
208
|
+
messageText: '',
|
|
209
|
+
showStreamingBody: true,
|
|
210
|
+
isAssistant: true,
|
|
211
|
+
attachmentCount: 1
|
|
212
|
+
})).toBe(false);
|
|
213
|
+
expect(shouldRenderMessageTextBody({
|
|
214
|
+
messageText: 'hola',
|
|
215
|
+
showStreamingBody: false,
|
|
216
|
+
isAssistant: false,
|
|
217
|
+
attachmentCount: 0
|
|
218
|
+
})).toBe(true);
|
|
219
|
+
expect(shouldShowApprovalActions({
|
|
220
|
+
pending_actions: []
|
|
221
|
+
})).toBe(true);
|
|
222
|
+
expect(shouldShowApprovalActions({})).toBe(false);
|
|
223
|
+
});
|
|
224
|
+
it('hides empty streaming bodies and controls assistant chrome', function () {
|
|
225
|
+
expect(shouldHideEmptyStreamingBody('', false)).toBe(true);
|
|
226
|
+
expect(shouldHideEmptyStreamingBody('', true)).toBe(false);
|
|
227
|
+
expect(shouldRenderAssistantFeedback({
|
|
228
|
+
isAssistant: true,
|
|
229
|
+
isError: false,
|
|
230
|
+
isStreaming: false,
|
|
231
|
+
isFrontendCancelled: true,
|
|
232
|
+
onRetry: function onRetry() {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
})).toBe(true);
|
|
236
|
+
expect(shouldRenderAssistantFeedback({
|
|
237
|
+
isAssistant: true,
|
|
238
|
+
isError: true,
|
|
239
|
+
isStreaming: false
|
|
240
|
+
})).toBe(false);
|
|
241
|
+
expect(shouldRenderAssistantSuggestions({
|
|
242
|
+
isAssistant: true,
|
|
243
|
+
isError: true,
|
|
244
|
+
suggestionsLength: 2
|
|
245
|
+
})).toBe(true);
|
|
246
|
+
expect(shouldRenderAssistantSuggestions({
|
|
247
|
+
isAssistant: true,
|
|
248
|
+
isError: true,
|
|
249
|
+
suggestionsLength: 0
|
|
250
|
+
})).toBe(false);
|
|
251
|
+
expect(shouldHideAssistantSuggestions(true, true, false)).toBe(true);
|
|
252
|
+
expect(shouldHideAssistantSuggestions(false, false, false)).toBe(true);
|
|
253
|
+
expect(shouldRenderCreateAgentActions({
|
|
254
|
+
isAssistant: true,
|
|
255
|
+
agentId: 'agent-1'
|
|
256
|
+
})).toBe(true);
|
|
257
|
+
});
|
|
258
|
+
it('keeps a blocking choice and optional suggestions mutually exclusive', function () {
|
|
259
|
+
var multipleChoice = {
|
|
260
|
+
options: [{
|
|
261
|
+
key: 'A',
|
|
262
|
+
text: 'Sitio web'
|
|
263
|
+
}]
|
|
264
|
+
};
|
|
265
|
+
var assistant = {
|
|
266
|
+
isAssistant: true,
|
|
267
|
+
suggestionsLength: 2
|
|
268
|
+
};
|
|
269
|
+
expect(shouldRenderAssistantSuggestions(assistant)).toBe(true);
|
|
270
|
+
expect(shouldRenderAssistantSuggestions(_objectSpread(_objectSpread({}, assistant), {}, {
|
|
271
|
+
multipleChoice: multipleChoice
|
|
272
|
+
}))).toBe(false);
|
|
273
|
+
expect(shouldRenderAssistantSuggestions(_objectSpread(_objectSpread({}, assistant), {}, {
|
|
274
|
+
multipleChoice: null
|
|
275
|
+
}))).toBe(true);
|
|
276
|
+
});
|
|
277
|
+
it('extracts the last question line of the assistant prose', function () {
|
|
278
|
+
expect(extractMultipleChoiceQuestion('Encontré 3 proyectos.\n\n**¿En cuál la creo?**')).toBe('¿En cuál la creo?');
|
|
279
|
+
expect(extractMultipleChoiceQuestion('¿Primero?\nTexto\n- ¿Segundo?')).toBe('¿Segundo?');
|
|
280
|
+
expect(extractMultipleChoiceQuestion('Elegí una opción.')).toBeNull();
|
|
281
|
+
expect(extractMultipleChoiceQuestion(undefined)).toBeNull();
|
|
282
|
+
});
|
|
283
|
+
describe('resolvePendingMultipleChoice', function () {
|
|
284
|
+
var options = [{
|
|
285
|
+
key: 'A',
|
|
286
|
+
text: 'Proyecto Alfa'
|
|
287
|
+
}, {
|
|
288
|
+
key: 'B',
|
|
289
|
+
text: 'Proyecto Beta'
|
|
290
|
+
}];
|
|
291
|
+
var assistant = {
|
|
292
|
+
id: 'assistant-1',
|
|
293
|
+
message: 'Hay dos.\n¿En qué proyecto la creo?',
|
|
294
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
295
|
+
user: {
|
|
296
|
+
id: 'assistant'
|
|
297
|
+
},
|
|
298
|
+
multipleChoice: {
|
|
299
|
+
options: options
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
var user = {
|
|
303
|
+
id: 'user-1',
|
|
304
|
+
message: 'Alfa',
|
|
305
|
+
role: ChatHistoryRole.USER,
|
|
306
|
+
user: {
|
|
307
|
+
id: '42'
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
var resolve = function resolve() {
|
|
311
|
+
var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
312
|
+
return resolvePendingMultipleChoice(_objectSpread({
|
|
313
|
+
messages: [assistant],
|
|
314
|
+
isStreaming: false,
|
|
315
|
+
dismissedMessageIds: {}
|
|
316
|
+
}, overrides));
|
|
317
|
+
};
|
|
318
|
+
it('returns the choice of the last assistant message', function () {
|
|
319
|
+
expect(resolve()).toEqual({
|
|
320
|
+
messageId: 'assistant-1',
|
|
321
|
+
question: '¿En qué proyecto la creo?',
|
|
322
|
+
options: options
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
it('returns null once the conversation moved on, while streaming or when dismissed', function () {
|
|
326
|
+
expect(resolve({
|
|
327
|
+
messages: [assistant, user]
|
|
328
|
+
})).toBeNull();
|
|
329
|
+
expect(resolve({
|
|
330
|
+
isStreaming: true
|
|
331
|
+
})).toBeNull();
|
|
332
|
+
expect(resolve({
|
|
333
|
+
dismissedMessageIds: {
|
|
334
|
+
'assistant-1': true
|
|
335
|
+
}
|
|
336
|
+
})).toBeNull();
|
|
337
|
+
});
|
|
338
|
+
it('returns null for errored, cancelled, approval or single-option messages', function () {
|
|
339
|
+
expect(resolve({
|
|
340
|
+
messages: [_objectSpread(_objectSpread({}, assistant), {}, {
|
|
341
|
+
isError: true
|
|
342
|
+
})]
|
|
343
|
+
})).toBeNull();
|
|
344
|
+
expect(resolve({
|
|
345
|
+
messages: [_objectSpread(_objectSpread({}, assistant), {}, {
|
|
346
|
+
isFrontendCancelled: true
|
|
347
|
+
})]
|
|
348
|
+
})).toBeNull();
|
|
349
|
+
expect(resolve({
|
|
350
|
+
messages: [_objectSpread(_objectSpread({}, assistant), {}, {
|
|
351
|
+
approval: {}
|
|
352
|
+
})]
|
|
353
|
+
})).toBeNull();
|
|
354
|
+
expect(resolve({
|
|
355
|
+
messages: [_objectSpread(_objectSpread({}, assistant), {}, {
|
|
356
|
+
multipleChoice: {
|
|
357
|
+
options: [options[0]]
|
|
358
|
+
}
|
|
359
|
+
})]
|
|
360
|
+
})).toBeNull();
|
|
361
|
+
expect(resolve({
|
|
362
|
+
messages: [_objectSpread(_objectSpread({}, assistant), {}, {
|
|
363
|
+
multipleChoice: null
|
|
364
|
+
})]
|
|
365
|
+
})).toBeNull();
|
|
366
|
+
});
|
|
367
|
+
it('compares pending choices by message, question and options identity', function () {
|
|
368
|
+
var pending = resolve();
|
|
369
|
+
expect(isSamePendingMultipleChoice(pending, resolve())).toBe(true);
|
|
370
|
+
expect(isSamePendingMultipleChoice(pending, null)).toBe(false);
|
|
371
|
+
expect(isSamePendingMultipleChoice(null, null)).toBe(true);
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
describe('resolveAnsweredMultipleChoices', function () {
|
|
375
|
+
var assistant = {
|
|
376
|
+
id: 'assistant-1',
|
|
377
|
+
message: '¿En qué proyecto la creo?',
|
|
378
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
379
|
+
user: {
|
|
380
|
+
id: 'assistant'
|
|
381
|
+
},
|
|
382
|
+
multipleChoice: {
|
|
383
|
+
options: [{
|
|
384
|
+
key: 'A',
|
|
385
|
+
text: 'Proyecto Alfa',
|
|
386
|
+
description: 'Equipo de producto'
|
|
387
|
+
}, {
|
|
388
|
+
key: 'B',
|
|
389
|
+
text: 'Proyecto Beta'
|
|
390
|
+
}]
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
var reply = function reply(message, key) {
|
|
394
|
+
return {
|
|
395
|
+
id: 'user-1',
|
|
396
|
+
message: message,
|
|
397
|
+
role: ChatHistoryRole.USER,
|
|
398
|
+
user: {
|
|
399
|
+
id: '42'
|
|
400
|
+
},
|
|
401
|
+
multipleChoiceAnswer: {
|
|
402
|
+
key: key
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
};
|
|
406
|
+
it('resolves a chosen option with its number and description and hides the user bubble', function () {
|
|
407
|
+
expect(resolveAnsweredMultipleChoices([assistant, reply('Proyecto Alfa', 'A')])).toEqual({
|
|
408
|
+
answers: {
|
|
409
|
+
'assistant-1': {
|
|
410
|
+
number: 1,
|
|
411
|
+
text: 'Proyecto Alfa',
|
|
412
|
+
description: 'Equipo de producto'
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
hiddenMessageIds: {
|
|
416
|
+
'user-1': true
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
it('resolves a typed answer, or an unknown key, with the text the user sent', function () {
|
|
421
|
+
expect(resolveAnsweredMultipleChoices([assistant, reply(' Otro proyecto ', null)]).answers).toEqual({
|
|
422
|
+
'assistant-1': {
|
|
423
|
+
number: null,
|
|
424
|
+
text: 'Otro proyecto'
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
expect(resolveAnsweredMultipleChoices([assistant, reply('Gamma', 'Z')]).answers['assistant-1'].number).toBeNull();
|
|
428
|
+
});
|
|
429
|
+
it('resolves a skipped question without the text sent to the agent', function () {
|
|
430
|
+
var skipped = _objectSpread(_objectSpread({}, reply('Omito esta pregunta.', null)), {}, {
|
|
431
|
+
multipleChoiceAnswer: {
|
|
432
|
+
key: null,
|
|
433
|
+
skipped: true
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
expect(resolveAnsweredMultipleChoices([assistant, skipped])).toEqual({
|
|
437
|
+
answers: {
|
|
438
|
+
'assistant-1': {
|
|
439
|
+
number: null,
|
|
440
|
+
text: '',
|
|
441
|
+
skipped: true
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
hiddenMessageIds: {
|
|
445
|
+
'user-1': true
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
it('leaves replies that did not come from the card untouched', function () {
|
|
450
|
+
var _reply = reply('Alfa', 'A'),
|
|
451
|
+
multipleChoiceAnswer = _reply.multipleChoiceAnswer,
|
|
452
|
+
plain = _objectWithoutProperties(_reply, _excluded);
|
|
453
|
+
expect(multipleChoiceAnswer).toBeDefined();
|
|
454
|
+
expect(resolveAnsweredMultipleChoices([assistant, plain])).toEqual({
|
|
455
|
+
answers: {},
|
|
456
|
+
hiddenMessageIds: {}
|
|
457
|
+
});
|
|
458
|
+
expect(resolveAnsweredMultipleChoices([assistant])).toEqual({
|
|
459
|
+
answers: {},
|
|
460
|
+
hiddenMessageIds: {}
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
it('anchors the turn on the resolved card when the question bubble is hidden', function () {
|
|
464
|
+
var messages = [{
|
|
465
|
+
id: 'assistant-1'
|
|
466
|
+
}, {
|
|
467
|
+
id: 'user-1'
|
|
468
|
+
}];
|
|
469
|
+
expect(resolveTurnAnchorId(messages, 'user-1', {
|
|
470
|
+
'user-1': true
|
|
471
|
+
})).toBe('assistant-1');
|
|
472
|
+
expect(resolveTurnAnchorId(messages, 'user-1', {})).toBe('user-1');
|
|
473
|
+
expect(resolveTurnAnchorId(messages, null, {
|
|
474
|
+
'user-1': true
|
|
475
|
+
})).toBeNull();
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
it('resolves list streaming flags for the last assistant placeholder only', function () {
|
|
479
|
+
expect(resolveChatListItemStreamingFlags({
|
|
480
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
481
|
+
userId: 'assistant',
|
|
482
|
+
messageId: 'answer-turn-1-streaming',
|
|
483
|
+
isLastMessage: true,
|
|
484
|
+
waitingResponse: true,
|
|
485
|
+
isWriting: false
|
|
486
|
+
})).toEqual({
|
|
487
|
+
isStreamingPlaceholder: true,
|
|
488
|
+
isStreaming: true
|
|
489
|
+
});
|
|
490
|
+
expect(resolveChatListItemStreamingFlags({
|
|
491
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
492
|
+
userId: 'assistant',
|
|
493
|
+
messageId: 'answer-turn-1-streaming',
|
|
494
|
+
isLastMessage: false,
|
|
495
|
+
waitingResponse: true,
|
|
496
|
+
isWriting: false
|
|
497
|
+
})).toEqual({
|
|
498
|
+
isStreamingPlaceholder: false,
|
|
499
|
+
isStreaming: false
|
|
500
|
+
});
|
|
501
|
+
expect(resolveChatListItemStreamingFlags({
|
|
502
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
503
|
+
userId: 'assistant',
|
|
504
|
+
messageId: 'answer-turn-1-streaming',
|
|
505
|
+
isLastMessage: true,
|
|
506
|
+
waitingResponse: false,
|
|
507
|
+
isWriting: true
|
|
508
|
+
}).isStreaming).toBe(true);
|
|
509
|
+
});
|
|
510
|
+
});
|
|
511
|
+
describe('suggestions and attachments', function () {
|
|
512
|
+
it('ignores empty or already-selected suggestions', function () {
|
|
513
|
+
expect(shouldIgnoreSuggestionClick(' ', false)).toBe(true);
|
|
514
|
+
expect(shouldIgnoreSuggestionClick('retry', true)).toBe(true);
|
|
515
|
+
expect(shouldIgnoreSuggestionClick('go', false)).toBe(false);
|
|
516
|
+
});
|
|
517
|
+
it('detects retry suggestion selection', function () {
|
|
518
|
+
expect(isRetrySuggestionSelection(true, 'Reintentar', 'Reintentar')).toBe(true);
|
|
519
|
+
expect(isRetrySuggestionSelection(false, 'Reintentar', 'Reintentar')).toBe(false);
|
|
520
|
+
});
|
|
521
|
+
it('resolves retry attachments from user message sources', function () {
|
|
522
|
+
var attachments = [{
|
|
523
|
+
id: '1',
|
|
524
|
+
name: 'a.pdf',
|
|
525
|
+
size: 1,
|
|
526
|
+
type: 'pdf'
|
|
527
|
+
}];
|
|
528
|
+
expect(resolveRetryAttachmentsFromUserMessage({
|
|
529
|
+
attachments: attachments
|
|
530
|
+
})).toEqual(attachments);
|
|
531
|
+
expect(resolveRetryAttachmentsFromUserMessage({
|
|
532
|
+
sources: attachments
|
|
533
|
+
})).toEqual(attachments);
|
|
534
|
+
expect(resolveRetryAttachmentsFromUserMessage({})).toEqual([]);
|
|
535
|
+
});
|
|
536
|
+
it('counts attachments from attachments or sources', function () {
|
|
537
|
+
expect(countUserMessageAttachments({
|
|
538
|
+
attachments: [{
|
|
539
|
+
id: '1',
|
|
540
|
+
name: 'a',
|
|
541
|
+
size: 1,
|
|
542
|
+
type: 'pdf'
|
|
543
|
+
}]
|
|
544
|
+
})).toBe(1);
|
|
545
|
+
expect(countUserMessageAttachments({
|
|
546
|
+
sources: [{
|
|
547
|
+
id: '2'
|
|
548
|
+
}]
|
|
549
|
+
})).toBe(1);
|
|
550
|
+
expect(countUserMessageAttachments(null)).toBe(0);
|
|
551
|
+
});
|
|
552
|
+
it('picks attachment download strategy', function () {
|
|
553
|
+
expect(resolveAttachmentDownloadBlobStrategy('https://a.test', null)).toBe('remote-url');
|
|
554
|
+
expect(resolveAttachmentDownloadBlobStrategy(undefined, new File(['x'], 'a.txt'))).toBe('local-file');
|
|
555
|
+
expect(resolveAttachmentDownloadBlobStrategy(undefined, null)).toBeNull();
|
|
556
|
+
});
|
|
557
|
+
it('blocks selecting another project option after one is chosen', function () {
|
|
558
|
+
expect(shouldOpenMessageOption(null)).toBe(true);
|
|
559
|
+
expect(shouldOpenMessageOption({
|
|
560
|
+
id: 1
|
|
561
|
+
})).toBe(false);
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
describe('extractFeedbackSessionId', function () {
|
|
565
|
+
it('removes answer segments from the message id', function () {
|
|
566
|
+
expect(extractFeedbackSessionId('question-1-answer-stream-2')).toBe('question-1-stream-2');
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
describe('attachments', function () {
|
|
570
|
+
it('detects audio attachments by mime type, extension or name', function () {
|
|
571
|
+
expect(isAudioAttachment({
|
|
572
|
+
type: 'audio/mpeg',
|
|
573
|
+
name: 'voice.mp3'
|
|
574
|
+
})).toBe(true);
|
|
575
|
+
expect(isAudioAttachment({
|
|
576
|
+
type: 'mp3',
|
|
577
|
+
name: 'voice.mp3'
|
|
578
|
+
})).toBe(true);
|
|
579
|
+
expect(isAudioAttachment({
|
|
580
|
+
type: 'text/plain',
|
|
581
|
+
name: 'notes.txt'
|
|
582
|
+
})).toBe(false);
|
|
583
|
+
});
|
|
584
|
+
it('allows preview for local files and remote urls', function () {
|
|
585
|
+
expect(canOpenAttachmentPreview({
|
|
586
|
+
id: '1',
|
|
587
|
+
name: 'a.pdf',
|
|
588
|
+
size: 1,
|
|
589
|
+
type: 'application/pdf',
|
|
590
|
+
file: new File(['x'], 'a.pdf')
|
|
591
|
+
})).toBe(true);
|
|
592
|
+
expect(canOpenAttachmentPreview({
|
|
593
|
+
id: '2',
|
|
594
|
+
name: 'b.pdf',
|
|
595
|
+
size: 1,
|
|
596
|
+
type: 'application/pdf',
|
|
597
|
+
url_original: 'https://example.com/b.pdf'
|
|
598
|
+
})).toBe(true);
|
|
599
|
+
});
|
|
600
|
+
});
|
|
601
|
+
describe('list message visibility', function () {
|
|
602
|
+
it('skips empty messages unless streaming or rich content is present', function () {
|
|
603
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
604
|
+
isStreamingPlaceholder: false,
|
|
605
|
+
isStreaming: false,
|
|
606
|
+
attachmentCount: 0,
|
|
607
|
+
sourceCount: 0,
|
|
608
|
+
messageText: '',
|
|
609
|
+
hasApproval: false
|
|
610
|
+
})).toBe(true);
|
|
611
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
612
|
+
isStreamingPlaceholder: true,
|
|
613
|
+
isStreaming: false,
|
|
614
|
+
attachmentCount: 0,
|
|
615
|
+
sourceCount: 0,
|
|
616
|
+
messageText: '',
|
|
617
|
+
hasApproval: false
|
|
618
|
+
})).toBe(false);
|
|
619
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
620
|
+
isStreamingPlaceholder: false,
|
|
621
|
+
isStreaming: true,
|
|
622
|
+
attachmentCount: 0,
|
|
623
|
+
sourceCount: 0,
|
|
624
|
+
messageText: '',
|
|
625
|
+
hasApproval: false
|
|
626
|
+
})).toBe(false);
|
|
627
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
628
|
+
isStreamingPlaceholder: false,
|
|
629
|
+
isStreaming: false,
|
|
630
|
+
attachmentCount: 0,
|
|
631
|
+
sourceCount: 1,
|
|
632
|
+
messageText: '',
|
|
633
|
+
hasApproval: false
|
|
634
|
+
})).toBe(false);
|
|
635
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
636
|
+
isStreamingPlaceholder: false,
|
|
637
|
+
isStreaming: false,
|
|
638
|
+
attachmentCount: 0,
|
|
639
|
+
sourceCount: 0,
|
|
640
|
+
messageText: 'hola',
|
|
641
|
+
hasApproval: false
|
|
642
|
+
})).toBe(false);
|
|
643
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
644
|
+
isStreamingPlaceholder: false,
|
|
645
|
+
isStreaming: false,
|
|
646
|
+
attachmentCount: 0,
|
|
647
|
+
sourceCount: 0,
|
|
648
|
+
messageText: '',
|
|
649
|
+
projectName: 'Proyecto',
|
|
650
|
+
hasApproval: false
|
|
651
|
+
})).toBe(false);
|
|
652
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
653
|
+
isStreamingPlaceholder: false,
|
|
654
|
+
isStreaming: false,
|
|
655
|
+
attachmentCount: 1,
|
|
656
|
+
sourceCount: 0,
|
|
657
|
+
messageText: '',
|
|
658
|
+
hasApproval: false
|
|
659
|
+
})).toBe(false);
|
|
660
|
+
expect(shouldSkipEmptyChatListMessage({
|
|
661
|
+
isStreamingPlaceholder: false,
|
|
662
|
+
isStreaming: false,
|
|
663
|
+
attachmentCount: 0,
|
|
664
|
+
sourceCount: 0,
|
|
665
|
+
messageText: '',
|
|
666
|
+
hasApproval: true
|
|
667
|
+
})).toBe(false);
|
|
668
|
+
});
|
|
669
|
+
});
|
|
670
|
+
describe('retry and feedback helpers', function () {
|
|
671
|
+
it('maps wasHelpful to feedback enum', function () {
|
|
672
|
+
expect(resolveDisableFeedbackFromWasHelpful(undefined)).toBeNull();
|
|
673
|
+
expect(resolveDisableFeedbackFromWasHelpful(true)).toBe(Feedback.THUMBS_UP);
|
|
674
|
+
expect(resolveDisableFeedbackFromWasHelpful(false)).toBe(Feedback.THUMBS_DOWN);
|
|
675
|
+
});
|
|
676
|
+
it('allows retry for frontend-cancelled turns with a user message', function () {
|
|
677
|
+
expect(canRetryAssistantMessage({
|
|
678
|
+
hasUserMessageForRetry: true,
|
|
679
|
+
isStreaming: false,
|
|
680
|
+
isError: false,
|
|
681
|
+
hasApproval: false,
|
|
682
|
+
isFrontendCancelled: true,
|
|
683
|
+
turnId: null
|
|
684
|
+
})).toBe(true);
|
|
685
|
+
});
|
|
686
|
+
it('blocks retry when streaming, error, approval or missing user message', function () {
|
|
687
|
+
expect(canRetryAssistantMessage({
|
|
688
|
+
hasUserMessageForRetry: false,
|
|
689
|
+
isStreaming: false,
|
|
690
|
+
isError: false,
|
|
691
|
+
hasApproval: false,
|
|
692
|
+
turnId: 'turn-1'
|
|
693
|
+
})).toBe(false);
|
|
694
|
+
expect(canRetryAssistantMessage({
|
|
695
|
+
hasUserMessageForRetry: true,
|
|
696
|
+
isStreaming: true,
|
|
697
|
+
isError: false,
|
|
698
|
+
hasApproval: false,
|
|
699
|
+
turnId: 'turn-1'
|
|
700
|
+
})).toBe(false);
|
|
701
|
+
expect(canRetryAssistantMessage({
|
|
702
|
+
hasUserMessageForRetry: true,
|
|
703
|
+
isStreaming: false,
|
|
704
|
+
isError: true,
|
|
705
|
+
hasApproval: false,
|
|
706
|
+
turnId: 'turn-1'
|
|
707
|
+
})).toBe(false);
|
|
708
|
+
expect(canRetryAssistantMessage({
|
|
709
|
+
hasUserMessageForRetry: true,
|
|
710
|
+
isStreaming: false,
|
|
711
|
+
isError: false,
|
|
712
|
+
hasApproval: true,
|
|
713
|
+
turnId: 'turn-1'
|
|
714
|
+
})).toBe(false);
|
|
715
|
+
expect(canRetryAssistantMessage({
|
|
716
|
+
hasUserMessageForRetry: true,
|
|
717
|
+
isStreaming: false,
|
|
718
|
+
isError: false,
|
|
719
|
+
hasApproval: false,
|
|
720
|
+
isCancelled: true,
|
|
721
|
+
turnId: null
|
|
722
|
+
})).toBe(false);
|
|
723
|
+
expect(canRetryAssistantMessage({
|
|
724
|
+
hasUserMessageForRetry: true,
|
|
725
|
+
isStreaming: false,
|
|
726
|
+
isError: false,
|
|
727
|
+
hasApproval: false,
|
|
728
|
+
isCancelled: false,
|
|
729
|
+
turnId: 'turn-1'
|
|
730
|
+
})).toBe(true);
|
|
731
|
+
});
|
|
732
|
+
});
|
|
733
|
+
describe('attachment download helpers', function () {
|
|
734
|
+
it('builds file names and picks the first available url', function () {
|
|
735
|
+
expect(resolveAttachmentDownloadFileName({
|
|
736
|
+
name: 'brief.pdf',
|
|
737
|
+
type: 'pdf'
|
|
738
|
+
})).toBe('brief.pdf');
|
|
739
|
+
expect(resolveAttachmentDownloadFileName({
|
|
740
|
+
name: 'brief',
|
|
741
|
+
type: 'pdf'
|
|
742
|
+
})).toBe('brief.pdf');
|
|
743
|
+
expect(resolveAttachmentDownloadUrl({
|
|
744
|
+
url_original: 'https://a.test/o',
|
|
745
|
+
url_file: 'https://a.test/f'
|
|
746
|
+
})).toBe('https://a.test/o');
|
|
747
|
+
});
|
|
748
|
+
it('falls back to user sources when attachments are missing', function () {
|
|
749
|
+
var sources = [{
|
|
750
|
+
id: 's1',
|
|
751
|
+
name: 'a.pdf',
|
|
752
|
+
size: 1,
|
|
753
|
+
type: 'pdf'
|
|
754
|
+
}];
|
|
755
|
+
expect(resolveMessageAttachments(undefined, false, sources)).toEqual(sources);
|
|
756
|
+
expect(resolveMessageAttachments([], true, sources)).toEqual([]);
|
|
757
|
+
});
|
|
758
|
+
});
|
|
759
|
+
describe('turn space helpers', function () {
|
|
760
|
+
it('finds the latest question id', function () {
|
|
761
|
+
expect(findLastQuestionId([{
|
|
762
|
+
id: 'answer-1'
|
|
763
|
+
}, {
|
|
764
|
+
id: 'question-9'
|
|
765
|
+
}, {
|
|
766
|
+
id: 'question-10'
|
|
767
|
+
}])).toBe('question-10');
|
|
768
|
+
});
|
|
769
|
+
it('computes reserved and removable spacer heights', function () {
|
|
770
|
+
expect(computeReservedTurnSpace(800, 600, 800)).toBe(56);
|
|
771
|
+
expect(computeRemovableTurnSpace(1200, 800, 200, 300)).toBe(100);
|
|
772
|
+
expect(computeRemovableTurnSpace(1200, 800, 200, 0)).toBe(0);
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
describe('branch coverage gaps', function () {
|
|
776
|
+
it('hasMessageLevelStreamIndicator requires placeholder id and active stream', function () {
|
|
777
|
+
expect(hasMessageLevelStreamIndicator(undefined, true, true)).toBe(false);
|
|
778
|
+
expect(hasMessageLevelStreamIndicator('answer-turn-1-streaming', false, false)).toBe(false);
|
|
779
|
+
});
|
|
780
|
+
it('shouldHideAssistantSuggestions respects disabled chips on the last message', function () {
|
|
781
|
+
expect(shouldHideAssistantSuggestions(false, true, true)).toBe(true);
|
|
782
|
+
});
|
|
783
|
+
it('resolveChatListItemStreamingFlags only streams the last assistant placeholder', function () {
|
|
784
|
+
expect(resolveChatListItemStreamingFlags({
|
|
785
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
786
|
+
userId: 'assistant',
|
|
787
|
+
messageId: 'answer-turn-1-streaming',
|
|
788
|
+
isLastMessage: false,
|
|
789
|
+
waitingResponse: true,
|
|
790
|
+
isWriting: false
|
|
791
|
+
})).toMatchObject({
|
|
792
|
+
isStreamingPlaceholder: false,
|
|
793
|
+
isStreaming: false
|
|
794
|
+
});
|
|
795
|
+
});
|
|
796
|
+
it('isAudioAttachment detects extension-only files', function () {
|
|
797
|
+
expect(isAudioAttachment({
|
|
798
|
+
type: '',
|
|
799
|
+
name: 'voice.wav'
|
|
800
|
+
})).toBe(true);
|
|
801
|
+
expect(isAudioAttachment({
|
|
802
|
+
type: 'audio/webm',
|
|
803
|
+
name: 'clip'
|
|
804
|
+
})).toBe(true);
|
|
805
|
+
});
|
|
806
|
+
it('canOpenAttachmentPreview accepts originalFile and url_file', function () {
|
|
807
|
+
expect(canOpenAttachmentPreview({
|
|
808
|
+
id: '1',
|
|
809
|
+
name: 'a.pdf',
|
|
810
|
+
type: 'pdf',
|
|
811
|
+
size: 1,
|
|
812
|
+
file: undefined,
|
|
813
|
+
originalFile: new File([], 'a.pdf')
|
|
814
|
+
})).toBe(true);
|
|
815
|
+
expect(canOpenAttachmentPreview({
|
|
816
|
+
id: '2',
|
|
817
|
+
name: 'b.pdf',
|
|
818
|
+
type: 'pdf',
|
|
819
|
+
size: 1,
|
|
820
|
+
file: undefined,
|
|
821
|
+
url_file: 'https://cdn/file'
|
|
822
|
+
})).toBe(true);
|
|
823
|
+
});
|
|
824
|
+
it('resolveMessageAttachments ignores empty attachment arrays for assistants', function () {
|
|
825
|
+
expect(resolveMessageAttachments([], true, [{
|
|
826
|
+
id: 's1'
|
|
827
|
+
}])).toEqual([]);
|
|
828
|
+
});
|
|
829
|
+
it('resolveAttachmentDownloadUrl falls back to url_file and thumbnail', function () {
|
|
830
|
+
expect(resolveAttachmentDownloadUrl({
|
|
831
|
+
url_file: 'https://cdn/file'
|
|
832
|
+
})).toBe('https://cdn/file');
|
|
833
|
+
expect(resolveAttachmentDownloadUrl({
|
|
834
|
+
url_thumbnail: 'https://cdn/thumb'
|
|
835
|
+
})).toBe('https://cdn/thumb');
|
|
836
|
+
});
|
|
837
|
+
});
|
|
838
|
+
describe('streaming and scroll lifecycle helpers', function () {
|
|
839
|
+
it('builds smooth stream options from window flags', function () {
|
|
840
|
+
expect(buildSmoothStreamTextOptions({
|
|
841
|
+
streamLagMs: 100
|
|
842
|
+
}, true)).toMatchObject({
|
|
843
|
+
enabled: true,
|
|
844
|
+
targetLagMs: 100
|
|
845
|
+
});
|
|
846
|
+
expect(buildSmoothStreamTextOptions({
|
|
847
|
+
streamLagMs: 100,
|
|
848
|
+
streamAdapt: true,
|
|
849
|
+
streamBufferMs: 200,
|
|
850
|
+
streamMinBuffer: 10,
|
|
851
|
+
streamWarmupMs: 50
|
|
852
|
+
}, true)).toMatchObject({
|
|
853
|
+
adaptToBackendRate: true,
|
|
854
|
+
targetBufferMs: 200,
|
|
855
|
+
minBufferChars: 10,
|
|
856
|
+
warmupMs: 50
|
|
857
|
+
});
|
|
858
|
+
expect(buildSmoothStreamTextOptions({}, false).enabled).toBe(false);
|
|
859
|
+
});
|
|
860
|
+
it('readSmoothStreamWindowFlags returns empty when window is unavailable', function () {
|
|
861
|
+
var originalWindow = global.window;
|
|
862
|
+
// @ts-expect-error simulating non-browser runtime
|
|
863
|
+
delete global.window;
|
|
864
|
+
expect(readSmoothStreamWindowFlags()).toEqual({});
|
|
865
|
+
global.window = originalWindow;
|
|
866
|
+
});
|
|
867
|
+
it('resolves streaming raw text and hook ids', function () {
|
|
868
|
+
expect(resolveStreamingRawText(true, 'live', 'final')).toBe('live');
|
|
869
|
+
expect(resolveStreamingMessageHookId(false, 'id-1')).toBeNull();
|
|
870
|
+
expect(resolveStreamingTextHookId(true, false, 'id-1')).toBe('id-1');
|
|
871
|
+
expect(resolveReasoningTraceHookId(true, true, 'id-1')).toBe('id-1');
|
|
872
|
+
});
|
|
873
|
+
it('guards chat init, turn reservation and scroll effects', function () {
|
|
874
|
+
expect(shouldInitializeChat(false)).toBe(true);
|
|
875
|
+
expect(shouldClearLastReservedQuestion(true)).toBe(true);
|
|
876
|
+
expect(shouldScheduleTurnSpaceReservation(false, false, 'question-1', null)).toBe(true);
|
|
877
|
+
expect(shouldSkipMessagesScrollEffect(false, false, false, false)).toBe(true);
|
|
878
|
+
expect(shouldRunSessionCacheScrollToBottom(false, 'chat-1', 2, null)).toBe(true);
|
|
879
|
+
expect(detectJustFinishedLoadingMessages(true, false)).toBe(true);
|
|
880
|
+
expect(shouldScrollToBottomAfterLoad(true, 0)).toBe(false);
|
|
881
|
+
expect(shouldUpdateScrollAffordancesOnLoadEnd(false)).toBe(true);
|
|
882
|
+
});
|
|
883
|
+
it('restores scroll position from session snapshot', function () {
|
|
884
|
+
expect(resolvePendingScrollTopFromSession(null, 'chat-1')).toBeNull();
|
|
885
|
+
expect(resolvePendingScrollTopFromSession({
|
|
886
|
+
scrollSessionId: 'chat-1',
|
|
887
|
+
scrollTop: 120
|
|
888
|
+
}, 'chat-1')).toBe(120);
|
|
889
|
+
expect(shouldApplyPendingScrollRestore(false, 50, true)).toBe(true);
|
|
890
|
+
expect(shouldClearScrollRestoreWithoutChat(null)).toBe(true);
|
|
891
|
+
expect(shouldRestoreScrollOnExpandedChange(false, true, true)).toBe(true);
|
|
892
|
+
});
|
|
893
|
+
it('resolves list keys, analytics and cancelled feedback props', function () {
|
|
894
|
+
expect(resolveMessageListItemKey(undefined, 3)).toBe('msg-3');
|
|
895
|
+
expect(resolveSuggestionAnalyticsAgentType(true, 'clone')).toBe('marketplace');
|
|
896
|
+
expect(resolveFeedbackPropsForCancelled(true, [{
|
|
897
|
+
id: 1
|
|
898
|
+
}], function () {
|
|
899
|
+
return undefined;
|
|
900
|
+
}).sources).toBeUndefined();
|
|
901
|
+
expect(shouldRenderMentionInlineNodes(true, ['node'])).toBe(true);
|
|
902
|
+
expect(resolveScrollOnParentMode(true)).toBe(true);
|
|
903
|
+
});
|
|
904
|
+
it('processes scroll frames and turn reservation plans', function () {
|
|
905
|
+
var _resolveLastUserMessa;
|
|
906
|
+
var frame = processChatMessagesScrollFrame({
|
|
907
|
+
scrollTop: 200,
|
|
908
|
+
scrollHeight: 1000,
|
|
909
|
+
clientHeight: 400,
|
|
910
|
+
lastScrollTop: 250,
|
|
911
|
+
scrollThreshold: 39,
|
|
912
|
+
anchoredTurnId: null,
|
|
913
|
+
initialChatId: 'chat-1'
|
|
914
|
+
});
|
|
915
|
+
expect(frame.shouldDrainTurnSpace).toBe(true);
|
|
916
|
+
expect(frame.shouldScheduleScrollPersist).toBe(true);
|
|
917
|
+
expect(computeMeasureTurnLayout({
|
|
918
|
+
containerTop: 10,
|
|
919
|
+
questionTop: 50,
|
|
920
|
+
contentBottom: 250,
|
|
921
|
+
scrollTop: 100
|
|
922
|
+
})).toMatchObject({
|
|
923
|
+
questionTop: 140,
|
|
924
|
+
turnHeight: 200
|
|
925
|
+
});
|
|
926
|
+
expect(resolveReserveTurnSpacePlan({
|
|
927
|
+
currentScrollTop: 500,
|
|
928
|
+
targetScrollTop: 200,
|
|
929
|
+
clientHeight: 400,
|
|
930
|
+
turnHeight: 120
|
|
931
|
+
}).kind).toBe('skip-reservation');
|
|
932
|
+
expect(resolveReserveTurnSpacePlan({
|
|
933
|
+
currentScrollTop: 50,
|
|
934
|
+
targetScrollTop: 200,
|
|
935
|
+
clientHeight: 400,
|
|
936
|
+
turnHeight: 120
|
|
937
|
+
}).kind).toBe('reserve');
|
|
938
|
+
expect(resolveScrollToBottomTargetTop(900, 300)).toBe(600);
|
|
939
|
+
expect(resolveContainerAtBottom({
|
|
940
|
+
scrollHeight: 100,
|
|
941
|
+
scrollTop: 0,
|
|
942
|
+
clientHeight: 100
|
|
943
|
+
})).toBe(true);
|
|
944
|
+
expect(resolveContainerAtBottom(null)).toBe(false);
|
|
945
|
+
expect(resolveStreamingMessageHookId(true, 'id-1')).toBe('id-1');
|
|
946
|
+
expect(isAudioAttachment({
|
|
947
|
+
type: undefined,
|
|
948
|
+
name: undefined
|
|
949
|
+
})).toBe(false);
|
|
950
|
+
expect(resolveCreateAgentActionsAgentId({
|
|
951
|
+
agentId: 'a1'
|
|
952
|
+
})).toBe('a1');
|
|
953
|
+
expect((_resolveLastUserMessa = resolveLastUserMessageForAttachments([{
|
|
954
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
955
|
+
user: {
|
|
956
|
+
id: 'assistant'
|
|
957
|
+
}
|
|
958
|
+
}, {
|
|
959
|
+
role: ChatHistoryRole.USER,
|
|
960
|
+
user: {
|
|
961
|
+
id: '7'
|
|
962
|
+
}
|
|
963
|
+
}], '7')) === null || _resolveLastUserMessa === void 0 ? void 0 : _resolveLastUserMessa.user.id).toBe('7');
|
|
964
|
+
});
|
|
965
|
+
});
|
|
966
|
+
});
|
|
967
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImNhbk9wZW5BdHRhY2htZW50UHJldmlldyIsImNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSIsImNvbXB1dGVEaXN0YW5jZUZyb21Cb3R0b20iLCJjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlIiwiY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlIiwiY29tcHV0ZVN5bmNlZFR1cm5TcGFjZXJIZWlnaHQiLCJjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMiLCJjb21wdXRlVHVyblNjcm9sbFRhcmdldFRvcCIsImNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyIsImVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MiLCJleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQiLCJmaW5kTGFzdFF1ZXN0aW9uSWQiLCJoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QiLCJoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IiLCJpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlIiwiaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCIsImlzQXBwcm92YWxDaGF0TWVzc2FnZSIsImlzQXNzaXN0YW50Q2hhdE1lc3NhZ2UiLCJpc0F1ZGlvQXR0YWNobWVudCIsImlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20iLCJpc0N1cnJlbnRVc2VyTWVzc2FnZSIsImlzTmVhclNjcm9sbEJvdHRvbSIsImlzTmV3Q2hhdE1lc3NhZ2VFdmVudCIsImlzUmV0cnlTdWdnZXN0aW9uU2VsZWN0aW9uIiwiaXNTY3JvbGxpbmdVcHdhcmQiLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5IiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lIiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCIsInJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyIsInJlc29sdmVEaXNhYmxlRmVlZGJhY2tGcm9tV2FzSGVscGZ1bCIsInJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMiLCJyZXNvbHZlUmV0cnlBdHRhY2htZW50c0Zyb21Vc2VyTWVzc2FnZSIsInJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkIiwic2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UiLCJzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsIiwic2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zIiwic2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSIsImV4dHJhY3RNdWx0aXBsZUNob2ljZVF1ZXN0aW9uIiwiaXNTYW1lUGVuZGluZ011bHRpcGxlQ2hvaWNlIiwicmVzb2x2ZVBlbmRpbmdNdWx0aXBsZUNob2ljZSIsInJlc29sdmVBbnN3ZXJlZE11bHRpcGxlQ2hvaWNlcyIsInJlc29sdmVUdXJuQW5jaG9ySWQiLCJzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2siLCJzaG91bGRPcGVuTWVzc2FnZU9wdGlvbiIsInNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwiLCJzaG91bGRSZWxlYXNlVHVyblNwYWNlIiwic2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2siLCJzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyIsInNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlIiwic2hvdWxkUmVuZGVyQ3JlYXRlQWdlbnRBY3Rpb25zIiwic2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5Iiwic2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QiLCJzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zIiwic2hvdWxkU2hvd0JvdHRvbVNjcm9sbEdyYWRpZW50Iiwic2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IiLCJzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93Iiwic2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tIiwic2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yIiwic2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5Iiwic2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50Iiwic2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlIiwic2hvdWxkU2tpcFR1cm5TY3JvbGxBbmltYXRpb24iLCJzaG91bGRTa2lwVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQiLCJ0dXJuQW5jaG9yT2Zmc2V0IiwiYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyIsImNvbXB1dGVNZWFzdXJlVHVybkxheW91dCIsImRldGVjdEp1c3RGaW5pc2hlZExvYWRpbmdNZXNzYWdlcyIsInByb2Nlc3NDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZSIsInJlYWRTbW9vdGhTdHJlYW1XaW5kb3dGbGFncyIsInJlc29sdmVDb250YWluZXJBdEJvdHRvbSIsInJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkIiwicmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQiLCJyZXNvbHZlTGFzdFVzZXJNZXNzYWdlRm9yQXR0YWNobWVudHMiLCJyZXNvbHZlRmVlZGJhY2tQcm9wc0ZvckNhbmNlbGxlZCIsInJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbiIsInJlc29sdmVTY3JvbGxUb0JvdHRvbVRhcmdldFRvcCIsInJlc29sdmVNZXNzYWdlTGlzdEl0ZW1LZXkiLCJyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uIiwicmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkIiwicmVzb2x2ZVNjcm9sbE9uUGFyZW50TW9kZSIsInJlc29sdmVTdHJlYW1pbmdSYXdUZXh0IiwicmVzb2x2ZVN0cmVhbWluZ1RleHRIb29rSWQiLCJyZXNvbHZlU3VnZ2VzdGlvbkFuYWx5dGljc0FnZW50VHlwZSIsInNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUiLCJzaG91bGRDbGVhckxhc3RSZXNlcnZlZFF1ZXN0aW9uIiwic2hvdWxkQ2xlYXJTY3JvbGxSZXN0b3JlV2l0aG91dENoYXQiLCJzaG91bGRJbml0aWFsaXplQ2hhdCIsInNob3VsZFJlbmRlck1lbnRpb25JbmxpbmVOb2RlcyIsInNob3VsZFJlc3RvcmVTY3JvbGxPbkV4cGFuZGVkQ2hhbmdlIiwic2hvdWxkUnVuU2Vzc2lvbkNhY2hlU2Nyb2xsVG9Cb3R0b20iLCJzaG91bGRTY2hlZHVsZVR1cm5TcGFjZVJlc2VydmF0aW9uIiwic2hvdWxkU2Nyb2xsVG9Cb3R0b21BZnRlckxvYWQiLCJzaG91bGRTa2lwTWVzc2FnZXNTY3JvbGxFZmZlY3QiLCJzaG91bGRVcGRhdGVTY3JvbGxBZmZvcmRhbmNlc09uTG9hZEVuZCIsImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJ0b0JlIiwiaWQiLCJhcHByb3ZhbCIsImlzTmV3TWVzc2FnZSIsImFuY2hvcmVkVHVybklkIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNXcml0aW5nIiwiaXNBdEJvdHRvbSIsImlzQW5zd2VyT3JRdWVzdGlvbiIsImlzQXBwcm92YWwiLCJoYXNJbml0aWFsTWVzc2FnZSIsIm1lc3NhZ2VzTGVuZ3RoIiwicHJldk1lc3NhZ2VzTGVuZ3RoIiwidHlwZSIsIlVTRVIiLCJBU1NJU1RBTlQiLCJtZXNzYWdlVGV4dCIsInNob3dTdHJlYW1pbmdCb2R5IiwiaXNBc3Npc3RhbnQiLCJhdHRhY2htZW50Q291bnQiLCJwZW5kaW5nX2FjdGlvbnMiLCJpc0Vycm9yIiwiaXNTdHJlYW1pbmciLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwib25SZXRyeSIsInVuZGVmaW5lZCIsInN1Z2dlc3Rpb25zTGVuZ3RoIiwiYWdlbnRJZCIsIm11bHRpcGxlQ2hvaWNlIiwib3B0aW9ucyIsImtleSIsInRleHQiLCJhc3Npc3RhbnQiLCJfb2JqZWN0U3ByZWFkIiwidG9CZU51bGwiLCJtZXNzYWdlIiwicm9sZSIsInVzZXIiLCJyZXNvbHZlIiwib3ZlcnJpZGVzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibWVzc2FnZXMiLCJkaXNtaXNzZWRNZXNzYWdlSWRzIiwidG9FcXVhbCIsIm1lc3NhZ2VJZCIsInF1ZXN0aW9uIiwicGVuZGluZyIsImRlc2NyaXB0aW9uIiwicmVwbHkiLCJtdWx0aXBsZUNob2ljZUFuc3dlciIsImFuc3dlcnMiLCJudW1iZXIiLCJoaWRkZW5NZXNzYWdlSWRzIiwic2tpcHBlZCIsIl9yZXBseSIsInBsYWluIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwidG9CZURlZmluZWQiLCJ1c2VySWQiLCJpc0xhc3RNZXNzYWdlIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImF0dGFjaG1lbnRzIiwibmFtZSIsInNpemUiLCJzb3VyY2VzIiwiRmlsZSIsImZpbGUiLCJ1cmxfb3JpZ2luYWwiLCJzb3VyY2VDb3VudCIsImhhc0FwcHJvdmFsIiwicHJvamVjdE5hbWUiLCJUSFVNQlNfVVAiLCJUSFVNQlNfRE9XTiIsImhhc1VzZXJNZXNzYWdlRm9yUmV0cnkiLCJ0dXJuSWQiLCJpc0NhbmNlbGxlZCIsInVybF9maWxlIiwidG9NYXRjaE9iamVjdCIsIm9yaWdpbmFsRmlsZSIsInVybF90aHVtYm5haWwiLCJzdHJlYW1MYWdNcyIsImVuYWJsZWQiLCJ0YXJnZXRMYWdNcyIsInN0cmVhbUFkYXB0Iiwic3RyZWFtQnVmZmVyTXMiLCJzdHJlYW1NaW5CdWZmZXIiLCJzdHJlYW1XYXJtdXBNcyIsImFkYXB0VG9CYWNrZW5kUmF0ZSIsInRhcmdldEJ1ZmZlck1zIiwibWluQnVmZmVyQ2hhcnMiLCJ3YXJtdXBNcyIsIm9yaWdpbmFsV2luZG93IiwiZ2xvYmFsIiwid2luZG93Iiwic2Nyb2xsU2Vzc2lvbklkIiwic2Nyb2xsVG9wIiwidG9CZVVuZGVmaW5lZCIsIl9yZXNvbHZlTGFzdFVzZXJNZXNzYSIsImZyYW1lIiwic2Nyb2xsSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwibGFzdFNjcm9sbFRvcCIsInNjcm9sbFRocmVzaG9sZCIsImluaXRpYWxDaGF0SWQiLCJzaG91bGREcmFpblR1cm5TcGFjZSIsInNob3VsZFNjaGVkdWxlU2Nyb2xsUGVyc2lzdCIsImNvbnRhaW5lclRvcCIsInF1ZXN0aW9uVG9wIiwiY29udGVudEJvdHRvbSIsInR1cm5IZWlnaHQiLCJjdXJyZW50U2Nyb2xsVG9wIiwidGFyZ2V0U2Nyb2xsVG9wIiwia2luZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0QUlNZXNzYWdlcy9DaGF0QUlNZXNzYWdlcy5oZWxwZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdEhpc3RvcnlSb2xlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7XG4gIGNhbk9wZW5BdHRhY2htZW50UHJldmlldyxcbiAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlLFxuICBjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tLFxuICBjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlLFxuICBjb21wdXRlUmVzZXJ2ZWRUdXJuU3BhY2UsXG4gIGNvbXB1dGVTeW5jZWRUdXJuU3BhY2VySGVpZ2h0LFxuICBjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMsXG4gIGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wLFxuICBjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMsXG4gIGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MsXG4gIGV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCxcbiAgZmluZExhc3RRdWVzdGlvbklkLFxuICBoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QsXG4gIGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcixcbiAgaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZSxcbiAgaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCxcbiAgaXNBcHByb3ZhbENoYXRNZXNzYWdlLFxuICBpc0Fzc2lzdGFudENoYXRNZXNzYWdlLFxuICBpc0F1ZGlvQXR0YWNobWVudCxcbiAgaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSxcbiAgaXNDdXJyZW50VXNlck1lc3NhZ2UsXG4gIGlzTmVhclNjcm9sbEJvdHRvbSxcbiAgaXNOZXdDaGF0TWVzc2FnZUV2ZW50LFxuICBpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbixcbiAgaXNTY3JvbGxpbmdVcHdhcmQsXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3ksXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRGaWxlTmFtZSxcbiAgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCxcbiAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzLFxuICByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwsXG4gIHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMsXG4gIHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlLFxuICByZXNvbHZlU2Nyb2xsTmVhckJvdHRvbVRocmVzaG9sZCxcbiAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UsXG4gIHNob3VsZERyYWluVHVyblNwYWNlT25TY3JvbGwsXG4gIHNob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyxcbiAgc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSxcbiAgZXh0cmFjdE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24sXG4gIGlzU2FtZVBlbmRpbmdNdWx0aXBsZUNob2ljZSxcbiAgcmVzb2x2ZVBlbmRpbmdNdWx0aXBsZUNob2ljZSxcbiAgcmVzb2x2ZUFuc3dlcmVkTXVsdGlwbGVDaG9pY2VzLFxuICByZXNvbHZlVHVybkFuY2hvcklkLFxuICBzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2ssXG4gIHNob3VsZE9wZW5NZXNzYWdlT3B0aW9uLFxuICBzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsLFxuICBzaG91bGRSZWxlYXNlVHVyblNwYWNlLFxuICBzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayxcbiAgc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMsXG4gIHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlLFxuICBzaG91bGRSZW5kZXJDcmVhdGVBZ2VudEFjdGlvbnMsXG4gIHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSxcbiAgc2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QsXG4gIHNob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMsXG4gIHNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCxcbiAgc2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IsXG4gIHNob3VsZFNob3dNZXNzYWdlQXR0YWNobWVudHNSb3csXG4gIHNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSxcbiAgc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yLFxuICBzaG91bGRTaG93U3RyZWFtaW5nTWVzc2FnZUJvZHksXG4gIHNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCxcbiAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlLFxuICBzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbixcbiAgc2hvdWxkU2tpcFR1cm5TcGFjZVJlc2VydmF0aW9uLFxuICBzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQsXG4gIHR1cm5BbmNob3JPZmZzZXQsXG4gIGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMsXG4gIGNvbXB1dGVNZWFzdXJlVHVybkxheW91dCxcbiAgZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzLFxuICBwcm9jZXNzQ2hhdE1lc3NhZ2VzU2Nyb2xsRnJhbWUsXG4gIHJlYWRTbW9vdGhTdHJlYW1XaW5kb3dGbGFncyxcbiAgcmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tLFxuICByZXNvbHZlU3RyZWFtaW5nTWVzc2FnZUhvb2tJZCxcbiAgcmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQsXG4gIHJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyxcbiAgcmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQsXG4gIHJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbixcbiAgcmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wLFxuICByZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5LFxuICByZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uLFxuICByZXNvbHZlUmVhc29uaW5nVHJhY2VIb29rSWQsXG4gIHJlc29sdmVTY3JvbGxPblBhcmVudE1vZGUsXG4gIHJlc29sdmVTdHJlYW1pbmdSYXdUZXh0LFxuICByZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCxcbiAgcmVzb2x2ZVN1Z2dlc3Rpb25BbmFseXRpY3NBZ2VudFR5cGUsXG4gIHNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUsXG4gIHNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24sXG4gIHNob3VsZENsZWFyU2Nyb2xsUmVzdG9yZVdpdGhvdXRDaGF0LFxuICBzaG91bGRJbml0aWFsaXplQ2hhdCxcbiAgc2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzLFxuICBzaG91bGRSZXN0b3JlU2Nyb2xsT25FeHBhbmRlZENoYW5nZSxcbiAgc2hvdWxkUnVuU2Vzc2lvbkNhY2hlU2Nyb2xsVG9Cb3R0b20sXG4gIHNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24sXG4gIHNob3VsZFNjcm9sbFRvQm90dG9tQWZ0ZXJMb2FkLFxuICBzaG91bGRTa2lwTWVzc2FnZXNTY3JvbGxFZmZlY3QsXG4gIHNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kLFxufSBmcm9tICcuL0NoYXRBSU1lc3NhZ2VzLmhlbHBlcnMnXG5cbmRlc2NyaWJlKCdDaGF0QUlNZXNzYWdlcy5oZWxwZXJzJywgKCkgPT4ge1xuICBkZXNjcmliZSgndHVybkFuY2hvck9mZnNldCcsICgpID0+IHtcbiAgICBpdCgnY2FwcyB0aGUgb2Zmc2V0IGF0IDIwMHB4JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHR1cm5BbmNob3JPZmZzZXQoNTAwKSkudG9CZSg5MClcbiAgICAgIGV4cGVjdCh0dXJuQW5jaG9yT2Zmc2V0KDIwMDApKS50b0JlKDIwMClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMnLCAoKSA9PiB7XG4gICAgaXQoJ3NjYWxlcyBkdXJhdGlvbiB3aXRoIHNjcm9sbCBkaXN0YW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMoMCkpLnRvQmUoNjAwKVxuICAgICAgZXhwZWN0KGNvbXB1dGVUdXJuU2Nyb2xsRHVyYXRpb25NcygxMjAwKSkudG9CZSg4MDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnc2Nyb2xsIGFmZm9yZGFuY2VzJywgKCkgPT4ge1xuICAgIGl0KCdjb21wdXRlcyBkaXN0YW5jZSBmcm9tIGJvdHRvbSBleGNsdWRpbmcgc3BhY2VyIGhlaWdodCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tKDEwMDAsIDIwMCwgMzAwLCA0MDApKS50b0JlKDEwMClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3dzIHRoZSBzY3JvbGwgYnV0dG9uIG9ubHkgd2hlbiBmYXIgZW5vdWdoIGZyb20gdGhlIGJvdHRvbScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTaG93U2Nyb2xsVG9Cb3R0b20oNjApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tKDIwKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3RvZ2dsZXMgdG9wIGFuZCBib3R0b20gc2Nyb2xsIGdyYWRpZW50cyBwYXN0IHRoZSB0aHJlc2hvbGQnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50KDApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCgyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCgwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93Qm90dG9tU2Nyb2xsR3JhZGllbnQoNSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RldGVjdHMgdXB3YXJkIHNjcm9sbCBhbmQgbmVhci1ib3R0b20gd2l0aCBhZGFwdGl2ZSB0aHJlc2hvbGQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNTY3JvbGxpbmdVcHdhcmQoMTAsIDIwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzTmVhclNjcm9sbEJvdHRvbSg1MDAsIDQwMCwgMTAwLCA1MCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Nyb2xsTmVhckJvdHRvbVRocmVzaG9sZCgzOSwgdHJ1ZSwgZmFsc2UpKS50b0JlKDE1KVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkKDE1LCBmYWxzZSwgdHJ1ZSkpLnRvQmUoMzkpXG4gICAgICBleHBlY3QocmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQoMjUsIGZhbHNlLCBmYWxzZSkpLnRvQmUoMjUpXG4gICAgfSlcblxuICAgIGl0KCdza2lwcyB0aW55IHR1cm4gc2Nyb2xsIGFuaW1hdGlvbnMgYW5kIGVhc2VzIHByb2dyZXNzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFNraXBUdXJuU2Nyb2xsQW5pbWF0aW9uKDAuNSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbigxMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZWFzZU91dEV4cG9TY3JvbGxQcm9ncmVzcygxKSkudG9CZSgxKVxuICAgICAgZXhwZWN0KGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MoMCkpLnRvQmUoMClcbiAgICB9KVxuXG4gICAgaXQoJ2NvbXB1dGVzIHR1cm4gc2Nyb2xsIHRhcmdldHMgYW5kIHJlc2VydmF0aW9uIHNraXBzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wKDMwMCwgNTAwKSkudG9CZSgyMTApXG4gICAgICBleHBlY3Qoc2hvdWxkU2tpcFR1cm5TcGFjZVJlc2VydmF0aW9uKDEwMCwgNTApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2tpcFR1cm5TcGFjZVJlc2VydmF0aW9uKDUwLCAxMDApKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgndXBkYXRlcyBzcGFjZXIgaGVpZ2h0IG9ubHkgd2hlbiB0aGUgZGVsdGEgaXMgbWVhbmluZ2Z1bCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQoMTAwLCAxMDAuNSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0KDEwMCwgMTAyKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnc3luY3MgdHVybiBzcGFjZXIgaGVpZ2h0IHdpdGhvdXQgZ3Jvd2luZyByZXNlcnZlZCBzcGFjZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCg4MDAsIDYwMCwgMjAwKSkudG9CZSg1NilcbiAgICAgIGV4cGVjdChjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCg4MDAsIDYwMCwgNDApKS50b0JlKDQwKVxuICAgIH0pXG5cbiAgICBpdCgnZHJhaW5zIG9yIHJlbGVhc2VzIHR1cm4gc3BhY2UgYmFzZWQgb24gYW5jaG9yIHN0YXRlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZERyYWluVHVyblNwYWNlT25TY3JvbGwobnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsKCdxdWVzdGlvbi0xJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVsZWFzZVR1cm5TcGFjZShudWxsLCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZWxlYXNlVHVyblNwYWNlKCdxdWVzdGlvbi0xJywgMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZWxlYXNlVHVyblNwYWNlKG51bGwsIDUwKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncGVyc2lzdHMgcGFuZWwgc2Nyb2xsIG9ubHkgZm9yIGFjdGl2ZSBzZXNzaW9ucyBzY3JvbGxlZCBhd2F5IGZyb20gdG9wJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwoJ2NoYXQtMScsIDEwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwoJ2NoYXQtMScsIDApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwobnVsbCwgMTApKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBib3R0b20gYWxpZ25tZW50IHdpdGggdG9sZXJhbmNlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20oMTAwMCwgOTAwLCAxMDApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSgxMDAwLCA3MDAsIDEwMCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnbWVzc2FnZSBsaXN0IHNjcm9sbCBkZWNpc2lvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgbmV3IG1lc3NhZ2UgZXZlbnRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCgnYScsICdhJywgMywgMykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoaXNOZXdDaGF0TWVzc2FnZUV2ZW50KCdiJywgJ2EnLCAzLCAzKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCgnYScsICdhJywgNCwgMykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NsYXNzaWZpZXMgYXBwcm92YWwgYW5kIGFuc3dlci9xdWVzdGlvbiBpZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNBcHByb3ZhbENoYXRNZXNzYWdlKHsgaWQ6ICdhcHByb3ZhbC0xJyB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQXBwcm92YWxDaGF0TWVzc2FnZSh7IGlkOiAnYW5zd2VyLTEnLCBhcHByb3ZhbDoge30gfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0FwcHJvdmFsQ2hhdE1lc3NhZ2UoeyBpZDogJ2Fuc3dlci0xJyB9KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChpc0Fuc3dlck9yUXVlc3Rpb25DaGF0TWVzc2FnZUlkKCdxdWVzdGlvbi05JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0Fuc3dlck9yUXVlc3Rpb25DaGF0TWVzc2FnZUlkKCdvdGhlcicpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZmluZHMgdGhlIGluaXRpYWwgdXNlciBtZXNzYWdlIG1hcmtlcicsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QoW3sgaWQ6ICd1c2VyLWluaXRpYWwtbWVzc2FnZScgfV0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaGFzSW5pdGlhbFVzZXJNZXNzYWdlSW5MaXN0KFt7IGlkOiAncXVlc3Rpb24tMScgfV0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmV0dXJucyBzY3JvbGwsIHN5bmMtdHVybiBvciBhZmZvcmRhbmNlcy1vbmx5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRBdXRvU2Nyb2xsT25NZXNzYWdlc0NoYW5nZSh7XG4gICAgICAgICAgaXNOZXdNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdEJvdHRvbTogdHJ1ZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IHRydWUsXG4gICAgICAgICAgaXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaGFzSW5pdGlhbE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogMixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnYWZmb3JkYW5jZXMtb25seScpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgICAgIGlzTmV3TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogJ3F1ZXN0aW9uLTEnLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiBmYWxzZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IGZhbHNlLFxuICAgICAgICAgIGlzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIGhhc0luaXRpYWxNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlc0xlbmd0aDogMyxcbiAgICAgICAgICBwcmV2TWVzc2FnZXNMZW5ndGg6IDIsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoJ3N5bmMtdHVybicpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgICAgIGlzTmV3TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiB0cnVlLFxuICAgICAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBoYXNJbml0aWFsTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZXNMZW5ndGg6IDMsXG4gICAgICAgICAgcHJldk1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKCdhZmZvcmRhbmNlcy1vbmx5JylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRBdXRvU2Nyb2xsT25NZXNzYWdlc0NoYW5nZSh7XG4gICAgICAgICAgaXNOZXdNZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIGFuY2hvcmVkVHVybklkOiBudWxsLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiB0cnVlLFxuICAgICAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBoYXNJbml0aWFsTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZXNMZW5ndGg6IDMsXG4gICAgICAgICAgcHJldk1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKCdzY3JvbGwnKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZEF1dG9TY3JvbGxPbk1lc3NhZ2VzQ2hhbmdlKHtcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgYW5jaG9yZWRUdXJuSWQ6IG51bGwsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiBmYWxzZSxcbiAgICAgICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXRCb3R0b206IGZhbHNlLFxuICAgICAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogZmFsc2UsXG4gICAgICAgICAgaXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaGFzSW5pdGlhbE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2VzTGVuZ3RoOiA0LFxuICAgICAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogMyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnc2Nyb2xsJylcbiAgICB9KVxuXG4gICAgaXQoJ2NvbnRyb2xzIHN0cmVhbSBzeW5jIGFuZCBnbG9iYWwgbG9hZGluZyBpbmRpY2F0b3JzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFJ1blN0cmVhbVR1cm5TeW5jRWZmZWN0KGZhbHNlLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QodHJ1ZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yKCdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsIHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcignYW5zd2VyLTEnLCB0cnVlLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IoZmFsc2UsIHsgdHlwZTogJ3dyaXRpbmcnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IodHJ1ZSwgeyB0eXBlOiAnd3JpdGluZycgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnbWVzc2FnZSBpdGVtIHJlbmRlcmluZyBndWFyZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Jlc29sdmVzIHVzZXIgYW5kIGFzc2lzdGFudCByb2xlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0N1cnJlbnRVc2VyTWVzc2FnZShDaGF0SGlzdG9yeVJvbGUuVVNFUiwgJzknLCAnOScpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNDdXJyZW50VXNlck1lc3NhZ2UoQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCwgJzEnLCAnMScpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBc3Npc3RhbnRDaGF0TWVzc2FnZShDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULCAnYXNzaXN0YW50JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0Fzc2lzdGFudENoYXRNZXNzYWdlKENoYXRIaXN0b3J5Um9sZS5VU0VSLCAnYXNzaXN0YW50JykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2Rlcml2ZXMgc3RyZWFtaW5nIGJvZHkgYW5kIGFjdGl2aXR5IGluZGljYXRvciBmbGFncycsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlKGZhbHNlLCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dTdHJlYW1pbmdNZXNzYWdlQm9keSh0cnVlLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93U3RyZWFtaW5nTWVzc2FnZUJvZHkodHJ1ZSwgdHJ1ZSwgdHJ1ZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yKHRydWUsIHRydWUsIHsgdHlwZTogJ3dyaXRpbmcnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yKGZhbHNlLCB0cnVlLCB7IHR5cGU6ICd3cml0aW5nJyB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2d1YXJkcyBjaGFuZ2UtcHJvamVjdCwgYXR0YWNobWVudHMsIHRleHQgYm9keSBhbmQgYXBwcm92YWwgVUknLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyQ2hhbmdlUHJvamVjdE1lc3NhZ2UodHJ1ZSwgW3sgaWQ6IDEgfV0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyQ2hhbmdlUHJvamVjdE1lc3NhZ2UodHJ1ZSwgbnVsbCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd01lc3NhZ2VBdHRhY2htZW50c1JvdygwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93KDIpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSh7XG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICcnLFxuICAgICAgICAgIHNob3dTdHJlYW1pbmdCb2R5OiB0cnVlLFxuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5KHtcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJ2hvbGEnLFxuICAgICAgICAgIHNob3dTdHJlYW1pbmdCb2R5OiBmYWxzZSxcbiAgICAgICAgICBpc0Fzc2lzdGFudDogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0FwcHJvdmFsQWN0aW9ucyh7IHBlbmRpbmdfYWN0aW9uczogW10gfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zKHt9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2hpZGVzIGVtcHR5IHN0cmVhbWluZyBib2RpZXMgYW5kIGNvbnRyb2xzIGFzc2lzdGFudCBjaHJvbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSgnJywgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSgnJywgdHJ1ZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlckFzc2lzdGFudEZlZWRiYWNrKHtcbiAgICAgICAgICBpc0Fzc2lzdGFudDogdHJ1ZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICBvblJldHJ5OiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2soe1xuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgICBzdWdnZXN0aW9uc0xlbmd0aDogMixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgICBzdWdnZXN0aW9uc0xlbmd0aDogMCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zKGZhbHNlLCBmYWxzZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlckNyZWF0ZUFnZW50QWN0aW9ucyh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgYWdlbnRJZDogJ2FnZW50LTEnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdrZWVwcyBhIGJsb2NraW5nIGNob2ljZSBhbmQgb3B0aW9uYWwgc3VnZ2VzdGlvbnMgbXV0dWFsbHkgZXhjbHVzaXZlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbXVsdGlwbGVDaG9pY2UgPSB7IG9wdGlvbnM6IFt7IGtleTogJ0EnLCB0ZXh0OiAnU2l0aW8gd2ViJyB9XSB9XG4gICAgICBjb25zdCBhc3Npc3RhbnQgPSB7IGlzQXNzaXN0YW50OiB0cnVlLCBzdWdnZXN0aW9uc0xlbmd0aDogMiB9XG5cbiAgICAgIGV4cGVjdChzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyhhc3Npc3RhbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMoeyAuLi5hc3Npc3RhbnQsIG11bHRpcGxlQ2hvaWNlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zKHsgLi4uYXNzaXN0YW50LCBtdWx0aXBsZUNob2ljZTogbnVsbCB9KSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnZXh0cmFjdHMgdGhlIGxhc3QgcXVlc3Rpb24gbGluZSBvZiB0aGUgYXNzaXN0YW50IHByb3NlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGV4dHJhY3RNdWx0aXBsZUNob2ljZVF1ZXN0aW9uKCdFbmNvbnRyw6kgMyBwcm95ZWN0b3MuXFxuXFxuKirCv0VuIGN1w6FsIGxhIGNyZW8/KionKSkudG9CZSgnwr9FbiBjdcOhbCBsYSBjcmVvPycpXG4gICAgICBleHBlY3QoZXh0cmFjdE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24oJ8K/UHJpbWVybz9cXG5UZXh0b1xcbi0gwr9TZWd1bmRvPycpKS50b0JlKCfCv1NlZ3VuZG8/JylcbiAgICAgIGV4cGVjdChleHRyYWN0TXVsdGlwbGVDaG9pY2VRdWVzdGlvbignRWxlZ8OtIHVuYSBvcGNpw7NuLicpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QoZXh0cmFjdE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24odW5kZWZpbmVkKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncmVzb2x2ZVBlbmRpbmdNdWx0aXBsZUNob2ljZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBbXG4gICAgICAgIHsga2V5OiAnQScsIHRleHQ6ICdQcm95ZWN0byBBbGZhJyB9LFxuICAgICAgICB7IGtleTogJ0InLCB0ZXh0OiAnUHJveWVjdG8gQmV0YScgfSxcbiAgICAgIF1cbiAgICAgIGNvbnN0IGFzc2lzdGFudCA9IHtcbiAgICAgICAgaWQ6ICdhc3Npc3RhbnQtMScsXG4gICAgICAgIG1lc3NhZ2U6ICdIYXkgZG9zLlxcbsK/RW4gcXXDqSBwcm95ZWN0byBsYSBjcmVvPycsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnIH0sXG4gICAgICAgIG11bHRpcGxlQ2hvaWNlOiB7IG9wdGlvbnMgfSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXIgPSB7IGlkOiAndXNlci0xJywgbWVzc2FnZTogJ0FsZmEnLCByb2xlOiBDaGF0SGlzdG9yeVJvbGUuVVNFUiwgdXNlcjogeyBpZDogJzQyJyB9IH1cbiAgICAgIGNvbnN0IHJlc29sdmUgPSAob3ZlcnJpZGVzOiBQYXJ0aWFsPFBhcmFtZXRlcnM8dHlwZW9mIHJlc29sdmVQZW5kaW5nTXVsdGlwbGVDaG9pY2U+WzBdPiA9IHt9KSA9PlxuICAgICAgICByZXNvbHZlUGVuZGluZ011bHRpcGxlQ2hvaWNlKHtcbiAgICAgICAgICBtZXNzYWdlczogW2Fzc2lzdGFudF0sXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGRpc21pc3NlZE1lc3NhZ2VJZHM6IHt9LFxuICAgICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgfSlcblxuICAgICAgaXQoJ3JldHVybnMgdGhlIGNob2ljZSBvZiB0aGUgbGFzdCBhc3Npc3RhbnQgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc29sdmUoKSkudG9FcXVhbCh7IG1lc3NhZ2VJZDogJ2Fzc2lzdGFudC0xJywgcXVlc3Rpb246ICfCv0VuIHF1w6kgcHJveWVjdG8gbGEgY3Jlbz8nLCBvcHRpb25zIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgncmV0dXJucyBudWxsIG9uY2UgdGhlIGNvbnZlcnNhdGlvbiBtb3ZlZCBvbiwgd2hpbGUgc3RyZWFtaW5nIG9yIHdoZW4gZGlzbWlzc2VkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IG1lc3NhZ2VzOiBbYXNzaXN0YW50LCB1c2VyXSB9KSkudG9CZU51bGwoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IGlzU3RyZWFtaW5nOiB0cnVlIH0pKS50b0JlTnVsbCgpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlKHsgZGlzbWlzc2VkTWVzc2FnZUlkczogeyAnYXNzaXN0YW50LTEnOiB0cnVlIH0gfSkpLnRvQmVOdWxsKClcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdyZXR1cm5zIG51bGwgZm9yIGVycm9yZWQsIGNhbmNlbGxlZCwgYXBwcm92YWwgb3Igc2luZ2xlLW9wdGlvbiBtZXNzYWdlcycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc29sdmUoeyBtZXNzYWdlczogW3sgLi4uYXNzaXN0YW50LCBpc0Vycm9yOiB0cnVlIH1dIH0pKS50b0JlTnVsbCgpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlKHsgbWVzc2FnZXM6IFt7IC4uLmFzc2lzdGFudCwgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSB9XSB9KSkudG9CZU51bGwoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IG1lc3NhZ2VzOiBbeyAuLi5hc3Npc3RhbnQsIGFwcHJvdmFsOiB7fSB9XSB9KSkudG9CZU51bGwoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IG1lc3NhZ2VzOiBbeyAuLi5hc3Npc3RhbnQsIG11bHRpcGxlQ2hvaWNlOiB7IG9wdGlvbnM6IFtvcHRpb25zWzBdXSB9IH1dIH0pKS50b0JlTnVsbCgpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlKHsgbWVzc2FnZXM6IFt7IC4uLmFzc2lzdGFudCwgbXVsdGlwbGVDaG9pY2U6IG51bGwgfV0gfSkpLnRvQmVOdWxsKClcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdjb21wYXJlcyBwZW5kaW5nIGNob2ljZXMgYnkgbWVzc2FnZSwgcXVlc3Rpb24gYW5kIG9wdGlvbnMgaWRlbnRpdHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSByZXNvbHZlKClcbiAgICAgICAgZXhwZWN0KGlzU2FtZVBlbmRpbmdNdWx0aXBsZUNob2ljZShwZW5kaW5nLCByZXNvbHZlKCkpKS50b0JlKHRydWUpXG4gICAgICAgIGV4cGVjdChpc1NhbWVQZW5kaW5nTXVsdGlwbGVDaG9pY2UocGVuZGluZywgbnVsbCkpLnRvQmUoZmFsc2UpXG4gICAgICAgIGV4cGVjdChpc1NhbWVQZW5kaW5nTXVsdGlwbGVDaG9pY2UobnVsbCwgbnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhc3Npc3RhbnQgPSB7XG4gICAgICAgIGlkOiAnYXNzaXN0YW50LTEnLFxuICAgICAgICBtZXNzYWdlOiAnwr9FbiBxdcOpIHByb3llY3RvIGxhIGNyZW8/JyxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcgfSxcbiAgICAgICAgbXVsdGlwbGVDaG9pY2U6IHtcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGtleTogJ0EnLCB0ZXh0OiAnUHJveWVjdG8gQWxmYScsIGRlc2NyaXB0aW9uOiAnRXF1aXBvIGRlIHByb2R1Y3RvJyB9LFxuICAgICAgICAgICAgeyBrZXk6ICdCJywgdGV4dDogJ1Byb3llY3RvIEJldGEnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGx5ID0gKG1lc3NhZ2U6IHN0cmluZywga2V5OiBzdHJpbmcgfCBudWxsKSA9PiAoe1xuICAgICAgICBpZDogJ3VzZXItMScsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5VU0VSLFxuICAgICAgICB1c2VyOiB7IGlkOiAnNDInIH0sXG4gICAgICAgIG11bHRpcGxlQ2hvaWNlQW5zd2VyOiB7IGtleSB9LFxuICAgICAgfSlcblxuICAgICAgaXQoJ3Jlc29sdmVzIGEgY2hvc2VuIG9wdGlvbiB3aXRoIGl0cyBudW1iZXIgYW5kIGRlc2NyaXB0aW9uIGFuZCBoaWRlcyB0aGUgdXNlciBidWJibGUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMoW2Fzc2lzdGFudCwgcmVwbHkoJ1Byb3llY3RvIEFsZmEnLCAnQScpXSkpLnRvRXF1YWwoe1xuICAgICAgICAgIGFuc3dlcnM6IHsgJ2Fzc2lzdGFudC0xJzogeyBudW1iZXI6IDEsIHRleHQ6ICdQcm95ZWN0byBBbGZhJywgZGVzY3JpcHRpb246ICdFcXVpcG8gZGUgcHJvZHVjdG8nIH0gfSxcbiAgICAgICAgICBoaWRkZW5NZXNzYWdlSWRzOiB7ICd1c2VyLTEnOiB0cnVlIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgncmVzb2x2ZXMgYSB0eXBlZCBhbnN3ZXIsIG9yIGFuIHVua25vd24ga2V5LCB3aXRoIHRoZSB0ZXh0IHRoZSB1c2VyIHNlbnQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMoW2Fzc2lzdGFudCwgcmVwbHkoJyAgT3RybyBwcm95ZWN0byAnLCBudWxsKV0pLmFuc3dlcnMpLnRvRXF1YWwoe1xuICAgICAgICAgICdhc3Npc3RhbnQtMSc6IHsgbnVtYmVyOiBudWxsLCB0ZXh0OiAnT3RybyBwcm95ZWN0bycgfSxcbiAgICAgICAgfSlcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIHJlc29sdmVBbnN3ZXJlZE11bHRpcGxlQ2hvaWNlcyhbYXNzaXN0YW50LCByZXBseSgnR2FtbWEnLCAnWicpXSkuYW5zd2Vyc1snYXNzaXN0YW50LTEnXS5udW1iZXJcbiAgICAgICAgKS50b0JlTnVsbCgpXG4gICAgICB9KVxuXG4gICAgICBpdCgncmVzb2x2ZXMgYSBza2lwcGVkIHF1ZXN0aW9uIHdpdGhvdXQgdGhlIHRleHQgc2VudCB0byB0aGUgYWdlbnQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraXBwZWQgPSB7IC4uLnJlcGx5KCdPbWl0byBlc3RhIHByZWd1bnRhLicsIG51bGwpLCBtdWx0aXBsZUNob2ljZUFuc3dlcjogeyBrZXk6IG51bGwsIHNraXBwZWQ6IHRydWUgfSB9XG4gICAgICAgIGV4cGVjdChyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMoW2Fzc2lzdGFudCwgc2tpcHBlZF0pKS50b0VxdWFsKHtcbiAgICAgICAgICBhbnN3ZXJzOiB7ICdhc3Npc3RhbnQtMSc6IHsgbnVtYmVyOiBudWxsLCB0ZXh0OiAnJywgc2tpcHBlZDogdHJ1ZSB9IH0sXG4gICAgICAgICAgaGlkZGVuTWVzc2FnZUlkczogeyAndXNlci0xJzogdHJ1ZSB9LFxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ2xlYXZlcyByZXBsaWVzIHRoYXQgZGlkIG5vdCBjb21lIGZyb20gdGhlIGNhcmQgdW50b3VjaGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IG11bHRpcGxlQ2hvaWNlQW5zd2VyLCAuLi5wbGFpbiB9ID0gcmVwbHkoJ0FsZmEnLCAnQScpXG4gICAgICAgIGV4cGVjdChtdWx0aXBsZUNob2ljZUFuc3dlcikudG9CZURlZmluZWQoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZUFuc3dlcmVkTXVsdGlwbGVDaG9pY2VzKFthc3Npc3RhbnQsIHBsYWluXSkpLnRvRXF1YWwoeyBhbnN3ZXJzOiB7fSwgaGlkZGVuTWVzc2FnZUlkczoge30gfSlcbiAgICAgICAgZXhwZWN0KHJlc29sdmVBbnN3ZXJlZE11bHRpcGxlQ2hvaWNlcyhbYXNzaXN0YW50XSkpLnRvRXF1YWwoeyBhbnN3ZXJzOiB7fSwgaGlkZGVuTWVzc2FnZUlkczoge30gfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdhbmNob3JzIHRoZSB0dXJuIG9uIHRoZSByZXNvbHZlZCBjYXJkIHdoZW4gdGhlIHF1ZXN0aW9uIGJ1YmJsZSBpcyBoaWRkZW4nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW3sgaWQ6ICdhc3Npc3RhbnQtMScgfSwgeyBpZDogJ3VzZXItMScgfV1cbiAgICAgICAgZXhwZWN0KHJlc29sdmVUdXJuQW5jaG9ySWQobWVzc2FnZXMsICd1c2VyLTEnLCB7ICd1c2VyLTEnOiB0cnVlIH0pKS50b0JlKCdhc3Npc3RhbnQtMScpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlVHVybkFuY2hvcklkKG1lc3NhZ2VzLCAndXNlci0xJywge30pKS50b0JlKCd1c2VyLTEnKVxuICAgICAgICBleHBlY3QocmVzb2x2ZVR1cm5BbmNob3JJZChtZXNzYWdlcywgbnVsbCwgeyAndXNlci0xJzogdHJ1ZSB9KSkudG9CZU51bGwoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVzIGxpc3Qgc3RyZWFtaW5nIGZsYWdzIGZvciB0aGUgbGFzdCBhc3Npc3RhbnQgcGxhY2Vob2xkZXIgb25seScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzKHtcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICAgIHVzZXJJZDogJ2Fzc2lzdGFudCcsXG4gICAgICAgICAgbWVzc2FnZUlkOiAnYW5zd2VyLXR1cm4tMS1zdHJlYW1pbmcnLFxuICAgICAgICAgIGlzTGFzdE1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiB0cnVlLCBpc1N0cmVhbWluZzogdHJ1ZSB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyh7XG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICB1c2VySWQ6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIG1lc3NhZ2VJZDogJ2Fuc3dlci10dXJuLTEtc3RyZWFtaW5nJyxcbiAgICAgICAgICBpc0xhc3RNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGZhbHNlLCBpc1N0cmVhbWluZzogZmFsc2UgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3Moe1xuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgdXNlcklkOiAnYXNzaXN0YW50JyxcbiAgICAgICAgICBtZXNzYWdlSWQ6ICdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsXG4gICAgICAgICAgaXNMYXN0TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgIGlzV3JpdGluZzogdHJ1ZSxcbiAgICAgICAgfSkuaXNTdHJlYW1pbmdcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3N1Z2dlc3Rpb25zIGFuZCBhdHRhY2htZW50cycsICgpID0+IHtcbiAgICBpdCgnaWdub3JlcyBlbXB0eSBvciBhbHJlYWR5LXNlbGVjdGVkIHN1Z2dlc3Rpb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljaygnICAnLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2soJ3JldHJ5JywgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2soJ2dvJywgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyByZXRyeSBzdWdnZXN0aW9uIHNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbih0cnVlLCAnUmVpbnRlbnRhcicsICdSZWludGVudGFyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbihmYWxzZSwgJ1JlaW50ZW50YXInLCAnUmVpbnRlbnRhcicpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgcmV0cnkgYXR0YWNobWVudHMgZnJvbSB1c2VyIG1lc3NhZ2Ugc291cmNlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gW3sgaWQ6ICcxJywgbmFtZTogJ2EucGRmJywgc2l6ZTogMSwgdHlwZTogJ3BkZicgfV1cbiAgICAgIGV4cGVjdChyZXNvbHZlUmV0cnlBdHRhY2htZW50c0Zyb21Vc2VyTWVzc2FnZSh7IGF0dGFjaG1lbnRzIH0pKS50b0VxdWFsKGF0dGFjaG1lbnRzKVxuICAgICAgZXhwZWN0KHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlKHsgc291cmNlczogYXR0YWNobWVudHMgfSkpLnRvRXF1YWwoYXR0YWNobWVudHMpXG4gICAgICBleHBlY3QocmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2Uoe30pKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdCgnY291bnRzIGF0dGFjaG1lbnRzIGZyb20gYXR0YWNobWVudHMgb3Igc291cmNlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMoeyBhdHRhY2htZW50czogW3sgaWQ6ICcxJywgbmFtZTogJ2EnLCBzaXplOiAxLCB0eXBlOiAncGRmJyB9XSB9KSkudG9CZSgxKVxuICAgICAgZXhwZWN0KGNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyh7IHNvdXJjZXM6IFt7IGlkOiAnMicgfV0gfSkpLnRvQmUoMSlcbiAgICAgIGV4cGVjdChjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMobnVsbCkpLnRvQmUoMClcbiAgICB9KVxuXG4gICAgaXQoJ3BpY2tzIGF0dGFjaG1lbnQgZG93bmxvYWQgc3RyYXRlZ3knLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSgnaHR0cHM6Ly9hLnRlc3QnLCBudWxsKSkudG9CZSgncmVtb3RlLXVybCcpXG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSh1bmRlZmluZWQsIG5ldyBGaWxlKFsneCddLCAnYS50eHQnKSkpLnRvQmUoJ2xvY2FsLWZpbGUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3kodW5kZWZpbmVkLCBudWxsKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnYmxvY2tzIHNlbGVjdGluZyBhbm90aGVyIHByb2plY3Qgb3B0aW9uIGFmdGVyIG9uZSBpcyBjaG9zZW4nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkT3Blbk1lc3NhZ2VPcHRpb24obnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRPcGVuTWVzc2FnZU9wdGlvbih7IGlkOiAxIH0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2V4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCcsICgpID0+IHtcbiAgICBpdCgncmVtb3ZlcyBhbnN3ZXIgc2VnbWVudHMgZnJvbSB0aGUgbWVzc2FnZSBpZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQoJ3F1ZXN0aW9uLTEtYW5zd2VyLXN0cmVhbS0yJykpLnRvQmUoJ3F1ZXN0aW9uLTEtc3RyZWFtLTInKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2F0dGFjaG1lbnRzJywgKCkgPT4ge1xuICAgIGl0KCdkZXRlY3RzIGF1ZGlvIGF0dGFjaG1lbnRzIGJ5IG1pbWUgdHlwZSwgZXh0ZW5zaW9uIG9yIG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnYXVkaW8vbXBlZycsIG5hbWU6ICd2b2ljZS5tcDMnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnbXAzJywgbmFtZTogJ3ZvaWNlLm1wMycgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0F1ZGlvQXR0YWNobWVudCh7IHR5cGU6ICd0ZXh0L3BsYWluJywgbmFtZTogJ25vdGVzLnR4dCcgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgcHJldmlldyBmb3IgbG9jYWwgZmlsZXMgYW5kIHJlbW90ZSB1cmxzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5PcGVuQXR0YWNobWVudFByZXZpZXcoe1xuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgbmFtZTogJ2EucGRmJyxcbiAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICAgICAgIGZpbGU6IG5ldyBGaWxlKFsneCddLCAnYS5wZGYnKSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhbk9wZW5BdHRhY2htZW50UHJldmlldyh7XG4gICAgICAgICAgaWQ6ICcyJyxcbiAgICAgICAgICBuYW1lOiAnYi5wZGYnLFxuICAgICAgICAgIHNpemU6IDEsXG4gICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgICAgICAgdXJsX29yaWdpbmFsOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9iLnBkZicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdsaXN0IG1lc3NhZ2UgdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICBpdCgnc2tpcHMgZW1wdHkgbWVzc2FnZXMgdW5sZXNzIHN0cmVhbWluZyBvciByaWNoIGNvbnRlbnQgaXMgcHJlc2VudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAxLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnaG9sYScsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdQcm95ZWN0bycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMSxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmV0cnkgYW5kIGZlZWRiYWNrIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgd2FzSGVscGZ1bCB0byBmZWVkYmFjayBlbnVtJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVEaXNhYmxlRmVlZGJhY2tGcm9tV2FzSGVscGZ1bCh1bmRlZmluZWQpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZURpc2FibGVGZWVkYmFja0Zyb21XYXNIZWxwZnVsKHRydWUpKS50b0JlKEZlZWRiYWNrLlRIVU1CU19VUClcbiAgICAgIGV4cGVjdChyZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwoZmFsc2UpKS50b0JlKEZlZWRiYWNrLlRIVU1CU19ET1dOKVxuICAgIH0pXG5cbiAgICBpdCgnYWxsb3dzIHJldHJ5IGZvciBmcm9udGVuZC1jYW5jZWxsZWQgdHVybnMgd2l0aCBhIHVzZXIgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICB0dXJuSWQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2Jsb2NrcyByZXRyeSB3aGVuIHN0cmVhbWluZywgZXJyb3IsIGFwcHJvdmFsIG9yIG1pc3NpbmcgdXNlciBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IGZhbHNlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgdHVybklkOiAndHVybi0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIHR1cm5JZDogJ3R1cm4tMScsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICB0dXJuSWQ6ICd0dXJuLTEnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogdHJ1ZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgaXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IHRydWUsXG4gICAgICAgICAgdHVybklkOiAndHVybi0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBpc0NhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICB0dXJuSWQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIHR1cm5JZDogJ3R1cm4tMScsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdhdHRhY2htZW50IGRvd25sb2FkIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkcyBmaWxlIG5hbWVzIGFuZCBwaWNrcyB0aGUgZmlyc3QgYXZhaWxhYmxlIHVybCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkRmlsZU5hbWUoeyBuYW1lOiAnYnJpZWYucGRmJywgdHlwZTogJ3BkZicgfSkpLnRvQmUoJ2JyaWVmLnBkZicpXG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lKHsgbmFtZTogJ2JyaWVmJywgdHlwZTogJ3BkZicgfSkpLnRvQmUoJ2JyaWVmLnBkZicpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwoe1xuICAgICAgICAgIHVybF9vcmlnaW5hbDogJ2h0dHBzOi8vYS50ZXN0L28nLFxuICAgICAgICAgIHVybF9maWxlOiAnaHR0cHM6Ly9hLnRlc3QvZicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoJ2h0dHBzOi8vYS50ZXN0L28nKVxuICAgIH0pXG5cbiAgICBpdCgnZmFsbHMgYmFjayB0byB1c2VyIHNvdXJjZXMgd2hlbiBhdHRhY2htZW50cyBhcmUgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBbeyBpZDogJ3MxJywgbmFtZTogJ2EucGRmJywgc2l6ZTogMSwgdHlwZTogJ3BkZicgfV1cbiAgICAgIGV4cGVjdChyZXNvbHZlTWVzc2FnZUF0dGFjaG1lbnRzKHVuZGVmaW5lZCwgZmFsc2UsIHNvdXJjZXMpKS50b0VxdWFsKHNvdXJjZXMpXG4gICAgICBleHBlY3QocmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyhbXSwgdHJ1ZSwgc291cmNlcykpLnRvRXF1YWwoW10pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndHVybiBzcGFjZSBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdmaW5kcyB0aGUgbGF0ZXN0IHF1ZXN0aW9uIGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpbmRMYXN0UXVlc3Rpb25JZChbeyBpZDogJ2Fuc3dlci0xJyB9LCB7IGlkOiAncXVlc3Rpb24tOScgfSwgeyBpZDogJ3F1ZXN0aW9uLTEwJyB9XSkpLnRvQmUoJ3F1ZXN0aW9uLTEwJylcbiAgICB9KVxuXG4gICAgaXQoJ2NvbXB1dGVzIHJlc2VydmVkIGFuZCByZW1vdmFibGUgc3BhY2VyIGhlaWdodHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlKDgwMCwgNjAwLCA4MDApKS50b0JlKDU2KVxuICAgICAgZXhwZWN0KGNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UoMTIwMCwgODAwLCAyMDAsIDMwMCkpLnRvQmUoMTAwKVxuICAgICAgZXhwZWN0KGNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UoMTIwMCwgODAwLCAyMDAsIDApKS50b0JlKDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnYnJhbmNoIGNvdmVyYWdlIGdhcHMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvciByZXF1aXJlcyBwbGFjZWhvbGRlciBpZCBhbmQgYWN0aXZlIHN0cmVhbScsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IodW5kZWZpbmVkLCB0cnVlLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IoJ2Fuc3dlci10dXJuLTEtc3RyZWFtaW5nJywgZmFsc2UsIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyByZXNwZWN0cyBkaXNhYmxlZCBjaGlwcyBvbiB0aGUgbGFzdCBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyhmYWxzZSwgdHJ1ZSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyBvbmx5IHN0cmVhbXMgdGhlIGxhc3QgYXNzaXN0YW50IHBsYWNlaG9sZGVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3Moe1xuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgdXNlcklkOiAnYXNzaXN0YW50JyxcbiAgICAgICAgICBtZXNzYWdlSWQ6ICdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsXG4gICAgICAgICAgaXNMYXN0TWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSwgaXNTdHJlYW1pbmc6IGZhbHNlIH0pXG4gICAgfSlcblxuICAgIGl0KCdpc0F1ZGlvQXR0YWNobWVudCBkZXRlY3RzIGV4dGVuc2lvbi1vbmx5IGZpbGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQXVkaW9BdHRhY2htZW50KHsgdHlwZTogJycsIG5hbWU6ICd2b2ljZS53YXYnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnYXVkaW8vd2VibScsIG5hbWU6ICdjbGlwJyB9KSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3IGFjY2VwdHMgb3JpZ2luYWxGaWxlIGFuZCB1cmxfZmlsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3KHtcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIG5hbWU6ICdhLnBkZicsXG4gICAgICAgICAgdHlwZTogJ3BkZicsXG4gICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICBmaWxlOiB1bmRlZmluZWQgYXMgbmV2ZXIsXG4gICAgICAgICAgb3JpZ2luYWxGaWxlOiBuZXcgRmlsZShbXSwgJ2EucGRmJyksXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3KHtcbiAgICAgICAgICBpZDogJzInLFxuICAgICAgICAgIG5hbWU6ICdiLnBkZicsXG4gICAgICAgICAgdHlwZTogJ3BkZicsXG4gICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICBmaWxlOiB1bmRlZmluZWQgYXMgbmV2ZXIsXG4gICAgICAgICAgdXJsX2ZpbGU6ICdodHRwczovL2Nkbi9maWxlJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyBpZ25vcmVzIGVtcHR5IGF0dGFjaG1lbnQgYXJyYXlzIGZvciBhc3Npc3RhbnRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMoW10sIHRydWUsIFt7IGlkOiAnczEnIH1dKSkudG9FcXVhbChbXSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwgZmFsbHMgYmFjayB0byB1cmxfZmlsZSBhbmQgdGh1bWJuYWlsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwoeyB1cmxfZmlsZTogJ2h0dHBzOi8vY2RuL2ZpbGUnIH0pKS50b0JlKCdodHRwczovL2Nkbi9maWxlJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkVXJsKHsgdXJsX3RodW1ibmFpbDogJ2h0dHBzOi8vY2RuL3RodW1iJyB9KSkudG9CZSgnaHR0cHM6Ly9jZG4vdGh1bWInKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3N0cmVhbWluZyBhbmQgc2Nyb2xsIGxpZmVjeWNsZSBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdidWlsZHMgc21vb3RoIHN0cmVhbSBvcHRpb25zIGZyb20gd2luZG93IGZsYWdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMoeyBzdHJlYW1MYWdNczogMTAwIH0sIHRydWUpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgdGFyZ2V0TGFnTXM6IDEwMCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RyZWFtTGFnTXM6IDEwMCxcbiAgICAgICAgICAgIHN0cmVhbUFkYXB0OiB0cnVlLFxuICAgICAgICAgICAgc3RyZWFtQnVmZmVyTXM6IDIwMCxcbiAgICAgICAgICAgIHN0cmVhbU1pbkJ1ZmZlcjogMTAsXG4gICAgICAgICAgICBzdHJlYW1XYXJtdXBNczogNTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgIClcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGFkYXB0VG9CYWNrZW5kUmF0ZTogdHJ1ZSxcbiAgICAgICAgdGFyZ2V0QnVmZmVyTXM6IDIwMCxcbiAgICAgICAgbWluQnVmZmVyQ2hhcnM6IDEwLFxuICAgICAgICB3YXJtdXBNczogNTAsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMoe30sIGZhbHNlKS5lbmFibGVkKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzIHJldHVybnMgZW1wdHkgd2hlbiB3aW5kb3cgaXMgdW5hdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbFdpbmRvdyA9IGdsb2JhbC53aW5kb3dcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2ltdWxhdGluZyBub24tYnJvd3NlciBydW50aW1lXG4gICAgICBkZWxldGUgZ2xvYmFsLndpbmRvd1xuICAgICAgZXhwZWN0KHJlYWRTbW9vdGhTdHJlYW1XaW5kb3dGbGFncygpKS50b0VxdWFsKHt9KVxuICAgICAgZ2xvYmFsLndpbmRvdyA9IG9yaWdpbmFsV2luZG93XG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBzdHJlYW1pbmcgcmF3IHRleHQgYW5kIGhvb2sgaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVTdHJlYW1pbmdSYXdUZXh0KHRydWUsICdsaXZlJywgJ2ZpbmFsJykpLnRvQmUoJ2xpdmUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkKGZhbHNlLCAnaWQtMScpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVN0cmVhbWluZ1RleHRIb29rSWQodHJ1ZSwgZmFsc2UsICdpZC0xJykpLnRvQmUoJ2lkLTEnKVxuICAgICAgZXhwZWN0KHJlc29sdmVSZWFzb25pbmdUcmFjZUhvb2tJZCh0cnVlLCB0cnVlLCAnaWQtMScpKS50b0JlKCdpZC0xJylcbiAgICB9KVxuXG4gICAgaXQoJ2d1YXJkcyBjaGF0IGluaXQsIHR1cm4gcmVzZXJ2YXRpb24gYW5kIHNjcm9sbCBlZmZlY3RzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEluaXRpYWxpemVDaGF0KGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24odHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTY2hlZHVsZVR1cm5TcGFjZVJlc2VydmF0aW9uKGZhbHNlLCBmYWxzZSwgJ3F1ZXN0aW9uLTEnLCBudWxsKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBNZXNzYWdlc1Njcm9sbEVmZmVjdChmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSdW5TZXNzaW9uQ2FjaGVTY3JvbGxUb0JvdHRvbShmYWxzZSwgJ2NoYXQtMScsIDIsIG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzKHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNjcm9sbFRvQm90dG9tQWZ0ZXJMb2FkKHRydWUsIDApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kKGZhbHNlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzdG9yZXMgc2Nyb2xsIHBvc2l0aW9uIGZyb20gc2Vzc2lvbiBzbmFwc2hvdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uKG51bGwsICdjaGF0LTEnKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZW5kaW5nU2Nyb2xsVG9wRnJvbVNlc3Npb24oeyBzY3JvbGxTZXNzaW9uSWQ6ICdjaGF0LTEnLCBzY3JvbGxUb3A6IDEyMCB9LCAnY2hhdC0xJykpLnRvQmUoMTIwKVxuICAgICAgZXhwZWN0KHNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUoZmFsc2UsIDUwLCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyU2Nyb2xsUmVzdG9yZVdpdGhvdXRDaGF0KG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UoZmFsc2UsIHRydWUsIHRydWUpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBsaXN0IGtleXMsIGFuYWx5dGljcyBhbmQgY2FuY2VsbGVkIGZlZWRiYWNrIHByb3BzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVNZXNzYWdlTGlzdEl0ZW1LZXkodW5kZWZpbmVkLCAzKSkudG9CZSgnbXNnLTMnKVxuICAgICAgZXhwZWN0KHJlc29sdmVTdWdnZXN0aW9uQW5hbHl0aWNzQWdlbnRUeXBlKHRydWUsICdjbG9uZScpKS50b0JlKCdtYXJrZXRwbGFjZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQodHJ1ZSwgW3sgaWQ6IDEgfV0sICgpID0+IHVuZGVmaW5lZCkuc291cmNlcykudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzKHRydWUsIFsnbm9kZSddKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxPblBhcmVudE1vZGUodHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Byb2Nlc3NlcyBzY3JvbGwgZnJhbWVzIGFuZCB0dXJuIHJlc2VydmF0aW9uIHBsYW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnJhbWUgPSBwcm9jZXNzQ2hhdE1lc3NhZ2VzU2Nyb2xsRnJhbWUoe1xuICAgICAgICBzY3JvbGxUb3A6IDIwMCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0OiAxMDAwLFxuICAgICAgICBjbGllbnRIZWlnaHQ6IDQwMCxcbiAgICAgICAgbGFzdFNjcm9sbFRvcDogMjUwLFxuICAgICAgICBzY3JvbGxUaHJlc2hvbGQ6IDM5LFxuICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgaW5pdGlhbENoYXRJZDogJ2NoYXQtMScsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGZyYW1lLnNob3VsZERyYWluVHVyblNwYWNlKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoZnJhbWUuc2hvdWxkU2NoZWR1bGVTY3JvbGxQZXJzaXN0KS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0KHsgY29udGFpbmVyVG9wOiAxMCwgcXVlc3Rpb25Ub3A6IDUwLCBjb250ZW50Qm90dG9tOiAyNTAsIHNjcm9sbFRvcDogMTAwIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBxdWVzdGlvblRvcDogMTQwLCB0dXJuSGVpZ2h0OiAyMDAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlUmVzZXJ2ZVR1cm5TcGFjZVBsYW4oe1xuICAgICAgICAgIGN1cnJlbnRTY3JvbGxUb3A6IDUwMCxcbiAgICAgICAgICB0YXJnZXRTY3JvbGxUb3A6IDIwMCxcbiAgICAgICAgICBjbGllbnRIZWlnaHQ6IDQwMCxcbiAgICAgICAgICB0dXJuSGVpZ2h0OiAxMjAsXG4gICAgICAgIH0pLmtpbmRcbiAgICAgICkudG9CZSgnc2tpcC1yZXNlcnZhdGlvbicpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbih7XG4gICAgICAgICAgY3VycmVudFNjcm9sbFRvcDogNTAsXG4gICAgICAgICAgdGFyZ2V0U2Nyb2xsVG9wOiAyMDAsXG4gICAgICAgICAgY2xpZW50SGVpZ2h0OiA0MDAsXG4gICAgICAgICAgdHVybkhlaWdodDogMTIwLFxuICAgICAgICB9KS5raW5kXG4gICAgICApLnRvQmUoJ3Jlc2VydmUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxUb0JvdHRvbVRhcmdldFRvcCg5MDAsIDMwMCkpLnRvQmUoNjAwKVxuICAgICAgZXhwZWN0KHJlc29sdmVDb250YWluZXJBdEJvdHRvbSh7IHNjcm9sbEhlaWdodDogMTAwLCBzY3JvbGxUb3A6IDAsIGNsaWVudEhlaWdodDogMTAwIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QocmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tKG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkKHRydWUsICdpZC0xJykpLnRvQmUoJ2lkLTEnKVxuICAgICAgZXhwZWN0KGlzQXVkaW9BdHRhY2htZW50KHsgdHlwZTogdW5kZWZpbmVkIGFzIG5ldmVyLCBuYW1lOiB1bmRlZmluZWQgYXMgbmV2ZXIgfSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QocmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQoeyBhZ2VudElkOiAnYTEnIH0pKS50b0JlKCdhMScpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyhcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnIH0gfSxcbiAgICAgICAgICAgIHsgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLlVTRVIsIHVzZXI6IHsgaWQ6ICc3JyB9IH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAnNydcbiAgICAgICAgKT8udXNlci5pZFxuICAgICAgKS50b0JlKCc3JylcbiAgICB9KVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxTQUFTQSxRQUFRLFFBQVEsb0NBQW9DO0FBQzdELFNBQVNDLGVBQWUsUUFBUSxxQkFB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
|