@projectcor/maia-components 2.49.0-beta.1 → 2.49.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App.js +44 -19
- package/lib/components/atoms/ActionableButton.spec.js +111 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
- package/lib/components/atoms/Chip/Chip.spec.js +82 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
- package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
- package/lib/components/atoms/Expand/Expand.spec.js +57 -0
- package/lib/components/atoms/Fade/Fade.spec.js +31 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
- package/lib/components/atoms/HelpButton.spec.js +87 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
- package/lib/components/atoms/NextPageLoader.spec.js +37 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
- package/lib/components/atoms/PrimaryButton.spec.js +42 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
- package/lib/components/atoms/Switch/Switch.spec.js +41 -0
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
- package/lib/components/atoms/ThirdButton.spec.js +29 -0
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
- package/lib/components/atoms/WithAppCfg.spec.js +82 -0
- package/lib/components/index.js +2 -1
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
- package/lib/components/molecules/AgentInputBlock/index.js +5 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
- package/lib/components/molecules/ChatAIHome/styles.js +85 -78
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
- package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
- package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
- package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
- package/lib/components/organisms/ChatAIPage/index.js +3 -0
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
- package/lib/constants/formatExtensions.js +7 -8
- package/lib/constants/formatExtensions.spec.js +14 -0
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
- package/lib/constants/maiaFeatureAccess.spec.js +30 -0
- package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
- package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
- package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +4 -1
- package/lib/constants/permissions/utils.spec.js +128 -0
- package/lib/constants/plannerSyncEvents.spec.js +31 -0
- package/lib/constants/taskUrls.spec.js +9 -0
- package/lib/dev/DevMaiaPage.js +30 -0
- package/lib/dev/DevReasoningTimeline.js +75 -86
- package/lib/dev/Providers.js +5 -3
- package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
- package/lib/hooks/useAgentSuggestions.spec.js +89 -0
- package/lib/hooks/useCaretPosition.spec.js +58 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
- package/lib/hooks/useChatManager/useChatManager.js +272 -745
- package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
- package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
- package/lib/hooks/useChats/useChats.spec.js +208 -0
- package/lib/hooks/useClientSearch.helpers.js +36 -0
- package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
- package/lib/hooks/useClientSearch.js +4 -32
- package/lib/hooks/useClientSearch.spec.js +86 -0
- package/lib/hooks/useContextMentions.helpers.js +212 -0
- package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
- package/lib/hooks/useContextMentions.js +5 -223
- package/lib/hooks/useContextMentions.spec.js +338 -0
- package/lib/hooks/useContextMentions.types.js +2 -0
- package/lib/hooks/useContextPinPopover.helpers.js +95 -0
- package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
- package/lib/hooks/useContextPinPopover.js +16 -75
- package/lib/hooks/useContextPinPopover.spec.js +159 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
- package/lib/hooks/useDebounce.spec.js +42 -0
- package/lib/hooks/useEntitySearch.helpers.js +407 -0
- package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
- package/lib/hooks/useEntitySearch.js +52 -436
- package/lib/hooks/useEntitySearch.spec.js +718 -0
- package/lib/hooks/useEvent.spec.js +45 -0
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
- package/lib/hooks/useFrequentlyUsedActions.js +60 -22
- package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
- package/lib/hooks/useIsMaiaPageRoute.js +26 -0
- package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
- package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
- package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
- package/lib/hooks/useMentionPopover.helpers.js +41 -0
- package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
- package/lib/hooks/useMentionPopover.js +9 -35
- package/lib/hooks/useMentionPopover.spec.js +392 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
- package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
- package/lib/hooks/useModal/useModal.spec.js +73 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
- package/lib/hooks/useProjectSearch.helpers.js +61 -0
- package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
- package/lib/hooks/useProjectSearch.js +4 -58
- package/lib/hooks/useProjectSearch.spec.js +91 -0
- package/lib/hooks/useProjectSummary.spec.js +193 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
- package/lib/hooks/useProjectSummaryConfig.js +14 -52
- package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
- package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
- package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
- package/lib/hooks/useRecentClientsSearch.js +4 -32
- package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
- package/lib/hooks/useRecentContexts.spec.js +139 -0
- package/lib/hooks/useResize.spec.js +37 -0
- package/lib/hooks/useSkillsCatalog.spec.js +88 -0
- package/lib/hooks/useSlashCommands.spec.js +139 -0
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
- package/lib/hooks/useStreamResponse.spec.js +199 -0
- package/lib/hooks/useT.spec.js +20 -0
- package/lib/hooks/useToggle.spec.js +33 -0
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
- package/lib/index.js +5 -2
- package/lib/lang/br/index.js +26 -7
- package/lib/lang/en/index.js +26 -7
- package/lib/lang/es/index.js +26 -7
- package/lib/lang/fr/index.js +26 -7
- package/lib/services/appcues.spec.js +37 -0
- package/lib/services/maia/Access/updateAccess.spec.js +137 -0
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
- package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
- package/lib/services/maia/Agents/connectors.spec.js +496 -0
- package/lib/services/maia/Agents/createAgent.spec.js +55 -0
- package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
- package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
- package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
- package/lib/services/maia/Agents/getAgents.js +90 -282
- package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
- package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
- package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
- package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
- package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
- package/lib/services/maia/Chats/patchChat.spec.js +41 -0
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
- package/lib/services/maia/Knowledge/delete.spec.js +45 -0
- package/lib/services/maia/Knowledge/download.spec.js +78 -0
- package/lib/services/maia/Knowledge/save.spec.js +58 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
- package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
- package/lib/services/maia/Skills/createSkill.spec.js +68 -0
- package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
- package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
- package/lib/services/maia/Skills/getSkills.spec.js +152 -0
- package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
- package/lib/services/maia/client.spec.js +56 -0
- package/lib/services/utils/fetchCOR.spec.js +211 -0
- package/lib/services/utils/getCookie.spec.js +20 -0
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
- package/lib/services/utils/mapChatMessages.js +25 -254
- package/lib/services/utils/mapChatMessages.spec.js +254 -0
- package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
- package/lib/store/maiaLastChatPersistence.spec.js +22 -0
- package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
- package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
- package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
- package/lib/store/sessions/sessionNotifications.js +35 -41
- package/lib/store/sessions/sessionNotifications.spec.js +106 -0
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
- package/lib/store/sessions/sessionStreamManager.js +209 -277
- package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
- package/lib/store/sessions/sessions.types.spec.js +16 -0
- package/lib/store/sessions/useSessionsStore.spec.js +135 -0
- package/lib/store/useChatsStore.spec.js +619 -0
- package/lib/store/useFaqsStore.spec.js +57 -0
- package/lib/styles/cascade.js +29 -3
- package/lib/styles/transitions.js +3 -1
- package/lib/test/mockSseStream.js +121 -0
- package/lib/test/streamdownCodeMock.js +6 -0
- package/lib/test/streamdownMock.js +12 -0
- package/lib/types/Chat.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/lib/types/global.d.js +1 -1
- package/lib/types/reasoning.js +1 -1
- package/lib/utils/actionCategoryMap.spec.js +18 -0
- package/lib/utils/agentDisplayName.spec.js +48 -0
- package/lib/utils/autoApproveStorage.spec.js +25 -0
- package/lib/utils/chatInputFiles.spec.js +39 -0
- package/lib/utils/contextMentionIcons.spec.js +41 -0
- package/lib/utils/contextMentionLabel.spec.js +13 -0
- package/lib/utils/contextMentionTriggers.spec.js +44 -0
- package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
- package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
- package/lib/utils/entityLinkRender.spec.js +72 -0
- package/lib/utils/fileDownloadHelper.spec.js +67 -0
- package/lib/utils/formatQuickActionMessage.spec.js +27 -0
- package/lib/utils/formatUnreadCount.spec.js +12 -0
- package/lib/utils/getUnitFileSize.spec.js +18 -0
- package/lib/utils/hitlAnalytics.spec.js +136 -0
- package/lib/utils/hoursPlannerQuickActionType.js +74 -1
- package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
- package/lib/utils/imagePreprocessor.helpers.js +28 -0
- package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
- package/lib/utils/imagePreprocessor.js +12 -37
- package/lib/utils/imagePreprocessor.spec.js +112 -0
- package/lib/utils/maiaPageRoute.js +24 -0
- package/lib/utils/maiaPageRoute.spec.js +23 -0
- package/lib/utils/mapBackendLang.spec.js +19 -0
- package/lib/utils/navigateContextEntity.spec.js +50 -0
- package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
- package/lib/utils/openTaskInCorPanel.spec.js +43 -0
- package/lib/utils/orchestratorSubagents.spec.js +32 -0
- package/lib/utils/reasoningMappers.spec.js +103 -0
- package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/renderContextMentions.spec.js +268 -0
- package/lib/utils/retryCompletion.spec.js +181 -0
- package/lib/utils/skillContentSize.spec.js +13 -0
- package/lib/utils/slashCommandMarker.spec.js +43 -0
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
- package/lib/utils/sseStreamContent.spec.js +31 -0
- package/lib/utils/streamActivityMessages.helpers.js +223 -0
- package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
- package/lib/utils/streamActivityMessages.js +33 -238
- package/lib/utils/streamActivityMessages.spec.js +336 -0
- package/lib/utils/validateTrimmedFields.spec.js +26 -0
- package/package.json +2 -2
- package/README.md +0 -2
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
- package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
- package/lib/types/contextCompaction.js +0 -48
- package/lib/types/jest-dom.d.js +0 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { isEditorVisuallyMultiline, isPlaceholderTruncatedInEditor, resolvePreviousCharBeforeCaret, resolveTriggerInsertPrefix, shouldMergeAtSignWithPreviousSibling, shouldEvaluatePlaceholderTruncation, shouldNormalizeEmptyEditorDom, shouldShowPlaceholderTooltip } from './ContextMentionEditor.helpers';
|
|
2
|
+
describe('ContextMentionEditor.helpers', function () {
|
|
3
|
+
describe('resolvePreviousCharBeforeCaret', function () {
|
|
4
|
+
it('reads the previous char only from text nodes with offset', function () {
|
|
5
|
+
var text = document.createTextNode('hola');
|
|
6
|
+
expect(resolvePreviousCharBeforeCaret(text, 0)).toBe('');
|
|
7
|
+
expect(resolvePreviousCharBeforeCaret(text, 3)).toBe('l');
|
|
8
|
+
expect(resolvePreviousCharBeforeCaret(document.createElement('div'), 1)).toBe('');
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('shouldMergeAtSignWithPreviousSibling', function () {
|
|
12
|
+
it('merges only when prefix is empty and previous text ends with @', function () {
|
|
13
|
+
var previous = document.createTextNode('@');
|
|
14
|
+
expect(shouldMergeAtSignWithPreviousSibling('', previous)).toBe(true);
|
|
15
|
+
expect(shouldMergeAtSignWithPreviousSibling(' ', previous)).toBe(false);
|
|
16
|
+
expect(shouldMergeAtSignWithPreviousSibling('', document.createElement('span'))).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('resolveTriggerInsertPrefix', function () {
|
|
20
|
+
it('adds a space when the previous char is not a trigger boundary', function () {
|
|
21
|
+
expect(resolveTriggerInsertPrefix('a')).toBe(' ');
|
|
22
|
+
expect(resolveTriggerInsertPrefix('(')).toBe('');
|
|
23
|
+
expect(resolveTriggerInsertPrefix('@')).toBe('');
|
|
24
|
+
expect(resolveTriggerInsertPrefix('')).toBe('');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('shouldNormalizeEmptyEditorDom', function () {
|
|
28
|
+
it('detects whitespace-only content as empty', function () {
|
|
29
|
+
expect(shouldNormalizeEmptyEditorDom(' ')).toBe(true);
|
|
30
|
+
expect(shouldNormalizeEmptyEditorDom('hola')).toBe(false);
|
|
31
|
+
expect(shouldNormalizeEmptyEditorDom(null)).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('shouldEvaluatePlaceholderTruncation', function () {
|
|
35
|
+
it('only evaluates when placeholder exists and editor text is empty', function () {
|
|
36
|
+
expect(shouldEvaluatePlaceholderTruncation('Escribí algo', '')).toBe(true);
|
|
37
|
+
expect(shouldEvaluatePlaceholderTruncation(' ', '')).toBe(false);
|
|
38
|
+
expect(shouldEvaluatePlaceholderTruncation('Escribí algo', 'hola')).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('shouldShowPlaceholderTooltip', function () {
|
|
42
|
+
it('shows tooltip only for truncated empty placeholders', function () {
|
|
43
|
+
expect(shouldShowPlaceholderTooltip(true, true, 'Placeholder largo')).toBe(true);
|
|
44
|
+
expect(shouldShowPlaceholderTooltip(false, true, 'Placeholder largo')).toBe(false);
|
|
45
|
+
expect(shouldShowPlaceholderTooltip(true, false, 'Placeholder largo')).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('isEditorVisuallyMultiline', function () {
|
|
49
|
+
it('detects multiline layout from height and line height', function () {
|
|
50
|
+
expect(isEditorVisuallyMultiline(60, 20)).toBe(true);
|
|
51
|
+
expect(isEditorVisuallyMultiline(25, 20)).toBe(false);
|
|
52
|
+
expect(isEditorVisuallyMultiline(0, 20)).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('isPlaceholderTruncatedInEditor', function () {
|
|
56
|
+
it('returns false for empty placeholders or narrow editors', function () {
|
|
57
|
+
var editor = document.createElement('div');
|
|
58
|
+
Object.defineProperty(editor, 'clientWidth', {
|
|
59
|
+
value: 0,
|
|
60
|
+
configurable: true
|
|
61
|
+
});
|
|
62
|
+
expect(isPlaceholderTruncatedInEditor(editor, ' ')).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it('detects when measured text exceeds available width', function () {
|
|
65
|
+
var editor = document.createElement('div');
|
|
66
|
+
Object.defineProperty(editor, 'clientWidth', {
|
|
67
|
+
value: 80,
|
|
68
|
+
configurable: true
|
|
69
|
+
});
|
|
70
|
+
jest.spyOn(window, 'getComputedStyle').mockReturnValue({
|
|
71
|
+
fontWeight: '400',
|
|
72
|
+
fontSize: '16px',
|
|
73
|
+
fontFamily: 'Arial',
|
|
74
|
+
paddingLeft: '0px',
|
|
75
|
+
paddingRight: '0px',
|
|
76
|
+
borderLeftWidth: '0px',
|
|
77
|
+
borderRightWidth: '0px'
|
|
78
|
+
});
|
|
79
|
+
var measureSpy = jest.spyOn(CanvasRenderingContext2D.prototype, 'measureText').mockReturnValue({
|
|
80
|
+
width: 200
|
|
81
|
+
});
|
|
82
|
+
expect(isPlaceholderTruncatedInEditor(editor, 'Placeholder largo')).toBe(true);
|
|
83
|
+
measureSpy.mockReturnValue({
|
|
84
|
+
width: 10
|
|
85
|
+
});
|
|
86
|
+
expect(isPlaceholderTruncatedInEditor(editor, 'Corto')).toBe(false);
|
|
87
|
+
measureSpy.mockRestore();
|
|
88
|
+
jest.restoreAllMocks();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0VkaXRvclZpc3VhbGx5TXVsdGlsaW5lIiwiaXNQbGFjZWhvbGRlclRydW5jYXRlZEluRWRpdG9yIiwicmVzb2x2ZVByZXZpb3VzQ2hhckJlZm9yZUNhcmV0IiwicmVzb2x2ZVRyaWdnZXJJbnNlcnRQcmVmaXgiLCJzaG91bGRNZXJnZUF0U2lnbldpdGhQcmV2aW91c1NpYmxpbmciLCJzaG91bGRFdmFsdWF0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbiIsInNob3VsZE5vcm1hbGl6ZUVtcHR5RWRpdG9yRG9tIiwic2hvdWxkU2hvd1BsYWNlaG9sZGVyVG9vbHRpcCIsImRlc2NyaWJlIiwiaXQiLCJ0ZXh0IiwiZG9jdW1lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsImV4cGVjdCIsInRvQmUiLCJjcmVhdGVFbGVtZW50IiwicHJldmlvdXMiLCJlZGl0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwiamVzdCIsInNweU9uIiwid2luZG93IiwibW9ja1JldHVyblZhbHVlIiwiZm9udFdlaWdodCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsIm1lYXN1cmVTcHkiLCJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiLCJwcm90b3R5cGUiLCJ3aWR0aCIsIm1vY2tSZXN0b3JlIiwicmVzdG9yZUFsbE1vY2tzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvQ29udGV4dE1lbnRpb25FZGl0b3IvQ29udGV4dE1lbnRpb25FZGl0b3IuaGVscGVycy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGlzRWRpdG9yVmlzdWFsbHlNdWx0aWxpbmUsXG4gIGlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvcixcbiAgcmVzb2x2ZVByZXZpb3VzQ2hhckJlZm9yZUNhcmV0LFxuICByZXNvbHZlVHJpZ2dlckluc2VydFByZWZpeCxcbiAgc2hvdWxkTWVyZ2VBdFNpZ25XaXRoUHJldmlvdXNTaWJsaW5nLFxuICBzaG91bGRFdmFsdWF0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbixcbiAgc2hvdWxkTm9ybWFsaXplRW1wdHlFZGl0b3JEb20sXG4gIHNob3VsZFNob3dQbGFjZWhvbGRlclRvb2x0aXAsXG59IGZyb20gJy4vQ29udGV4dE1lbnRpb25FZGl0b3IuaGVscGVycydcblxuZGVzY3JpYmUoJ0NvbnRleHRNZW50aW9uRWRpdG9yLmhlbHBlcnMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdyZXNvbHZlUHJldmlvdXNDaGFyQmVmb3JlQ2FyZXQnLCAoKSA9PiB7XG4gICAgaXQoJ3JlYWRzIHRoZSBwcmV2aW91cyBjaGFyIG9ubHkgZnJvbSB0ZXh0IG5vZGVzIHdpdGggb2Zmc2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdob2xhJylcbiAgICAgIGV4cGVjdChyZXNvbHZlUHJldmlvdXNDaGFyQmVmb3JlQ2FyZXQodGV4dCwgMCkpLnRvQmUoJycpXG4gICAgICBleHBlY3QocmVzb2x2ZVByZXZpb3VzQ2hhckJlZm9yZUNhcmV0KHRleHQsIDMpKS50b0JlKCdsJylcbiAgICAgIGV4cGVjdChyZXNvbHZlUHJldmlvdXNDaGFyQmVmb3JlQ2FyZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIDEpKS50b0JlKCcnKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Nob3VsZE1lcmdlQXRTaWduV2l0aFByZXZpb3VzU2libGluZycsICgpID0+IHtcbiAgICBpdCgnbWVyZ2VzIG9ubHkgd2hlbiBwcmVmaXggaXMgZW1wdHkgYW5kIHByZXZpb3VzIHRleHQgZW5kcyB3aXRoIEAnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdAJylcbiAgICAgIGV4cGVjdChzaG91bGRNZXJnZUF0U2lnbldpdGhQcmV2aW91c1NpYmxpbmcoJycsIHByZXZpb3VzKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZE1lcmdlQXRTaWduV2l0aFByZXZpb3VzU2libGluZygnICcsIHByZXZpb3VzKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRNZXJnZUF0U2lnbldpdGhQcmV2aW91c1NpYmxpbmcoJycsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZVRyaWdnZXJJbnNlcnRQcmVmaXgnLCAoKSA9PiB7XG4gICAgaXQoJ2FkZHMgYSBzcGFjZSB3aGVuIHRoZSBwcmV2aW91cyBjaGFyIGlzIG5vdCBhIHRyaWdnZXIgYm91bmRhcnknLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVRyaWdnZXJJbnNlcnRQcmVmaXgoJ2EnKSkudG9CZSgnICcpXG4gICAgICBleHBlY3QocmVzb2x2ZVRyaWdnZXJJbnNlcnRQcmVmaXgoJygnKSkudG9CZSgnJylcbiAgICAgIGV4cGVjdChyZXNvbHZlVHJpZ2dlckluc2VydFByZWZpeCgnQCcpKS50b0JlKCcnKVxuICAgICAgZXhwZWN0KHJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4KCcnKSkudG9CZSgnJylcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdzaG91bGROb3JtYWxpemVFbXB0eUVkaXRvckRvbScsICgpID0+IHtcbiAgICBpdCgnZGV0ZWN0cyB3aGl0ZXNwYWNlLW9ubHkgY29udGVudCBhcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGROb3JtYWxpemVFbXB0eUVkaXRvckRvbSgnICAgJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGROb3JtYWxpemVFbXB0eUVkaXRvckRvbSgnaG9sYScpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZE5vcm1hbGl6ZUVtcHR5RWRpdG9yRG9tKG51bGwpKS50b0JlKHRydWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnc2hvdWxkRXZhbHVhdGVQbGFjZWhvbGRlclRydW5jYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ29ubHkgZXZhbHVhdGVzIHdoZW4gcGxhY2Vob2xkZXIgZXhpc3RzIGFuZCBlZGl0b3IgdGV4dCBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRFdmFsdWF0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbignRXNjcmliw60gYWxnbycsICcnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEV2YWx1YXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKCcgICAnLCAnJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkRXZhbHVhdGVQbGFjZWhvbGRlclRydW5jYXRpb24oJ0VzY3JpYsOtIGFsZ28nLCAnaG9sYScpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Nob3VsZFNob3dQbGFjZWhvbGRlclRvb2x0aXAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3dzIHRvb2x0aXAgb25seSBmb3IgdHJ1bmNhdGVkIGVtcHR5IHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTaG93UGxhY2Vob2xkZXJUb29sdGlwKHRydWUsIHRydWUsICdQbGFjZWhvbGRlciBsYXJnbycpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1BsYWNlaG9sZGVyVG9vbHRpcChmYWxzZSwgdHJ1ZSwgJ1BsYWNlaG9sZGVyIGxhcmdvJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1BsYWNlaG9sZGVyVG9vbHRpcCh0cnVlLCBmYWxzZSwgJ1BsYWNlaG9sZGVyIGxhcmdvJykpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnaXNFZGl0b3JWaXN1YWxseU11bHRpbGluZScsICgpID0+IHtcbiAgICBpdCgnZGV0ZWN0cyBtdWx0aWxpbmUgbGF5b3V0IGZyb20gaGVpZ2h0IGFuZCBsaW5lIGhlaWdodCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0VkaXRvclZpc3VhbGx5TXVsdGlsaW5lKDYwLCAyMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0VkaXRvclZpc3VhbGx5TXVsdGlsaW5lKDI1LCAyMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoaXNFZGl0b3JWaXN1YWxseU11bHRpbGluZSgwLCAyMCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnaXNQbGFjZWhvbGRlclRydW5jYXRlZEluRWRpdG9yJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGZhbHNlIGZvciBlbXB0eSBwbGFjZWhvbGRlcnMgb3IgbmFycm93IGVkaXRvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVkaXRvciwgJ2NsaWVudFdpZHRoJywgeyB2YWx1ZTogMCwgY29uZmlndXJhYmxlOiB0cnVlIH0pXG4gICAgICBleHBlY3QoaXNQbGFjZWhvbGRlclRydW5jYXRlZEluRWRpdG9yKGVkaXRvciwgJyAgICcpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyB3aGVuIG1lYXN1cmVkIHRleHQgZXhjZWVkcyBhdmFpbGFibGUgd2lkdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVkaXRvciwgJ2NsaWVudFdpZHRoJywgeyB2YWx1ZTogODAsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KVxuICAgICAgamVzdC5zcHlPbih3aW5kb3csICdnZXRDb21wdXRlZFN0eWxlJykubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgZm9udFdlaWdodDogJzQwMCcsXG4gICAgICAgIGZvbnRTaXplOiAnMTZweCcsXG4gICAgICAgIGZvbnRGYW1pbHk6ICdBcmlhbCcsXG4gICAgICAgIHBhZGRpbmdMZWZ0OiAnMHB4JyxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMHB4JyxcbiAgICAgICAgYm9yZGVyTGVmdFdpZHRoOiAnMHB4JyxcbiAgICAgICAgYm9yZGVyUmlnaHRXaWR0aDogJzBweCcsXG4gICAgICB9IGFzIENTU1N0eWxlRGVjbGFyYXRpb24pXG5cbiAgICAgIGNvbnN0IG1lYXN1cmVTcHkgPSBqZXN0LnNweU9uKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUsICdtZWFzdXJlVGV4dCcpLm1vY2tSZXR1cm5WYWx1ZSh7XG4gICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICB9IGFzIFRleHRNZXRyaWNzKVxuXG4gICAgICBleHBlY3QoaXNQbGFjZWhvbGRlclRydW5jYXRlZEluRWRpdG9yKGVkaXRvciwgJ1BsYWNlaG9sZGVyIGxhcmdvJykpLnRvQmUodHJ1ZSlcblxuICAgICAgbWVhc3VyZVNweS5tb2NrUmV0dXJuVmFsdWUoeyB3aWR0aDogMTAgfSBhcyBUZXh0TWV0cmljcylcbiAgICAgIGV4cGVjdChpc1BsYWNlaG9sZGVyVHJ1bmNhdGVkSW5FZGl0b3IoZWRpdG9yLCAnQ29ydG8nKSkudG9CZShmYWxzZSlcblxuICAgICAgbWVhc3VyZVNweS5tb2NrUmVzdG9yZSgpXG4gICAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpXG4gICAgfSlcbiAgfSlcbn0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQ0VBLHlCQUF5QixFQUN6QkMsOEJBQThCLEVBQzlCQyw4QkFBOEIsRUFDOUJDLDBCQUEwQixFQUMxQkMsb0NBQW9DLEVBQ3BDQyxtQ0FBbUMsRUFDbkNDLDZCQUE2QixFQUM3QkMsNEJBQTRCLFFBQ3ZCLGdDQUFnQztBQUV2Q0MsUUFBUSxDQUFDLDhCQUE4QixFQUFFLFlBQU07RUFDN0NBLFFB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QUMsS0FBSyxDQUFDO01BQzVDRyxNQUFNLENBQUNDLGNBQWMsQ0FBQ0YsTUFBTSxFQUFFLGFBQWEsRUFBRTtRQUFFRyxLQUFLLEVBQUUsQ0FBQztRQUFFQyxZQUFZLEVBQUU7TUFBSyxDQUFDLENBQUM7TUFDOUVSLE1BQU0sQ0FBQ1osOEJBQThCLENBQUNnQixNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuRSxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLFlBQU07TUFDN0QsSUFBTVEsTUFBTSxHQUFHTixRQUFRLENBQUNJLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDNUNHLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDRixNQUFNLEVBQUUsYUFBYSxFQUFFO1FBQUVHLEtBQUssRUFBRSxFQUFFO1FBQUVDLFlBQVksRUFBRTtNQUFLLENBQUMsQ0FBQztNQUMvRUMsSUFBSSxDQUFDQyxLQUFLLENBQUNDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDQyxlQUFlLENBQUM7UUFDckRDLFVBQVUsRUFBRSxLQUFLO1FBQ2pCQyxRQUFRLEVBQUUsTUFBTTtRQUNoQkMsVUFBVSxFQUFFLE9BQU87UUFDbkJDLFdBQVcsRUFBRSxLQUFLO1FBQ2xCQyxZQUFZLEVBQUUsS0FBSztRQUNuQkMsZUFBZSxFQUFFLEtBQUs7UUFDdEJDLGdCQUFnQixFQUFFO01BQ3BCLENBQXdCLENBQUM7TUFFekIsSUFBTUMsVUFBVSxHQUFHWCxJQUFJLENBQUNDLEtBQUssQ0FBQ1csd0JBQXdCLENBQUNDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQ1YsZUFBZSxDQUFDO1FBQy9GVyxLQUFLLEVBQUU7TUFDVCxDQUFnQixDQUFDO01BRWpCdkIsTUFBTSxDQUFDWiw4QkFBOEIsQ0FBQ2dCLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUNILElBQUksQ0FBQyxJQUFJLENBQUM7TUFFOUVtQixVQUFVLENBQUNSLGVBQWUsQ0FBQztRQUFFVyxLQUFLLEVBQUU7TUFBRyxDQUFnQixDQUFDO01BQ3hEdkIsTUFBTSxDQUFDWiw4QkFBOEIsQ0FBQ2dCLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDO01BRW5FbUIsVUFBVSxDQUFDSSxXQUFXLENBQUMsQ0FBQztNQUN4QmYsSUFBSSxDQUFDZ0IsZUFBZSxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -9,31 +9,9 @@ import { buildChipElement } from '../ContextMentionChip';
|
|
|
9
9
|
import { ContextMentionChipGlobalStyles } from '../ContextMentionChip/ContextMentionChip.styles';
|
|
10
10
|
import { buildSlashChipElement } from '../SlashCommandChip';
|
|
11
11
|
import { filesFromDataTransfer } from '../../../utils/chatInputFiles';
|
|
12
|
+
import { isEditorVisuallyMultiline, isPlaceholderTruncatedInEditor, resolvePreviousCharBeforeCaret, resolveTriggerInsertPrefix, shouldMergeAtSignWithPreviousSibling, shouldEvaluatePlaceholderTruncation, shouldNormalizeEmptyEditorDom, shouldShowPlaceholderTooltip } from './ContextMentionEditor.helpers';
|
|
12
13
|
import { SCMEEditable } from './ContextMentionEditor.styles';
|
|
13
14
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
-
var isPlaceholderTruncatedInEditor = function isPlaceholderTruncatedInEditor(editor, placeholder) {
|
|
15
|
-
var trimmed = placeholder.trim();
|
|
16
|
-
if (!trimmed) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
var clientWidth = editor.clientWidth;
|
|
20
|
-
if (clientWidth <= 4) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
var styles = window.getComputedStyle(editor);
|
|
24
|
-
var ctx = document.createElement('canvas').getContext('2d');
|
|
25
|
-
if (!ctx) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
ctx.font = "".concat(styles.fontWeight, " ").concat(styles.fontSize, " ").concat(styles.fontFamily);
|
|
29
|
-
var measured = ctx.measureText(trimmed).width;
|
|
30
|
-
var paddingLeft = parseFloat(styles.paddingLeft) || 0;
|
|
31
|
-
var paddingRight = parseFloat(styles.paddingRight) || 0;
|
|
32
|
-
var borderLeft = parseFloat(styles.borderLeftWidth) || 0;
|
|
33
|
-
var borderRight = parseFloat(styles.borderRightWidth) || 0;
|
|
34
|
-
var available = Math.max(0, clientWidth - paddingLeft - paddingRight - borderLeft - borderRight);
|
|
35
|
-
return measured > available + 1;
|
|
36
|
-
};
|
|
37
15
|
export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
38
16
|
var _placeholder$trim2;
|
|
39
17
|
var placeholder = _ref.placeholder,
|
|
@@ -72,14 +50,13 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
72
50
|
}
|
|
73
51
|
}, []);
|
|
74
52
|
var normalizeEmptyEditorDom = useCallback(function () {
|
|
75
|
-
var _editor$textContent;
|
|
76
53
|
var editor = editorRef.current;
|
|
77
54
|
if (!editor) return;
|
|
78
55
|
|
|
79
56
|
// Limpiar cualquier residuo (br, espacios) que deje el browser al vaciar el contenteditable.
|
|
80
57
|
// Sin esto, un espacio suelto activa data-empty="true" + ::before placeholder en línea 1
|
|
81
58
|
// y desplaza el cursor a la línea 2.
|
|
82
|
-
if ((
|
|
59
|
+
if (shouldNormalizeEmptyEditorDom(editor.textContent)) {
|
|
83
60
|
editor.innerHTML = '';
|
|
84
61
|
}
|
|
85
62
|
var selection = window.getSelection();
|
|
@@ -94,8 +71,7 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
94
71
|
var _placeholder$trim;
|
|
95
72
|
var el = editorRef.current;
|
|
96
73
|
var ph = (_placeholder$trim = placeholder === null || placeholder === void 0 ? void 0 : placeholder.trim()) !== null && _placeholder$trim !== void 0 ? _placeholder$trim : '';
|
|
97
|
-
|
|
98
|
-
if (!el || !ph || !isEditorLogicallyEmpty) {
|
|
74
|
+
if (!el || !shouldEvaluatePlaceholderTruncation(placeholder, serialize().text)) {
|
|
99
75
|
setPlaceholderTruncated(false);
|
|
100
76
|
return;
|
|
101
77
|
}
|
|
@@ -213,16 +189,9 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
213
189
|
}
|
|
214
190
|
var range = selection.getRangeAt(0);
|
|
215
191
|
range.collapse(true);
|
|
216
|
-
var prefix = '';
|
|
217
192
|
var startContainer = range.startContainer,
|
|
218
193
|
startOffset = range.startOffset;
|
|
219
|
-
|
|
220
|
-
var prevChar = startOffset > 0 ? startContainer.data.charAt(startOffset - 1) : '';
|
|
221
|
-
// Espacio solo si hay texto previo que no sea límite ni `@` (@@ deben quedar seguidos).
|
|
222
|
-
if (prevChar && !/[\s([{@]/.test(prevChar)) {
|
|
223
|
-
prefix = ' ';
|
|
224
|
-
}
|
|
225
|
-
}
|
|
194
|
+
var prefix = resolveTriggerInsertPrefix(resolvePreviousCharBeforeCaret(startContainer, startOffset));
|
|
226
195
|
var inserted = "".concat(prefix, "@");
|
|
227
196
|
var textNode = document.createTextNode(inserted);
|
|
228
197
|
range.insertNode(textNode);
|
|
@@ -232,7 +201,7 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
232
201
|
var prevSibling = textNode.previousSibling;
|
|
233
202
|
var caretNode = textNode;
|
|
234
203
|
var caretOffset = inserted.length;
|
|
235
|
-
if (prefix
|
|
204
|
+
if (shouldMergeAtSignWithPreviousSibling(prefix, prevSibling)) {
|
|
236
205
|
var prevText = prevSibling;
|
|
237
206
|
caretOffset = prevText.data.length + inserted.length;
|
|
238
207
|
prevText.data += inserted;
|
|
@@ -263,15 +232,9 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
263
232
|
}
|
|
264
233
|
var range = selection.getRangeAt(0);
|
|
265
234
|
range.collapse(true);
|
|
266
|
-
var prefix = '';
|
|
267
235
|
var startContainer = range.startContainer,
|
|
268
236
|
startOffset = range.startOffset;
|
|
269
|
-
|
|
270
|
-
var prevChar = startOffset > 0 ? startContainer.data.charAt(startOffset - 1) : '';
|
|
271
|
-
if (prevChar && !/[\s([{]/.test(prevChar)) {
|
|
272
|
-
prefix = ' ';
|
|
273
|
-
}
|
|
274
|
-
}
|
|
237
|
+
var prefix = resolveTriggerInsertPrefix(resolvePreviousCharBeforeCaret(startContainer, startOffset));
|
|
275
238
|
var inserted = "".concat(prefix, "/");
|
|
276
239
|
var textNode = document.createTextNode(inserted);
|
|
277
240
|
range.insertNode(textNode);
|
|
@@ -298,15 +261,9 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
298
261
|
}
|
|
299
262
|
var range = selection.getRangeAt(0);
|
|
300
263
|
range.collapse(true);
|
|
301
|
-
var prefix = '';
|
|
302
264
|
var startContainer = range.startContainer,
|
|
303
265
|
startOffset = range.startOffset;
|
|
304
|
-
|
|
305
|
-
var prevChar = startOffset > 0 ? startContainer.data.charAt(startOffset - 1) : '';
|
|
306
|
-
if (prevChar && !/[\s([{]/.test(prevChar)) {
|
|
307
|
-
prefix = ' ';
|
|
308
|
-
}
|
|
309
|
-
}
|
|
266
|
+
var prefix = resolveTriggerInsertPrefix(resolvePreviousCharBeforeCaret(startContainer, startOffset));
|
|
310
267
|
var inserted = "".concat(prefix, "#");
|
|
311
268
|
var textNode = document.createTextNode(inserted);
|
|
312
269
|
range.insertNode(textNode);
|
|
@@ -319,20 +276,19 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
319
276
|
serialize: serialize,
|
|
320
277
|
syncTriggerAtRunLength: syncTriggerAtRunLength,
|
|
321
278
|
hasVisualMultiline: function hasVisualMultiline() {
|
|
322
|
-
var _editor$textContent$t, _editor$
|
|
279
|
+
var _editor$textContent$t, _editor$textContent;
|
|
323
280
|
var editor = editorRef.current;
|
|
324
281
|
if (!editor) {
|
|
325
282
|
return false;
|
|
326
283
|
}
|
|
327
|
-
var text = (_editor$textContent$t = (_editor$
|
|
284
|
+
var text = (_editor$textContent$t = (_editor$textContent = editor.textContent) === null || _editor$textContent === void 0 ? void 0 : _editor$textContent.trim()) !== null && _editor$textContent$t !== void 0 ? _editor$textContent$t : '';
|
|
328
285
|
if (!text) {
|
|
329
286
|
return false;
|
|
330
287
|
}
|
|
331
288
|
var styles = window.getComputedStyle(editor);
|
|
332
289
|
var lineHeight = parseFloat(styles.lineHeight) || 22;
|
|
333
290
|
var editorHeight = editor.getBoundingClientRect().height;
|
|
334
|
-
|
|
335
|
-
return isMultiline;
|
|
291
|
+
return isEditorVisuallyMultiline(editorHeight, lineHeight);
|
|
336
292
|
},
|
|
337
293
|
getEditorClientRect: function getEditorClientRect() {
|
|
338
294
|
var _editorRef$current$ge, _editorRef$current;
|
|
@@ -494,8 +450,7 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
494
450
|
selection.collapseToEnd();
|
|
495
451
|
handleInput();
|
|
496
452
|
};
|
|
497
|
-
var
|
|
498
|
-
var placeholderTooltipTitle = logicalEmpty && placeholderTruncated && trimmedPlaceholder ? trimmedPlaceholder : '';
|
|
453
|
+
var placeholderTooltipTitle = shouldShowPlaceholderTooltip(logicalEmpty, placeholderTruncated, placeholder) ? (_placeholder$trim2 = placeholder === null || placeholder === void 0 ? void 0 : placeholder.trim()) !== null && _placeholder$trim2 !== void 0 ? _placeholder$trim2 : '' : '';
|
|
499
454
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
500
455
|
children: [/*#__PURE__*/_jsx(ContextMentionChipGlobalStyles, {}), /*#__PURE__*/_jsx(Tooltip, {
|
|
501
456
|
title: placeholderTooltipTitle,
|
|
@@ -530,4 +485,4 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
530
485
|
});
|
|
531
486
|
});
|
|
532
487
|
ContextMentionEditor.displayName = 'ContextMentionEditor';
|
|
533
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3J3YXJkUmVmIiwidXNlQ2FsbGJhY2siLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlTGF5b3V0RWZmZWN0IiwidXNlUmVmIiwidXNlU3RhdGUiLCJUb29sdGlwIiwidXNlQ29udGV4dE1lbnRpb25zIiwiYnVpbGRDaGlwRWxlbWVudCIsIkNvbnRleHRNZW50aW9uQ2hpcEdsb2JhbFN0eWxlcyIsImJ1aWxkU2xhc2hDaGlwRWxlbWVudCIsImZpbGVzRnJvbURhdGFUcmFuc2ZlciIsIlNDTUVFZGl0YWJsZSIsImpzeCIsIl9qc3giLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImpzeHMiLCJfanN4cyIsImlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvciIsImVkaXRvciIsInBsYWNlaG9sZGVyIiwidHJpbW1lZCIsInRyaW0iLCJjbGllbnRXaWR0aCIsInN0eWxlcyIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJjdHgiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJnZXRDb250ZXh0IiwiZm9udCIsImNvbmNhdCIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJtZWFzdXJlZCIsIm1lYXN1cmVUZXh0Iiwid2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhcnNlRmxvYXQiLCJwYWRkaW5nUmlnaHQiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwiYXZhaWxhYmxlIiwiTWF0aCIsIm1heCIsIkNvbnRleHRNZW50aW9uRWRpdG9yIiwiX3JlZiIsInJlZiIsIl9wbGFjZWhvbGRlciR0cmltMiIsImRpc2FibGVkIiwiY2xhc3NOYW1lIiwibWF4SGVpZ2h0Iiwib25JbnB1dCIsIm9uS2V5RG93biIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvblBhc3RlRmlsZXMiLCJfdXNlQ29udGV4dE1lbnRpb25zIiwiZWRpdG9yUmVmIiwidXBkYXRlVHJpZ2dlciIsInJlcGxhY2VUcmlnZ2VyV2l0aENoaXAiLCJzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoIiwidXBkYXRlU2xhc2hUcmlnZ2VyIiwicmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwIiwidXBkYXRlSGFzaFRyaWdnZXIiLCJyZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAiLCJzZXJpYWxpemUiLCJjbGVhckVkaXRvckRvbSIsImNsZWFyIiwiZm9jdXMiLCJza2lwTmV4dElucHV0IiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwicGxhY2Vob2xkZXJUcnVuY2F0ZWQiLCJzZXRQbGFjZWhvbGRlclRydW5jYXRlZCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9naWNhbEVtcHR5Iiwic2V0TG9naWNhbEVtcHR5Iiwic3luY0VkaXRvckVtcHR5QXR0cmlidXRlIiwiaXNFbXB0eSIsImN1cnJlbnQiLCJzZXRBdHRyaWJ1dGUiLCJTdHJpbmciLCJub3JtYWxpemVFbXB0eUVkaXRvckRvbSIsIl9lZGl0b3IkdGV4dENvbnRlbnQiLCJ0ZXh0Q29udGVudCIsImlubmVySFRNTCIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJjb2xsYXBzZSIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwicmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uIiwiX3BsYWNlaG9sZGVyJHRyaW0iLCJlbCIsInBoIiwiaXNFZGl0b3JMb2dpY2FsbHlFbXB0eSIsInRleHQiLCJ1bmRlZmluZWQiLCJybyIsIlJlc2l6ZU9ic2VydmVyIiwicXVldWVNaWNyb3Rhc2siLCJvYnNlcnZlIiwiZGlzY29ubmVjdCIsImVtaXRJbnB1dFN0YXRlIiwidHJpZyIsInNsYXNoVHJpZyIsImhhc2hUcmlnIiwic3RhdGUiLCJtZW50aW9ucyIsInNsYXNoQ29tbWFuZHMiLCJfb2JqZWN0U3ByZWFkIiwidHJpZ2dlciIsImFjdGl2ZSIsInF1ZXJ5IiwiYXRSdW5MZW5ndGgiLCJzbGFzaFRyaWdnZXIiLCJoYXNoVHJpZ2dlciIsInNldFBsYWluVGV4dCIsInBsYWluIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImluc2VydE1lbnRpb25UcmlnZ2VyIiwiYW5jaG9yTm9kZSIsImNvbnRhaW5zIiwiZW5kUmFuZ2UiLCJnZXRSYW5nZUF0IiwicHJlZml4Iiwic3RhcnRDb250YWluZXIiLCJzdGFydE9mZnNldCIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInByZXZDaGFyIiwiZGF0YSIsImNoYXJBdCIsInRlc3QiLCJpbnNlcnRlZCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnROb2RlIiwicHJldlNpYmxpbmciLCJwcmV2aW91c1NpYmxpbmciLCJjYXJldE5vZGUiLCJjYXJldE9mZnNldCIsImVuZHNXaXRoIiwicHJldlRleHQiLCJyZW1vdmUiLCJzZXRTdGFydCIsImluc2VydFNsYXNoVHJpZ2dlciIsImluc2VydFNraWxsVHJpZ2dlciIsImhhc1Zpc3VhbE11bHRpbGluZSIsIl9lZGl0b3IkdGV4dENvbnRlbnQkdCIsIl9lZGl0b3IkdGV4dENvbnRlbnQyIiwibGluZUhlaWdodCIsImVkaXRvckhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImlzTXVsdGlsaW5lIiwiZ2V0RWRpdG9yQ2xpZW50UmVjdCIsIl9lZGl0b3JSZWYkY3VycmVudCRnZSIsIl9lZGl0b3JSZWYkY3VycmVudCIsImluc2VydE1lbnRpb24iLCJtZW50aW9uIiwiY2hpcCIsImFwcGVuZE1lbnRpb25BdEVuZCIsImlkIiwidHlwZSIsImxhYmVsIiwidHJhaWxpbmdTcGFjZSIsImFwcGVuZENoaWxkIiwiaW5zZXJ0U2tpbGxNZW50aW9uIiwiaW5zZXJ0U2xhc2hDb21tYW5kIiwiY29tbWFuZCIsImhhbmRsZUlucHV0IiwiaGFuZGxlUGFzdGUiLCJlIiwiZmlsZXMiLCJjbGlwYm9hcmREYXRhIiwicHJldmVudERlZmF1bHQiLCJnZXREYXRhIiwicmFuZ2VDb3VudCIsImRlbGV0ZUZyb21Eb2N1bWVudCIsImNvbGxhcHNlVG9FbmQiLCJ0cmltbWVkUGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlclRvb2x0aXBUaXRsZSIsImNoaWxkcmVuIiwidGl0bGUiLCJzdHlsZSIsImRpc3BsYXkiLCJtaW5XaWR0aCIsIiRtYXhIZWlnaHQiLCJjb250ZW50RWRpdGFibGUiLCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciLCJyb2xlIiwib25QYXN0ZSIsImRpc3BsYXlOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvQ29udGV4dE1lbnRpb25FZGl0b3IvQ29udGV4dE1lbnRpb25FZGl0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENsaXBib2FyZEV2ZW50LFxuICBmb3J3YXJkUmVmLFxuICBLZXlib2FyZEV2ZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICdAcHJvamVjdGNvci90b29sdGlwdjIvbGliL2NvbXBvbmVudHMvVG9vbHRpcCdcbmltcG9ydCB7IHVzZUNvbnRleHRNZW50aW9ucyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNvbnRleHRNZW50aW9ucydcbmltcG9ydCB7IENvbnRleHRNZW50aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBidWlsZENoaXBFbGVtZW50IH0gZnJvbSAnLi4vQ29udGV4dE1lbnRpb25DaGlwJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb25DaGlwR2xvYmFsU3R5bGVzIH0gZnJvbSAnLi4vQ29udGV4dE1lbnRpb25DaGlwL0NvbnRleHRNZW50aW9uQ2hpcC5zdHlsZXMnXG5pbXBvcnQgeyBidWlsZFNsYXNoQ2hpcEVsZW1lbnQsIFNsYXNoQ29tbWFuZENoaXBEYXRhIH0gZnJvbSAnLi4vU2xhc2hDb21tYW5kQ2hpcCdcbmltcG9ydCB7IGZpbGVzRnJvbURhdGFUcmFuc2ZlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NoYXRJbnB1dEZpbGVzJ1xuaW1wb3J0IHsgU0NNRUVkaXRhYmxlIH0gZnJvbSAnLi9Db250ZXh0TWVudGlvbkVkaXRvci5zdHlsZXMnXG5cbmNvbnN0IGlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvciA9IChlZGl0b3I6IEhUTUxFbGVtZW50LCBwbGFjZWhvbGRlcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBwbGFjZWhvbGRlci50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgeyBjbGllbnRXaWR0aCB9ID0gZWRpdG9yXG4gIGlmIChjbGllbnRXaWR0aCA8PSA0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlZGl0b3IpXG4gIGNvbnN0IGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJylcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjdHguZm9udCA9IGAke3N0eWxlcy5mb250V2VpZ2h0fSAke3N0eWxlcy5mb250U2l6ZX0gJHtzdHlsZXMuZm9udEZhbWlseX1gXG4gIGNvbnN0IG1lYXN1cmVkID0gY3R4Lm1lYXN1cmVUZXh0KHRyaW1tZWQpLndpZHRoXG5cbiAgY29uc3QgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nTGVmdCkgfHwgMFxuICBjb25zdCBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nUmlnaHQpIHx8IDBcbiAgY29uc3QgYm9yZGVyTGVmdCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlckxlZnRXaWR0aCkgfHwgMFxuICBjb25zdCBib3JkZXJSaWdodCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlclJpZ2h0V2lkdGgpIHx8IDBcbiAgY29uc3QgYXZhaWxhYmxlID0gTWF0aC5tYXgoMCwgY2xpZW50V2lkdGggLSBwYWRkaW5nTGVmdCAtIHBhZGRpbmdSaWdodCAtIGJvcmRlckxlZnQgLSBib3JkZXJSaWdodClcblxuICByZXR1cm4gbWVhc3VyZWQgPiBhdmFpbGFibGUgKyAxXG59XG5cbmV4cG9ydCB0eXBlIENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlID0ge1xuICBmb2N1czogKCkgPT4gdm9pZFxuICBjbGVhcjogKCkgPT4gdm9pZFxuICBzZXRQbGFpblRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqIEluc2VydGEgYEBgIGVuIGVsIGNhcmV0IChjb24gZXNwYWNpbyBwcmV2aW8gc2kgaGFjZSBmYWx0YSkgeSBhYnJlIGVsIHRyaWdnZXIgZGUgbWVudGlvbnMuICovXG4gIGluc2VydE1lbnRpb25UcmlnZ2VyOiAoKSA9PiB2b2lkXG4gIC8qKiBJbnNlcnRhIGAvYCBlbiBlbCBjYXJldCAoY29uIGVzcGFjaW8gcHJldmlvIHNpIGhhY2UgZmFsdGEpIHkgYWJyZSBlbCB0cmlnZ2VyIGRlIHNsYXNoIGNvbW1hbmRzLiAqL1xuICBpbnNlcnRTbGFzaFRyaWdnZXI6ICgpID0+IHZvaWRcbiAgLyoqIEluc2VydGEgYCNgIGVuIGVsIGNhcmV0IChjb24gZXNwYWNpbyBwcmV2aW8gc2kgaGFjZSBmYWx0YSkgeSBhYnJlIGVsIHRyaWdnZXIgZGUgc2tpbGxzLiAqL1xuICBpbnNlcnRTa2lsbFRyaWdnZXI6ICgpID0+IHZvaWRcbiAgaW5zZXJ0TWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB2b2lkXG4gIGFwcGVuZE1lbnRpb25BdEVuZDogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB2b2lkXG4gIGluc2VydFNsYXNoQ29tbWFuZDogKGNvbW1hbmQ6IFNsYXNoQ29tbWFuZENoaXBEYXRhKSA9PiB2b2lkXG4gIC8qKiBSZWVtcGxhemEgZWwgYCNxdWVyeWAgcGVuZGllbnRlIHBvciBlbCBjaGlwIGRlIGxhIHNraWxsIGVsZWdpZGEuICovXG4gIGluc2VydFNraWxsTWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB2b2lkXG4gIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGg6IChhdFJ1bkxlbmd0aDogbnVtYmVyKSA9PiB2b2lkXG4gIHNlcmlhbGl6ZTogKCkgPT4ge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgc2xhc2hDb21tYW5kczogU2xhc2hDb21tYW5kQ2hpcERhdGFbXVxuICB9XG4gIGhhc1Zpc3VhbE11bHRpbGluZTogKCkgPT4gYm9vbGVhblxuICAvKiogUmVjdCBkZWwgw6FyZWEgZWRpdGFibGUgKHZpZXdwb3J0KTsgbG8gdXNhIGVsIHBvcG92ZXIgZGUgQCBwYXJhIGFsaW5lYXIgYW5jaG8geSBmYWxsYmFjayB2ZXJ0aWNhbC4gKi9cbiAgZ2V0RWRpdG9yQ2xpZW50UmVjdDogKCkgPT4gRE9NUmVjdCB8IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgQ29udGV4dE1lbnRpb25FZGl0b3JQcm9wcyA9IHtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKiogQWx0byBtw6F4aW1vIGRlbCDDoXJlYSBlZGl0YWJsZSAocHgpLiBTZSBhanVzdGEgY3VhbmRvIGhheSBjaGlwcyBkZSBjb250ZXh0by9hZGp1bnRvcy4gKi9cbiAgbWF4SGVpZ2h0PzogbnVtYmVyXG4gIG9uSW5wdXQ/OiAoc3RhdGU6IHtcbiAgICB0ZXh0OiBzdHJpbmdcbiAgICBtZW50aW9uczogQ29udGV4dE1lbnRpb25bXVxuICAgIHNsYXNoQ29tbWFuZHM6IFNsYXNoQ29tbWFuZENoaXBEYXRhW11cbiAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZzsgYXRSdW5MZW5ndGg6IG51bWJlciB9XG4gICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZyB9XG4gICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBib29sZWFuOyBxdWVyeTogc3RyaW5nIH1cbiAgfSkgPT4gdm9pZFxuICBvbktleURvd24/OiAoZTogS2V5Ym9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHZvaWRcbiAgb25Gb2N1cz86ICgpID0+IHZvaWRcbiAgb25CbHVyPzogKCkgPT4gdm9pZFxuICAvKiogQ2xpcGJvYXJkIGZpbGVzIChzY3JlZW5zaG90cywgY29waWVkIGltYWdlcykuIFRleHQgaXMgc3RpbGwgaW5zZXJ0ZWQgd2hlbiBwcmVzZW50LiAqL1xuICBvblBhc3RlRmlsZXM/OiAoZmlsZXM6IEZpbGVbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgQ29udGV4dE1lbnRpb25FZGl0b3IgPSBmb3J3YXJkUmVmPENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlLCBDb250ZXh0TWVudGlvbkVkaXRvclByb3BzPihcbiAgKHsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBjbGFzc05hbWUsIG1heEhlaWdodCwgb25JbnB1dCwgb25LZXlEb3duLCBvbkZvY3VzLCBvbkJsdXIsIG9uUGFzdGVGaWxlcyB9LCByZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlZGl0b3JSZWYsXG4gICAgICB1cGRhdGVUcmlnZ2VyLFxuICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCxcbiAgICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgICB1cGRhdGVTbGFzaFRyaWdnZXIsXG4gICAgICByZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAsXG4gICAgICB1cGRhdGVIYXNoVHJpZ2dlcixcbiAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNraWxsQ2hpcCxcbiAgICAgIHNlcmlhbGl6ZSxcbiAgICAgIGNsZWFyOiBjbGVhckVkaXRvckRvbSxcbiAgICAgIGZvY3VzLFxuICAgIH0gPSB1c2VDb250ZXh0TWVudGlvbnMoKVxuICAgIGNvbnN0IHNraXBOZXh0SW5wdXQgPSB1c2VSZWYoZmFsc2UpXG4gICAgY29uc3QgW3BsYWNlaG9sZGVyVHJ1bmNhdGVkLCBzZXRQbGFjZWhvbGRlclRydW5jYXRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgICBjb25zdCBbbG9naWNhbEVtcHR5LCBzZXRMb2dpY2FsRW1wdHldID0gdXNlU3RhdGUodHJ1ZSlcblxuICAgIGNvbnN0IHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSA9IHVzZUNhbGxiYWNrKChpc0VtcHR5OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuc2V0QXR0cmlidXRlKCdkYXRhLWVtcHR5JywgU3RyaW5nKGlzRW1wdHkpKVxuICAgICAgfVxuICAgIH0sIFtdKVxuXG4gICAgY29uc3Qgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgaWYgKCFlZGl0b3IpIHJldHVyblxuXG4gICAgICAvLyBMaW1waWFyIGN1YWxxdWllciByZXNpZHVvIChiciwgZXNwYWNpb3MpIHF1ZSBkZWplIGVsIGJyb3dzZXIgYWwgdmFjaWFyIGVsIGNvbnRlbnRlZGl0YWJsZS5cbiAgICAgIC8vIFNpbiBlc3RvLCB1biBlc3BhY2lvIHN1ZWx0byBhY3RpdmEgZGF0YS1lbXB0eT1cInRydWVcIiArIDo6YmVmb3JlIHBsYWNlaG9sZGVyIGVuIGzDrW5lYSAxXG4gICAgICAvLyB5IGRlc3BsYXphIGVsIGN1cnNvciBhIGxhIGzDrW5lYSAyLlxuICAgICAgaWYgKGVkaXRvci50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xuICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gJydcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgfSwgW2VkaXRvclJlZl0pXG5cbiAgICBjb25zdCByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICBjb25zdCBwaCA9IHBsYWNlaG9sZGVyPy50cmltKCkgPz8gJydcbiAgICAgIGNvbnN0IGlzRWRpdG9yTG9naWNhbGx5RW1wdHkgPSBzZXJpYWxpemUoKS50ZXh0LnRyaW0oKSA9PT0gJydcblxuICAgICAgaWYgKCFlbCB8fCAhcGggfHwgIWlzRWRpdG9yTG9naWNhbGx5RW1wdHkpIHtcbiAgICAgICAgc2V0UGxhY2Vob2xkZXJUcnVuY2F0ZWQoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRQbGFjZWhvbGRlclRydW5jYXRlZChpc1BsYWNlaG9sZGVyVHJ1bmNhdGVkSW5FZGl0b3IoZWwsIHBoKSlcbiAgICB9LCBbcGxhY2Vob2xkZXIsIHNlcmlhbGl6ZV0pXG5cbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKClcbiAgICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24pXG4gICAgICB9KVxuICAgICAgcm8ub2JzZXJ2ZShlbClcbiAgICAgIHJldHVybiAoKSA9PiByby5kaXNjb25uZWN0KClcbiAgICB9LCBbcGxhY2Vob2xkZXIsIGRpc2FibGVkLCByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb25dKVxuXG4gICAgY29uc3QgZW1pdElucHV0U3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCB0cmlnID0gdXBkYXRlVHJpZ2dlcigpXG4gICAgICBjb25zdCBzbGFzaFRyaWcgPSB1cGRhdGVTbGFzaFRyaWdnZXIoKVxuICAgICAgY29uc3QgaGFzaFRyaWcgPSB1cGRhdGVIYXNoVHJpZ2dlcigpXG4gICAgICBsZXQgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20oKVxuICAgICAgICBzdGF0ZSA9IHsgdGV4dDogJycsIG1lbnRpb25zOiBbXSwgc2xhc2hDb21tYW5kczogW10gfVxuICAgICAgfVxuICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogdHJpZy5hY3RpdmUsIHF1ZXJ5OiB0cmlnLnF1ZXJ5LCBhdFJ1bkxlbmd0aDogdHJpZy5hdFJ1bkxlbmd0aCB9LFxuICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBzbGFzaFRyaWcuYWN0aXZlLCBxdWVyeTogc2xhc2hUcmlnLnF1ZXJ5IH0sXG4gICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogaGFzaFRyaWcuYWN0aXZlLCBxdWVyeTogaGFzaFRyaWcucXVlcnkgfSxcbiAgICAgIH0pXG4gICAgICBxdWV1ZU1pY3JvdGFzayhyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24pXG4gICAgfSwgW1xuICAgICAgdXBkYXRlVHJpZ2dlcixcbiAgICAgIHVwZGF0ZVNsYXNoVHJpZ2dlcixcbiAgICAgIHVwZGF0ZUhhc2hUcmlnZ2VyLFxuICAgICAgc2VyaWFsaXplLFxuICAgICAgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20sXG4gICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUsXG4gICAgICBvbklucHV0LFxuICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uLFxuICAgIF0pXG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKFxuICAgICAgcmVmLFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgZm9jdXMsXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJFZGl0b3JEb20oKVxuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSh0cnVlKVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eSh0cnVlKVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGxhaW5UZXh0OiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvcikgcmV0dXJuXG4gICAgICAgICAgY29uc3QgcGxhaW4gPSB0ZXh0ID8/ICcnXG4gICAgICAgICAgZWRpdG9yLnRleHRDb250ZW50ID0gcGxhaW5cbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICAgICAgZWRpdG9yLmlubmVySFRNTCA9ICcnXG4gICAgICAgICAgfVxuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIGVkaXRvci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKVxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydE1lbnRpb25UcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvciB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICAgICAgICBmb2N1cygpXG5cbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG5cbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlIHx8ICFlZGl0b3IuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgICAgIGVuZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKGVuZFJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICAgICAgbGV0IHByZWZpeCA9ICcnXG4gICAgICAgICAgY29uc3QgeyBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQgfSA9IHJhbmdlXG4gICAgICAgICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgcHJldkNoYXIgPSBzdGFydE9mZnNldCA+IDAgPyAoc3RhcnRDb250YWluZXIgYXMgVGV4dCkuZGF0YS5jaGFyQXQoc3RhcnRPZmZzZXQgLSAxKSA6ICcnXG4gICAgICAgICAgICAvLyBFc3BhY2lvIHNvbG8gc2kgaGF5IHRleHRvIHByZXZpbyBxdWUgbm8gc2VhIGzDrW1pdGUgbmkgYEBgIChAQCBkZWJlbiBxdWVkYXIgc2VndWlkb3MpLlxuICAgICAgICAgICAgaWYgKHByZXZDaGFyICYmICEvW1xccyhbe0BdLy50ZXN0KHByZXZDaGFyKSkge1xuICAgICAgICAgICAgICBwcmVmaXggPSAnICdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnNlcnRlZCA9IGAke3ByZWZpeH1AYFxuICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaW5zZXJ0ZWQpXG4gICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0ZXh0Tm9kZSlcblxuICAgICAgICAgIC8vIFNpIGVsIGBAYCBxdWVkw7MgZW4gdW4gbm9kbyBudWV2bywgdW5pciBjb24gZWwgdGV4dCBub2RlIHByZXZpbyBxdWUgdGVybWluYSBlbiBgQGBcbiAgICAgICAgICAvLyBwYXJhIHF1ZSBkZXRlY3RNZW50aW9uVHJpZ2dlciB2ZWEgZWwgcnVuIGNvbXBsZXRvIChAQCwgQEBALCDigKYpLlxuICAgICAgICAgIGNvbnN0IHByZXZTaWJsaW5nID0gdGV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG4gICAgICAgICAgbGV0IGNhcmV0Tm9kZSA9IHRleHROb2RlXG4gICAgICAgICAgbGV0IGNhcmV0T2Zmc2V0ID0gaW5zZXJ0ZWQubGVuZ3RoXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycgJiYgcHJldlNpYmxpbmc/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiAocHJldlNpYmxpbmcgYXMgVGV4dCkuZGF0YS5lbmRzV2l0aCgnQCcpKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2VGV4dCA9IHByZXZTaWJsaW5nIGFzIFRleHRcbiAgICAgICAgICAgIGNhcmV0T2Zmc2V0ID0gcHJldlRleHQuZGF0YS5sZW5ndGggKyBpbnNlcnRlZC5sZW5ndGhcbiAgICAgICAgICAgIHByZXZUZXh0LmRhdGEgKz0gaW5zZXJ0ZWRcbiAgICAgICAgICAgIHRleHROb2RlLnJlbW92ZSgpXG4gICAgICAgICAgICBjYXJldE5vZGUgPSBwcmV2VGV4dFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVsIGNhcmV0IGRlYmUgcXVlZGFyIERFTlRSTyBkZWwgdGV4dCBub2RlIChkZXNwdcOpcyBkZSBgQGApLlxuICAgICAgICAgIC8vIGBzZXRTdGFydEFmdGVyYCBsbyBkZWphIGVuIGVsIHBhZHJlIHkgZGV0ZWN0TWVudGlvblRyaWdnZXIgbm8gYWN0aXZhIGVsIHBvcG92ZXIuXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY2FyZXROb2RlLCBjYXJldE9mZnNldClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcblxuICAgICAgICAgIGVtaXRJbnB1dFN0YXRlKClcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0U2xhc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvciB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICAgICAgICBmb2N1cygpXG5cbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG5cbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlIHx8ICFlZGl0b3IuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgICAgIGVuZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKGVuZFJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICAgICAgbGV0IHByZWZpeCA9ICcnXG4gICAgICAgICAgY29uc3QgeyBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQgfSA9IHJhbmdlXG4gICAgICAgICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgcHJldkNoYXIgPSBzdGFydE9mZnNldCA+IDAgPyAoc3RhcnRDb250YWluZXIgYXMgVGV4dCkuZGF0YS5jaGFyQXQoc3RhcnRPZmZzZXQgLSAxKSA6ICcnXG4gICAgICAgICAgICBpZiAocHJldkNoYXIgJiYgIS9bXFxzKFt7XS8udGVzdChwcmV2Q2hhcikpIHtcbiAgICAgICAgICAgICAgcHJlZml4ID0gJyAnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBgJHtwcmVmaXh9L2BcbiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGluc2VydGVkKVxuICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpXG5cbiAgICAgICAgICAvLyBDYXJldCBkZW50cm8gZGVsIHRleHQgbm9kZSBwYXJhIHF1ZSBkZXRlY3RTbGFzaFRyaWdnZXIgYWN0aXZlIGVsIGRyb3Bkb3duLlxuICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCBpbnNlcnRlZC5sZW5ndGgpXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG5cbiAgICAgICAgICBlbWl0SW5wdXRTdGF0ZSgpXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNraWxsVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlZGl0b3IgfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgICAgICAgZm9jdXMoKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVyblxuXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSB8fCAhZWRpdG9yLmNvbnRhaW5zKHNlbGVjdGlvbi5hbmNob3JOb2RlKSkge1xuICAgICAgICAgICAgY29uc3QgZW5kUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICBlbmRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKVxuICAgICAgICAgICAgZW5kUmFuZ2UuY29sbGFwc2UoZmFsc2UpXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShlbmRSYW5nZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcblxuICAgICAgICAgIGxldCBwcmVmaXggPSAnJ1xuICAgICAgICAgIGNvbnN0IHsgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0IH0gPSByYW5nZVxuICAgICAgICAgIGlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDaGFyID0gc3RhcnRPZmZzZXQgPiAwID8gKHN0YXJ0Q29udGFpbmVyIGFzIFRleHQpLmRhdGEuY2hhckF0KHN0YXJ0T2Zmc2V0IC0gMSkgOiAnJ1xuICAgICAgICAgICAgaWYgKHByZXZDaGFyICYmICEvW1xccyhbe10vLnRlc3QocHJldkNoYXIpKSB7XG4gICAgICAgICAgICAgIHByZWZpeCA9ICcgJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluc2VydGVkID0gYCR7cHJlZml4fSNgXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpbnNlcnRlZClcbiAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKVxuXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIGluc2VydGVkLmxlbmd0aClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcblxuICAgICAgICAgIGVtaXRJbnB1dFN0YXRlKClcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplLFxuICAgICAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgICAgICBoYXNWaXN1YWxNdWx0aWxpbmU6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZWRpdG9yLnRleHRDb250ZW50Py50cmltKCkgPz8gJydcbiAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVkaXRvcilcbiAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChzdHlsZXMubGluZUhlaWdodCkgfHwgMjJcbiAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgICAgY29uc3QgaXNNdWx0aWxpbmUgPSBlZGl0b3JIZWlnaHQgPiBsaW5lSGVpZ2h0ICogMS41XG5cbiAgICAgICAgICByZXR1cm4gaXNNdWx0aWxpbmVcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RWRpdG9yQ2xpZW50UmVjdDogKCkgPT4gZWRpdG9yUmVmLmN1cnJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGwsXG4gICAgICAgIGluc2VydE1lbnRpb246IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcChjaGlwLCBtZW50aW9uKVxuICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IHRydWVcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlcmlhbGl6ZSgpXG4gICAgICAgICAgb25JbnB1dD8uKHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgdHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwIH0sXG4gICAgICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgICBoYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoaXNFbXB0eSlcbiAgICAgICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAvLyBTaSBlbCBuYXZlZ2Fkb3Igbm8gZGlzcGFyYSBgaW5wdXRgIHRyYXMgZWwgY2hpcCwgZWwgZmxhZyBxdWVkYWJhIGVuIHRydWUgeSBlbCBwcsOzeGltbyBAIGRlbCB1c3VhcmlvIHNlIGlnbm9yYWJhLlxuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgYXBwZW5kTWVudGlvbkF0RW5kOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbicsICd0cnVlJylcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWlkJywgU3RyaW5nKG1lbnRpb24uaWQpKVxuICAgICAgICAgIGNoaXAuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tdHlwZScsIG1lbnRpb24udHlwZSlcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWxhYmVsJywgbWVudGlvbi5sYWJlbClcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJylcblxuICAgICAgICAgIGNvbnN0IHRyYWlsaW5nU3BhY2UgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MDBhMCcpXG4gICAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGNoaXApXG4gICAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHRyYWlsaW5nU3BhY2UpXG5cbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoZmFsc2UpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGZhbHNlKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydCh0cmFpbGluZ1NwYWNlLCAxKVxuICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNraWxsTWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpcCA9IGJ1aWxkQ2hpcEVsZW1lbnQobWVudGlvbilcbiAgICAgICAgICByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAoY2hpcCwgbWVudGlvbilcbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gc3RhdGUudGV4dC50cmltKCkgPT09ICcnXG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGlzRW1wdHkpXG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0U2xhc2hDb21tYW5kOiAoY29tbWFuZDogU2xhc2hDb21tYW5kQ2hpcERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlwID0gYnVpbGRTbGFzaENoaXBFbGVtZW50KGNvbW1hbmQpXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwKGNoaXAsIGNvbW1hbmQpXG4gICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2VyaWFsaXplKClcbiAgICAgICAgICBvbklucHV0Py4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAgfSxcbiAgICAgICAgICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIFtcbiAgICAgICAgZm9jdXMsXG4gICAgICAgIGNsZWFyRWRpdG9yRG9tLFxuICAgICAgICBzZXJpYWxpemUsXG4gICAgICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCxcbiAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwLFxuICAgICAgICBvbklucHV0LFxuICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24sXG4gICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSxcbiAgICAgICAgZW1pdElucHV0U3RhdGUsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBlZGl0b3JSZWYsXG4gICAgICBdXG4gICAgKVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXQgPSAoKSA9PiB7XG4gICAgICBpZiAoc2tpcE5leHRJbnB1dC5jdXJyZW50KSB7XG4gICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZW1pdElucHV0U3RhdGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVBhc3RlID0gKGU6IENsaXBib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgZmlsZXMgPSBmaWxlc0Zyb21EYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKVxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCAmJiBvblBhc3RlRmlsZXMpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIG9uUGFzdGVGaWxlcyhmaWxlcylcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJylcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggJiYgb25QYXN0ZUZpbGVzICYmICF0ZXh0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVyblxuICAgICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpXG4gICAgICBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKVxuICAgICAgc2VsZWN0aW9uLmNvbGxhcHNlVG9FbmQoKVxuICAgICAgaGFuZGxlSW5wdXQoKVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRQbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyPy50cmltKCkgPz8gJydcbiAgICBjb25zdCBwbGFjZWhvbGRlclRvb2x0aXBUaXRsZSA9IGxvZ2ljYWxFbXB0eSAmJiBwbGFjZWhvbGRlclRydW5jYXRlZCAmJiB0cmltbWVkUGxhY2Vob2xkZXIgPyB0cmltbWVkUGxhY2Vob2xkZXIgOiAnJ1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxDb250ZXh0TWVudGlvbkNoaXBHbG9iYWxTdHlsZXMgLz5cbiAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3BsYWNlaG9sZGVyVG9vbHRpcFRpdGxlfT5cbiAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnYmxvY2snLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgIDxTQ01FRWRpdGFibGVcbiAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAkbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgICAgICAgIHN0eWxlPXttYXhIZWlnaHQgIT0gbnVsbCA/IHsgbWF4SGVpZ2h0IH0gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBkYXRhLWVtcHR5PXtTdHJpbmcobG9naWNhbEVtcHR5KX1cbiAgICAgICAgICAgICAgY29udGVudEVkaXRhYmxlPXshZGlzYWJsZWR9XG4gICAgICAgICAgICAgIGRhdGEtZGlzYWJsZWQ9e1N0cmluZyghIWRpc2FibGVkKX1cbiAgICAgICAgICAgICAgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXG4gICAgICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgb25JbnB1dD17aGFuZGxlSW5wdXR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgICAgICBvblBhc3RlPXtoYW5kbGVQYXN0ZX1cbiAgICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgPC8+XG4gICAgKVxuICB9XG4pXG5cbkNvbnRleHRNZW50aW9uRWRpdG9yLmRpc3BsYXlOYW1lID0gJ0NvbnRleHRNZW50aW9uRWRpdG9yJ1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsU0FFRUEsVUFBVSxFQUVWQyxXQUFXLEVBQ1hDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxPQUFPO0FBQ2QsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUN0RSxTQUFTQyxrQkFBa0IsUUFBUSxtQ0FBbUM7QUFFdEUsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBQ3hELFNBQVNDLDhCQUE4QixRQUFRLGlEQUFpRDtBQUNoRyxTQUFTQyxxQkFBcUIsUUFBOEIscUJBQXFCO0FBQ2pGLFNBQVNDLHFCQUFxQixRQUFRLCtCQUErQjtBQUNyRSxTQUFTQyxZQUFZLFFBQVEsK0JBQStCO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLFFBQUEsSUFBQUMsU0FBQSxFQUFBQyxJQUFBLElBQUFDLEtBQUE7QUFF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
|
|
488
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3J3YXJkUmVmIiwidXNlQ2FsbGJhY2siLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlTGF5b3V0RWZmZWN0IiwidXNlUmVmIiwidXNlU3RhdGUiLCJUb29sdGlwIiwidXNlQ29udGV4dE1lbnRpb25zIiwiYnVpbGRDaGlwRWxlbWVudCIsIkNvbnRleHRNZW50aW9uQ2hpcEdsb2JhbFN0eWxlcyIsImJ1aWxkU2xhc2hDaGlwRWxlbWVudCIsImZpbGVzRnJvbURhdGFUcmFuc2ZlciIsImlzRWRpdG9yVmlzdWFsbHlNdWx0aWxpbmUiLCJpc1BsYWNlaG9sZGVyVHJ1bmNhdGVkSW5FZGl0b3IiLCJyZXNvbHZlUHJldmlvdXNDaGFyQmVmb3JlQ2FyZXQiLCJyZXNvbHZlVHJpZ2dlckluc2VydFByZWZpeCIsInNob3VsZE1lcmdlQXRTaWduV2l0aFByZXZpb3VzU2libGluZyIsInNob3VsZEV2YWx1YXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uIiwic2hvdWxkTm9ybWFsaXplRW1wdHlFZGl0b3JEb20iLCJzaG91bGRTaG93UGxhY2Vob2xkZXJUb29sdGlwIiwiU0NNRUVkaXRhYmxlIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwiQ29udGV4dE1lbnRpb25FZGl0b3IiLCJfcmVmIiwicmVmIiwiX3BsYWNlaG9sZGVyJHRyaW0yIiwicGxhY2Vob2xkZXIiLCJkaXNhYmxlZCIsImNsYXNzTmFtZSIsIm1heEhlaWdodCIsIm9uSW5wdXQiLCJvbktleURvd24iLCJvbkZvY3VzIiwib25CbHVyIiwib25QYXN0ZUZpbGVzIiwiX3VzZUNvbnRleHRNZW50aW9ucyIsImVkaXRvclJlZiIsInVwZGF0ZVRyaWdnZXIiLCJyZXBsYWNlVHJpZ2dlcldpdGhDaGlwIiwic3luY1RyaWdnZXJBdFJ1bkxlbmd0aCIsInVwZGF0ZVNsYXNoVHJpZ2dlciIsInJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCIsInVwZGF0ZUhhc2hUcmlnZ2VyIiwicmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwIiwic2VyaWFsaXplIiwiY2xlYXJFZGl0b3JEb20iLCJjbGVhciIsImZvY3VzIiwic2tpcE5leHRJbnB1dCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInBsYWNlaG9sZGVyVHJ1bmNhdGVkIiwic2V0UGxhY2Vob2xkZXJUcnVuY2F0ZWQiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImxvZ2ljYWxFbXB0eSIsInNldExvZ2ljYWxFbXB0eSIsInN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSIsImlzRW1wdHkiLCJjdXJyZW50Iiwic2V0QXR0cmlidXRlIiwiU3RyaW5nIiwibm9ybWFsaXplRW1wdHlFZGl0b3JEb20iLCJlZGl0b3IiLCJ0ZXh0Q29udGVudCIsImlubmVySFRNTCIsInNlbGVjdGlvbiIsIndpbmRvdyIsImdldFNlbGVjdGlvbiIsInJhbmdlIiwiZG9jdW1lbnQiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsImNvbGxhcHNlIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24iLCJfcGxhY2Vob2xkZXIkdHJpbSIsImVsIiwicGgiLCJ0cmltIiwidGV4dCIsInVuZGVmaW5lZCIsInJvIiwiUmVzaXplT2JzZXJ2ZXIiLCJxdWV1ZU1pY3JvdGFzayIsIm9ic2VydmUiLCJkaXNjb25uZWN0IiwiZW1pdElucHV0U3RhdGUiLCJ0cmlnIiwic2xhc2hUcmlnIiwiaGFzaFRyaWciLCJzdGF0ZSIsIm1lbnRpb25zIiwic2xhc2hDb21tYW5kcyIsIl9vYmplY3RTcHJlYWQiLCJ0cmlnZ2VyIiwiYWN0aXZlIiwicXVlcnkiLCJhdFJ1bkxlbmd0aCIsInNsYXNoVHJpZ2dlciIsImhhc2hUcmlnZ2VyIiwic2V0UGxhaW5UZXh0IiwicGxhaW4iLCJjaGlsZE5vZGVzIiwibGVuZ3RoIiwiaW5zZXJ0TWVudGlvblRyaWdnZXIiLCJhbmNob3JOb2RlIiwiY29udGFpbnMiLCJlbmRSYW5nZSIsImdldFJhbmdlQXQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0IiwicHJlZml4IiwiaW5zZXJ0ZWQiLCJjb25jYXQiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwiaW5zZXJ0Tm9kZSIsInByZXZTaWJsaW5nIiwicHJldmlvdXNTaWJsaW5nIiwiY2FyZXROb2RlIiwiY2FyZXRPZmZzZXQiLCJwcmV2VGV4dCIsImRhdGEiLCJyZW1vdmUiLCJzZXRTdGFydCIsImluc2VydFNsYXNoVHJpZ2dlciIsImluc2VydFNraWxsVHJpZ2dlciIsImhhc1Zpc3VhbE11bHRpbGluZSIsIl9lZGl0b3IkdGV4dENvbnRlbnQkdCIsIl9lZGl0b3IkdGV4dENvbnRlbnQiLCJzdHlsZXMiLCJnZXRDb21wdXRlZFN0eWxlIiwibGluZUhlaWdodCIsInBhcnNlRmxvYXQiLCJlZGl0b3JIZWlnaHQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJoZWlnaHQiLCJnZXRFZGl0b3JDbGllbnRSZWN0IiwiX2VkaXRvclJlZiRjdXJyZW50JGdlIiwiX2VkaXRvclJlZiRjdXJyZW50IiwiaW5zZXJ0TWVudGlvbiIsIm1lbnRpb24iLCJjaGlwIiwiYXBwZW5kTWVudGlvbkF0RW5kIiwiaWQiLCJ0eXBlIiwibGFiZWwiLCJ0cmFpbGluZ1NwYWNlIiwiYXBwZW5kQ2hpbGQiLCJpbnNlcnRTa2lsbE1lbnRpb24iLCJpbnNlcnRTbGFzaENvbW1hbmQiLCJjb21tYW5kIiwiaGFuZGxlSW5wdXQiLCJoYW5kbGVQYXN0ZSIsImUiLCJmaWxlcyIsImNsaXBib2FyZERhdGEiLCJwcmV2ZW50RGVmYXVsdCIsImdldERhdGEiLCJyYW5nZUNvdW50IiwiZGVsZXRlRnJvbURvY3VtZW50IiwiY29sbGFwc2VUb0VuZCIsInBsYWNlaG9sZGVyVG9vbHRpcFRpdGxlIiwiY2hpbGRyZW4iLCJ0aXRsZSIsInN0eWxlIiwiZGlzcGxheSIsIndpZHRoIiwibWluV2lkdGgiLCIkbWF4SGVpZ2h0IiwiY29udGVudEVkaXRhYmxlIiwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiwicm9sZSIsIm9uUGFzdGUiLCJkaXNwbGF5TmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL0NvbnRleHRNZW50aW9uRWRpdG9yL0NvbnRleHRNZW50aW9uRWRpdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbGlwYm9hcmRFdmVudCxcbiAgZm9yd2FyZFJlZixcbiAgS2V5Ym9hcmRFdmVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5pbXBvcnQgeyB1c2VDb250ZXh0TWVudGlvbnMgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VDb250ZXh0TWVudGlvbnMnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgYnVpbGRDaGlwRWxlbWVudCB9IGZyb20gJy4uL0NvbnRleHRNZW50aW9uQ2hpcCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uQ2hpcEdsb2JhbFN0eWxlcyB9IGZyb20gJy4uL0NvbnRleHRNZW50aW9uQ2hpcC9Db250ZXh0TWVudGlvbkNoaXAuc3R5bGVzJ1xuaW1wb3J0IHsgYnVpbGRTbGFzaENoaXBFbGVtZW50LCBTbGFzaENvbW1hbmRDaGlwRGF0YSB9IGZyb20gJy4uL1NsYXNoQ29tbWFuZENoaXAnXG5pbXBvcnQgeyBmaWxlc0Zyb21EYXRhVHJhbnNmZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9jaGF0SW5wdXRGaWxlcydcbmltcG9ydCB7XG4gIGlzRWRpdG9yVmlzdWFsbHlNdWx0aWxpbmUsXG4gIGlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvcixcbiAgcmVzb2x2ZVByZXZpb3VzQ2hhckJlZm9yZUNhcmV0LFxuICByZXNvbHZlVHJpZ2dlckluc2VydFByZWZpeCxcbiAgc2hvdWxkTWVyZ2VBdFNpZ25XaXRoUHJldmlvdXNTaWJsaW5nLFxuICBzaG91bGRFdmFsdWF0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbixcbiAgc2hvdWxkTm9ybWFsaXplRW1wdHlFZGl0b3JEb20sXG4gIHNob3VsZFNob3dQbGFjZWhvbGRlclRvb2x0aXAsXG59IGZyb20gJy4vQ29udGV4dE1lbnRpb25FZGl0b3IuaGVscGVycydcbmltcG9ydCB7IFNDTUVFZGl0YWJsZSB9IGZyb20gJy4vQ29udGV4dE1lbnRpb25FZGl0b3Iuc3R5bGVzJ1xuXG5leHBvcnQgdHlwZSBDb250ZXh0TWVudGlvbkVkaXRvckhhbmRsZSA9IHtcbiAgZm9jdXM6ICgpID0+IHZvaWRcbiAgY2xlYXI6ICgpID0+IHZvaWRcbiAgc2V0UGxhaW5UZXh0OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKiBJbnNlcnRhIGBAYCBlbiBlbCBjYXJldCAoY29uIGVzcGFjaW8gcHJldmlvIHNpIGhhY2UgZmFsdGEpIHkgYWJyZSBlbCB0cmlnZ2VyIGRlIG1lbnRpb25zLiAqL1xuICBpbnNlcnRNZW50aW9uVHJpZ2dlcjogKCkgPT4gdm9pZFxuICAvKiogSW5zZXJ0YSBgL2AgZW4gZWwgY2FyZXQgKGNvbiBlc3BhY2lvIHByZXZpbyBzaSBoYWNlIGZhbHRhKSB5IGFicmUgZWwgdHJpZ2dlciBkZSBzbGFzaCBjb21tYW5kcy4gKi9cbiAgaW5zZXJ0U2xhc2hUcmlnZ2VyOiAoKSA9PiB2b2lkXG4gIC8qKiBJbnNlcnRhIGAjYCBlbiBlbCBjYXJldCAoY29uIGVzcGFjaW8gcHJldmlvIHNpIGhhY2UgZmFsdGEpIHkgYWJyZSBlbCB0cmlnZ2VyIGRlIHNraWxscy4gKi9cbiAgaW5zZXJ0U2tpbGxUcmlnZ2VyOiAoKSA9PiB2b2lkXG4gIGluc2VydE1lbnRpb246IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4gdm9pZFxuICBhcHBlbmRNZW50aW9uQXRFbmQ6IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4gdm9pZFxuICBpbnNlcnRTbGFzaENvbW1hbmQ6IChjb21tYW5kOiBTbGFzaENvbW1hbmRDaGlwRGF0YSkgPT4gdm9pZFxuICAvKiogUmVlbXBsYXphIGVsIGAjcXVlcnlgIHBlbmRpZW50ZSBwb3IgZWwgY2hpcCBkZSBsYSBza2lsbCBlbGVnaWRhLiAqL1xuICBpbnNlcnRTa2lsbE1lbnRpb246IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4gdm9pZFxuICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoOiAoYXRSdW5MZW5ndGg6IG51bWJlcikgPT4gdm9pZFxuICBzZXJpYWxpemU6ICgpID0+IHtcbiAgICB0ZXh0OiBzdHJpbmdcbiAgICBtZW50aW9uczogQ29udGV4dE1lbnRpb25bXVxuICAgIHNsYXNoQ29tbWFuZHM6IFNsYXNoQ29tbWFuZENoaXBEYXRhW11cbiAgfVxuICBoYXNWaXN1YWxNdWx0aWxpbmU6ICgpID0+IGJvb2xlYW5cbiAgLyoqIFJlY3QgZGVsIMOhcmVhIGVkaXRhYmxlICh2aWV3cG9ydCk7IGxvIHVzYSBlbCBwb3BvdmVyIGRlIEAgcGFyYSBhbGluZWFyIGFuY2hvIHkgZmFsbGJhY2sgdmVydGljYWwuICovXG4gIGdldEVkaXRvckNsaWVudFJlY3Q6ICgpID0+IERPTVJlY3QgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIENvbnRleHRNZW50aW9uRWRpdG9yUHJvcHMgPSB7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqIEFsdG8gbcOheGltbyBkZWwgw6FyZWEgZWRpdGFibGUgKHB4KS4gU2UgYWp1c3RhIGN1YW5kbyBoYXkgY2hpcHMgZGUgY29udGV4dG8vYWRqdW50b3MuICovXG4gIG1heEhlaWdodD86IG51bWJlclxuICBvbklucHV0PzogKHN0YXRlOiB7XG4gICAgdGV4dDogc3RyaW5nXG4gICAgbWVudGlvbnM6IENvbnRleHRNZW50aW9uW11cbiAgICBzbGFzaENvbW1hbmRzOiBTbGFzaENvbW1hbmRDaGlwRGF0YVtdXG4gICAgdHJpZ2dlcjogeyBhY3RpdmU6IGJvb2xlYW47IHF1ZXJ5OiBzdHJpbmc7IGF0UnVuTGVuZ3RoOiBudW1iZXIgfVxuICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGJvb2xlYW47IHF1ZXJ5OiBzdHJpbmcgfVxuICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZyB9XG4gIH0pID0+IHZvaWRcbiAgb25LZXlEb3duPzogKGU6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB2b2lkXG4gIG9uRm9jdXM/OiAoKSA9PiB2b2lkXG4gIG9uQmx1cj86ICgpID0+IHZvaWRcbiAgLyoqIENsaXBib2FyZCBmaWxlcyAoc2NyZWVuc2hvdHMsIGNvcGllZCBpbWFnZXMpLiBUZXh0IGlzIHN0aWxsIGluc2VydGVkIHdoZW4gcHJlc2VudC4gKi9cbiAgb25QYXN0ZUZpbGVzPzogKGZpbGVzOiBGaWxlW10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IENvbnRleHRNZW50aW9uRWRpdG9yID0gZm9yd2FyZFJlZjxDb250ZXh0TWVudGlvbkVkaXRvckhhbmRsZSwgQ29udGV4dE1lbnRpb25FZGl0b3JQcm9wcz4oXG4gICh7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgY2xhc3NOYW1lLCBtYXhIZWlnaHQsIG9uSW5wdXQsIG9uS2V5RG93biwgb25Gb2N1cywgb25CbHVyLCBvblBhc3RlRmlsZXMgfSwgcmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZWRpdG9yUmVmLFxuICAgICAgdXBkYXRlVHJpZ2dlcixcbiAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAsXG4gICAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgICAgdXBkYXRlU2xhc2hUcmlnZ2VyLFxuICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwLFxuICAgICAgdXBkYXRlSGFzaFRyaWdnZXIsXG4gICAgICByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAsXG4gICAgICBzZXJpYWxpemUsXG4gICAgICBjbGVhcjogY2xlYXJFZGl0b3JEb20sXG4gICAgICBmb2N1cyxcbiAgICB9ID0gdXNlQ29udGV4dE1lbnRpb25zKClcbiAgICBjb25zdCBza2lwTmV4dElucHV0ID0gdXNlUmVmKGZhbHNlKVxuICAgIGNvbnN0IFtwbGFjZWhvbGRlclRydW5jYXRlZCwgc2V0UGxhY2Vob2xkZXJUcnVuY2F0ZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gICAgY29uc3QgW2xvZ2ljYWxFbXB0eSwgc2V0TG9naWNhbEVtcHR5XSA9IHVzZVN0YXRlKHRydWUpXG5cbiAgICBjb25zdCBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUgPSB1c2VDYWxsYmFjaygoaXNFbXB0eTogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1lbXB0eScsIFN0cmluZyhpc0VtcHR5KSlcbiAgICAgIH1cbiAgICB9LCBbXSlcblxuICAgIGNvbnN0IG5vcm1hbGl6ZUVtcHR5RWRpdG9yRG9tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWRpdG9yKSByZXR1cm5cblxuICAgICAgLy8gTGltcGlhciBjdWFscXVpZXIgcmVzaWR1byAoYnIsIGVzcGFjaW9zKSBxdWUgZGVqZSBlbCBicm93c2VyIGFsIHZhY2lhciBlbCBjb250ZW50ZWRpdGFibGUuXG4gICAgICAvLyBTaW4gZXN0bywgdW4gZXNwYWNpbyBzdWVsdG8gYWN0aXZhIGRhdGEtZW1wdHk9XCJ0cnVlXCIgKyA6OmJlZm9yZSBwbGFjZWhvbGRlciBlbiBsw61uZWEgMVxuICAgICAgLy8geSBkZXNwbGF6YSBlbCBjdXJzb3IgYSBsYSBsw61uZWEgMi5cbiAgICAgIGlmIChzaG91bGROb3JtYWxpemVFbXB0eUVkaXRvckRvbShlZGl0b3IudGV4dENvbnRlbnQpKSB7XG4gICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm5cbiAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICB9LCBbZWRpdG9yUmVmXSlcblxuICAgIGNvbnN0IHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHBoID0gcGxhY2Vob2xkZXI/LnRyaW0oKSA/PyAnJ1xuXG4gICAgICBpZiAoIWVsIHx8ICFzaG91bGRFdmFsdWF0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbihwbGFjZWhvbGRlciwgc2VyaWFsaXplKCkudGV4dCkpIHtcbiAgICAgICAgc2V0UGxhY2Vob2xkZXJUcnVuY2F0ZWQoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRQbGFjZWhvbGRlclRydW5jYXRlZChpc1BsYWNlaG9sZGVyVHJ1bmNhdGVkSW5FZGl0b3IoZWwsIHBoKSlcbiAgICB9LCBbcGxhY2Vob2xkZXIsIHNlcmlhbGl6ZV0pXG5cbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKClcbiAgICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24pXG4gICAgICB9KVxuICAgICAgcm8ub2JzZXJ2ZShlbClcbiAgICAgIHJldHVybiAoKSA9PiByby5kaXNjb25uZWN0KClcbiAgICB9LCBbcGxhY2Vob2xkZXIsIGRpc2FibGVkLCByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb25dKVxuXG4gICAgY29uc3QgZW1pdElucHV0U3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCB0cmlnID0gdXBkYXRlVHJpZ2dlcigpXG4gICAgICBjb25zdCBzbGFzaFRyaWcgPSB1cGRhdGVTbGFzaFRyaWdnZXIoKVxuICAgICAgY29uc3QgaGFzaFRyaWcgPSB1cGRhdGVIYXNoVHJpZ2dlcigpXG4gICAgICBsZXQgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20oKVxuICAgICAgICBzdGF0ZSA9IHsgdGV4dDogJycsIG1lbnRpb25zOiBbXSwgc2xhc2hDb21tYW5kczogW10gfVxuICAgICAgfVxuICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogdHJpZy5hY3RpdmUsIHF1ZXJ5OiB0cmlnLnF1ZXJ5LCBhdFJ1bkxlbmd0aDogdHJpZy5hdFJ1bkxlbmd0aCB9LFxuICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBzbGFzaFRyaWcuYWN0aXZlLCBxdWVyeTogc2xhc2hUcmlnLnF1ZXJ5IH0sXG4gICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogaGFzaFRyaWcuYWN0aXZlLCBxdWVyeTogaGFzaFRyaWcucXVlcnkgfSxcbiAgICAgIH0pXG4gICAgICBxdWV1ZU1pY3JvdGFzayhyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24pXG4gICAgfSwgW1xuICAgICAgdXBkYXRlVHJpZ2dlcixcbiAgICAgIHVwZGF0ZVNsYXNoVHJpZ2dlcixcbiAgICAgIHVwZGF0ZUhhc2hUcmlnZ2VyLFxuICAgICAgc2VyaWFsaXplLFxuICAgICAgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20sXG4gICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUsXG4gICAgICBvbklucHV0LFxuICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uLFxuICAgIF0pXG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKFxuICAgICAgcmVmLFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgZm9jdXMsXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJFZGl0b3JEb20oKVxuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSh0cnVlKVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eSh0cnVlKVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGxhaW5UZXh0OiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvcikgcmV0dXJuXG4gICAgICAgICAgY29uc3QgcGxhaW4gPSB0ZXh0ID8/ICcnXG4gICAgICAgICAgZWRpdG9yLnRleHRDb250ZW50ID0gcGxhaW5cbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICAgICAgZWRpdG9yLmlubmVySFRNTCA9ICcnXG4gICAgICAgICAgfVxuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIGVkaXRvci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKVxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydE1lbnRpb25UcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvciB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICAgICAgICBmb2N1cygpXG5cbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG5cbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlIHx8ICFlZGl0b3IuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgICAgIGVuZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKGVuZFJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICAgICAgY29uc3QgeyBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQgfSA9IHJhbmdlXG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gcmVzb2x2ZVRyaWdnZXJJbnNlcnRQcmVmaXgocmVzb2x2ZVByZXZpb3VzQ2hhckJlZm9yZUNhcmV0KHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCkpXG5cbiAgICAgICAgICBjb25zdCBpbnNlcnRlZCA9IGAke3ByZWZpeH1AYFxuICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaW5zZXJ0ZWQpXG4gICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0ZXh0Tm9kZSlcblxuICAgICAgICAgIC8vIFNpIGVsIGBAYCBxdWVkw7MgZW4gdW4gbm9kbyBudWV2bywgdW5pciBjb24gZWwgdGV4dCBub2RlIHByZXZpbyBxdWUgdGVybWluYSBlbiBgQGBcbiAgICAgICAgICAvLyBwYXJhIHF1ZSBkZXRlY3RNZW50aW9uVHJpZ2dlciB2ZWEgZWwgcnVuIGNvbXBsZXRvIChAQCwgQEBALCDigKYpLlxuICAgICAgICAgIGNvbnN0IHByZXZTaWJsaW5nID0gdGV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG4gICAgICAgICAgbGV0IGNhcmV0Tm9kZSA9IHRleHROb2RlXG4gICAgICAgICAgbGV0IGNhcmV0T2Zmc2V0ID0gaW5zZXJ0ZWQubGVuZ3RoXG4gICAgICAgICAgaWYgKHNob3VsZE1lcmdlQXRTaWduV2l0aFByZXZpb3VzU2libGluZyhwcmVmaXgsIHByZXZTaWJsaW5nKSkge1xuICAgICAgICAgICAgY29uc3QgcHJldlRleHQgPSBwcmV2U2libGluZyBhcyBUZXh0XG4gICAgICAgICAgICBjYXJldE9mZnNldCA9IHByZXZUZXh0LmRhdGEubGVuZ3RoICsgaW5zZXJ0ZWQubGVuZ3RoXG4gICAgICAgICAgICBwcmV2VGV4dC5kYXRhICs9IGluc2VydGVkXG4gICAgICAgICAgICB0ZXh0Tm9kZS5yZW1vdmUoKVxuICAgICAgICAgICAgY2FyZXROb2RlID0gcHJldlRleHRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbCBjYXJldCBkZWJlIHF1ZWRhciBERU5UUk8gZGVsIHRleHQgbm9kZSAoZGVzcHXDqXMgZGUgYEBgKS5cbiAgICAgICAgICAvLyBgc2V0U3RhcnRBZnRlcmAgbG8gZGVqYSBlbiBlbCBwYWRyZSB5IGRldGVjdE1lbnRpb25UcmlnZ2VyIG5vIGFjdGl2YSBlbCBwb3BvdmVyLlxuICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGNhcmV0Tm9kZSwgY2FyZXRPZmZzZXQpXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG5cbiAgICAgICAgICBlbWl0SW5wdXRTdGF0ZSgpXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNsYXNoVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlZGl0b3IgfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgICAgICAgZm9jdXMoKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVyblxuXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSB8fCAhZWRpdG9yLmNvbnRhaW5zKHNlbGVjdGlvbi5hbmNob3JOb2RlKSkge1xuICAgICAgICAgICAgY29uc3QgZW5kUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICBlbmRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKVxuICAgICAgICAgICAgZW5kUmFuZ2UuY29sbGFwc2UoZmFsc2UpXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShlbmRSYW5nZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcblxuICAgICAgICAgIGNvbnN0IHsgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0IH0gPSByYW5nZVxuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4KHJlc29sdmVQcmV2aW91c0NoYXJCZWZvcmVDYXJldChzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpKVxuXG4gICAgICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBgJHtwcmVmaXh9L2BcbiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGluc2VydGVkKVxuICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpXG5cbiAgICAgICAgICAvLyBDYXJldCBkZW50cm8gZGVsIHRleHQgbm9kZSBwYXJhIHF1ZSBkZXRlY3RTbGFzaFRyaWdnZXIgYWN0aXZlIGVsIGRyb3Bkb3duLlxuICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCBpbnNlcnRlZC5sZW5ndGgpXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG5cbiAgICAgICAgICBlbWl0SW5wdXRTdGF0ZSgpXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNraWxsVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlZGl0b3IgfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgICAgICAgZm9jdXMoKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVyblxuXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSB8fCAhZWRpdG9yLmNvbnRhaW5zKHNlbGVjdGlvbi5hbmNob3JOb2RlKSkge1xuICAgICAgICAgICAgY29uc3QgZW5kUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICBlbmRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKVxuICAgICAgICAgICAgZW5kUmFuZ2UuY29sbGFwc2UoZmFsc2UpXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShlbmRSYW5nZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcblxuICAgICAgICAgIGNvbnN0IHsgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0IH0gPSByYW5nZVxuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4KHJlc29sdmVQcmV2aW91c0NoYXJCZWZvcmVDYXJldChzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpKVxuXG4gICAgICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBgJHtwcmVmaXh9I2BcbiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGluc2VydGVkKVxuICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpXG5cbiAgICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgaW5zZXJ0ZWQubGVuZ3RoKVxuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuXG4gICAgICAgICAgZW1pdElucHV0U3RhdGUoKVxuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemUsXG4gICAgICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgICAgIGhhc1Zpc3VhbE11bHRpbGluZTogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRleHQgPSBlZGl0b3IudGV4dENvbnRlbnQ/LnRyaW0oKSA/PyAnJ1xuICAgICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWRpdG9yKVxuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBwYXJzZUZsb2F0KHN0eWxlcy5saW5lSGVpZ2h0KSB8fCAyMlxuICAgICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IGVkaXRvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgICByZXR1cm4gaXNFZGl0b3JWaXN1YWxseU11bHRpbGluZShlZGl0b3JIZWlnaHQsIGxpbmVIZWlnaHQpXG4gICAgICAgIH0sXG4gICAgICAgIGdldEVkaXRvckNsaWVudFJlY3Q6ICgpID0+IGVkaXRvclJlZi5jdXJyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsLFxuICAgICAgICBpbnNlcnRNZW50aW9uOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlwID0gYnVpbGRDaGlwRWxlbWVudChtZW50aW9uKVxuICAgICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAoY2hpcCwgbWVudGlvbilcbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gc3RhdGUudGV4dC50cmltKCkgPT09ICcnXG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGlzRW1wdHkpXG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgLy8gU2kgZWwgbmF2ZWdhZG9yIG5vIGRpc3BhcmEgYGlucHV0YCB0cmFzIGVsIGNoaXAsIGVsIGZsYWcgcXVlZGFiYSBlbiB0cnVlIHkgZWwgcHLDs3hpbW8gQCBkZWwgdXN1YXJpbyBzZSBpZ25vcmFiYS5cbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGFwcGVuZE1lbnRpb25BdEVuZDogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvcikgcmV0dXJuXG5cbiAgICAgICAgICBjb25zdCBjaGlwID0gYnVpbGRDaGlwRWxlbWVudChtZW50aW9uKVxuICAgICAgICAgIGNoaXAuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24nLCAndHJ1ZScpXG4gICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1pZCcsIFN0cmluZyhtZW50aW9uLmlkKSlcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLXR5cGUnLCBtZW50aW9uLnR5cGUpXG4gICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1sYWJlbCcsIG1lbnRpb24ubGFiZWwpXG4gICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpXG5cbiAgICAgICAgICBjb25zdCB0cmFpbGluZ1NwYWNlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTAwYTAnKVxuICAgICAgICAgIGVkaXRvci5hcHBlbmRDaGlsZChjaGlwKVxuICAgICAgICAgIGVkaXRvci5hcHBlbmRDaGlsZCh0cmFpbGluZ1NwYWNlKVxuXG4gICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2VyaWFsaXplKClcbiAgICAgICAgICBvbklucHV0Py4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAgfSxcbiAgICAgICAgICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGZhbHNlKVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShmYWxzZSlcblxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodHJhaWxpbmdTcGFjZSwgMSlcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKClcbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRTa2lsbE1lbnRpb246IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwKGNoaXAsIG1lbnRpb24pXG4gICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2VyaWFsaXplKClcbiAgICAgICAgICBvbklucHV0Py4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAgfSxcbiAgICAgICAgICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNsYXNoQ29tbWFuZDogKGNvbW1hbmQ6IFNsYXNoQ29tbWFuZENoaXBEYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpcCA9IGJ1aWxkU2xhc2hDaGlwRWxlbWVudChjb21tYW5kKVxuICAgICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcChjaGlwLCBjb21tYW5kKVxuICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IHRydWVcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlcmlhbGl6ZSgpXG4gICAgICAgICAgb25JbnB1dD8uKHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgdHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwIH0sXG4gICAgICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgICBoYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoaXNFbXB0eSlcbiAgICAgICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKClcbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBbXG4gICAgICAgIGZvY3VzLFxuICAgICAgICBjbGVhckVkaXRvckRvbSxcbiAgICAgICAgc2VyaWFsaXplLFxuICAgICAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgICAgICByZXBsYWNlVHJpZ2dlcldpdGhDaGlwLFxuICAgICAgICByZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNraWxsQ2hpcCxcbiAgICAgICAgb25JbnB1dCxcbiAgICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uLFxuICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUsXG4gICAgICAgIGVtaXRJbnB1dFN0YXRlLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgZWRpdG9yUmVmLFxuICAgICAgXVxuICAgIClcblxuICAgIGNvbnN0IGhhbmRsZUlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKHNraXBOZXh0SW5wdXQuY3VycmVudCkge1xuICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGVtaXRJbnB1dFN0YXRlKClcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVQYXN0ZSA9IChlOiBDbGlwYm9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gZmlsZXNGcm9tRGF0YVRyYW5zZmVyKGUuY2xpcGJvYXJkRGF0YSlcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggJiYgb25QYXN0ZUZpbGVzKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBvblBhc3RlRmlsZXMoZmlsZXMpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoICYmIG9uUGFzdGVGaWxlcyAmJiAhdGV4dCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm5cbiAgICAgIHNlbGVjdGlvbi5kZWxldGVGcm9tRG9jdW1lbnQoKVxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSlcbiAgICAgIHNlbGVjdGlvbi5jb2xsYXBzZVRvRW5kKClcbiAgICAgIGhhbmRsZUlucHV0KClcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZWhvbGRlclRvb2x0aXBUaXRsZSA9IHNob3VsZFNob3dQbGFjZWhvbGRlclRvb2x0aXAobG9naWNhbEVtcHR5LCBwbGFjZWhvbGRlclRydW5jYXRlZCwgcGxhY2Vob2xkZXIpXG4gICAgICA/IChwbGFjZWhvbGRlcj8udHJpbSgpID8/ICcnKVxuICAgICAgOiAnJ1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxDb250ZXh0TWVudGlvbkNoaXBHbG9iYWxTdHlsZXMgLz5cbiAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3BsYWNlaG9sZGVyVG9vbHRpcFRpdGxlfT5cbiAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnYmxvY2snLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgIDxTQ01FRWRpdGFibGVcbiAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAkbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgICAgICAgIHN0eWxlPXttYXhIZWlnaHQgIT0gbnVsbCA/IHsgbWF4SGVpZ2h0IH0gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBkYXRhLWVtcHR5PXtTdHJpbmcobG9naWNhbEVtcHR5KX1cbiAgICAgICAgICAgICAgY29udGVudEVkaXRhYmxlPXshZGlzYWJsZWR9XG4gICAgICAgICAgICAgIGRhdGEtZGlzYWJsZWQ9e1N0cmluZyghIWRpc2FibGVkKX1cbiAgICAgICAgICAgICAgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXG4gICAgICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgb25JbnB1dD17aGFuZGxlSW5wdXR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgICAgICBvblBhc3RlPXtoYW5kbGVQYXN0ZX1cbiAgICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgPC8+XG4gICAgKVxuICB9XG4pXG5cbkNvbnRleHRNZW50aW9uRWRpdG9yLmRpc3BsYXlOYW1lID0gJ0NvbnRleHRNZW50aW9uRWRpdG9yJ1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsU0FFRUEsVUFBVSxFQUVWQyxXQUFXLEVBQ1hDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxPQUFPO0FBQ2QsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUN0RSxTQUFTQyxrQkFBa0IsUUFBUSxt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
|