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