@projectcor/maia-components 2.48.1-1 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/lib/App.js +19 -44
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +53 -1
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +28 -52
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +37 -1
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +33 -66
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +227 -1
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -177
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +29 -1
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -28
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +173 -1
- package/lib/components/atoms/MAIAInput/MAIAInput.js +126 -171
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +47 -1
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -61
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +30 -1
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +13 -18
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +48 -1
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +17 -26
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +266 -321
- package/lib/components/molecules/ChatAIHome/styles.js +78 -85
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +345 -1
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +201 -200
- package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +373 -5
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +199 -271
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +20 -1
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +87 -74
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +46 -61
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +314 -1
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +261 -480
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +1 -4
- package/lib/dev/DevReasoningTimeline.js +37 -68
- package/lib/dev/Providers.js +3 -5
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useChatManager/useChatManager.helpers.js +550 -1
- package/lib/hooks/useChatManager/useChatManager.js +245 -429
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +257 -1
- package/lib/hooks/useChatMessages/useChatMessages.js +50 -206
- package/lib/hooks/useContextMentions.helpers.js +61 -1
- package/lib/hooks/useContextMentions.js +5 -62
- package/lib/hooks/useEntitySearch.helpers.js +49 -1
- package/lib/hooks/useEntitySearch.js +22 -53
- package/lib/hooks/useFrequentlyUsedActions.js +22 -60
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/index.js +2 -5
- package/lib/lang/br/index.js +1 -26
- package/lib/lang/en/index.js +1 -26
- package/lib/lang/es/index.js +1 -26
- package/lib/lang/fr/index.js +1 -26
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Agents/getAgents.helpers.js +61 -1
- package/lib/services/maia/Agents/getAgents.js +31 -59
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.js +25 -249
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.js +213 -273
- package/lib/styles/cascade.js +3 -29
- package/lib/styles/transitions.js +1 -3
- package/lib/types/global.d.js +1 -1
- package/lib/utils/hoursPlannerQuickActionType.js +1 -74
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/streamActivityMessages.helpers.js +222 -0
- package/lib/utils/streamActivityMessages.js +21 -251
- package/package.json +1 -1
- package/lib/components/atoms/ActionableButton.spec.js +0 -111
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -66
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -211
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -41
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -253
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -33
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -25
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
- package/lib/components/atoms/Chip/Chip.spec.js +0 -82
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -88
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -77
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -48
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -231
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
- package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
- package/lib/components/atoms/Expand/Expand.spec.js +0 -57
- package/lib/components/atoms/Fade/Fade.spec.js +0 -31
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
- package/lib/components/atoms/HelpButton.spec.js +0 -87
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -26
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -444
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -20
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -53
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -22
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
- package/lib/components/atoms/NextPageLoader.spec.js +0 -37
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -86
- package/lib/components/atoms/PrimaryButton.spec.js +0 -42
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
- package/lib/components/atoms/Switch/Switch.spec.js +0 -41
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
- package/lib/components/atoms/TextArea/TextArea.spec.js +0 -68
- package/lib/components/atoms/ThirdButton.spec.js +0 -29
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
- package/lib/components/atoms/WithAppCfg.spec.js +0 -60
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -495
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -57
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -227
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -108
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -254
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
- package/lib/components/molecules/AgentInputBlock/index.js +0 -5
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -77
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -445
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -471
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -659
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -95
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
- package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
- package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -172
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -82
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -453
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -391
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1204
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -195
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
- package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
- package/lib/components/organisms/ChatAIPage/index.js +0 -3
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
- package/lib/constants/maiaFeatureAccess.spec.js +0 -30
- package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
- package/lib/constants/maiaTaskPanelAccess.spec.js +0 -30
- package/lib/constants/permissions/clientRoleAccess.spec.js +0 -31
- package/lib/constants/permissions/utils.spec.js +0 -128
- package/lib/dev/DevMaiaPage.js +0 -30
- package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -231
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -313
- package/lib/hooks/useAgentSuggestions.spec.js +0 -89
- package/lib/hooks/useCaretPosition.spec.js +0 -58
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -506
- package/lib/hooks/useChatManager/useChatManager.spec.js +0 -1261
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -176
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -379
- package/lib/hooks/useChats/useChats.spec.js +0 -208
- package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
- package/lib/hooks/useClientSearch.spec.js +0 -86
- package/lib/hooks/useContextMentions.helpers.spec.js +0 -143
- package/lib/hooks/useContextMentions.spec.js +0 -239
- package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -115
- package/lib/hooks/useContextPinPopover.spec.js +0 -159
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
- package/lib/hooks/useDebounce.spec.js +0 -42
- package/lib/hooks/useEntitySearch.helpers.spec.js +0 -321
- package/lib/hooks/useEntitySearch.spec.js +0 -443
- package/lib/hooks/useEvent.spec.js +0 -45
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
- package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
- package/lib/hooks/useIsMaiaPageRoute.js +0 -26
- package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
- package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
- package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
- package/lib/hooks/useMentionPopover.helpers.spec.js +0 -71
- package/lib/hooks/useMentionPopover.spec.js +0 -215
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -132
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
- package/lib/hooks/useModal/useModal.spec.js +0 -73
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -192
- package/lib/hooks/useProjectSearch.helpers.spec.js +0 -70
- package/lib/hooks/useProjectSearch.spec.js +0 -91
- package/lib/hooks/useProjectSummary.spec.js +0 -193
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -92
- package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
- package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
- package/lib/hooks/useRecentContexts.spec.js +0 -139
- package/lib/hooks/useResize.spec.js +0 -37
- package/lib/hooks/useSkillsCatalog.spec.js +0 -88
- package/lib/hooks/useSlashCommands.spec.js +0 -139
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
- package/lib/hooks/useStreamResponse.spec.js +0 -199
- package/lib/hooks/useT.spec.js +0 -20
- package/lib/hooks/useToggle.spec.js +0 -33
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
- package/lib/services/maia/Access/updateAccess.spec.js +0 -137
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
- package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
- package/lib/services/maia/Agents/connectors.spec.js +0 -359
- package/lib/services/maia/Agents/createAgent.spec.js +0 -55
- package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
- package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -211
- package/lib/services/maia/Agents/getAgents.spec.js +0 -697
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
- package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
- package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
- package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
- package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
- package/lib/services/maia/Chats/patchChat.spec.js +0 -41
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
- package/lib/services/maia/Knowledge/delete.spec.js +0 -45
- package/lib/services/maia/Knowledge/download.spec.js +0 -78
- package/lib/services/maia/Knowledge/save.spec.js +0 -58
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -153
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
- package/lib/services/maia/Skills/createSkill.spec.js +0 -68
- package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
- package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
- package/lib/services/maia/Skills/getSkills.spec.js +0 -152
- package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
- package/lib/services/maia/client.spec.js +0 -56
- package/lib/services/utils/fetchCOR.spec.js +0 -211
- package/lib/services/utils/getCookie.spec.js +0 -20
- package/lib/services/utils/mapChatMessages.spec.js +0 -254
- package/lib/store/chatsSidebarOptimistic.spec.js +0 -112
- package/lib/store/maiaLastChatPersistence.spec.js +0 -22
- package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
- package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
- package/lib/store/sessions/sessionNotifications.spec.js +0 -106
- package/lib/store/sessions/sessionStreamManager.spec.js +0 -503
- package/lib/store/sessions/sessions.types.spec.js +0 -16
- package/lib/store/sessions/useSessionsStore.spec.js +0 -135
- package/lib/store/useChatsStore.spec.js +0 -619
- package/lib/store/useFaqsStore.spec.js +0 -57
- package/lib/utils/actionCategoryMap.spec.js +0 -18
- package/lib/utils/agentDisplayName.spec.js +0 -44
- package/lib/utils/autoApproveStorage.spec.js +0 -25
- package/lib/utils/chatInputFiles.spec.js +0 -39
- package/lib/utils/contextMentionIcons.spec.js +0 -41
- package/lib/utils/contextMentionLabel.spec.js +0 -13
- package/lib/utils/contextMentionTriggers.spec.js +0 -38
- package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
- package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
- package/lib/utils/entityLinkRender.spec.js +0 -72
- package/lib/utils/fileDownloadHelper.spec.js +0 -67
- package/lib/utils/formatQuickActionMessage.spec.js +0 -27
- package/lib/utils/formatUnreadCount.spec.js +0 -12
- package/lib/utils/getUnitFileSize.spec.js +0 -18
- package/lib/utils/hitlAnalytics.spec.js +0 -100
- package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
- package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
- package/lib/utils/imagePreprocessor.spec.js +0 -112
- package/lib/utils/maiaPageRoute.js +0 -24
- package/lib/utils/maiaPageRoute.spec.js +0 -23
- package/lib/utils/mapBackendLang.spec.js +0 -19
- package/lib/utils/navigateContextEntity.spec.js +0 -50
- package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
- package/lib/utils/orchestratorSubagents.spec.js +0 -32
- package/lib/utils/reasoningMappers.spec.js +0 -103
- package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
- package/lib/utils/renderContextMentions.spec.js +0 -158
- package/lib/utils/retryCompletion.spec.js +0 -99
- package/lib/utils/skillContentSize.spec.js +0 -13
- package/lib/utils/slashCommandMarker.spec.js +0 -43
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
- package/lib/utils/sseStreamContent.spec.js +0 -31
- package/lib/utils/streamActivityMessages.spec.js +0 -253
- package/lib/utils/validateTrimmedFields.spec.js +0 -26
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
1
2
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
3
|
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
4
|
import _typeof from "@babel/runtime/helpers/typeof";
|
|
4
5
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
6
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
5
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
9
|
+
import { isHoursChargeTool } from '../../constants/plannerSyncEvents';
|
|
10
|
+
import { ChatHistoryRole } from '../../types/Chat';
|
|
7
11
|
import { reasoningStore } from '../useReasoningTrace';
|
|
8
12
|
import { buildReasoningTrace } from '../../utils/reasoningMappers';
|
|
13
|
+
import { resolveRetryTurnId } from '../../utils/retryCompletion';
|
|
9
14
|
/** Trace acumulado en vivo para `messageId`, o null si el store apunta a otro mensaje. */
|
|
10
15
|
export var reasoningTraceFor = function reasoningTraceFor(messageId) {
|
|
11
16
|
var snapshot = reasoningStore.getSnapshot(messageId);
|
|
@@ -288,6 +293,50 @@ export var resolveStreamErrorPresentation = function resolveStreamErrorPresentat
|
|
|
288
293
|
showRetry: !isAccessDenied && !isPromptTooLong
|
|
289
294
|
};
|
|
290
295
|
};
|
|
296
|
+
export var resolveStreamErrorMessageKey = function resolveStreamErrorMessageKey(errorMessage, errorRawMessage) {
|
|
297
|
+
var presentation = resolveStreamErrorPresentation(errorMessage, errorRawMessage);
|
|
298
|
+
var messageKey = 'chat.error';
|
|
299
|
+
if (presentation.isAccessDenied) messageKey = 'chat.errorAccessDenied';else if (presentation.isPromptTooLong) messageKey = 'chat.errorPromptTooLong';
|
|
300
|
+
return {
|
|
301
|
+
messageKey: messageKey,
|
|
302
|
+
tokensUsed: presentation.tokensUsed,
|
|
303
|
+
showRetry: presentation.showRetry
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
export var resolveProjectDashboardMutation = function resolveProjectDashboardMutation(flags) {
|
|
307
|
+
if (flags.wasTaskCreation) return 'create';
|
|
308
|
+
if (flags.wasTaskEdit) return 'edit';
|
|
309
|
+
if (flags.wasTaskDelete) return 'delete';
|
|
310
|
+
return null;
|
|
311
|
+
};
|
|
312
|
+
export var applyProjectDashboardMutation = function applyProjectDashboardMutation(mutation, taskIds, dashboard) {
|
|
313
|
+
var _dashboard$deleteExis;
|
|
314
|
+
if (!mutation || !dashboard) return;
|
|
315
|
+
if (mutation === 'create') {
|
|
316
|
+
var _dashboard$addExistin;
|
|
317
|
+
(_dashboard$addExistin = dashboard.addExistingTaskToDashboard) === null || _dashboard$addExistin === void 0 || _dashboard$addExistin.call(dashboard, taskIds);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (mutation === 'edit') {
|
|
321
|
+
var _dashboard$editExisti;
|
|
322
|
+
(_dashboard$editExisti = dashboard.editExistingTaskInDashboard) === null || _dashboard$editExisti === void 0 || _dashboard$editExisti.call(dashboard, taskIds);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
(_dashboard$deleteExis = dashboard.deleteExistingTaskFromDashboard) === null || _dashboard$deleteExis === void 0 || _dashboard$deleteExis.call(dashboard, taskIds);
|
|
326
|
+
};
|
|
327
|
+
export var mergeAffectedTaskIdsForPanelRefetch = function mergeAffectedTaskIdsForPanelRefetch(pendingActions, taskIdsForDashboard, manualApproval) {
|
|
328
|
+
var manualPseudoActions = [];
|
|
329
|
+
if (manualApproval) {
|
|
330
|
+
var _manualApproval$toolA;
|
|
331
|
+
manualPseudoActions.push({
|
|
332
|
+
tool_name: manualApproval.toolName,
|
|
333
|
+
tool_args: (_manualApproval$toolA = manualApproval.toolArgs) !== null && _manualApproval$toolA !== void 0 ? _manualApproval$toolA : {},
|
|
334
|
+
thread_id: 'manual',
|
|
335
|
+
tool_call_id: 'manual'
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return [].concat(_toConsumableArray(extractTaskIdsFromPendingActionsArgs(pendingActions)), _toConsumableArray(taskIdsForDashboard), _toConsumableArray(extractTaskIdsFromPendingActionsArgs(manualPseudoActions))).map(String);
|
|
339
|
+
};
|
|
291
340
|
export var mapAuthUserToChatMessageUser = function mapAuthUserToChatMessageUser(authUser) {
|
|
292
341
|
return {
|
|
293
342
|
id: authUser.id.toString(),
|
|
@@ -316,6 +365,249 @@ export var canSendChatMessage = function canSendChatMessage(isProcessing, waitin
|
|
|
316
365
|
export var shouldBlockConcurrentStreamStart = function shouldBlockConcurrentStreamStart(willStartNewStream, activeCount, maxConcurrent) {
|
|
317
366
|
return willStartNewStream && activeCount >= maxConcurrent;
|
|
318
367
|
};
|
|
368
|
+
export var resolveSendMessageGate = function resolveSendMessageGate(params) {
|
|
369
|
+
if (!canSendChatMessage(params.isProcessing, params.waitingResponse, params.loadingMessages)) {
|
|
370
|
+
return 'busy';
|
|
371
|
+
}
|
|
372
|
+
if (shouldBlockConcurrentStreamStart(params.willStartNewStream, params.activeStreamCount, params.maxConcurrent)) {
|
|
373
|
+
return 'concurrency';
|
|
374
|
+
}
|
|
375
|
+
return null;
|
|
376
|
+
};
|
|
377
|
+
export var resolveSendMessagePayloadFields = function resolveSendMessagePayloadFields(options, positional) {
|
|
378
|
+
var _positional$faqId, _positional$agentSugg, _positional$mentions, _positional$fuaId, _positional$scId;
|
|
379
|
+
return {
|
|
380
|
+
faqId: (_positional$faqId = positional === null || positional === void 0 ? void 0 : positional.faqId) !== null && _positional$faqId !== void 0 ? _positional$faqId : options.faqId,
|
|
381
|
+
agentSuggestionId: (_positional$agentSugg = positional === null || positional === void 0 ? void 0 : positional.agentSuggestionId) !== null && _positional$agentSugg !== void 0 ? _positional$agentSugg : options.agentSuggestionId,
|
|
382
|
+
mentions: (_positional$mentions = positional === null || positional === void 0 ? void 0 : positional.mentions) !== null && _positional$mentions !== void 0 ? _positional$mentions : options.mentions,
|
|
383
|
+
fuaId: (_positional$fuaId = positional === null || positional === void 0 ? void 0 : positional.fuaId) !== null && _positional$fuaId !== void 0 ? _positional$fuaId : options.fuaId,
|
|
384
|
+
scId: (_positional$scId = positional === null || positional === void 0 ? void 0 : positional.scId) !== null && _positional$scId !== void 0 ? _positional$scId : options.scId,
|
|
385
|
+
contextData: options.contextData
|
|
386
|
+
};
|
|
387
|
+
};
|
|
388
|
+
export var buildChatHistoryFromMessages = function buildChatHistoryFromMessages(messages, authUserId) {
|
|
389
|
+
return messages.map(function (historyMessage) {
|
|
390
|
+
return {
|
|
391
|
+
content: historyMessage.message,
|
|
392
|
+
role: historyMessage.user.id === authUserId ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
393
|
+
};
|
|
394
|
+
});
|
|
395
|
+
};
|
|
396
|
+
export var resolveLastMessageAgentId = function resolveLastMessageAgentId(messages) {
|
|
397
|
+
var _messages$at;
|
|
398
|
+
return (_messages$at = messages.at(-1)) === null || _messages$at === void 0 ? void 0 : _messages$at.agentId;
|
|
399
|
+
};
|
|
400
|
+
export var resolveAgentIdForStream = function resolveAgentIdForStream(agentIdFromMessages, fallbackAgentId) {
|
|
401
|
+
return agentIdFromMessages || fallbackAgentId || '';
|
|
402
|
+
};
|
|
403
|
+
export var resolveUserQuestionMessageId = function resolveUserQuestionMessageId(turnMessageId) {
|
|
404
|
+
return "question-".concat(turnMessageId);
|
|
405
|
+
};
|
|
406
|
+
export var buildMaiaStreamRequestPayload = function buildMaiaStreamRequestPayload(params) {
|
|
407
|
+
var _params$ctxProject, _params$ctxTask;
|
|
408
|
+
return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
409
|
+
message: params.message,
|
|
410
|
+
history: params.history,
|
|
411
|
+
projectId: params.projectId,
|
|
412
|
+
lang: params.authUser.lang,
|
|
413
|
+
userId: params.authUser.id.toString(),
|
|
414
|
+
firstName: params.authUser.firstName,
|
|
415
|
+
lastName: params.authUser.lastName,
|
|
416
|
+
companyId: params.authUser.company_id.toString(),
|
|
417
|
+
chatId: params.chatId,
|
|
418
|
+
messageId: params.messageId,
|
|
419
|
+
agentName: params.agentName,
|
|
420
|
+
agentId: params.agentId,
|
|
421
|
+
isWebSearchActive: params.isWebSearchActive,
|
|
422
|
+
isDeepSearchActive: params.isDeepSearchActive,
|
|
423
|
+
isAutoApproveActive: params.isAutoApproveActive
|
|
424
|
+
}, ((_params$ctxProject = params.ctxProject) === null || _params$ctxProject === void 0 ? void 0 : _params$ctxProject.feeId) != null ? {
|
|
425
|
+
feeId: Number(params.ctxProject.feeId)
|
|
426
|
+
} : {}), resolveClientPayload(params.ctxClient, params.ctxProject)), params.projectName ? {
|
|
427
|
+
projectName: params.projectName
|
|
428
|
+
} : {}), ((_params$ctxTask = params.ctxTask) === null || _params$ctxTask === void 0 ? void 0 : _params$ctxTask.id) != null ? _objectSpread({
|
|
429
|
+
taskId: Number(params.ctxTask.id)
|
|
430
|
+
}, params.ctxTask.name ? {
|
|
431
|
+
taskName: params.ctxTask.name
|
|
432
|
+
} : {}) : {}), params.attachments && params.attachments.length > 0 ? {
|
|
433
|
+
attachments: params.attachments
|
|
434
|
+
} : {}), params.faqId ? {
|
|
435
|
+
faqId: params.faqId
|
|
436
|
+
} : {}), params.agentSuggestionId ? {
|
|
437
|
+
agentSuggestionId: params.agentSuggestionId
|
|
438
|
+
} : {}), params.fuaId ? {
|
|
439
|
+
fuaId: params.fuaId
|
|
440
|
+
} : {}), params.scId ? {
|
|
441
|
+
scId: params.scId
|
|
442
|
+
} : {}), params.agentEntity != null ? {
|
|
443
|
+
agentEntity: params.agentEntity
|
|
444
|
+
} : {}), params.agentType != null ? {
|
|
445
|
+
agentType: params.agentType
|
|
446
|
+
} : {}), params.agentEmoji != null ? {
|
|
447
|
+
agentEmoji: params.agentEmoji
|
|
448
|
+
} : {}), params.contextMessage ? {
|
|
449
|
+
contextMessage: params.contextMessage
|
|
450
|
+
} : {}), params.contextData ? {
|
|
451
|
+
contextData: params.contextData
|
|
452
|
+
} : {});
|
|
453
|
+
};
|
|
454
|
+
export var buildMaiaStreamRequestPayloadForProjectChange = function buildMaiaStreamRequestPayloadForProjectChange(params) {
|
|
455
|
+
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
456
|
+
message: params.message,
|
|
457
|
+
history: params.history,
|
|
458
|
+
projectId: params.project.id,
|
|
459
|
+
lang: params.authUser.lang,
|
|
460
|
+
userId: params.authUser.id.toString(),
|
|
461
|
+
firstName: params.authUser.firstName,
|
|
462
|
+
lastName: params.authUser.lastName,
|
|
463
|
+
companyId: params.authUser.company_id.toString(),
|
|
464
|
+
chatId: params.chatId,
|
|
465
|
+
messageId: params.messageId,
|
|
466
|
+
agentName: params.agentName,
|
|
467
|
+
agentId: params.agentId,
|
|
468
|
+
isWebSearchActive: params.isWebSearchActive,
|
|
469
|
+
isDeepSearchActive: params.isDeepSearchActive,
|
|
470
|
+
isAutoApproveActive: params.isAutoApproveActive
|
|
471
|
+
}, params.project.feeId != null ? {
|
|
472
|
+
feeId: Number(params.project.feeId)
|
|
473
|
+
} : {}), params.project.clientId != null ? {
|
|
474
|
+
clientId: Number(params.project.clientId)
|
|
475
|
+
} : {}), params.agentEntity != null ? {
|
|
476
|
+
agentEntity: params.agentEntity
|
|
477
|
+
} : {}), params.agentType != null ? {
|
|
478
|
+
agentType: params.agentType
|
|
479
|
+
} : {});
|
|
480
|
+
};
|
|
481
|
+
export var resolveStreamErrorHandlingMode = function resolveStreamErrorHandlingMode(hasRetrySnapshot) {
|
|
482
|
+
return hasRetrySnapshot ? 'retry-restore' : 'commit-error';
|
|
483
|
+
};
|
|
484
|
+
export var resolveStreamErrorAssistantMessageId = function resolveStreamErrorAssistantMessageId(messageId) {
|
|
485
|
+
return "answer-".concat(messageId);
|
|
486
|
+
};
|
|
487
|
+
export var buildStreamErrorAssistantMessage = function buildStreamErrorAssistantMessage(params) {
|
|
488
|
+
return _objectSpread(_objectSpread({
|
|
489
|
+
id: resolveStreamErrorAssistantMessageId(params.messageId),
|
|
490
|
+
message: params.message,
|
|
491
|
+
isError: true
|
|
492
|
+
}, params.showRetry ? {
|
|
493
|
+
suggestions: [params.retryLabel]
|
|
494
|
+
} : {}), {}, {
|
|
495
|
+
date: new Date(),
|
|
496
|
+
user: {
|
|
497
|
+
id: 'assistant',
|
|
498
|
+
name: 'Assistant'
|
|
499
|
+
},
|
|
500
|
+
role: ChatHistoryRole.ASSISTANT
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
/** HITL pre-aprobado (manual/auto): el stream sigue sin pintar la caja de aprobación. */
|
|
504
|
+
export var shouldSkipHitlApprovalUi = function shouldSkipHitlApprovalUi(approval) {
|
|
505
|
+
return Boolean(approval.manual_approval_detected || approval.auto_approved || approval.approval_status === 'approved');
|
|
506
|
+
};
|
|
507
|
+
export var resolveHitlApprovalRequiredOutcome = function resolveHitlApprovalRequiredOutcome(approval) {
|
|
508
|
+
return shouldSkipHitlApprovalUi(approval) ? {
|
|
509
|
+
type: 'skip-ui'
|
|
510
|
+
} : {
|
|
511
|
+
type: 'show-ui',
|
|
512
|
+
approvalMessageId: "approval-".concat(approval.original_thread_id)
|
|
513
|
+
};
|
|
514
|
+
};
|
|
515
|
+
export var buildHitlApprovalPendingMessage = function buildHitlApprovalPendingMessage(params) {
|
|
516
|
+
return {
|
|
517
|
+
id: params.approvalMessageId,
|
|
518
|
+
message: params.accumulatedContent || '',
|
|
519
|
+
date: new Date(),
|
|
520
|
+
user: {
|
|
521
|
+
id: 'assistant',
|
|
522
|
+
name: 'Assistant'
|
|
523
|
+
},
|
|
524
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
525
|
+
approval: params.approval,
|
|
526
|
+
approvalStatus: 'pending',
|
|
527
|
+
reasoning: params.reasoning
|
|
528
|
+
};
|
|
529
|
+
};
|
|
530
|
+
export var shouldPreserveReasoningOnStreamStop = function shouldPreserveReasoningOnStreamStop(stoppedTrace) {
|
|
531
|
+
return Boolean(stoppedTrace === null || stoppedTrace === void 0 ? void 0 : stoppedTrace.steps.length);
|
|
532
|
+
};
|
|
533
|
+
export var buildStreamStopPartialAssistantMessage = function buildStreamStopPartialAssistantMessage(params) {
|
|
534
|
+
return _objectSpread({
|
|
535
|
+
id: params.finalMessageId,
|
|
536
|
+
message: params.partialText,
|
|
537
|
+
date: new Date(),
|
|
538
|
+
user: {
|
|
539
|
+
id: 'assistant',
|
|
540
|
+
name: 'Assistant'
|
|
541
|
+
},
|
|
542
|
+
role: ChatHistoryRole.ASSISTANT
|
|
543
|
+
}, params.stoppedTrace ? {
|
|
544
|
+
reasoning: params.stoppedTrace
|
|
545
|
+
} : {});
|
|
546
|
+
};
|
|
547
|
+
export var buildStreamStopCancelledAssistantMessage = function buildStreamStopCancelledAssistantMessage(params) {
|
|
548
|
+
return {
|
|
549
|
+
id: params.cancelledMessageId,
|
|
550
|
+
message: params.cancelledLabel,
|
|
551
|
+
date: new Date(),
|
|
552
|
+
user: {
|
|
553
|
+
id: 'assistant',
|
|
554
|
+
name: 'Assistant'
|
|
555
|
+
},
|
|
556
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
557
|
+
isFrontendCancelled: true
|
|
558
|
+
};
|
|
559
|
+
};
|
|
560
|
+
export var resolveRetryBlockReason = function resolveRetryBlockReason(params) {
|
|
561
|
+
if (params.isProcessing || params.waitingResponse || params.loadingMessages) return 'busy';
|
|
562
|
+
if (params.isSessionStreamActive) return 'session-active';
|
|
563
|
+
if (params.activeStreamCount >= params.maxConcurrent) return 'concurrency';
|
|
564
|
+
return null;
|
|
565
|
+
};
|
|
566
|
+
export var shouldUseOrchestratorRetryFallback = function shouldUseOrchestratorRetryFallback(message) {
|
|
567
|
+
var _message$memorySessio;
|
|
568
|
+
return Boolean(message.isFrontendCancelled && !((_message$memorySessio = message.memorySessionId) !== null && _message$memorySessio !== void 0 && _message$memorySessio.trim()));
|
|
569
|
+
};
|
|
570
|
+
export var resolveRetryEligibility = function resolveRetryEligibility(previousMessages, message, userMessage) {
|
|
571
|
+
var _userMessage$message, _userMessage$attachme, _userMessage$sources;
|
|
572
|
+
if (!previousMessages.some(function (item) {
|
|
573
|
+
return item.id === message.id;
|
|
574
|
+
})) {
|
|
575
|
+
return {
|
|
576
|
+
eligible: false,
|
|
577
|
+
reason: 'not-in-thread'
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
if (!(userMessage !== null && userMessage !== void 0 && (_userMessage$message = userMessage.message) !== null && _userMessage$message !== void 0 && _userMessage$message.trim()) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$attachme = userMessage.attachments) !== null && _userMessage$attachme !== void 0 && _userMessage$attachme.length) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$sources = userMessage.sources) !== null && _userMessage$sources !== void 0 && _userMessage$sources.length)) {
|
|
581
|
+
return {
|
|
582
|
+
eligible: false,
|
|
583
|
+
reason: 'empty-user'
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
var turnId = resolveRetryTurnId(message);
|
|
587
|
+
var useOrchestratorFallback = shouldUseOrchestratorRetryFallback(message);
|
|
588
|
+
if (!turnId && !useOrchestratorFallback) {
|
|
589
|
+
return {
|
|
590
|
+
eligible: false,
|
|
591
|
+
reason: 'no-turn'
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
return {
|
|
595
|
+
eligible: true,
|
|
596
|
+
turnId: turnId,
|
|
597
|
+
useOrchestratorFallback: useOrchestratorFallback
|
|
598
|
+
};
|
|
599
|
+
};
|
|
600
|
+
export var resolveRetryUserAttachments = function resolveRetryUserAttachments(userMessage) {
|
|
601
|
+
if (Array.isArray(userMessage.attachments)) return userMessage.attachments;
|
|
602
|
+
if (Array.isArray(userMessage.sources)) return userMessage.sources;
|
|
603
|
+
return [];
|
|
604
|
+
};
|
|
605
|
+
export var shouldUpdateProjectOnChange = function shouldUpdateProjectOnChange(nextProjectId, currentProjectId) {
|
|
606
|
+
return nextProjectId !== currentProjectId;
|
|
607
|
+
};
|
|
608
|
+
export var shouldResendAfterProjectChange = function shouldResendAfterProjectChange(userQuestion, project) {
|
|
609
|
+
return Boolean(userQuestion && project);
|
|
610
|
+
};
|
|
319
611
|
export var resolveApprovalDecisionStatus = function resolveApprovalDecisionStatus(decision) {
|
|
320
612
|
return decision === 'approve' ? 'approved' : 'rejected';
|
|
321
613
|
};
|
|
@@ -331,6 +623,23 @@ export var resolveApprovalStreamBlockReason = function resolveApprovalStreamBloc
|
|
|
331
623
|
if (params.activeStreamCount >= params.maxConcurrent) return 'limit';
|
|
332
624
|
return null;
|
|
333
625
|
};
|
|
626
|
+
|
|
627
|
+
/** Tools de carga de horas a sincronizar con Planner al cerrar un stream (HITL aprobado). */
|
|
628
|
+
export var resolveHoursChargeToolsOnStreamFinish = function resolveHoursChargeToolsOnStreamFinish(hasApprovalInPreviousMessage, approvalStatus, pendingActions, manualApprovalToolName) {
|
|
629
|
+
var hoursToolsFromApproval = pendingActions.map(function (action) {
|
|
630
|
+
return action.tool_name;
|
|
631
|
+
}).filter(function (toolName) {
|
|
632
|
+
return isHoursChargeTool(toolName);
|
|
633
|
+
});
|
|
634
|
+
var wasHoursChargeApproved = hasApprovalInPreviousMessage && approvalStatus === 'approved' && hoursToolsFromApproval.length > 0;
|
|
635
|
+
if (wasHoursChargeApproved) {
|
|
636
|
+
return hoursToolsFromApproval;
|
|
637
|
+
}
|
|
638
|
+
if (isHoursChargeTool(manualApprovalToolName)) {
|
|
639
|
+
return manualApprovalToolName ? [manualApprovalToolName] : [];
|
|
640
|
+
}
|
|
641
|
+
return [];
|
|
642
|
+
};
|
|
334
643
|
export var findMessageWithApprovalByThreadIds = function findMessageWithApprovalByThreadIds(threadIds, activeMessages, sessionMessagesById, activeSessionId) {
|
|
335
644
|
var fromActiveView = findMessageWithApprovalInList(threadIds, activeMessages, activeSessionId || '');
|
|
336
645
|
if (fromActiveView) return fromActiveView;
|
|
@@ -350,4 +659,244 @@ export var findMessageWithApprovalByThreadIds = function findMessageWithApproval
|
|
|
350
659
|
sessionMessages = _sessionEntry[1];
|
|
351
660
|
return findMessageWithApprovalInList(threadIds, sessionMessages, sessionId);
|
|
352
661
|
};
|
|
353
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFzb25pbmdTdG9yZSIsImJ1aWxkUmVhc29uaW5nVHJhY2UiLCJyZWFzb25pbmdUcmFjZUZvciIsIm1lc3NhZ2VJZCIsInNuYXBzaG90IiwiZ2V0U25hcHNob3QiLCJzdGVwcyIsImxlbmd0aCIsInN1bW1hcnkiLCJub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MiLCJhdHRhY2htZW50c09yT3B0aW9ucyIsIl9vcHRpb25zJGF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiYXR0YWNobWVudHMiLCJvcHRpb25zIiwicmVzb2x2ZVByb2plY3RUb1JlcXVlc3QiLCJjaGlwc1Byb2plY3QiLCJsYXN0TWVzc2FnZVByb2plY3RJZCIsImNoaXBzUHJvamVjdElkIiwicHJvamVjdElkIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwYXJzZWQiLCJyZXNvbHZlQ2xpZW50UGF5bG9hZCIsImN0eENsaWVudCIsImN0eFByb2plY3QiLCJfY3R4UHJvamVjdCRjbGllbnQiLCJpZCIsIl9vYmplY3RTcHJlYWQiLCJjbGllbnRJZCIsIm5hbWUiLCJjbGllbnROYW1lIiwiY2xpZW50Iiwibm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMiLCJyYXdBdHRhY2htZW50cyIsImZpbHRlciIsImF0dGFjaG1lbnQiLCJfdHlwZW9mIiwibWFwIiwiaW5kZXgiLCJ0cmltIiwiY29uY2F0IiwidHlwZSIsIm1pbWVUeXBlIiwibWltZV90eXBlIiwiZnVsbEZpbGVOYW1lIiwiaW5jbHVkZXMiLCJudW1lcmljU2l6ZSIsInNpemUiLCJwYXJzZWRTaXplIiwiZmlsZSIsIkZpbGUiLCJ1cmxfb3JpZ2luYWwiLCJ1bmRlZmluZWQiLCJ1cmxfdGh1bWJuYWlsIiwidXJsX2ZpbGUiLCJyb2xlIiwiZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzIiwicGVuZGluZ0FjdGlvbnMiLCJpZHMiLCJwdXNoSWQiLCJyYXciLCJuIiwicGFyc2VJbnQiLCJTdHJpbmciLCJpc05hTiIsInB1c2giLCJmb3JFYWNoIiwiYWN0aW9uIiwiX3JlYyR0YXNrX2lkIiwiYXJncyIsInRvb2xfYXJncyIsInJlYyIsInRhc2tfaWQiLCJ0YXNrX2lkcyIsInRhc2tzIiwidCIsIl90cmVjJHRhc2tfaWQiLCJ0cmVjIiwiZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMiLCJ0b29sX25hbWUiLCJfcmVjJHRhc2tfaWQyIiwibGlzdCIsInRpZCIsImV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zIiwiX3JlYyRhZ2VudF9pZCIsImVkaXRBY3Rpb24iLCJmaW5kIiwiYSIsInRvTG93ZXJDYXNlIiwiYWdlbnRfaWQiLCJhZ2VudElkIiwiZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lIiwidG9vbE5hbWUiLCJfcmVmIiwiX3JlYyRhZ2VudF9pZDIiLCJleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQiLCJ0ZXh0IiwibGFiZWxlZCIsIm1hdGNoIiwiYm9sZCIsIlRBU0tfQ1JFQVRJT05fVE9PTFMiLCJUQVNLX0VESVRfVE9PTFMiLCJUQVNLX0RFTEVURV9UT09MUyIsImlzVGFza0VkaXRUb29sTmFtZSIsImlzVGFza0RlbGV0ZVRvb2xOYW1lIiwicGVuZGluZ0FjdGlvbnNJbmNsdWRlVG9vbCIsInRvb2xzIiwic29tZSIsInJlc29sdmVBcHByb3ZlZFBlbmRpbmdBY3Rpb25GbGFncyIsImhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UiLCJhcHByb3ZhbFN0YXR1cyIsImFwcHJvdmVkIiwid2FzVGFza0NyZWF0aW9uIiwid2FzVGFza0VkaXQiLCJ3YXNUYXNrRGVsZXRlIiwid2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCIsIndhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQiLCJ3YXNFZGl0QWdlbnRBcHByb3ZlZCIsInNob3VsZFN5bmNUYXNrRGFzaGJvYXJkIiwidGFza0lkc0ZvckRhc2hib2FyZCIsInJlc29sdmVUYXNrSWRzRm9yRGFzaGJvYXJkIiwiY29udGVudCIsInRhc2tVcmxSZWdleCIsInRhc2tJZHNGcm9tVXJscyIsIl90b0NvbnN1bWFibGVBcnJheSIsIm1hdGNoQWxsIiwidGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCIsInRhc2tJZHNGcm9tRGVsZXRpb25UZXh0IiwicmVwbGFjZVRhc2tVcmxzV2l0aFRhYlNlZ21lbnQiLCJ0YWJTZWdtZW50IiwicmVwbGFjZSIsInVybCIsInJlc29sdmVQcm9qZWN0RGFzaGJvYXJkU3luYyIsImNvbnRleHRQcm9qZWN0SWQiLCJwYXRobmFtZSIsInBhdGhNYXRjaCIsInJvdXRlUHJvamVjdElkIiwiaXNPblByb2plY3RSb3V0ZSIsIkJvb2xlYW4iLCJyZXNvbHZlQ3JlYXRlQWdlbnRGb2xsb3dVcCIsImZsYWdzIiwibXVsdGlBZ2VudHNBY2Nlc3MiLCJjb21wbGV0ZWRBZ2VudElkIiwiY29uZmlndXJlZEFnZW50SWQiLCJyZXNvbHZlRWRpdEFnZW50Rm9sbG93VXAiLCJyZXNvbHZlZEFnZW50SWQiLCJzaG91bGRSZWZldGNoT3BlblRhc2tQYW5lbCIsIm9wZW5UYXNrUGFuZWxJZCIsIm1hbnVhbEZsYWdzIiwiYWZmZWN0ZWRUYXNrSWRzIiwidGFza0Zsb3dBY3RpdmUiLCJtYW51YWxXYXNUYXNrRWRpdCIsIm1hbnVhbFdhc1Rhc2tEZWxldGUiLCJyZXNvbHZlU3RyZWFtRXJyb3JQcmVzZW50YXRpb24iLCJlcnJvck1lc3NhZ2UiLCJlcnJvclJhd01lc3NhZ2UiLCJfZXJyb3JSYXdNZXNzYWdlJG1hdGMiLCJfZXJyb3JSYXdNZXNzYWdlJG1hdGMyIiwiaXNBY2Nlc3NEZW5pZWQiLCJpc1Byb21wdFRvb0xvbmciLCJ0b2tlbnNVc2VkIiwic2hvd1JldHJ5IiwibWFwQXV0aFVzZXJUb0NoYXRNZXNzYWdlVXNlciIsImF1dGhVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxJbkxpc3QiLCJ0aHJlYWRJZHMiLCJtZXNzYWdlcyIsInNlc3Npb25JZCIsImZvdW5kIiwibWVzc2FnZSIsIl9tZXNzYWdlJGFwcHJvdmFsIiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJ0aHJlYWRfaWQiLCJzZXNzaW9uX2lkIiwiY2FuU2VuZENoYXRNZXNzYWdlIiwiaXNQcm9jZXNzaW5nIiwid2FpdGluZ1Jlc3BvbnNlIiwibG9hZGluZ01lc3NhZ2VzIiwic2hvdWxkQmxvY2tDb25jdXJyZW50U3RyZWFtU3RhcnQiLCJ3aWxsU3RhcnROZXdTdHJlYW0iLCJhY3RpdmVDb3VudCIsIm1heENvbmN1cnJlbnQiLCJyZXNvbHZlQXBwcm92YWxEZWNpc2lvblN0YXR1cyIsImRlY2lzaW9uIiwicmVzb2x2ZUNvbnRpbnVlU3RyZWFtRGVjaXNpb24iLCJlZGl0ZWRBY3Rpb25zIiwicmVzb2x2ZUFwcHJvdmFsU3RyZWFtQmxvY2tSZWFzb24iLCJwYXJhbXMiLCJfcGFyYW1zJHRocmVhZElkcyIsImhhc0FwcHJvdmFsTWVzc2FnZSIsImlzU2Vzc2lvblN0cmVhbUFjdGl2ZSIsImFjdGl2ZVN0cmVhbUNvdW50IiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyIsImFjdGl2ZU1lc3NhZ2VzIiwic2Vzc2lvbk1lc3NhZ2VzQnlJZCIsImFjdGl2ZVNlc3Npb25JZCIsImZyb21BY3RpdmVWaWV3Iiwic2Vzc2lvbkVudHJ5IiwiT2JqZWN0IiwiZW50cmllcyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheSIsInNlc3Npb25NZXNzYWdlcyIsIl9tZXNzYWdlJGFwcHJvdmFsMiIsIl9zZXNzaW9uRW50cnkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlQ2hhdE1hbmFnZXIvdXNlQ2hhdE1hbmFnZXIuaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0TWVzc2FnZVVzZXIsIFBlbmRpbmdBY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgQ09SVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgeyBidWlsZFJlYXNvbmluZ1RyYWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVhc29uaW5nTWFwcGVycydcbmltcG9ydCB0eXBlIHsgUmVhc29uaW5nVHJhY2UgfSBmcm9tICcuLi8uLi90eXBlcy9yZWFzb25pbmcnXG5pbXBvcnQgdHlwZSB7IFNlbmRNZXNzYWdlT3B0aW9ucyB9IGZyb20gJy4vdXNlQ2hhdE1hbmFnZXIuaW50ZXJmYWNlJ1xuXG50eXBlIEF0dGFjaG1lbnRzT3JPcHRpb25zID0gQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9uc1xuXG4vKiogVHJhY2UgYWN1bXVsYWRvIGVuIHZpdm8gcGFyYSBgbWVzc2FnZUlkYCwgbyBudWxsIHNpIGVsIHN0b3JlIGFwdW50YSBhIG90cm8gbWVuc2FqZS4gKi9cbmV4cG9ydCBjb25zdCByZWFzb25pbmdUcmFjZUZvciA9IChtZXNzYWdlSWQ6IHN0cmluZyk6IFJlYXNvbmluZ1RyYWNlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNuYXBzaG90ID0gcmVhc29uaW5nU3RvcmUuZ2V0U25hcHNob3QobWVzc2FnZUlkKVxuICBpZiAoIXNuYXBzaG90LnN0ZXBzLmxlbmd0aCkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIGJ1aWxkUmVhc29uaW5nVHJhY2Uoc25hcHNob3Quc3RlcHMsIHNuYXBzaG90LnN1bW1hcnkpXG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MgPSAoYXR0YWNobWVudHNPck9wdGlvbnM/OiBBdHRhY2htZW50c09yT3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhdHRhY2htZW50c09yT3B0aW9ucykpIHtcbiAgICByZXR1cm4geyBhdHRhY2htZW50czogYXR0YWNobWVudHNPck9wdGlvbnMsIG9wdGlvbnM6IHt9IGFzIFNlbmRNZXNzYWdlT3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBTZW5kTWVzc2FnZU9wdGlvbnMgPSBhdHRhY2htZW50c09yT3B0aW9ucyA/PyB7fVxuICByZXR1cm4geyBhdHRhY2htZW50czogb3B0aW9ucy5hdHRhY2htZW50cyA/PyBbXSwgb3B0aW9ucyB9XG59XG5cbi8qKiBjaGlwc1Byb2plY3QgZXMgbGEgZnVlbnRlIGRlIHZlcmRhZCBkZWwgcGluIHZpc2libGU7IHNpIG5vIGhheSBwaW4sIHJlc3RhdXJhciBkZXNkZSBoaXN0b3JpYWwuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QgPSAoXG4gIGNoaXBzUHJvamVjdDogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxhc3RNZXNzYWdlUHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgY2hpcHNQcm9qZWN0SWQgPSBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/IE51bWJlcihjaGlwc1Byb2plY3QucHJvamVjdElkKSA6IG51bGxcbiAgaWYgKGNoaXBzUHJvamVjdElkICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGNoaXBzUHJvamVjdElkKSkge1xuICAgIHJldHVybiBjaGlwc1Byb2plY3RJZFxuICB9XG4gIGlmIChsYXN0TWVzc2FnZVByb2plY3RJZCAhPSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGxhc3RNZXNzYWdlUHJvamVjdElkKVxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGxcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNsaWVudFBheWxvYWQgPSAoXG4gIGN0eENsaWVudDogeyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY3R4UHJvamVjdDogUHJvamVjdCB8IG51bGwgfCB1bmRlZmluZWRcbik6IHsgY2xpZW50SWQ/OiBudW1iZXI7IGNsaWVudE5hbWU/OiBzdHJpbmcgfSA9PiB7XG4gIGlmIChjdHhDbGllbnQ/LmlkKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IGN0eENsaWVudC5pZCwgLi4uKGN0eENsaWVudC5uYW1lID8geyBjbGllbnROYW1lOiBjdHhDbGllbnQubmFtZSB9IDoge30pIH1cbiAgfVxuICBpZiAoY3R4UHJvamVjdD8uY2xpZW50SWQgIT0gbnVsbCkge1xuICAgIHJldHVybiB7IGNsaWVudElkOiBOdW1iZXIoY3R4UHJvamVjdC5jbGllbnRJZCkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnQ/LmlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudElkOiBjdHhQcm9qZWN0LmNsaWVudC5pZCxcbiAgICAgIC4uLihjdHhQcm9qZWN0LmNsaWVudC5uYW1lID8geyBjbGllbnROYW1lOiBjdHhQcm9qZWN0LmNsaWVudC5uYW1lIH0gOiB7fSksXG4gICAgfVxuICB9XG4gIHJldHVybiB7fVxufVxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMgPSAocmF3QXR0YWNobWVudHM6IHVua25vd24pOiBBdHRhY2htZW50RmlsZVtdID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd0F0dGFjaG1lbnRzKSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIHJhd0F0dGFjaG1lbnRzXG4gICAgLmZpbHRlcigoYXR0YWNobWVudCk6IGF0dGFjaG1lbnQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gISFhdHRhY2htZW50ICYmIHR5cGVvZiBhdHRhY2htZW50ID09PSAnb2JqZWN0JylcbiAgICAubWFwKChhdHRhY2htZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIHR5cGVvZiBhdHRhY2htZW50Lm5hbWUgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQubmFtZS50cmltKCkgPyBhdHRhY2htZW50Lm5hbWUudHJpbSgpIDogYGZpbGUtJHtpbmRleCArIDF9YFxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBhdHRhY2htZW50LnR5cGUgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQudHlwZS50cmltKCkgPyBhdHRhY2htZW50LnR5cGUudHJpbSgpIDogJ3BkZidcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gdHlwZW9mIGF0dGFjaG1lbnQubWltZV90eXBlID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQubWltZV90eXBlIDogJydcbiAgICAgIGNvbnN0IGZ1bGxGaWxlTmFtZSA9IG5hbWUuaW5jbHVkZXMoJy4nKSA/IG5hbWUgOiBgJHtuYW1lfS4ke3R5cGV9YFxuICAgICAgbGV0IG51bWVyaWNTaXplID0gMFxuICAgICAgaWYgKHR5cGVvZiBhdHRhY2htZW50LnNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG51bWVyaWNTaXplID0gYXR0YWNobWVudC5zaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJzZWRTaXplID0gTnVtYmVyKGF0dGFjaG1lbnQuc2l6ZSlcbiAgICAgICAgbnVtZXJpY1NpemUgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VkU2l6ZSkgPyBwYXJzZWRTaXplIDogMFxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlOiBuZXcgRmlsZShbXSwgZnVsbEZpbGVOYW1lLCB7IHR5cGU6IG1pbWVUeXBlIH0pLFxuICAgICAgICBpZDpcbiAgICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5pZCA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC5pZC50cmltKClcbiAgICAgICAgICAgID8gYXR0YWNobWVudC5pZFxuICAgICAgICAgICAgOiBgYXNzaXN0YW50LWZpbGUtJHtpbmRleH0tJHtmdWxsRmlsZU5hbWV9YCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2l6ZTogbnVtZXJpY1NpemUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHVybF9vcmlnaW5hbDogdHlwZW9mIGF0dGFjaG1lbnQudXJsX29yaWdpbmFsID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfdGh1bWJuYWlsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfdGh1bWJuYWlsID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsX2ZpbGU6IHR5cGVvZiBhdHRhY2htZW50LnVybF9maWxlID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQudXJsX2ZpbGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHJvbGU6IGF0dGFjaG1lbnQucm9sZSA9PT0gJ2Fzc2lzdGFudCcgPyAnYXNzaXN0YW50JyA6ICd1c2VyJyxcbiAgICAgIH1cbiAgICB9KVxufVxuXG4vKiogRXh0cmFlIHRhc2tfaWRzIGRlIGxvcyB0b29sX2FyZ3MgZGUgcGVuZGluZ19hY3Rpb25zLiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyA9IChwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogbnVtYmVyW10gPT4ge1xuICBjb25zdCBpZHM6IG51bWJlcltdID0gW11cbiAgY29uc3QgcHVzaElkID0gKHJhdzogdW5rbm93bikgPT4ge1xuICAgIGlmIChyYXcgPT0gbnVsbCkgcmV0dXJuXG4gICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgfVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcHVzaElkKHJlYy50YXNrX2lkID8/IHJlYy5pZClcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWMudGFza19pZHMpKSB7XG4gICAgICByZWMudGFza19pZHMuZm9yRWFjaChwdXNoSWQpXG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlYy50YXNrcykpIHtcbiAgICAgIHJlYy50YXNrcy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodCAmJiB0eXBlb2YgdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgICBjb25zdCB0cmVjID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgIHB1c2hJZCh0cmVjLnRhc2tfaWQgPz8gdHJlYy5pZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zID0gKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgaWYgKGFjdGlvbi50b29sX25hbWUgPT09ICdkZWxldGVfdGFzaycpIHtcbiAgICAgIGNvbnN0IHJhdyA9IHJlYy50YXNrX2lkID8/IHJlYy5pZFxuICAgICAgaWYgKHJhdyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrc19iYXRjaCcpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSByZWMudGFza19pZHNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgIGxpc3QuZm9yRWFjaCh0aWQgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcodGlkKSwgMTApXG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyA9IChwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGVkaXRBY3Rpb24gPSBwZW5kaW5nQWN0aW9ucy5maW5kKGEgPT4gKGEudG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnZWRpdF9hZ2VudCcpXG4gIGlmIChcbiAgICAhZWRpdEFjdGlvbiB8fFxuICAgICFlZGl0QWN0aW9uLnRvb2xfYXJncyB8fFxuICAgIHR5cGVvZiBlZGl0QWN0aW9uLnRvb2xfYXJncyAhPT0gJ29iamVjdCcgfHxcbiAgICBBcnJheS5pc0FycmF5KGVkaXRBY3Rpb24udG9vbF9hcmdzKVxuICApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHJlYyA9IGVkaXRBY3Rpb24udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IHJhdyA9IHJlYy5hZ2VudF9pZCA/PyByZWMuYWdlbnRJZFxuICByZXR1cm4gcmF3ICE9IG51bGwgPyBTdHJpbmcocmF3KSA6IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZSA9IChcbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSxcbiAgdG9vbE5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHRvb2xOYW1lLnRvTG93ZXJDYXNlKCkpXG4gIGlmICghYWN0aW9uIHx8ICFhY3Rpb24udG9vbF9hcmdzIHx8IHR5cGVvZiBhY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGFjdGlvbi50b29sX2FyZ3MpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZWMgPSBhY3Rpb24udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IHJhdyA9IHJlYy5hZ2VudF9pZCA/PyByZWMuYWdlbnRJZCA/PyByZWMuaWRcbiAgcmV0dXJuIHJhdyAhPSBudWxsID8gU3RyaW5nKHJhdykgOiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQgPSAodGV4dDogc3RyaW5nKTogbnVtYmVyW10gPT4ge1xuICBjb25zdCBsYWJlbGVkID0gdGV4dC5tYXRjaCgvXFxiSURcXHMqXFwqXFwqKFxcZCspXFwqXFwqL2kpXG4gIGlmIChsYWJlbGVkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGxhYmVsZWRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIGNvbnN0IGJvbGQgPSB0ZXh0Lm1hdGNoKC9cXCpcXCooXFxkezUsfSlcXCpcXCovKVxuICBpZiAoYm9sZCkge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChib2xkWzFdLCAxMClcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG4pID8gW10gOiBbbl1cbiAgfVxuICByZXR1cm4gW11cbn1cblxuZXhwb3J0IGNvbnN0IFRBU0tfQ1JFQVRJT05fVE9PTFMgPSBbJ2NyZWF0ZV90YXNrJywgJ2NyZWF0ZV90YXNrc19iYXRjaCcsICdjbG9uZV90YXNrJ10gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBUQVNLX0VESVRfVE9PTFMgPSBbXG4gICdlZGl0X3Rhc2snLFxuICAnZWRpdF90YXNrc19iYXRjaCcsXG4gICd0YXNrX2Fzc2lnbicsXG4gICd0YXNrX3VuYXNzaWduJyxcbiAgJ3VwZGF0ZV90YXNrX3R5cGUnLFxuICAndXBkYXRlX2VzdGltYXRlZF9ob3VycycsXG4gICdhc3NpZ25fdGFza19sYWJlbCcsXG5dIGFzIGNvbnN0XG5leHBvcnQgY29uc3QgVEFTS19ERUxFVEVfVE9PTFMgPSBbJ2RlbGV0ZV90YXNrJywgJ2RlbGV0ZV90YXNrc19iYXRjaCddIGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBpc1Rhc2tFZGl0VG9vbE5hbWUgPSAodG9vbE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBib29sZWFuID0+XG4gICEhdG9vbE5hbWUgJiYgKFRBU0tfRURJVF9UT09MUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModG9vbE5hbWUpXG5cbmV4cG9ydCBjb25zdCBpc1Rhc2tEZWxldGVUb29sTmFtZSA9ICh0b29sTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4gPT5cbiAgISF0b29sTmFtZSAmJiAoVEFTS19ERUxFVEVfVE9PTFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRvb2xOYW1lKVxuXG5jb25zdCBwZW5kaW5nQWN0aW9uc0luY2x1ZGVUb29sID0gKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10sIHRvb2xzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4gPT5cbiAgcGVuZGluZ0FjdGlvbnMuc29tZShhY3Rpb24gPT4gdG9vbHMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykpXG5cbmV4cG9ydCB0eXBlIEFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzID0ge1xuICB3YXNUYXNrQ3JlYXRpb246IGJvb2xlYW5cbiAgd2FzVGFza0VkaXQ6IGJvb2xlYW5cbiAgd2FzVGFza0RlbGV0ZTogYm9vbGVhblxuICB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkOiBib29sZWFuXG4gIHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQ6IGJvb2xlYW5cbiAgd2FzRWRpdEFnZW50QXBwcm92ZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBcHByb3ZlZFBlbmRpbmdBY3Rpb25GbGFncyA9IChcbiAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZTogYm9vbGVhbixcbiAgYXBwcm92YWxTdGF0dXM6IENoYXRNZXNzYWdlWydhcHByb3ZhbFN0YXR1cyddLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdXG4pOiBBcHByb3ZlZFBlbmRpbmdBY3Rpb25GbGFncyA9PiB7XG4gIGNvbnN0IGFwcHJvdmVkID0gaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJiBhcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJ1xuXG4gIHJldHVybiB7XG4gICAgd2FzVGFza0NyZWF0aW9uOiBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zSW5jbHVkZVRvb2wocGVuZGluZ0FjdGlvbnMsIFRBU0tfQ1JFQVRJT05fVE9PTFMpLFxuICAgIHdhc1Rhc2tFZGl0OiBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zSW5jbHVkZVRvb2wocGVuZGluZ0FjdGlvbnMsIFRBU0tfRURJVF9UT09MUyksXG4gICAgd2FzVGFza0RlbGV0ZTogaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJiBwZW5kaW5nQWN0aW9uc0luY2x1ZGVUb29sKHBlbmRpbmdBY3Rpb25zLCBUQVNLX0RFTEVURV9UT09MUyksXG4gICAgd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZDogYXBwcm92ZWQgJiYgcGVuZGluZ0FjdGlvbnNJbmNsdWRlVG9vbChwZW5kaW5nQWN0aW9ucywgWydjcmVhdGVfYWdlbnQnXSksXG4gICAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZDpcbiAgICAgIGFwcHJvdmVkICYmIHBlbmRpbmdBY3Rpb25zLnNvbWUoYWN0aW9uID0+IChhY3Rpb24udG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpLFxuICAgIHdhc0VkaXRBZ2VudEFwcHJvdmVkOlxuICAgICAgYXBwcm92ZWQgJiYgcGVuZGluZ0FjdGlvbnMuc29tZShhY3Rpb24gPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JyksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFN5bmNUYXNrRGFzaGJvYXJkID0gKFxuICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlOiBib29sZWFuLFxuICB3YXNUYXNrQ3JlYXRpb246IGJvb2xlYW4sXG4gIHdhc1Rhc2tFZGl0OiBib29sZWFuLFxuICB3YXNUYXNrRGVsZXRlOiBib29sZWFuLFxuICB0YXNrSWRzRm9yRGFzaGJvYXJkOiBudW1iZXJbXVxuKTogYm9vbGVhbiA9PlxuICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmICh3YXNUYXNrQ3JlYXRpb24gfHwgd2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSkgJiYgdGFza0lkc0ZvckRhc2hib2FyZC5sZW5ndGggPiAwXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlVGFza0lkc0ZvckRhc2hib2FyZCA9IChcbiAgY29udGVudDogc3RyaW5nLFxuICB0YXNrVXJsUmVnZXg6IFJlZ0V4cCxcbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSxcbiAgd2FzVGFza0RlbGV0ZTogYm9vbGVhblxuKTogbnVtYmVyW10gPT4ge1xuICBjb25zdCB0YXNrSWRzRnJvbVVybHMgPSBbLi4uY29udGVudC5tYXRjaEFsbCh0YXNrVXJsUmVnZXgpXS5tYXAobWF0Y2ggPT4gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSlcbiAgY29uc3QgdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCA9IGV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zKVxuICBjb25zdCB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCA9XG4gICAgd2FzVGFza0RlbGV0ZSAmJiB0YXNrSWRzRnJvbVVybHMubGVuZ3RoID09PSAwICYmIHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID09PSAwXG4gICAgICA/IGV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dChjb250ZW50KVxuICAgICAgOiBbXVxuXG4gIGlmICh0YXNrSWRzRnJvbVVybHMubGVuZ3RoID4gMCkgcmV0dXJuIHRhc2tJZHNGcm9tVXJsc1xuICBpZiAodGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbC5sZW5ndGggPiAwKSByZXR1cm4gdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbFxuICByZXR1cm4gdGFza0lkc0Zyb21EZWxldGlvblRleHRcbn1cblxuZXhwb3J0IGNvbnN0IHJlcGxhY2VUYXNrVXJsc1dpdGhUYWJTZWdtZW50ID0gKGNvbnRlbnQ6IHN0cmluZywgdGFza1VybFJlZ2V4OiBSZWdFeHAsIHRhYlNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVByb2plY3REYXNoYm9hcmRTeW5jID0gKFxuICBjb250ZXh0UHJvamVjdElkOiBudW1iZXIgfCBudWxsLFxuICBwYXRobmFtZTogc3RyaW5nXG4pOiB7IHJvdXRlUHJvamVjdElkOiBudW1iZXIgfCBudWxsOyBpc09uUHJvamVjdFJvdXRlOiBib29sZWFuIH0gPT4ge1xuICBjb25zdCBwYXRoTWF0Y2ggPSBwYXRobmFtZS5tYXRjaCgvXlxcL3Byb2plY3RzXFwvKFxcZCspXFwvLylcbiAgY29uc3Qgcm91dGVQcm9qZWN0SWQgPSBwYXRoTWF0Y2ggPyBwYXJzZUludChwYXRoTWF0Y2hbMV0sIDEwKSA6IG51bGxcbiAgY29uc3QgaXNPblByb2plY3RSb3V0ZSA9IEJvb2xlYW4oY29udGV4dFByb2plY3RJZCAmJiByb3V0ZVByb2plY3RJZCAmJiBjb250ZXh0UHJvamVjdElkID09PSByb3V0ZVByb2plY3RJZClcbiAgcmV0dXJuIHsgcm91dGVQcm9qZWN0SWQsIGlzT25Qcm9qZWN0Um91dGUgfVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNyZWF0ZUFnZW50Rm9sbG93VXAgPSAoXG4gIGZsYWdzOiBQaWNrPEFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzLCAnd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCcgfCAnd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCc+LFxuICBtdWx0aUFnZW50c0FjY2VzczogYm9vbGVhbixcbiAgY29tcGxldGVkQWdlbnRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXVxuKTogeyBhZ2VudElkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghbXVsdGlBZ2VudHNBY2Nlc3MpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZmxhZ3Mud2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCAmJiBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkpIHtcbiAgICByZXR1cm4geyBhZ2VudElkOiBjb21wbGV0ZWRBZ2VudElkLnRyaW0oKSB9XG4gIH1cblxuICBpZiAoZmxhZ3Mud2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRBZ2VudElkID1cbiAgICAgIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fCBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnMsICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICBpZiAoY29uZmlndXJlZEFnZW50SWQpIHtcbiAgICAgIHJldHVybiB7IGFnZW50SWQ6IGNvbmZpZ3VyZWRBZ2VudElkIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRWRpdEFnZW50Rm9sbG93VXAgPSAoXG4gIHdhc0VkaXRBZ2VudEFwcHJvdmVkOiBib29sZWFuLFxuICBjb21wbGV0ZWRBZ2VudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdXG4pOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCF3YXNFZGl0QWdlbnRBcHByb3ZlZCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCByZXNvbHZlZEFnZW50SWQgPSBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgfHwgZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gIHJldHVybiByZXNvbHZlZEFnZW50SWQgPyB7IGFnZW50SWQ6IHJlc29sdmVkQWdlbnRJZCB9IDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZWZldGNoT3BlblRhc2tQYW5lbCA9IChcbiAgb3BlblRhc2tQYW5lbElkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGZsYWdzOiBQaWNrPEFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzLCAnd2FzVGFza0VkaXQnIHwgJ3dhc1Rhc2tEZWxldGUnPixcbiAgbWFudWFsRmxhZ3M6IHsgbWFudWFsV2FzVGFza0VkaXQ6IGJvb2xlYW47IG1hbnVhbFdhc1Rhc2tEZWxldGU6IGJvb2xlYW4gfSxcbiAgYWZmZWN0ZWRUYXNrSWRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChvcGVuVGFza1BhbmVsSWQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHRhc2tGbG93QWN0aXZlID1cbiAgICBmbGFncy53YXNUYXNrRWRpdCB8fCBmbGFncy53YXNUYXNrRGVsZXRlIHx8IG1hbnVhbEZsYWdzLm1hbnVhbFdhc1Rhc2tFZGl0IHx8IG1hbnVhbEZsYWdzLm1hbnVhbFdhc1Rhc2tEZWxldGVcbiAgaWYgKCF0YXNrRmxvd0FjdGl2ZSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBhZmZlY3RlZFRhc2tJZHMuaW5jbHVkZXMoU3RyaW5nKG9wZW5UYXNrUGFuZWxJZCkpXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtRXJyb3JQcmVzZW50YXRpb24gPSAoZXJyb3JNZXNzYWdlPzogc3RyaW5nLCBlcnJvclJhd01lc3NhZ2U/OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgaXNBY2Nlc3NEZW5pZWQgPSBlcnJvck1lc3NhZ2UgPT09IFwiQWNjZXNzIGRlbmllZDogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhpcyBhZ2VudFwiXG4gIGNvbnN0IGlzUHJvbXB0VG9vTG9uZyA9XG4gICAgZXJyb3JNZXNzYWdlID09PSAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJyAmJiBCb29sZWFuKGVycm9yUmF3TWVzc2FnZT8uaW5jbHVkZXMoJ3Byb21wdCBpcyB0b28gbG9uZycpKVxuICBjb25zdCB0b2tlbnNVc2VkID0gZXJyb3JSYXdNZXNzYWdlPy5tYXRjaCgvKFxcZCspIHRva2Vucy8pPy5bMV0gPz8gJydcblxuICByZXR1cm4ge1xuICAgIGlzQWNjZXNzRGVuaWVkLFxuICAgIGlzUHJvbXB0VG9vTG9uZyxcbiAgICB0b2tlbnNVc2VkLFxuICAgIHNob3dSZXRyeTogIWlzQWNjZXNzRGVuaWVkICYmICFpc1Byb21wdFRvb0xvbmcsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1hcEF1dGhVc2VyVG9DaGF0TWVzc2FnZVVzZXIgPSAoYXV0aFVzZXI6IENPUlVzZXIpOiBDaGF0TWVzc2FnZVVzZXIgPT4gKHtcbiAgaWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgYXZhdGFyOiBhdXRoVXNlci5waWN0dXJlLFxufSlcblxuZXhwb3J0IGNvbnN0IGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsSW5MaXN0ID0gKFxuICB0aHJlYWRJZHM6IHN0cmluZ1tdLFxuICBtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSxcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbik6IHsgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7IHNlc3Npb25JZDogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgY29uc3QgZm91bmQgPSBtZXNzYWdlcy5maW5kKG1lc3NhZ2UgPT5cbiAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgKVxuXG4gIGlmIChmb3VuZD8uYXBwcm92YWwpIHtcbiAgICByZXR1cm4geyBtZXNzYWdlOiBmb3VuZCwgc2Vzc2lvbklkOiBmb3VuZC5hcHByb3ZhbC5zZXNzaW9uX2lkIHx8IHNlc3Npb25JZCB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgY2FuU2VuZENoYXRNZXNzYWdlID0gKFxuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4sXG4gIHdhaXRpbmdSZXNwb25zZTogYm9vbGVhbixcbiAgbG9hZGluZ01lc3NhZ2VzOiBib29sZWFuXG4pOiBib29sZWFuID0+ICEoaXNQcm9jZXNzaW5nIHx8IHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZXMpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRCbG9ja0NvbmN1cnJlbnRTdHJlYW1TdGFydCA9IChcbiAgd2lsbFN0YXJ0TmV3U3RyZWFtOiBib29sZWFuLFxuICBhY3RpdmVDb3VudDogbnVtYmVyLFxuICBtYXhDb25jdXJyZW50OiBudW1iZXJcbik6IGJvb2xlYW4gPT4gd2lsbFN0YXJ0TmV3U3RyZWFtICYmIGFjdGl2ZUNvdW50ID49IG1heENvbmN1cnJlbnRcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBcHByb3ZhbERlY2lzaW9uU3RhdHVzID0gKGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0Jyk6ICdhcHByb3ZlZCcgfCAncmVqZWN0ZWQnID0+XG4gIGRlY2lzaW9uID09PSAnYXBwcm92ZScgPyAnYXBwcm92ZWQnIDogJ3JlamVjdGVkJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRpbnVlU3RyZWFtRGVjaXNpb24gPSAoXG4gIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgZWRpdGVkQWN0aW9ucz86IHVua25vd25bXVxuKTogJ2FwcHJvdmUnIHwgJ3JlamVjdCcgfCAnZWRpdCcgPT4gKGVkaXRlZEFjdGlvbnMgPyAnZWRpdCcgOiBkZWNpc2lvbilcblxuZXhwb3J0IHR5cGUgQXBwcm92YWxTdHJlYW1CbG9ja1JlYXNvbiA9XG4gICdtaXNzaW5nLXRocmVhZHMnIHwgJ21pc3NpbmctYXBwcm92YWwnIHwgJ21pc3Npbmctc2Vzc2lvbicgfCAnc2Vzc2lvbi1hY3RpdmUnIHwgJ2xpbWl0J1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFwcHJvdmFsU3RyZWFtQmxvY2tSZWFzb24gPSAocGFyYW1zOiB7XG4gIHRocmVhZElkczogc3RyaW5nW11cbiAgaGFzQXBwcm92YWxNZXNzYWdlOiBib29sZWFuXG4gIHNlc3Npb25JZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBpc1Nlc3Npb25TdHJlYW1BY3RpdmU6IGJvb2xlYW5cbiAgYWN0aXZlU3RyZWFtQ291bnQ6IG51bWJlclxuICBtYXhDb25jdXJyZW50OiBudW1iZXJcbn0pOiBBcHByb3ZhbFN0cmVhbUJsb2NrUmVhc29uIHwgbnVsbCA9PiB7XG4gIGlmICghcGFyYW1zLnRocmVhZElkcz8ubGVuZ3RoKSByZXR1cm4gJ21pc3NpbmctdGhyZWFkcydcbiAgaWYgKCFwYXJhbXMuaGFzQXBwcm92YWxNZXNzYWdlKSByZXR1cm4gJ21pc3NpbmctYXBwcm92YWwnXG4gIGlmICghcGFyYW1zLnNlc3Npb25JZCkgcmV0dXJuICdtaXNzaW5nLXNlc3Npb24nXG4gIGlmIChwYXJhbXMuaXNTZXNzaW9uU3RyZWFtQWN0aXZlKSByZXR1cm4gJ3Nlc3Npb24tYWN0aXZlJ1xuICBpZiAocGFyYW1zLmFjdGl2ZVN0cmVhbUNvdW50ID49IHBhcmFtcy5tYXhDb25jdXJyZW50KSByZXR1cm4gJ2xpbWl0J1xuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyA9IChcbiAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgYWN0aXZlTWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXG4gIHNlc3Npb25NZXNzYWdlc0J5SWQ6IFJlY29yZDxzdHJpbmcsIENoYXRNZXNzYWdlW10+LFxuICBhY3RpdmVTZXNzaW9uSWQ6IHN0cmluZyB8IG51bGxcbik6IHsgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7IHNlc3Npb25JZDogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgY29uc3QgZnJvbUFjdGl2ZVZpZXcgPSBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEluTGlzdCh0aHJlYWRJZHMsIGFjdGl2ZU1lc3NhZ2VzLCBhY3RpdmVTZXNzaW9uSWQgfHwgJycpXG4gIGlmIChmcm9tQWN0aXZlVmlldykgcmV0dXJuIGZyb21BY3RpdmVWaWV3XG5cbiAgY29uc3Qgc2Vzc2lvbkVudHJ5ID0gT2JqZWN0LmVudHJpZXMoc2Vzc2lvbk1lc3NhZ2VzQnlJZCkuZmluZCgoWywgc2Vzc2lvbk1lc3NhZ2VzXSkgPT5cbiAgICBzZXNzaW9uTWVzc2FnZXMuc29tZShtZXNzYWdlID0+XG4gICAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgICApXG4gIClcblxuICBpZiAoIXNlc3Npb25FbnRyeSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBbc2Vzc2lvbklkLCBzZXNzaW9uTWVzc2FnZXNdID0gc2Vzc2lvbkVudHJ5XG4gIHJldHVybiBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEluTGlzdCh0aHJlYWRJZHMsIHNlc3Npb25NZXNzYWdlcywgc2Vzc2lvbklkKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSxTQUFTQSxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELFNBQVNDLG1CQUFtQixRQUFRLDhCQUE4QjtBQU1sRTtBQUNBLE9BQU8sSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBSUMsU0FBaUIsRUFBNEI7RUFDN0UsSUFBTUMsUUFBUSxHQUFHSixjQUFjLENBQUNLLFdBQVcsQ0FBQ0YsU0FBUyxDQUFDO0VBQ3RE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
|
|
662
|
+
export var resolveStreamFinishFinalMessageId = function resolveStreamFinishFinalMessageId(memorySessionId) {
|
|
663
|
+
return "answer-".concat(memorySessionId);
|
|
664
|
+
};
|
|
665
|
+
export var resolveStreamStopMessageIds = function resolveStreamStopMessageIds(currentMessageId) {
|
|
666
|
+
return {
|
|
667
|
+
finalMessageId: "answer-".concat(currentMessageId),
|
|
668
|
+
cancelledMessageId: "answer-".concat(currentMessageId, "-cancelled")
|
|
669
|
+
};
|
|
670
|
+
};
|
|
671
|
+
export var resolveRentabilidadProjectFaqMessage = function resolveRentabilidadProjectFaqMessage(message, rentabilidadLabel, incomeType) {
|
|
672
|
+
if (message !== rentabilidadLabel) return message;
|
|
673
|
+
return "FAQ: ".concat(rentabilidadLabel, " - Tipo de rentabilidad: ").concat(incomeType !== null && incomeType !== void 0 ? incomeType : '');
|
|
674
|
+
};
|
|
675
|
+
export var resolveStreamErrorUserMessage = function resolveStreamErrorUserMessage(messageKey, translate, tokensUsed) {
|
|
676
|
+
if (messageKey === 'chat.errorAccessDenied') return translate('chat.errorAccessDenied');
|
|
677
|
+
if (messageKey === 'chat.errorPromptTooLong') return translate('chat.errorPromptTooLong', {
|
|
678
|
+
used: tokensUsed
|
|
679
|
+
});
|
|
680
|
+
return translate('chat.error');
|
|
681
|
+
};
|
|
682
|
+
export var resolvePreviousAssistantMessageBeforePlaceholder = function resolvePreviousAssistantMessageBeforePlaceholder(messages, placeholderId) {
|
|
683
|
+
return messages.filter(function (message) {
|
|
684
|
+
return message.id !== placeholderId;
|
|
685
|
+
}).at(-1);
|
|
686
|
+
};
|
|
687
|
+
export var resolveHitlExecutionContext = function resolveHitlExecutionContext(approval, accumulatedContent) {
|
|
688
|
+
var _approval$pending_act, _approval$pending_act2;
|
|
689
|
+
return {
|
|
690
|
+
messageId: "approval-".concat(approval.original_thread_id),
|
|
691
|
+
messageText: accumulatedContent || '',
|
|
692
|
+
approval: approval,
|
|
693
|
+
pendingActions: approval.pending_actions,
|
|
694
|
+
threadIds: (_approval$pending_act = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2.map(function (action) {
|
|
695
|
+
return action.thread_id;
|
|
696
|
+
}).filter(function (threadId) {
|
|
697
|
+
return Boolean(threadId);
|
|
698
|
+
})) !== null && _approval$pending_act !== void 0 ? _approval$pending_act : []
|
|
699
|
+
};
|
|
700
|
+
};
|
|
701
|
+
export var resolveSkippedHitlManualApproval = function resolveSkippedHitlManualApproval(approval) {
|
|
702
|
+
var _approval$pending_act3, _ref4, _tool_name, _tool_args;
|
|
703
|
+
var firstAction = (_approval$pending_act3 = approval.pending_actions) === null || _approval$pending_act3 === void 0 ? void 0 : _approval$pending_act3[0];
|
|
704
|
+
var toolName = (_ref4 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref4 !== void 0 ? _ref4 : '';
|
|
705
|
+
if (!toolName) return null;
|
|
706
|
+
var toolArgs = ((_tool_args = approval.tool_args) !== null && _tool_args !== void 0 ? _tool_args : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_args) || null;
|
|
707
|
+
return {
|
|
708
|
+
toolName: toolName,
|
|
709
|
+
toolArgs: toolArgs
|
|
710
|
+
};
|
|
711
|
+
};
|
|
712
|
+
export var resolveHitlSkipResolutionSource = function resolveHitlSkipResolutionSource(approval) {
|
|
713
|
+
return approval.manual_approval_detected ? 'manual' : 'auto';
|
|
714
|
+
};
|
|
715
|
+
export var resolveCreateAgentHitlAnalyticsEvents = function resolveCreateAgentHitlAnalyticsEvents(params) {
|
|
716
|
+
var _params$completedAgen;
|
|
717
|
+
var events = [];
|
|
718
|
+
var trimmedAgentId = (_params$completedAgen = params.completedAgentId) === null || _params$completedAgen === void 0 ? void 0 : _params$completedAgen.trim();
|
|
719
|
+
var idField = trimmedAgentId ? {
|
|
720
|
+
created_agent_id: trimmedAgentId
|
|
721
|
+
} : {};
|
|
722
|
+
if (params.wasCreateAgentApproved) {
|
|
723
|
+
events.push(_objectSpread({
|
|
724
|
+
agent_type: params.agentType,
|
|
725
|
+
action_type: params.buildActionTypeList(params.pendingActions),
|
|
726
|
+
decision: 'accept',
|
|
727
|
+
option: 'create_agent'
|
|
728
|
+
}, idField));
|
|
729
|
+
}
|
|
730
|
+
var manualTool = params.manualApprovalToolName;
|
|
731
|
+
if (manualTool && params.normalizeToolName(manualTool) === 'create_agent') {
|
|
732
|
+
events.push(_objectSpread({
|
|
733
|
+
agent_type: params.agentType,
|
|
734
|
+
action_type: 'create_agent',
|
|
735
|
+
decision: 'accept',
|
|
736
|
+
resolution_source: 'manual',
|
|
737
|
+
option: 'create_agent'
|
|
738
|
+
}, idField));
|
|
739
|
+
}
|
|
740
|
+
return events;
|
|
741
|
+
};
|
|
742
|
+
export var resolveContextProjectIdForDashboard = function resolveContextProjectIdForDashboard(projectId, lastMessageProjectId) {
|
|
743
|
+
var raw = projectId !== null && projectId !== void 0 ? projectId : lastMessageProjectId;
|
|
744
|
+
if (raw == null) return null;
|
|
745
|
+
var parsed = parseInt(String(raw), 10);
|
|
746
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
747
|
+
};
|
|
748
|
+
export var resolveDashboardSyncedContent = /*#__PURE__*/function () {
|
|
749
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(content, taskUrlRegex, shouldSyncDashboard, taskIds, getTabTaskDefault) {
|
|
750
|
+
var matches, tab, tabSegment;
|
|
751
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
752
|
+
while (1) switch (_context.prev = _context.next) {
|
|
753
|
+
case 0:
|
|
754
|
+
if (!(!shouldSyncDashboard || taskIds.length === 0)) {
|
|
755
|
+
_context.next = 1;
|
|
756
|
+
break;
|
|
757
|
+
}
|
|
758
|
+
return _context.abrupt("return", content);
|
|
759
|
+
case 1:
|
|
760
|
+
matches = _toConsumableArray(content.matchAll(taskUrlRegex));
|
|
761
|
+
if (!(matches.length === 0)) {
|
|
762
|
+
_context.next = 2;
|
|
763
|
+
break;
|
|
764
|
+
}
|
|
765
|
+
return _context.abrupt("return", content);
|
|
766
|
+
case 2:
|
|
767
|
+
_context.next = 3;
|
|
768
|
+
return getTabTaskDefault(taskIds[0]);
|
|
769
|
+
case 3:
|
|
770
|
+
tab = _context.sent;
|
|
771
|
+
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
772
|
+
return _context.abrupt("return", replaceTaskUrlsWithTabSegment(content, taskUrlRegex, tabSegment));
|
|
773
|
+
case 4:
|
|
774
|
+
case "end":
|
|
775
|
+
return _context.stop();
|
|
776
|
+
}
|
|
777
|
+
}, _callee);
|
|
778
|
+
}));
|
|
779
|
+
return function resolveDashboardSyncedContent(_x, _x2, _x3, _x4, _x5) {
|
|
780
|
+
return _ref5.apply(this, arguments);
|
|
781
|
+
};
|
|
782
|
+
}();
|
|
783
|
+
export var isTerminalSessionStatus = function isTerminalSessionStatus(status) {
|
|
784
|
+
return status === 'complete' || status === 'error';
|
|
785
|
+
};
|
|
786
|
+
export var buildTerminalSessionReconciliationKey = function buildTerminalSessionReconciliationKey(sessionId, status, finishedAt) {
|
|
787
|
+
return "".concat(sessionId, ":").concat(status, ":").concat(finishedAt !== null && finishedAt !== void 0 ? finishedAt : '');
|
|
788
|
+
};
|
|
789
|
+
export var hasStaleStreamingPlaceholderInTail = function hasStaleStreamingPlaceholderInTail(tail, isStreamingPlaceholder) {
|
|
790
|
+
return tail.some(function (message) {
|
|
791
|
+
return isStreamingPlaceholder(message.id);
|
|
792
|
+
});
|
|
793
|
+
};
|
|
794
|
+
export var shouldForceReloadMessagesOnTerminalSession = function shouldForceReloadMessagesOnTerminalSession(status, tail, isStreamingPlaceholder) {
|
|
795
|
+
return isTerminalSessionStatus(status) && hasStaleStreamingPlaceholderInTail(tail, isStreamingPlaceholder);
|
|
796
|
+
};
|
|
797
|
+
export var shouldRotateSessionForNewHome = function shouldRotateSessionForNewHome(initialChatId, previousInitialChatId) {
|
|
798
|
+
return !initialChatId && Boolean(previousInitialChatId);
|
|
799
|
+
};
|
|
800
|
+
export var shouldSwitchToInitialChatSession = function shouldSwitchToInitialChatSession(initialChatId, currentChatId) {
|
|
801
|
+
return Boolean(initialChatId && initialChatId !== currentChatId);
|
|
802
|
+
};
|
|
803
|
+
export var buildStreamFinishAssistantMessage = function buildStreamFinishAssistantMessage(params) {
|
|
804
|
+
return _objectSpread(_objectSpread(_objectSpread({
|
|
805
|
+
id: params.finalMessageId,
|
|
806
|
+
message: params.content,
|
|
807
|
+
date: new Date(),
|
|
808
|
+
user: {
|
|
809
|
+
id: 'assistant',
|
|
810
|
+
name: 'Assistant'
|
|
811
|
+
},
|
|
812
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
813
|
+
sources: params.sources
|
|
814
|
+
}, params.attachments.length > 0 ? {
|
|
815
|
+
attachments: params.attachments
|
|
816
|
+
} : {}), {}, {
|
|
817
|
+
memorySessionId: params.memorySessionId,
|
|
818
|
+
suggestions: params.suggestions || []
|
|
819
|
+
}, params.createAgentFollowUp ? {
|
|
820
|
+
createAgentFollowUp: params.createAgentFollowUp
|
|
821
|
+
} : {}), {}, {
|
|
822
|
+
reasoning: params.reasoning
|
|
823
|
+
});
|
|
824
|
+
};
|
|
825
|
+
export var shouldMarkChatReadAfterStreamFinish = function shouldMarkChatReadAfterStreamFinish(isActive, isChatViewVisible) {
|
|
826
|
+
return isActive && isChatViewVisible;
|
|
827
|
+
};
|
|
828
|
+
export var shouldDispatchFirstSessionRefetch = function shouldDispatchFirstSessionRefetch(firstTime) {
|
|
829
|
+
return firstTime;
|
|
830
|
+
};
|
|
831
|
+
export function resolveActiveStreamFinishProcessing(_x6) {
|
|
832
|
+
return _resolveActiveStreamFinishProcessing.apply(this, arguments);
|
|
833
|
+
}
|
|
834
|
+
function _resolveActiveStreamFinishProcessing() {
|
|
835
|
+
_resolveActiveStreamFinishProcessing = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(params) {
|
|
836
|
+
var _previousMessage$appr, _params$manualApprova, _params$manualApprova2, _params$manualApprova3, _params$manualApprova4;
|
|
837
|
+
var contentToAdd, previousMessage, hasApprovalInPreviousMessage, pendingActions, _resolveApprovedPendi, wasTaskCreation, wasTaskEdit, wasTaskDelete, wasCreateAgentApproved, wasConfigureAgentAccessApproved, wasEditAgentApproved, createAgentFollowUp, editAgentFollowUp, taskIdsForDashboard, shouldSyncDashboard, lastProjectMessage, contextProjectId, _resolveProjectDashbo, isOnProjectRoute, manualWasTaskEdit, manualWasTaskDelete, hoursChargeTools, affectedTaskIds;
|
|
838
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
839
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
840
|
+
case 0:
|
|
841
|
+
contentToAdd = params.content;
|
|
842
|
+
previousMessage = resolvePreviousAssistantMessageBeforePlaceholder(params.messages, params.tempMessageId);
|
|
843
|
+
hasApprovalInPreviousMessage = (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approval) != null;
|
|
844
|
+
pendingActions = (previousMessage === null || previousMessage === void 0 || (_previousMessage$appr = previousMessage.approval) === null || _previousMessage$appr === void 0 ? void 0 : _previousMessage$appr.pending_actions) || [];
|
|
845
|
+
_resolveApprovedPendi = resolveApprovedPendingActionFlags(hasApprovalInPreviousMessage, previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus, pendingActions), wasTaskCreation = _resolveApprovedPendi.wasTaskCreation, wasTaskEdit = _resolveApprovedPendi.wasTaskEdit, wasTaskDelete = _resolveApprovedPendi.wasTaskDelete, wasCreateAgentApproved = _resolveApprovedPendi.wasCreateAgentApproved, wasConfigureAgentAccessApproved = _resolveApprovedPendi.wasConfigureAgentAccessApproved, wasEditAgentApproved = _resolveApprovedPendi.wasEditAgentApproved;
|
|
846
|
+
createAgentFollowUp = resolveCreateAgentFollowUp({
|
|
847
|
+
wasCreateAgentApproved: wasCreateAgentApproved,
|
|
848
|
+
wasConfigureAgentAccessApproved: wasConfigureAgentAccessApproved
|
|
849
|
+
}, params.multiAgentsAccess, params.completedAgentId, pendingActions);
|
|
850
|
+
editAgentFollowUp = resolveEditAgentFollowUp(wasEditAgentApproved, params.completedAgentId, pendingActions);
|
|
851
|
+
taskIdsForDashboard = resolveTaskIdsForDashboard(params.content, params.taskUrlRegex, pendingActions, wasTaskDelete);
|
|
852
|
+
shouldSyncDashboard = shouldSyncTaskDashboard(hasApprovalInPreviousMessage, wasTaskCreation, wasTaskEdit, wasTaskDelete, taskIdsForDashboard);
|
|
853
|
+
if (!shouldSyncDashboard) {
|
|
854
|
+
_context2.next = 2;
|
|
855
|
+
break;
|
|
856
|
+
}
|
|
857
|
+
_context2.next = 1;
|
|
858
|
+
return resolveDashboardSyncedContent(params.content, params.taskUrlRegex, shouldSyncDashboard, taskIdsForDashboard, params.getTabTaskDefault);
|
|
859
|
+
case 1:
|
|
860
|
+
contentToAdd = _context2.sent;
|
|
861
|
+
lastProjectMessage = params.messages.filter(function (msg) {
|
|
862
|
+
return msg.projectId;
|
|
863
|
+
}).at(-1);
|
|
864
|
+
contextProjectId = resolveContextProjectIdForDashboard(params.projectId, lastProjectMessage === null || lastProjectMessage === void 0 ? void 0 : lastProjectMessage.projectId);
|
|
865
|
+
_resolveProjectDashbo = resolveProjectDashboardSync(contextProjectId, params.pathname), isOnProjectRoute = _resolveProjectDashbo.isOnProjectRoute;
|
|
866
|
+
if (isOnProjectRoute && params.applyDashboardMutation) {
|
|
867
|
+
params.applyDashboardMutation(resolveProjectDashboardMutation({
|
|
868
|
+
wasTaskCreation: wasTaskCreation,
|
|
869
|
+
wasTaskEdit: wasTaskEdit,
|
|
870
|
+
wasTaskDelete: wasTaskDelete
|
|
871
|
+
}), taskIdsForDashboard);
|
|
872
|
+
}
|
|
873
|
+
case 2:
|
|
874
|
+
manualWasTaskEdit = isTaskEditToolName((_params$manualApprova = params.manualApproval) === null || _params$manualApprova === void 0 ? void 0 : _params$manualApprova.toolName);
|
|
875
|
+
manualWasTaskDelete = isTaskDeleteToolName((_params$manualApprova2 = params.manualApproval) === null || _params$manualApprova2 === void 0 ? void 0 : _params$manualApprova2.toolName);
|
|
876
|
+
hoursChargeTools = resolveHoursChargeToolsOnStreamFinish(hasApprovalInPreviousMessage, previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus, pendingActions, (_params$manualApprova3 = params.manualApproval) === null || _params$manualApprova3 === void 0 ? void 0 : _params$manualApprova3.toolName);
|
|
877
|
+
affectedTaskIds = mergeAffectedTaskIdsForPanelRefetch(pendingActions, taskIdsForDashboard, (_params$manualApprova4 = params.manualApproval) !== null && _params$manualApprova4 !== void 0 && _params$manualApprova4.toolName ? {
|
|
878
|
+
toolName: params.manualApproval.toolName,
|
|
879
|
+
toolArgs: params.manualApproval.toolArgs
|
|
880
|
+
} : null);
|
|
881
|
+
return _context2.abrupt("return", {
|
|
882
|
+
contentToAdd: contentToAdd,
|
|
883
|
+
createAgentFollowUp: createAgentFollowUp,
|
|
884
|
+
editAgentFollowUp: editAgentFollowUp,
|
|
885
|
+
hoursChargeTools: hoursChargeTools,
|
|
886
|
+
affectedTaskIds: affectedTaskIds,
|
|
887
|
+
manualWasTaskEdit: manualWasTaskEdit,
|
|
888
|
+
manualWasTaskDelete: manualWasTaskDelete,
|
|
889
|
+
wasTaskEdit: wasTaskEdit,
|
|
890
|
+
wasTaskDelete: wasTaskDelete,
|
|
891
|
+
wasCreateAgentApproved: wasCreateAgentApproved,
|
|
892
|
+
pendingActions: pendingActions
|
|
893
|
+
});
|
|
894
|
+
case 3:
|
|
895
|
+
case "end":
|
|
896
|
+
return _context2.stop();
|
|
897
|
+
}
|
|
898
|
+
}, _callee2);
|
|
899
|
+
}));
|
|
900
|
+
return _resolveActiveStreamFinishProcessing.apply(this, arguments);
|
|
901
|
+
}
|
|
902
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0hvdXJzQ2hhcmdlVG9vbCIsIkNoYXRIaXN0b3J5Um9sZSIsInJlYXNvbmluZ1N0b3JlIiwiYnVpbGRSZWFzb25pbmdUcmFjZSIsInJlc29sdmVSZXRyeVR1cm5JZCIsInJlYXNvbmluZ1RyYWNlRm9yIiwibWVzc2FnZUlkIiwic25hcHNob3QiLCJnZXRTbmFwc2hvdCIsInN0ZXBzIiwibGVuZ3RoIiwic3VtbWFyeSIsIm5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyIsImF0dGFjaG1lbnRzT3JPcHRpb25zIiwiX29wdGlvbnMkYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsIm9wdGlvbnMiLCJyZXNvbHZlUHJvamVjdFRvUmVxdWVzdCIsImNoaXBzUHJvamVjdCIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwiY2hpcHNQcm9qZWN0SWQiLCJwcm9qZWN0SWQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlZCIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwiY3R4Q2xpZW50IiwiY3R4UHJvamVjdCIsIl9jdHhQcm9qZWN0JGNsaWVudCIsImlkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudElkIiwibmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyIsInJhd0F0dGFjaG1lbnRzIiwiZmlsdGVyIiwiYXR0YWNobWVudCIsIl90eXBlb2YiLCJtYXAiLCJpbmRleCIsInRyaW0iLCJjb25jYXQiLCJ0eXBlIiwibWltZVR5cGUiLCJtaW1lX3R5cGUiLCJmdWxsRmlsZU5hbWUiLCJpbmNsdWRlcyIsIm51bWVyaWNTaXplIiwic2l6ZSIsInBhcnNlZFNpemUiLCJmaWxlIiwiRmlsZSIsInVybF9vcmlnaW5hbCIsInVuZGVmaW5lZCIsInVybF90aHVtYm5haWwiLCJ1cmxfZmlsZSIsInJvbGUiLCJleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MiLCJwZW5kaW5nQWN0aW9ucyIsImlkcyIsInB1c2hJZCIsInJhdyIsIm4iLCJwYXJzZUludCIsIlN0cmluZyIsImlzTmFOIiwicHVzaCIsImZvckVhY2giLCJhY3Rpb24iLCJfcmVjJHRhc2tfaWQiLCJhcmdzIiwidG9vbF9hcmdzIiwicmVjIiwidGFza19pZCIsInRhc2tfaWRzIiwidGFza3MiLCJ0IiwiX3RyZWMkdGFza19pZCIsInRyZWMiLCJleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyIsInRvb2xfbmFtZSIsIl9yZWMkdGFza19pZDIiLCJsaXN0IiwidGlkIiwiZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMiLCJfcmVjJGFnZW50X2lkIiwiZWRpdEFjdGlvbiIsImZpbmQiLCJhIiwidG9Mb3dlckNhc2UiLCJhZ2VudF9pZCIsImFnZW50SWQiLCJleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUiLCJ0b29sTmFtZSIsIl9yZWYiLCJfcmVjJGFnZW50X2lkMiIsImV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCIsInRleHQiLCJsYWJlbGVkIiwibWF0Y2giLCJib2xkIiwiVEFTS19DUkVBVElPTl9UT09MUyIsIlRBU0tfRURJVF9UT09MUyIsIlRBU0tfREVMRVRFX1RPT0xTIiwiaXNUYXNrRWRpdFRvb2xOYW1lIiwiaXNUYXNrRGVsZXRlVG9vbE5hbWUiLCJwZW5kaW5nQWN0aW9uc0luY2x1ZGVUb29sIiwidG9vbHMiLCJzb21lIiwicmVzb2x2ZUFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzIiwiaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSIsImFwcHJvdmFsU3RhdHVzIiwiYXBwcm92ZWQiLCJ3YXNUYXNrQ3JlYXRpb24iLCJ3YXNUYXNrRWRpdCIsIndhc1Rhc2tEZWxldGUiLCJ3YXNDcmVhdGVBZ2VudEFwcHJvdmVkIiwid2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCIsIndhc0VkaXRBZ2VudEFwcHJvdmVkIiwic2hvdWxkU3luY1Rhc2tEYXNoYm9hcmQiLCJ0YXNrSWRzRm9yRGFzaGJvYXJkIiwicmVzb2x2ZVRhc2tJZHNGb3JEYXNoYm9hcmQiLCJjb250ZW50IiwidGFza1VybFJlZ2V4IiwidGFza0lkc0Zyb21VcmxzIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJ0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsIiwidGFza0lkc0Zyb21EZWxldGlvblRleHQiLCJyZXBsYWNlVGFza1VybHNXaXRoVGFiU2VnbWVudCIsInRhYlNlZ21lbnQiLCJyZXBsYWNlIiwidXJsIiwicmVzb2x2ZVByb2plY3REYXNoYm9hcmRTeW5jIiwiY29udGV4dFByb2plY3RJZCIsInBhdGhuYW1lIiwicGF0aE1hdGNoIiwicm91dGVQcm9qZWN0SWQiLCJpc09uUHJvamVjdFJvdXRlIiwiQm9vbGVhbiIsInJlc29sdmVDcmVhdGVBZ2VudEZvbGxvd1VwIiwiZmxhZ3MiLCJtdWx0aUFnZW50c0FjY2VzcyIsImNvbXBsZXRlZEFnZW50SWQiLCJjb25maWd1cmVkQWdlbnRJZCIsInJlc29sdmVFZGl0QWdlbnRGb2xsb3dVcCIsInJlc29sdmVkQWdlbnRJZCIsInNob3VsZFJlZmV0Y2hPcGVuVGFza1BhbmVsIiwib3BlblRhc2tQYW5lbElkIiwibWFudWFsRmxhZ3MiLCJhZmZlY3RlZFRhc2tJZHMiLCJ0YXNrRmxvd0FjdGl2ZSIsIm1hbnVhbFdhc1Rhc2tFZGl0IiwibWFudWFsV2FzVGFza0RlbGV0ZSIsInJlc29sdmVTdHJlYW1FcnJvclByZXNlbnRhdGlvbiIsImVycm9yTWVzc2FnZSIsImVycm9yUmF3TWVzc2FnZSIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YyIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YzIiLCJpc0FjY2Vzc0RlbmllZCIsImlzUHJvbXB0VG9vTG9uZyIsInRva2Vuc1VzZWQiLCJzaG93UmV0cnkiLCJyZXNvbHZlU3RyZWFtRXJyb3JNZXNzYWdlS2V5IiwicHJlc2VudGF0aW9uIiwibWVzc2FnZUtleSIsInJlc29sdmVQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24iLCJhcHBseVByb2plY3REYXNoYm9hcmRNdXRhdGlvbiIsIm11dGF0aW9uIiwidGFza0lkcyIsImRhc2hib2FyZCIsIl9kYXNoYm9hcmQkZGVsZXRlRXhpcyIsIl9kYXNoYm9hcmQkYWRkRXhpc3RpbiIsImFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkIiwiY2FsbCIsIl9kYXNoYm9hcmQkZWRpdEV4aXN0aSIsImVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZCIsImRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQiLCJtZXJnZUFmZmVjdGVkVGFza0lkc0ZvclBhbmVsUmVmZXRjaCIsIm1hbnVhbEFwcHJvdmFsIiwibWFudWFsUHNldWRvQWN0aW9ucyIsIl9tYW51YWxBcHByb3ZhbCR0b29sQSIsInRvb2xBcmdzIiwidGhyZWFkX2lkIiwidG9vbF9jYWxsX2lkIiwibWFwQXV0aFVzZXJUb0NoYXRNZXNzYWdlVXNlciIsImF1dGhVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxJbkxpc3QiLCJ0aHJlYWRJZHMiLCJtZXNzYWdlcyIsInNlc3Npb25JZCIsImZvdW5kIiwibWVzc2FnZSIsIl9tZXNzYWdlJGFwcHJvdmFsIiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJzZXNzaW9uX2lkIiwiY2FuU2VuZENoYXRNZXNzYWdlIiwiaXNQcm9jZXNzaW5nIiwid2FpdGluZ1Jlc3BvbnNlIiwibG9hZGluZ01lc3NhZ2VzIiwic2hvdWxkQmxvY2tDb25jdXJyZW50U3RyZWFtU3RhcnQiLCJ3aWxsU3RhcnROZXdTdHJlYW0iLCJhY3RpdmVDb3VudCIsIm1heENvbmN1cnJlbnQiLCJyZXNvbHZlU2VuZE1lc3NhZ2VHYXRlIiwicGFyYW1zIiwiYWN0aXZlU3RyZWFtQ291bnQiLCJyZXNvbHZlU2VuZE1lc3NhZ2VQYXlsb2FkRmllbGRzIiwicG9zaXRpb25hbCIsIl9wb3NpdGlvbmFsJGZhcUlkIiwiX3Bvc2l0aW9uYWwkYWdlbnRTdWdnIiwiX3Bvc2l0aW9uYWwkbWVudGlvbnMiLCJfcG9zaXRpb25hbCRmdWFJZCIsIl9wb3NpdGlvbmFsJHNjSWQiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsImJ1aWxkQ2hhdEhpc3RvcnlGcm9tTWVzc2FnZXMiLCJhdXRoVXNlcklkIiwiaGlzdG9yeU1lc3NhZ2UiLCJ1c2VyIiwiVVNFUiIsIkFTU0lTVEFOVCIsInJlc29sdmVMYXN0TWVzc2FnZUFnZW50SWQiLCJfbWVzc2FnZXMkYXQiLCJhdCIsInJlc29sdmVBZ2VudElkRm9yU3RyZWFtIiwiYWdlbnRJZEZyb21NZXNzYWdlcyIsImZhbGxiYWNrQWdlbnRJZCIsInJlc29sdmVVc2VyUXVlc3Rpb25NZXNzYWdlSWQiLCJ0dXJuTWVzc2FnZUlkIiwiYnVpbGRNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWQiLCJfcGFyYW1zJGN0eFByb2plY3QiLCJfcGFyYW1zJGN0eFRhc2siLCJoaXN0b3J5IiwibGFuZyIsInVzZXJJZCIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY29tcGFueV9pZCIsImNoYXRJZCIsImFnZW50TmFtZSIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiaXNBdXRvQXBwcm92ZUFjdGl2ZSIsImZlZUlkIiwicHJvamVjdE5hbWUiLCJjdHhUYXNrIiwidGFza0lkIiwidGFza05hbWUiLCJhZ2VudEVudGl0eSIsImFnZW50VHlwZSIsImFnZW50RW1vamkiLCJjb250ZXh0TWVzc2FnZSIsImJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkRm9yUHJvamVjdENoYW5nZSIsInByb2plY3QiLCJyZXNvbHZlU3RyZWFtRXJyb3JIYW5kbGluZ01vZGUiLCJoYXNSZXRyeVNuYXBzaG90IiwicmVzb2x2ZVN0cmVhbUVycm9yQXNzaXN0YW50TWVzc2FnZUlkIiwiYnVpbGRTdHJlYW1FcnJvckFzc2lzdGFudE1lc3NhZ2UiLCJpc0Vycm9yIiwic3VnZ2VzdGlvbnMiLCJyZXRyeUxhYmVsIiwiZGF0ZSIsIkRhdGUiLCJzaG91bGRTa2lwSGl0bEFwcHJvdmFsVWkiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJhdXRvX2FwcHJvdmVkIiwiYXBwcm92YWxfc3RhdHVzIiwicmVzb2x2ZUhpdGxBcHByb3ZhbFJlcXVpcmVkT3V0Y29tZSIsImFwcHJvdmFsTWVzc2FnZUlkIiwib3JpZ2luYWxfdGhyZWFkX2lkIiwiYnVpbGRIaXRsQXBwcm92YWxQZW5kaW5nTWVzc2FnZSIsImFjY3VtdWxhdGVkQ29udGVudCIsInJlYXNvbmluZyIsInNob3VsZFByZXNlcnZlUmVhc29uaW5nT25TdHJlYW1TdG9wIiwic3RvcHBlZFRyYWNlIiwiYnVpbGRTdHJlYW1TdG9wUGFydGlhbEFzc2lzdGFudE1lc3NhZ2UiLCJmaW5hbE1lc3NhZ2VJZCIsInBhcnRpYWxUZXh0IiwiYnVpbGRTdHJlYW1TdG9wQ2FuY2VsbGVkQXNzaXN0YW50TWVzc2FnZSIsImNhbmNlbGxlZE1lc3NhZ2VJZCIsImNhbmNlbGxlZExhYmVsIiwiaXNGcm9udGVuZENhbmNlbGxlZCIsInJlc29sdmVSZXRyeUJsb2NrUmVhc29uIiwiaXNTZXNzaW9uU3RyZWFtQWN0aXZlIiwic2hvdWxkVXNlT3JjaGVzdHJhdG9yUmV0cnlGYWxsYmFjayIsIl9tZXNzYWdlJG1lbW9yeVNlc3NpbyIsIm1lbW9yeVNlc3Npb25JZCIsInJlc29sdmVSZXRyeUVsaWdpYmlsaXR5IiwicHJldmlvdXNNZXNzYWdlcyIsInVzZXJNZXNzYWdlIiwiX3VzZXJNZXNzYWdlJG1lc3NhZ2UiLCJfdXNlck1lc3NhZ2UkYXR0YWNobWUiLCJfdXNlck1lc3NhZ2Ukc291cmNlcyIsIml0ZW0iLCJlbGlnaWJsZSIsInJlYXNvbiIsInNvdXJjZXMiLCJ0dXJuSWQiLCJ1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayIsInJlc29sdmVSZXRyeVVzZXJBdHRhY2htZW50cyIsInNob3VsZFVwZGF0ZVByb2plY3RPbkNoYW5nZSIsIm5leHRQcm9qZWN0SWQiLCJjdXJyZW50UHJvamVjdElkIiwic2hvdWxkUmVzZW5kQWZ0ZXJQcm9qZWN0Q2hhbmdlIiwidXNlclF1ZXN0aW9uIiwicmVzb2x2ZUFwcHJvdmFsRGVjaXNpb25TdGF0dXMiLCJkZWNpc2lvbiIsInJlc29sdmVDb250aW51ZVN0cmVhbURlY2lzaW9uIiwiZWRpdGVkQWN0aW9ucyIsInJlc29sdmVBcHByb3ZhbFN0cmVhbUJsb2NrUmVhc29uIiwiX3BhcmFtcyR0aHJlYWRJZHMiLCJoYXNBcHByb3ZhbE1lc3NhZ2UiLCJyZXNvbHZlSG91cnNDaGFyZ2VUb29sc09uU3RyZWFtRmluaXNoIiwibWFudWFsQXBwcm92YWxUb29sTmFtZSIsImhvdXJzVG9vbHNGcm9tQXBwcm92YWwiLCJ3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkIiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyIsImFjdGl2ZU1lc3NhZ2VzIiwic2Vzc2lvbk1lc3NhZ2VzQnlJZCIsImFjdGl2ZVNlc3Npb25JZCIsImZyb21BY3RpdmVWaWV3Iiwic2Vzc2lvbkVudHJ5IiwiT2JqZWN0IiwiZW50cmllcyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheSIsInNlc3Npb25NZXNzYWdlcyIsIl9tZXNzYWdlJGFwcHJvdmFsMiIsIl9zZXNzaW9uRW50cnkiLCJyZXNvbHZlU3RyZWFtRmluaXNoRmluYWxNZXNzYWdlSWQiLCJyZXNvbHZlU3RyZWFtU3RvcE1lc3NhZ2VJZHMiLCJjdXJyZW50TWVzc2FnZUlkIiwicmVzb2x2ZVJlbnRhYmlsaWRhZFByb2plY3RGYXFNZXNzYWdlIiwicmVudGFiaWxpZGFkTGFiZWwiLCJpbmNvbWVUeXBlIiwicmVzb2x2ZVN0cmVhbUVycm9yVXNlck1lc3NhZ2UiLCJ0cmFuc2xhdGUiLCJ1c2VkIiwicmVzb2x2ZVByZXZpb3VzQXNzaXN0YW50TWVzc2FnZUJlZm9yZVBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJJZCIsInJlc29sdmVIaXRsRXhlY3V0aW9uQ29udGV4dCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdDIiLCJtZXNzYWdlVGV4dCIsInRocmVhZElkIiwicmVzb2x2ZVNraXBwZWRIaXRsTWFudWFsQXBwcm92YWwiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QzIiwiX3JlZjQiLCJfdG9vbF9uYW1lIiwiX3Rvb2xfYXJncyIsImZpcnN0QWN0aW9uIiwicmVzb2x2ZUhpdGxTa2lwUmVzb2x1dGlvblNvdXJjZSIsInJlc29sdmVDcmVhdGVBZ2VudEhpdGxBbmFseXRpY3NFdmVudHMiLCJfcGFyYW1zJGNvbXBsZXRlZEFnZW4iLCJldmVudHMiLCJ0cmltbWVkQWdlbnRJZCIsImlkRmllbGQiLCJjcmVhdGVkX2FnZW50X2lkIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiYnVpbGRBY3Rpb25UeXBlTGlzdCIsIm9wdGlvbiIsIm1hbnVhbFRvb2wiLCJub3JtYWxpemVUb29sTmFtZSIsInJlc29sdXRpb25fc291cmNlIiwicmVzb2x2ZUNvbnRleHRQcm9qZWN0SWRGb3JEYXNoYm9hcmQiLCJyZXNvbHZlRGFzaGJvYXJkU3luY2VkQ29udGVudCIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJzaG91bGRTeW5jRGFzaGJvYXJkIiwiZ2V0VGFiVGFza0RlZmF1bHQiLCJtYXRjaGVzIiwidGFiIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJhYnJ1cHQiLCJzZW50Iiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJpc1Rlcm1pbmFsU2Vzc2lvblN0YXR1cyIsInN0YXR1cyIsImJ1aWxkVGVybWluYWxTZXNzaW9uUmVjb25jaWxpYXRpb25LZXkiLCJmaW5pc2hlZEF0IiwiaGFzU3RhbGVTdHJlYW1pbmdQbGFjZWhvbGRlckluVGFpbCIsInRhaWwiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyIiwic2hvdWxkRm9yY2VSZWxvYWRNZXNzYWdlc09uVGVybWluYWxTZXNzaW9uIiwic2hvdWxkUm90YXRlU2Vzc2lvbkZvck5ld0hvbWUiLCJpbml0aWFsQ2hhdElkIiwicHJldmlvdXNJbml0aWFsQ2hhdElkIiwic2hvdWxkU3dpdGNoVG9Jbml0aWFsQ2hhdFNlc3Npb24iLCJjdXJyZW50Q2hhdElkIiwiYnVpbGRTdHJlYW1GaW5pc2hBc3Npc3RhbnRNZXNzYWdlIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsInNob3VsZE1hcmtDaGF0UmVhZEFmdGVyU3RyZWFtRmluaXNoIiwiaXNBY3RpdmUiLCJpc0NoYXRWaWV3VmlzaWJsZSIsInNob3VsZERpc3BhdGNoRmlyc3RTZXNzaW9uUmVmZXRjaCIsImZpcnN0VGltZSIsInJlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nIiwiX3g2IiwiX3Jlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nIiwiX2NhbGxlZTIiLCJfcHJldmlvdXNNZXNzYWdlJGFwcHIiLCJfcGFyYW1zJG1hbnVhbEFwcHJvdmEiLCJfcGFyYW1zJG1hbnVhbEFwcHJvdmEyIiwiX3BhcmFtcyRtYW51YWxBcHByb3ZhMyIsIl9wYXJhbXMkbWFudWFsQXBwcm92YTQiLCJjb250ZW50VG9BZGQiLCJwcmV2aW91c01lc3NhZ2UiLCJfcmVzb2x2ZUFwcHJvdmVkUGVuZGkiLCJlZGl0QWdlbnRGb2xsb3dVcCIsImxhc3RQcm9qZWN0TWVzc2FnZSIsIl9yZXNvbHZlUHJvamVjdERhc2hibyIsImhvdXJzQ2hhcmdlVG9vbHMiLCJfY29udGV4dDIiLCJ0ZW1wTWVzc2FnZUlkIiwibXNnIiwiYXBwbHlEYXNoYm9hcmRNdXRhdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlci5oZWxwZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSG91cnNDaGFyZ2VUb29sIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3BsYW5uZXJTeW5jRXZlbnRzJ1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQge1xuICBBcHByb3ZhbFJlcXVlc3QsXG4gIENoYXRIaXN0b3J5LFxuICBDaGF0SGlzdG9yeVJvbGUsXG4gIENoYXRNZXNzYWdlLFxuICBDaGF0TWVzc2FnZVVzZXIsXG4gIFBlbmRpbmdBY3Rpb24sXG59IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBDT1JVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgcmVhc29uaW5nU3RvcmUgfSBmcm9tICcuLi91c2VSZWFzb25pbmdUcmFjZSdcbmltcG9ydCB7IGJ1aWxkUmVhc29uaW5nVHJhY2UgfSBmcm9tICcuLi8uLi91dGlscy9yZWFzb25pbmdNYXBwZXJzJ1xuaW1wb3J0IHR5cGUgeyBSZWFzb25pbmdUcmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzL3JlYXNvbmluZydcbmltcG9ydCB0eXBlIHsgU2VuZE1lc3NhZ2VPcHRpb25zIH0gZnJvbSAnLi91c2VDaGF0TWFuYWdlci5pbnRlcmZhY2UnXG5pbXBvcnQgdHlwZSB7IENvbnRleHRNZW50aW9uLCBDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHR5cGUgeyBBZ2VudEVudGl0eSwgQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyByZXNvbHZlUmV0cnlUdXJuSWQgfSBmcm9tICcuLi8uLi91dGlscy9yZXRyeUNvbXBsZXRpb24nXG5cbnR5cGUgQXR0YWNobWVudHNPck9wdGlvbnMgPSBBdHRhY2htZW50RmlsZVtdIHwgU2VuZE1lc3NhZ2VPcHRpb25zXG5cbi8qKiBUcmFjZSBhY3VtdWxhZG8gZW4gdml2byBwYXJhIGBtZXNzYWdlSWRgLCBvIG51bGwgc2kgZWwgc3RvcmUgYXB1bnRhIGEgb3RybyBtZW5zYWplLiAqL1xuZXhwb3J0IGNvbnN0IHJlYXNvbmluZ1RyYWNlRm9yID0gKG1lc3NhZ2VJZDogc3RyaW5nKTogUmVhc29uaW5nVHJhY2UgfCBudWxsID0+IHtcbiAgY29uc3Qgc25hcHNob3QgPSByZWFzb25pbmdTdG9yZS5nZXRTbmFwc2hvdChtZXNzYWdlSWQpXG4gIGlmICghc25hcHNob3Quc3RlcHMubGVuZ3RoKSByZXR1cm4gbnVsbFxuICByZXR1cm4gYnVpbGRSZWFzb25pbmdUcmFjZShzbmFwc2hvdC5zdGVwcywgc25hcHNob3Quc3VtbWFyeSlcbn1cblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyA9IChhdHRhY2htZW50c09yT3B0aW9ucz86IEF0dGFjaG1lbnRzT3JPcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGF0dGFjaG1lbnRzT3JPcHRpb25zKSkge1xuICAgIHJldHVybiB7IGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c09yT3B0aW9ucywgb3B0aW9uczoge30gYXMgU2VuZE1lc3NhZ2VPcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFNlbmRNZXNzYWdlT3B0aW9ucyA9IGF0dGFjaG1lbnRzT3JPcHRpb25zID8/IHt9XG4gIHJldHVybiB7IGF0dGFjaG1lbnRzOiBvcHRpb25zLmF0dGFjaG1lbnRzID8/IFtdLCBvcHRpb25zIH1cbn1cblxuLyoqIGNoaXBzUHJvamVjdCBlcyBsYSBmdWVudGUgZGUgdmVyZGFkIGRlbCBwaW4gdmlzaWJsZTsgc2kgbm8gaGF5IHBpbiwgcmVzdGF1cmFyIGRlc2RlIGhpc3RvcmlhbC4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvamVjdFRvUmVxdWVzdCA9IChcbiAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZD86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbGFzdE1lc3NhZ2VQcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbik6IG51bWJlciB8IG51bGwgPT4ge1xuICBjb25zdCBjaGlwc1Byb2plY3RJZCA9IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8gTnVtYmVyKGNoaXBzUHJvamVjdC5wcm9qZWN0SWQpIDogbnVsbFxuICBpZiAoY2hpcHNQcm9qZWN0SWQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoY2hpcHNQcm9qZWN0SWQpKSB7XG4gICAgcmV0dXJuIGNoaXBzUHJvamVjdElkXG4gIH1cbiAgaWYgKGxhc3RNZXNzYWdlUHJvamVjdElkICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIobGFzdE1lc3NhZ2VQcm9qZWN0SWQpXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQ2xpZW50UGF5bG9hZCA9IChcbiAgY3R4Q2xpZW50OiB7IGlkPzogbnVtYmVyOyBuYW1lPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjdHhQcm9qZWN0OiBQcm9qZWN0IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogeyBjbGllbnRJZD86IG51bWJlcjsgY2xpZW50TmFtZT86IHN0cmluZyB9ID0+IHtcbiAgaWYgKGN0eENsaWVudD8uaWQpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogY3R4Q2xpZW50LmlkLCAuLi4oY3R4Q2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eENsaWVudC5uYW1lIH0gOiB7fSkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnRJZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IE51bWJlcihjdHhQcm9qZWN0LmNsaWVudElkKSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudD8uaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGN0eFByb2plY3QuY2xpZW50LmlkLFxuICAgICAgLi4uKGN0eFByb2plY3QuY2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eFByb2plY3QuY2xpZW50Lm5hbWUgfSA6IHt9KSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt9XG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyA9IChyYXdBdHRhY2htZW50czogdW5rbm93bik6IEF0dGFjaG1lbnRGaWxlW10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmF3QXR0YWNobWVudHMpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gcmF3QXR0YWNobWVudHNcbiAgICAuZmlsdGVyKChhdHRhY2htZW50KTogYXR0YWNobWVudCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiAhIWF0dGFjaG1lbnQgJiYgdHlwZW9mIGF0dGFjaG1lbnQgPT09ICdvYmplY3QnKVxuICAgIC5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQubmFtZSA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC5uYW1lLnRyaW0oKSA/IGF0dGFjaG1lbnQubmFtZS50cmltKCkgOiBgZmlsZS0ke2luZGV4ICsgMX1gXG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIGF0dGFjaG1lbnQudHlwZSA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC50eXBlLnRyaW0oKSA/IGF0dGFjaG1lbnQudHlwZS50cmltKCkgOiAncGRmJ1xuICAgICAgY29uc3QgbWltZVR5cGUgPSB0eXBlb2YgYXR0YWNobWVudC5taW1lX3R5cGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC5taW1lX3R5cGUgOiAnJ1xuICAgICAgY29uc3QgZnVsbEZpbGVOYW1lID0gbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZSA6IGAke25hbWV9LiR7dHlwZX1gXG4gICAgICBsZXQgbnVtZXJpY1NpemUgPSAwXG4gICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnQuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbnVtZXJpY1NpemUgPSBhdHRhY2htZW50LnNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNpemUgPSBOdW1iZXIoYXR0YWNobWVudC5zaXplKVxuICAgICAgICBudW1lcmljU2l6ZSA9IE51bWJlci5pc0Zpbml0ZShwYXJzZWRTaXplKSA/IHBhcnNlZFNpemUgOiAwXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCBmdWxsRmlsZU5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSksXG4gICAgICAgIGlkOlxuICAgICAgICAgIHR5cGVvZiBhdHRhY2htZW50LmlkID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LmlkLnRyaW0oKVxuICAgICAgICAgICAgPyBhdHRhY2htZW50LmlkXG4gICAgICAgICAgICA6IGBhc3Npc3RhbnQtZmlsZS0ke2luZGV4fS0ke2Z1bGxGaWxlTmFtZX1gLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplOiBudW1lcmljU2l6ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXJsX29yaWdpbmFsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfb3JpZ2luYWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF90aHVtYm5haWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF90aHVtYm5haWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfdGh1bWJuYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfZmlsZTogdHlwZW9mIGF0dGFjaG1lbnQudXJsX2ZpbGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfZmlsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcm9sZTogYXR0YWNobWVudC5yb2xlID09PSAnYXNzaXN0YW50JyA/ICdhc3Npc3RhbnQnIDogJ3VzZXInLFxuICAgICAgfVxuICAgIH0pXG59XG5cbi8qKiBFeHRyYWUgdGFza19pZHMgZGUgbG9zIHRvb2xfYXJncyBkZSBwZW5kaW5nX2FjdGlvbnMuICovXG5leHBvcnQgY29uc3QgZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzID0gKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBjb25zdCBwdXNoSWQgPSAocmF3OiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm5cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoU3RyaW5nKHJhdyksIDEwKVxuICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICB9XG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBwdXNoSWQocmVjLnRhc2tfaWQgPz8gcmVjLmlkKVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlYy50YXNrX2lkcykpIHtcbiAgICAgIHJlYy50YXNrX2lkcy5mb3JFYWNoKHB1c2hJZClcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjLnRhc2tzKSkge1xuICAgICAgcmVjLnRhc2tzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICh0ICYmIHR5cGVvZiB0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICAgIGNvbnN0IHRyZWMgPSB0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgcHVzaElkKHRyZWMudGFza19pZCA/PyB0cmVjLmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGlkc1xufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMgPSAocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdID0+IHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrJykge1xuICAgICAgY29uc3QgcmF3ID0gcmVjLnRhc2tfaWQgPz8gcmVjLmlkXG4gICAgICBpZiAocmF3ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3Rpb24udG9vbF9uYW1lID09PSAnZGVsZXRlX3Rhc2tzX2JhdGNoJykge1xuICAgICAgY29uc3QgbGlzdCA9IHJlYy50YXNrX2lkc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgbGlzdC5mb3JFYWNoKHRpZCA9PiB7XG4gICAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyh0aWQpLCAxMClcbiAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zID0gKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgZWRpdEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JylcbiAgaWYgKFxuICAgICFlZGl0QWN0aW9uIHx8XG4gICAgIWVkaXRBY3Rpb24udG9vbF9hcmdzIHx8XG4gICAgdHlwZW9mIGVkaXRBY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fFxuICAgIEFycmF5LmlzQXJyYXkoZWRpdEFjdGlvbi50b29sX2FyZ3MpXG4gICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gZWRpdEFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lID0gKFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLFxuICB0b29sTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgYWN0aW9uID0gcGVuZGluZ0FjdGlvbnMuZmluZChhID0+IChhLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gdG9vbE5hbWUudG9Mb3dlckNhc2UoKSlcbiAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi50b29sX2FyZ3MgfHwgdHlwZW9mIGFjdGlvbi50b29sX2FyZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoYWN0aW9uLnRvb2xfYXJncykpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHJlYyA9IGFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkID8/IHJlYy5pZFxuICByZXR1cm4gcmF3ICE9IG51bGwgPyBTdHJpbmcocmF3KSA6IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCA9ICh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IGxhYmVsZWQgPSB0ZXh0Lm1hdGNoKC9cXGJJRFxccypcXCpcXCooXFxkKylcXCpcXCovaSlcbiAgaWYgKGxhYmVsZWQpIHtcbiAgICBjb25zdCBuID0gcGFyc2VJbnQobGFiZWxlZFsxXSwgMTApXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihuKSA/IFtdIDogW25dXG4gIH1cbiAgY29uc3QgYm9sZCA9IHRleHQubWF0Y2goL1xcKlxcKihcXGR7NSx9KVxcKlxcKi8pXG4gIGlmIChib2xkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGJvbGRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3QgVEFTS19DUkVBVElPTl9UT09MUyA9IFsnY3JlYXRlX3Rhc2snLCAnY3JlYXRlX3Rhc2tzX2JhdGNoJywgJ2Nsb25lX3Rhc2snXSBhcyBjb25zdFxuZXhwb3J0IGNvbnN0IFRBU0tfRURJVF9UT09MUyA9IFtcbiAgJ2VkaXRfdGFzaycsXG4gICdlZGl0X3Rhc2tzX2JhdGNoJyxcbiAgJ3Rhc2tfYXNzaWduJyxcbiAgJ3Rhc2tfdW5hc3NpZ24nLFxuICAndXBkYXRlX3Rhc2tfdHlwZScsXG4gICd1cGRhdGVfZXN0aW1hdGVkX2hvdXJzJyxcbiAgJ2Fzc2lnbl90YXNrX2xhYmVsJyxcbl0gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBUQVNLX0RFTEVURV9UT09MUyA9IFsnZGVsZXRlX3Rhc2snLCAnZGVsZXRlX3Rhc2tzX2JhdGNoJ10gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzVGFza0VkaXRUb29sTmFtZSA9ICh0b29sTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4gPT5cbiAgISF0b29sTmFtZSAmJiAoVEFTS19FRElUX1RPT0xTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh0b29sTmFtZSlcblxuZXhwb3J0IGNvbnN0IGlzVGFza0RlbGV0ZVRvb2xOYW1lID0gKHRvb2xOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogYm9vbGVhbiA9PlxuICAhIXRvb2xOYW1lICYmIChUQVNLX0RFTEVURV9UT09MUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModG9vbE5hbWUpXG5cbmNvbnN0IHBlbmRpbmdBY3Rpb25zSW5jbHVkZVRvb2wgPSAocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSwgdG9vbHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiA9PlxuICBwZW5kaW5nQWN0aW9ucy5zb21lKGFjdGlvbiA9PiB0b29scy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lIHx8ICcnKSlcblxuZXhwb3J0IHR5cGUgQXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MgPSB7XG4gIHdhc1Rhc2tDcmVhdGlvbjogYm9vbGVhblxuICB3YXNUYXNrRWRpdDogYm9vbGVhblxuICB3YXNUYXNrRGVsZXRlOiBib29sZWFuXG4gIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQ6IGJvb2xlYW5cbiAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZDogYm9vbGVhblxuICB3YXNFZGl0QWdlbnRBcHByb3ZlZDogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzID0gKFxuICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlOiBib29sZWFuLFxuICBhcHByb3ZhbFN0YXR1czogQ2hhdE1lc3NhZ2VbJ2FwcHJvdmFsU3RhdHVzJ10sXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW11cbik6IEFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzID0+IHtcbiAgY29uc3QgYXBwcm92ZWQgPSBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIGFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnXG5cbiAgcmV0dXJuIHtcbiAgICB3YXNUYXNrQ3JlYXRpb246IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnNJbmNsdWRlVG9vbChwZW5kaW5nQWN0aW9ucywgVEFTS19DUkVBVElPTl9UT09MUyksXG4gICAgd2FzVGFza0VkaXQ6IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnNJbmNsdWRlVG9vbChwZW5kaW5nQWN0aW9ucywgVEFTS19FRElUX1RPT0xTKSxcbiAgICB3YXNUYXNrRGVsZXRlOiBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zSW5jbHVkZVRvb2wocGVuZGluZ0FjdGlvbnMsIFRBU0tfREVMRVRFX1RPT0xTKSxcbiAgICB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkOiBhcHByb3ZlZCAmJiBwZW5kaW5nQWN0aW9uc0luY2x1ZGVUb29sKHBlbmRpbmdBY3Rpb25zLCBbJ2NyZWF0ZV9hZ2VudCddKSxcbiAgICB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkOlxuICAgICAgYXBwcm92ZWQgJiYgcGVuZGluZ0FjdGlvbnMuc29tZShhY3Rpb24gPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJyksXG4gICAgd2FzRWRpdEFnZW50QXBwcm92ZWQ6XG4gICAgICBhcHByb3ZlZCAmJiBwZW5kaW5nQWN0aW9ucy5zb21lKGFjdGlvbiA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU3luY1Rhc2tEYXNoYm9hcmQgPSAoXG4gIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2U6IGJvb2xlYW4sXG4gIHdhc1Rhc2tDcmVhdGlvbjogYm9vbGVhbixcbiAgd2FzVGFza0VkaXQ6IGJvb2xlYW4sXG4gIHdhc1Rhc2tEZWxldGU6IGJvb2xlYW4sXG4gIHRhc2tJZHNGb3JEYXNoYm9hcmQ6IG51bWJlcltdXG4pOiBib29sZWFuID0+XG4gIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgKHdhc1Rhc2tDcmVhdGlvbiB8fCB3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlKSAmJiB0YXNrSWRzRm9yRGFzaGJvYXJkLmxlbmd0aCA+IDBcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUYXNrSWRzRm9yRGFzaGJvYXJkID0gKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHRhc2tVcmxSZWdleDogUmVnRXhwLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLFxuICB3YXNUYXNrRGVsZXRlOiBib29sZWFuXG4pOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IFsuLi5jb250ZW50Lm1hdGNoQWxsKHRhc2tVcmxSZWdleCldLm1hcChtYXRjaCA9PiBwYXJzZUludChtYXRjaFsxXSwgMTApKVxuICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gIGNvbnN0IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0ID1cbiAgICB3YXNUYXNrRGVsZXRlICYmIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPT09IDAgJiYgdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbC5sZW5ndGggPT09IDBcbiAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICA6IFtdXG5cbiAgaWYgKHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwKSByZXR1cm4gdGFza0lkc0Zyb21VcmxzXG4gIGlmICh0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA+IDApIHJldHVybiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gIHJldHVybiB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dFxufVxuXG5leHBvcnQgY29uc3QgcmVwbGFjZVRhc2tVcmxzV2l0aFRhYlNlZ21lbnQgPSAoY29udGVudDogc3RyaW5nLCB0YXNrVXJsUmVnZXg6IFJlZ0V4cCwgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+XG4gIGNvbnRlbnQucmVwbGFjZSh0YXNrVXJsUmVnZXgsIHVybCA9PlxuICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICApXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvamVjdERhc2hib2FyZFN5bmMgPSAoXG4gIGNvbnRleHRQcm9qZWN0SWQ6IG51bWJlciB8IG51bGwsXG4gIHBhdGhuYW1lOiBzdHJpbmdcbik6IHsgcm91dGVQcm9qZWN0SWQ6IG51bWJlciB8IG51bGw7IGlzT25Qcm9qZWN0Um91dGU6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHBhdGhNYXRjaCA9IHBhdGhuYW1lLm1hdGNoKC9eXFwvcHJvamVjdHNcXC8oXFxkKylcXC8vKVxuICBjb25zdCByb3V0ZVByb2plY3RJZCA9IHBhdGhNYXRjaCA/IHBhcnNlSW50KHBhdGhNYXRjaFsxXSwgMTApIDogbnVsbFxuICBjb25zdCBpc09uUHJvamVjdFJvdXRlID0gQm9vbGVhbihjb250ZXh0UHJvamVjdElkICYmIHJvdXRlUHJvamVjdElkICYmIGNvbnRleHRQcm9qZWN0SWQgPT09IHJvdXRlUHJvamVjdElkKVxuICByZXR1cm4geyByb3V0ZVByb2plY3RJZCwgaXNPblByb2plY3RSb3V0ZSB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQ3JlYXRlQWdlbnRGb2xsb3dVcCA9IChcbiAgZmxhZ3M6IFBpY2s8QXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MsICd3YXNDcmVhdGVBZ2VudEFwcHJvdmVkJyB8ICd3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkJz4sXG4gIG11bHRpQWdlbnRzQWNjZXNzOiBib29sZWFuLFxuICBjb21wbGV0ZWRBZ2VudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdXG4pOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFtdWx0aUFnZW50c0FjY2VzcykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChmbGFncy53YXNDcmVhdGVBZ2VudEFwcHJvdmVkICYmIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSkge1xuICAgIHJldHVybiB7IGFnZW50SWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH1cbiAgfVxuXG4gIGlmIChmbGFncy53YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkKSB7XG4gICAgY29uc3QgY29uZmlndXJlZEFnZW50SWQgPVxuICAgICAgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8IGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKVxuICAgIGlmIChjb25maWd1cmVkQWdlbnRJZCkge1xuICAgICAgcmV0dXJuIHsgYWdlbnRJZDogY29uZmlndXJlZEFnZW50SWQgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVFZGl0QWdlbnRGb2xsb3dVcCA9IChcbiAgd2FzRWRpdEFnZW50QXBwcm92ZWQ6IGJvb2xlYW4sXG4gIGNvbXBsZXRlZEFnZW50SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW11cbik6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXdhc0VkaXRBZ2VudEFwcHJvdmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fCBleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcbiAgcmV0dXJuIHJlc29sdmVkQWdlbnRJZCA/IHsgYWdlbnRJZDogcmVzb2x2ZWRBZ2VudElkIH0gOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlZmV0Y2hPcGVuVGFza1BhbmVsID0gKFxuICBvcGVuVGFza1BhbmVsSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgZmxhZ3M6IFBpY2s8QXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MsICd3YXNUYXNrRWRpdCcgfCAnd2FzVGFza0RlbGV0ZSc+LFxuICBtYW51YWxGbGFnczogeyBtYW51YWxXYXNUYXNrRWRpdDogYm9vbGVhbjsgbWFudWFsV2FzVGFza0RlbGV0ZTogYm9vbGVhbiB9LFxuICBhZmZlY3RlZFRhc2tJZHM6IHN0cmluZ1tdXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKG9wZW5UYXNrUGFuZWxJZCA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgdGFza0Zsb3dBY3RpdmUgPVxuICAgIGZsYWdzLndhc1Rhc2tFZGl0IHx8IGZsYWdzLndhc1Rhc2tEZWxldGUgfHwgbWFudWFsRmxhZ3MubWFudWFsV2FzVGFza0VkaXQgfHwgbWFudWFsRmxhZ3MubWFudWFsV2FzVGFza0RlbGV0ZVxuICBpZiAoIXRhc2tGbG93QWN0aXZlKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGFmZmVjdGVkVGFza0lkcy5pbmNsdWRlcyhTdHJpbmcob3BlblRhc2tQYW5lbElkKSlcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1FcnJvclByZXNlbnRhdGlvbiA9IChlcnJvck1lc3NhZ2U/OiBzdHJpbmcsIGVycm9yUmF3TWVzc2FnZT86IHN0cmluZykgPT4ge1xuICBjb25zdCBpc0FjY2Vzc0RlbmllZCA9IGVycm9yTWVzc2FnZSA9PT0gXCJBY2Nlc3MgZGVuaWVkOiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGFnZW50XCJcbiAgY29uc3QgaXNQcm9tcHRUb29Mb25nID1cbiAgICBlcnJvck1lc3NhZ2UgPT09ICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InICYmIEJvb2xlYW4oZXJyb3JSYXdNZXNzYWdlPy5pbmNsdWRlcygncHJvbXB0IGlzIHRvbyBsb25nJykpXG4gIGNvbnN0IHRva2Vuc1VzZWQgPSBlcnJvclJhd01lc3NhZ2U/Lm1hdGNoKC8oXFxkKykgdG9rZW5zLyk/LlsxXSA/PyAnJ1xuXG4gIHJldHVybiB7XG4gICAgaXNBY2Nlc3NEZW5pZWQsXG4gICAgaXNQcm9tcHRUb29Mb25nLFxuICAgIHRva2Vuc1VzZWQsXG4gICAgc2hvd1JldHJ5OiAhaXNBY2Nlc3NEZW5pZWQgJiYgIWlzUHJvbXB0VG9vTG9uZyxcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1FcnJvck1lc3NhZ2VLZXkgPSAnY2hhdC5lcnJvckFjY2Vzc0RlbmllZCcgfCAnY2hhdC5lcnJvclByb21wdFRvb0xvbmcnIHwgJ2NoYXQuZXJyb3InXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtRXJyb3JNZXNzYWdlS2V5ID0gKFxuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmcsXG4gIGVycm9yUmF3TWVzc2FnZT86IHN0cmluZ1xuKTogeyBtZXNzYWdlS2V5OiBTdHJlYW1FcnJvck1lc3NhZ2VLZXk7IHRva2Vuc1VzZWQ6IHN0cmluZzsgc2hvd1JldHJ5OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCBwcmVzZW50YXRpb24gPSByZXNvbHZlU3RyZWFtRXJyb3JQcmVzZW50YXRpb24oZXJyb3JNZXNzYWdlLCBlcnJvclJhd01lc3NhZ2UpXG4gIGxldCBtZXNzYWdlS2V5OiBTdHJlYW1FcnJvck1lc3NhZ2VLZXkgPSAnY2hhdC5lcnJvcidcbiAgaWYgKHByZXNlbnRhdGlvbi5pc0FjY2Vzc0RlbmllZCkgbWVzc2FnZUtleSA9ICdjaGF0LmVycm9yQWNjZXNzRGVuaWVkJ1xuICBlbHNlIGlmIChwcmVzZW50YXRpb24uaXNQcm9tcHRUb29Mb25nKSBtZXNzYWdlS2V5ID0gJ2NoYXQuZXJyb3JQcm9tcHRUb29Mb25nJ1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZUtleSxcbiAgICB0b2tlbnNVc2VkOiBwcmVzZW50YXRpb24udG9rZW5zVXNlZCxcbiAgICBzaG93UmV0cnk6IHByZXNlbnRhdGlvbi5zaG93UmV0cnksXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUHJvamVjdERhc2hib2FyZE11dGF0aW9uID0gJ2NyZWF0ZScgfCAnZWRpdCcgfCAnZGVsZXRlJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVByb2plY3REYXNoYm9hcmRNdXRhdGlvbiA9IChmbGFnczoge1xuICB3YXNUYXNrQ3JlYXRpb246IGJvb2xlYW5cbiAgd2FzVGFza0VkaXQ6IGJvb2xlYW5cbiAgd2FzVGFza0RlbGV0ZTogYm9vbGVhblxufSk6IFByb2plY3REYXNoYm9hcmRNdXRhdGlvbiB8IG51bGwgPT4ge1xuICBpZiAoZmxhZ3Mud2FzVGFza0NyZWF0aW9uKSByZXR1cm4gJ2NyZWF0ZSdcbiAgaWYgKGZsYWdzLndhc1Rhc2tFZGl0KSByZXR1cm4gJ2VkaXQnXG4gIGlmIChmbGFncy53YXNUYXNrRGVsZXRlKSByZXR1cm4gJ2RlbGV0ZSdcbiAgcmV0dXJuIG51bGxcbn1cblxudHlwZSBQcm9qZWN0RGFzaGJvYXJkQXBpID0ge1xuICBhZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD86ICh0YXNrSWRzOiBudW1iZXJbXSkgPT4gdm9pZFxuICBlZGl0RXhpc3RpbmdUYXNrSW5EYXNoYm9hcmQ/OiAodGFza0lkczogbnVtYmVyW10pID0+IHZvaWRcbiAgZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD86ICh0YXNrSWRzOiBudW1iZXJbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24gPSAoXG4gIG11dGF0aW9uOiBQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24gfCBudWxsLFxuICB0YXNrSWRzOiBudW1iZXJbXSxcbiAgZGFzaGJvYXJkOiBQcm9qZWN0RGFzaGJvYXJkQXBpIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogdm9pZCA9PiB7XG4gIGlmICghbXV0YXRpb24gfHwgIWRhc2hib2FyZCkgcmV0dXJuXG4gIGlmIChtdXRhdGlvbiA9PT0gJ2NyZWF0ZScpIHtcbiAgICBkYXNoYm9hcmQuYWRkRXhpc3RpbmdUYXNrVG9EYXNoYm9hcmQ/Lih0YXNrSWRzKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChtdXRhdGlvbiA9PT0gJ2VkaXQnKSB7XG4gICAgZGFzaGJvYXJkLmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgcmV0dXJuXG4gIH1cbiAgZGFzaGJvYXJkLmRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQ/Lih0YXNrSWRzKVxufVxuXG5leHBvcnQgY29uc3QgbWVyZ2VBZmZlY3RlZFRhc2tJZHNGb3JQYW5lbFJlZmV0Y2ggPSAoXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10sXG4gIHRhc2tJZHNGb3JEYXNoYm9hcmQ6IG51bWJlcltdLFxuICBtYW51YWxBcHByb3ZhbD86IHsgdG9vbE5hbWU6IHN0cmluZzsgdG9vbEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfSB8IG51bGxcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgbWFudWFsUHNldWRvQWN0aW9uczogUGVuZGluZ0FjdGlvbltdID0gW11cbiAgaWYgKG1hbnVhbEFwcHJvdmFsKSB7XG4gICAgbWFudWFsUHNldWRvQWN0aW9ucy5wdXNoKHtcbiAgICAgIHRvb2xfbmFtZTogbWFudWFsQXBwcm92YWwudG9vbE5hbWUsXG4gICAgICB0b29sX2FyZ3M6IG1hbnVhbEFwcHJvdmFsLnRvb2xBcmdzID8/IHt9LFxuICAgICAgdGhyZWFkX2lkOiAnbWFudWFsJyxcbiAgICAgIHRvb2xfY2FsbF9pZDogJ21hbnVhbCcsXG4gICAgfSBhcyBQZW5kaW5nQWN0aW9uKVxuICB9XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5leHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnMpLFxuICAgIC4uLnRhc2tJZHNGb3JEYXNoYm9hcmQsXG4gICAgLi4uZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKG1hbnVhbFBzZXVkb0FjdGlvbnMpLFxuICBdLm1hcChTdHJpbmcpXG59XG5cbmV4cG9ydCBjb25zdCBtYXBBdXRoVXNlclRvQ2hhdE1lc3NhZ2VVc2VyID0gKGF1dGhVc2VyOiBDT1JVc2VyKTogQ2hhdE1lc3NhZ2VVc2VyID0+ICh7XG4gIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICBuYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbn0pXG5cbmV4cG9ydCBjb25zdCBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEluTGlzdCA9IChcbiAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXG4gIHNlc3Npb25JZDogc3RyaW5nXG4pOiB7IG1lc3NhZ2U6IENoYXRNZXNzYWdlOyBzZXNzaW9uSWQ6IHN0cmluZyB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGZvdW5kID0gbWVzc2FnZXMuZmluZChtZXNzYWdlID0+XG4gICAgbWVzc2FnZS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gIClcblxuICBpZiAoZm91bmQ/LmFwcHJvdmFsKSB7XG4gICAgcmV0dXJuIHsgbWVzc2FnZTogZm91bmQsIHNlc3Npb25JZDogZm91bmQuYXBwcm92YWwuc2Vzc2lvbl9pZCB8fCBzZXNzaW9uSWQgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGNhblNlbmRDaGF0TWVzc2FnZSA9IChcbiAgaXNQcm9jZXNzaW5nOiBib29sZWFuLFxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW4sXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhblxuKTogYm9vbGVhbiA9PiAhKGlzUHJvY2Vzc2luZyB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKVxuXG5leHBvcnQgdHlwZSBTZW5kTWVzc2FnZUJsb2NrUmVhc29uID0gJ2J1c3knIHwgJ2NvbmN1cnJlbmN5J1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQmxvY2tDb25jdXJyZW50U3RyZWFtU3RhcnQgPSAoXG4gIHdpbGxTdGFydE5ld1N0cmVhbTogYm9vbGVhbixcbiAgYWN0aXZlQ291bnQ6IG51bWJlcixcbiAgbWF4Q29uY3VycmVudDogbnVtYmVyXG4pOiBib29sZWFuID0+IHdpbGxTdGFydE5ld1N0cmVhbSAmJiBhY3RpdmVDb3VudCA+PSBtYXhDb25jdXJyZW50XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2VuZE1lc3NhZ2VHYXRlID0gKHBhcmFtczoge1xuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW5cbiAgd2FpdGluZ1Jlc3BvbnNlOiBib29sZWFuXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhblxuICB3aWxsU3RhcnROZXdTdHJlYW06IGJvb2xlYW5cbiAgYWN0aXZlU3RyZWFtQ291bnQ6IG51bWJlclxuICBtYXhDb25jdXJyZW50OiBudW1iZXJcbn0pOiBTZW5kTWVzc2FnZUJsb2NrUmVhc29uIHwgbnVsbCA9PiB7XG4gIGlmICghY2FuU2VuZENoYXRNZXNzYWdlKHBhcmFtcy5pc1Byb2Nlc3NpbmcsIHBhcmFtcy53YWl0aW5nUmVzcG9uc2UsIHBhcmFtcy5sb2FkaW5nTWVzc2FnZXMpKSB7XG4gICAgcmV0dXJuICdidXN5J1xuICB9XG4gIGlmIChzaG91bGRCbG9ja0NvbmN1cnJlbnRTdHJlYW1TdGFydChwYXJhbXMud2lsbFN0YXJ0TmV3U3RyZWFtLCBwYXJhbXMuYWN0aXZlU3RyZWFtQ291bnQsIHBhcmFtcy5tYXhDb25jdXJyZW50KSkge1xuICAgIHJldHVybiAnY29uY3VycmVuY3knXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTZW5kTWVzc2FnZVBheWxvYWRGaWVsZHMgPSAoXG4gIG9wdGlvbnM6IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgcG9zaXRpb25hbD86IHtcbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdXG4gICAgZnVhSWQ/OiBzdHJpbmdcbiAgICBzY0lkPzogc3RyaW5nXG4gIH1cbikgPT4gKHtcbiAgZmFxSWQ6IHBvc2l0aW9uYWw/LmZhcUlkID8/IG9wdGlvbnMuZmFxSWQsXG4gIGFnZW50U3VnZ2VzdGlvbklkOiBwb3NpdGlvbmFsPy5hZ2VudFN1Z2dlc3Rpb25JZCA/PyBvcHRpb25zLmFnZW50U3VnZ2VzdGlvbklkLFxuICBtZW50aW9uczogcG9zaXRpb25hbD8ubWVudGlvbnMgPz8gb3B0aW9ucy5tZW50aW9ucyxcbiAgZnVhSWQ6IHBvc2l0aW9uYWw/LmZ1YUlkID8/IG9wdGlvbnMuZnVhSWQsXG4gIHNjSWQ6IHBvc2l0aW9uYWw/LnNjSWQgPz8gb3B0aW9ucy5zY0lkLFxuICBjb250ZXh0RGF0YTogb3B0aW9ucy5jb250ZXh0RGF0YSxcbn0pXG5cbmV4cG9ydCBjb25zdCBidWlsZENoYXRIaXN0b3J5RnJvbU1lc3NhZ2VzID0gKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBhdXRoVXNlcklkOiBzdHJpbmcpOiBDaGF0SGlzdG9yeVtdID0+XG4gIG1lc3NhZ2VzLm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXJJZCA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgfSkpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlTGFzdE1lc3NhZ2VBZ2VudElkID0gKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IG1lc3NhZ2VzLmF0KC0xKT8uYWdlbnRJZFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFnZW50SWRGb3JTdHJlYW0gPSAoXG4gIGFnZW50SWRGcm9tTWVzc2FnZXM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2tBZ2VudElkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyA9PiBhZ2VudElkRnJvbU1lc3NhZ2VzIHx8IGZhbGxiYWNrQWdlbnRJZCB8fCAnJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVVzZXJRdWVzdGlvbk1lc3NhZ2VJZCA9ICh0dXJuTWVzc2FnZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYHF1ZXN0aW9uLSR7dHVybk1lc3NhZ2VJZH1gXG5cbmV4cG9ydCB0eXBlIE1haWFTdHJlYW1SZXF1ZXN0UGF5bG9hZCA9IHtcbiAgbWVzc2FnZTogc3RyaW5nXG4gIGhpc3Rvcnk6IENoYXRIaXN0b3J5W11cbiAgcHJvamVjdElkOiBudW1iZXIgfCBudWxsXG4gIGxhbmc6IHN0cmluZ1xuICB1c2VySWQ6IHN0cmluZ1xuICBmaXJzdE5hbWU6IHN0cmluZ1xuICBsYXN0TmFtZTogc3RyaW5nXG4gIGNvbXBhbnlJZDogc3RyaW5nXG4gIGNoYXRJZDogc3RyaW5nXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4gIGFnZW50TmFtZTogc3RyaW5nXG4gIGFnZW50SWQ6IHN0cmluZ1xuICBpc1dlYlNlYXJjaEFjdGl2ZTogYm9vbGVhblxuICBpc0RlZXBTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogYm9vbGVhblxuICBjbGllbnRJZD86IG51bWJlclxuICBjbGllbnROYW1lPzogc3RyaW5nXG4gIGZlZUlkPzogbnVtYmVyXG4gIHByb2plY3ROYW1lPzogc3RyaW5nXG4gIHRhc2tJZD86IG51bWJlclxuICB0YXNrTmFtZT86IHN0cmluZ1xuICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgZmFxSWQ/OiBzdHJpbmdcbiAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgZnVhSWQ/OiBzdHJpbmdcbiAgc2NJZD86IHN0cmluZ1xuICBhZ2VudEVudGl0eT86IEFnZW50RW50aXR5XG4gIGFnZW50VHlwZT86IEFnZW50VHlwZVxuICBhZ2VudEVtb2ppPzogc3RyaW5nIHwgbnVsbFxuICBjb250ZXh0TWVzc2FnZT86IENvbnRleHRNZXNzYWdlXG4gIGNvbnRleHREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkID0gKHBhcmFtczoge1xuICBtZXNzYWdlOiBzdHJpbmdcbiAgaGlzdG9yeTogQ2hhdEhpc3RvcnlbXVxuICBwcm9qZWN0SWQ6IG51bWJlciB8IG51bGxcbiAgYXV0aFVzZXI6IFBpY2s8Q09SVXNlciwgJ2xhbmcnIHwgJ2lkJyB8ICdmaXJzdE5hbWUnIHwgJ2xhc3ROYW1lJyB8ICdjb21wYW55X2lkJz5cbiAgY2hhdElkOiBzdHJpbmdcbiAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgYWdlbnROYW1lOiBzdHJpbmdcbiAgYWdlbnRJZDogc3RyaW5nXG4gIGlzV2ViU2VhcmNoQWN0aXZlOiBib29sZWFuXG4gIGlzRGVlcFNlYXJjaEFjdGl2ZTogYm9vbGVhblxuICBpc0F1dG9BcHByb3ZlQWN0aXZlOiBib29sZWFuXG4gIGN0eFByb2plY3Q6IFByb2plY3QgfCBudWxsIHwgdW5kZWZpbmVkXG4gIGN0eENsaWVudDogeyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuICBjdHhUYXNrOiB7IGlkPzogbnVtYmVyIHwgc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkXG4gIHByb2plY3ROYW1lPzogc3RyaW5nXG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBmYXFJZD86IHN0cmluZ1xuICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICBmdWFJZD86IHN0cmluZ1xuICBzY0lkPzogc3RyaW5nXG4gIGFnZW50RW50aXR5PzogQWdlbnRFbnRpdHlcbiAgYWdlbnRUeXBlPzogQWdlbnRUeXBlXG4gIGFnZW50RW1vamk/OiBzdHJpbmcgfCBudWxsXG4gIGNvbnRleHRNZXNzYWdlPzogQ29udGV4dE1lc3NhZ2VcbiAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxufSk6IE1haWFTdHJlYW1SZXF1ZXN0UGF5bG9hZCA9PiAoe1xuICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgaGlzdG9yeTogcGFyYW1zLmhpc3RvcnksXG4gIHByb2plY3RJZDogcGFyYW1zLnByb2plY3RJZCxcbiAgbGFuZzogcGFyYW1zLmF1dGhVc2VyLmxhbmcsXG4gIHVzZXJJZDogcGFyYW1zLmF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gIGZpcnN0TmFtZTogcGFyYW1zLmF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgbGFzdE5hbWU6IHBhcmFtcy5hdXRoVXNlci5sYXN0TmFtZSxcbiAgY29tcGFueUlkOiBwYXJhbXMuYXV0aFVzZXIuY29tcGFueV9pZC50b1N0cmluZygpLFxuICBjaGF0SWQ6IHBhcmFtcy5jaGF0SWQsXG4gIG1lc3NhZ2VJZDogcGFyYW1zLm1lc3NhZ2VJZCxcbiAgYWdlbnROYW1lOiBwYXJhbXMuYWdlbnROYW1lLFxuICBhZ2VudElkOiBwYXJhbXMuYWdlbnRJZCxcbiAgaXNXZWJTZWFyY2hBY3RpdmU6IHBhcmFtcy5pc1dlYlNlYXJjaEFjdGl2ZSxcbiAgaXNEZWVwU2VhcmNoQWN0aXZlOiBwYXJhbXMuaXNEZWVwU2VhcmNoQWN0aXZlLFxuICBpc0F1dG9BcHByb3ZlQWN0aXZlOiBwYXJhbXMuaXNBdXRvQXBwcm92ZUFjdGl2ZSxcbiAgLi4uKHBhcmFtcy5jdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKHBhcmFtcy5jdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChwYXJhbXMuY3R4Q2xpZW50LCBwYXJhbXMuY3R4UHJvamVjdCksXG4gIC4uLihwYXJhbXMucHJvamVjdE5hbWUgPyB7IHByb2plY3ROYW1lOiBwYXJhbXMucHJvamVjdE5hbWUgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5jdHhUYXNrPy5pZCAhPSBudWxsXG4gICAgPyB7IHRhc2tJZDogTnVtYmVyKHBhcmFtcy5jdHhUYXNrLmlkKSwgLi4uKHBhcmFtcy5jdHhUYXNrLm5hbWUgPyB7IHRhc2tOYW1lOiBwYXJhbXMuY3R4VGFzay5uYW1lIH0gOiB7fSkgfVxuICAgIDoge30pLFxuICAuLi4ocGFyYW1zLmF0dGFjaG1lbnRzICYmIHBhcmFtcy5hdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50czogcGFyYW1zLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuZmFxSWQgPyB7IGZhcUlkOiBwYXJhbXMuZmFxSWQgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5hZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHBhcmFtcy5hZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAuLi4ocGFyYW1zLmZ1YUlkID8geyBmdWFJZDogcGFyYW1zLmZ1YUlkIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuc2NJZCA/IHsgc2NJZDogcGFyYW1zLnNjSWQgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5hZ2VudEVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogcGFyYW1zLmFnZW50RW50aXR5IH0gOiB7fSksXG4gIC4uLihwYXJhbXMuYWdlbnRUeXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogcGFyYW1zLmFnZW50VHlwZSB9IDoge30pLFxuICAuLi4ocGFyYW1zLmFnZW50RW1vamkgIT0gbnVsbCA/IHsgYWdlbnRFbW9qaTogcGFyYW1zLmFnZW50RW1vamkgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5jb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2U6IHBhcmFtcy5jb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAuLi4ocGFyYW1zLmNvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogcGFyYW1zLmNvbnRleHREYXRhIH0gOiB7fSksXG59KVxuXG5leHBvcnQgY29uc3QgYnVpbGRNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWRGb3JQcm9qZWN0Q2hhbmdlID0gKHBhcmFtczoge1xuICBtZXNzYWdlOiBzdHJpbmdcbiAgaGlzdG9yeTogQ2hhdEhpc3RvcnlbXVxuICBwcm9qZWN0OiBQcm9qZWN0XG4gIGF1dGhVc2VyOiBQaWNrPENPUlVzZXIsICdsYW5nJyB8ICdpZCcgfCAnZmlyc3ROYW1lJyB8ICdsYXN0TmFtZScgfCAnY29tcGFueV9pZCc+XG4gIGNoYXRJZDogc3RyaW5nXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4gIGFnZW50TmFtZTogc3RyaW5nXG4gIGFnZW50SWQ6IHN0cmluZ1xuICBpc1dlYlNlYXJjaEFjdGl2ZTogYm9vbGVhblxuICBpc0RlZXBTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogYm9vbGVhblxuICBhZ2VudEVudGl0eT86IEFnZW50RW50aXR5XG4gIGFnZW50VHlwZT86IEFnZW50VHlwZVxufSk6IE1haWFTdHJlYW1SZXF1ZXN0UGF5bG9hZCA9PiAoe1xuICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgaGlzdG9yeTogcGFyYW1zLmhpc3RvcnksXG4gIHByb2plY3RJZDogcGFyYW1zLnByb2plY3QuaWQsXG4gIGxhbmc6IHBhcmFtcy5hdXRoVXNlci5sYW5nLFxuICB1c2VySWQ6IHBhcmFtcy5hdXRoVXNlci5pZC50b1N0cmluZygpLFxuICBmaXJzdE5hbWU6IHBhcmFtcy5hdXRoVXNlci5maXJzdE5hbWUsXG4gIGxhc3ROYW1lOiBwYXJhbXMuYXV0aFVzZXIubGFzdE5hbWUsXG4gIGNvbXBhbnlJZDogcGFyYW1zLmF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgY2hhdElkOiBwYXJhbXMuY2hhdElkLFxuICBtZXNzYWdlSWQ6IHBhcmFtcy5tZXNzYWdlSWQsXG4gIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgYWdlbnRJZDogcGFyYW1zLmFnZW50SWQsXG4gIGlzV2ViU2VhcmNoQWN0aXZlOiBwYXJhbXMuaXNXZWJTZWFyY2hBY3RpdmUsXG4gIGlzRGVlcFNlYXJjaEFjdGl2ZTogcGFyYW1zLmlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogcGFyYW1zLmlzQXV0b0FwcHJvdmVBY3RpdmUsXG4gIC4uLihwYXJhbXMucHJvamVjdC5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKHBhcmFtcy5wcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAuLi4ocGFyYW1zLnByb2plY3QuY2xpZW50SWQgIT0gbnVsbCA/IHsgY2xpZW50SWQ6IE51bWJlcihwYXJhbXMucHJvamVjdC5jbGllbnRJZCkgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5hZ2VudEVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogcGFyYW1zLmFnZW50RW50aXR5IH0gOiB7fSksXG4gIC4uLihwYXJhbXMuYWdlbnRUeXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogcGFyYW1zLmFnZW50VHlwZSB9IDoge30pLFxufSlcblxuZXhwb3J0IHR5cGUgU3RyZWFtRXJyb3JIYW5kbGluZ01vZGUgPSAncmV0cnktcmVzdG9yZScgfCAnY29tbWl0LWVycm9yJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVN0cmVhbUVycm9ySGFuZGxpbmdNb2RlID0gKGhhc1JldHJ5U25hcHNob3Q6IGJvb2xlYW4pOiBTdHJlYW1FcnJvckhhbmRsaW5nTW9kZSA9PlxuICBoYXNSZXRyeVNuYXBzaG90ID8gJ3JldHJ5LXJlc3RvcmUnIDogJ2NvbW1pdC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1FcnJvckFzc2lzdGFudE1lc3NhZ2VJZCA9IChtZXNzYWdlSWQ6IHN0cmluZyk6IHN0cmluZyA9PiBgYW5zd2VyLSR7bWVzc2FnZUlkfWBcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU3RyZWFtRXJyb3JBc3Npc3RhbnRNZXNzYWdlID0gKHBhcmFtczoge1xuICBtZXNzYWdlSWQ6IHN0cmluZ1xuICBtZXNzYWdlOiBzdHJpbmdcbiAgc2hvd1JldHJ5OiBib29sZWFuXG4gIHJldHJ5TGFiZWw6IHN0cmluZ1xufSk6IENoYXRNZXNzYWdlID0+ICh7XG4gIGlkOiByZXNvbHZlU3RyZWFtRXJyb3JBc3Npc3RhbnRNZXNzYWdlSWQocGFyYW1zLm1lc3NhZ2VJZCksXG4gIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICBpc0Vycm9yOiB0cnVlLFxuICAuLi4ocGFyYW1zLnNob3dSZXRyeSA/IHsgc3VnZ2VzdGlvbnM6IFtwYXJhbXMucmV0cnlMYWJlbF0gfSA6IHt9KSxcbiAgZGF0ZTogbmV3IERhdGUoKSxcbiAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG59KVxuXG5leHBvcnQgdHlwZSBIaXRsQXBwcm92YWxSZXF1aXJlZE91dGNvbWUgPSB7IHR5cGU6ICdza2lwLXVpJyB9IHwgeyB0eXBlOiAnc2hvdy11aSc7IGFwcHJvdmFsTWVzc2FnZUlkOiBzdHJpbmcgfVxuXG4vKiogSElUTCBwcmUtYXByb2JhZG8gKG1hbnVhbC9hdXRvKTogZWwgc3RyZWFtIHNpZ3VlIHNpbiBwaW50YXIgbGEgY2FqYSBkZSBhcHJvYmFjacOzbi4gKi9cbmV4cG9ydCBjb25zdCBzaG91bGRTa2lwSGl0bEFwcHJvdmFsVWkgPSAoYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdCk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihhcHByb3ZhbC5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgfHwgYXBwcm92YWwuYXV0b19hcHByb3ZlZCB8fCBhcHByb3ZhbC5hcHByb3ZhbF9zdGF0dXMgPT09ICdhcHByb3ZlZCcpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlSGl0bEFwcHJvdmFsUmVxdWlyZWRPdXRjb21lID0gKGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QpOiBIaXRsQXBwcm92YWxSZXF1aXJlZE91dGNvbWUgPT5cbiAgc2hvdWxkU2tpcEhpdGxBcHByb3ZhbFVpKGFwcHJvdmFsKVxuICAgID8geyB0eXBlOiAnc2tpcC11aScgfVxuICAgIDogeyB0eXBlOiAnc2hvdy11aScsIGFwcHJvdmFsTWVzc2FnZUlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCB9XG5cbmV4cG9ydCBjb25zdCBidWlsZEhpdGxBcHByb3ZhbFBlbmRpbmdNZXNzYWdlID0gKHBhcmFtczoge1xuICBhcHByb3ZhbE1lc3NhZ2VJZDogc3RyaW5nXG4gIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nXG4gIGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3RcbiAgcmVhc29uaW5nPzogUmVhc29uaW5nVHJhY2UgfCBudWxsXG59KTogQ2hhdE1lc3NhZ2UgPT4gKHtcbiAgaWQ6IHBhcmFtcy5hcHByb3ZhbE1lc3NhZ2VJZCxcbiAgbWVzc2FnZTogcGFyYW1zLmFjY3VtdWxhdGVkQ29udGVudCB8fCAnJyxcbiAgZGF0ZTogbmV3IERhdGUoKSxcbiAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gIGFwcHJvdmFsOiBwYXJhbXMuYXBwcm92YWwsXG4gIGFwcHJvdmFsU3RhdHVzOiAncGVuZGluZycsXG4gIHJlYXNvbmluZzogcGFyYW1zLnJlYXNvbmluZyxcbn0pXG5cbmV4cG9ydCBjb25zdCBzaG91bGRQcmVzZXJ2ZVJlYXNvbmluZ09uU3RyZWFtU3RvcCA9IChzdG9wcGVkVHJhY2U6IFJlYXNvbmluZ1RyYWNlIHwgbnVsbCk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihzdG9wcGVkVHJhY2U/LnN0ZXBzLmxlbmd0aClcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU3RyZWFtU3RvcFBhcnRpYWxBc3Npc3RhbnRNZXNzYWdlID0gKHBhcmFtczoge1xuICBmaW5hbE1lc3NhZ2VJZDogc3RyaW5nXG4gIHBhcnRpYWxUZXh0OiBzdHJpbmdcbiAgc3RvcHBlZFRyYWNlOiBSZWFzb25pbmdUcmFjZSB8IG51bGxcbn0pOiBDaGF0TWVzc2FnZSA9PiAoe1xuICBpZDogcGFyYW1zLmZpbmFsTWVzc2FnZUlkLFxuICBtZXNzYWdlOiBwYXJhbXMucGFydGlhbFRleHQsXG4gIGRhdGU6IG5ldyBEYXRlKCksXG4gIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAuLi4ocGFyYW1zLnN0b3BwZWRUcmFjZSA/IHsgcmVhc29uaW5nOiBwYXJhbXMuc3RvcHBlZFRyYWNlIH0gOiB7fSksXG59KVxuXG5leHBvcnQgY29uc3QgYnVpbGRTdHJlYW1TdG9wQ2FuY2VsbGVkQXNzaXN0YW50TWVzc2FnZSA9IChwYXJhbXM6IHtcbiAgY2FuY2VsbGVkTWVzc2FnZUlkOiBzdHJpbmdcbiAgY2FuY2VsbGVkTGFiZWw6IHN0cmluZ1xufSk6IENoYXRNZXNzYWdlID0+ICh7XG4gIGlkOiBwYXJhbXMuY2FuY2VsbGVkTWVzc2FnZUlkLFxuICBtZXNzYWdlOiBwYXJhbXMuY2FuY2VsbGVkTGFiZWwsXG4gIGRhdGU6IG5ldyBEYXRlKCksXG4gIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICBpc0Zyb250ZW5kQ2FuY2VsbGVkOiB0cnVlLFxufSlcblxuZXhwb3J0IHR5cGUgUmV0cnlCbG9ja1JlYXNvbiA9ICdidXN5JyB8ICdzZXNzaW9uLWFjdGl2ZScgfCAnY29uY3VycmVuY3knXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUmV0cnlCbG9ja1JlYXNvbiA9IChwYXJhbXM6IHtcbiAgaXNQcm9jZXNzaW5nOiBib29sZWFuXG4gIHdhaXRpbmdSZXNwb25zZTogYm9vbGVhblxuICBsb2FkaW5nTWVzc2FnZXM6IGJvb2xlYW5cbiAgaXNTZXNzaW9uU3RyZWFtQWN0aXZlOiBib29sZWFuXG4gIGFjdGl2ZVN0cmVhbUNvdW50OiBudW1iZXJcbiAgbWF4Q29uY3VycmVudDogbnVtYmVyXG59KTogUmV0cnlCbG9ja1JlYXNvbiB8IG51bGwgPT4ge1xuICBpZiAocGFyYW1zLmlzUHJvY2Vzc2luZyB8fCBwYXJhbXMud2FpdGluZ1Jlc3BvbnNlIHx8IHBhcmFtcy5sb2FkaW5nTWVzc2FnZXMpIHJldHVybiAnYnVzeSdcbiAgaWYgKHBhcmFtcy5pc1Nlc3Npb25TdHJlYW1BY3RpdmUpIHJldHVybiAnc2Vzc2lvbi1hY3RpdmUnXG4gIGlmIChwYXJhbXMuYWN0aXZlU3RyZWFtQ291bnQgPj0gcGFyYW1zLm1heENvbmN1cnJlbnQpIHJldHVybiAnY29uY3VycmVuY3knXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRVc2VPcmNoZXN0cmF0b3JSZXRyeUZhbGxiYWNrID0gKFxuICBtZXNzYWdlOiBQaWNrPENoYXRNZXNzYWdlLCAnaXNGcm9udGVuZENhbmNlbGxlZCcgfCAnbWVtb3J5U2Vzc2lvbklkJz5cbik6IGJvb2xlYW4gPT4gQm9vbGVhbihtZXNzYWdlLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiYgIW1lc3NhZ2UubWVtb3J5U2Vzc2lvbklkPy50cmltKCkpXG5cbmV4cG9ydCB0eXBlIFJldHJ5RWxpZ2liaWxpdHkgPVxuICB8IHsgZWxpZ2libGU6IGZhbHNlOyByZWFzb246ICdub3QtaW4tdGhyZWFkJyB8ICdlbXB0eS11c2VyJyB8ICduby10dXJuJyB9XG4gIHwgeyBlbGlnaWJsZTogdHJ1ZTsgdHVybklkOiBzdHJpbmcgfCBudWxsOyB1c2VPcmNoZXN0cmF0b3JGYWxsYmFjazogYm9vbGVhbiB9XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUmV0cnlFbGlnaWJpbGl0eSA9IChcbiAgcHJldmlvdXNNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSxcbiAgbWVzc2FnZTogQ2hhdE1lc3NhZ2UsXG4gIHVzZXJNZXNzYWdlOiBDaGF0TWVzc2FnZSB8IG51bGwgfCB1bmRlZmluZWRcbik6IFJldHJ5RWxpZ2liaWxpdHkgPT4ge1xuICBpZiAoIXByZXZpb3VzTWVzc2FnZXMuc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IG1lc3NhZ2UuaWQpKSB7XG4gICAgcmV0dXJuIHsgZWxpZ2libGU6IGZhbHNlLCByZWFzb246ICdub3QtaW4tdGhyZWFkJyB9XG4gIH1cbiAgaWYgKCF1c2VyTWVzc2FnZT8ubWVzc2FnZT8udHJpbSgpICYmICF1c2VyTWVzc2FnZT8uYXR0YWNobWVudHM/Lmxlbmd0aCAmJiAhdXNlck1lc3NhZ2U/LnNvdXJjZXM/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7IGVsaWdpYmxlOiBmYWxzZSwgcmVhc29uOiAnZW1wdHktdXNlcicgfVxuICB9XG4gIGNvbnN0IHR1cm5JZCA9IHJlc29sdmVSZXRyeVR1cm5JZChtZXNzYWdlKVxuICBjb25zdCB1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayA9IHNob3VsZFVzZU9yY2hlc3RyYXRvclJldHJ5RmFsbGJhY2sobWVzc2FnZSlcbiAgaWYgKCF0dXJuSWQgJiYgIXVzZU9yY2hlc3RyYXRvckZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHsgZWxpZ2libGU6IGZhbHNlLCByZWFzb246ICduby10dXJuJyB9XG4gIH1cbiAgcmV0dXJuIHsgZWxpZ2libGU6IHRydWUsIHR1cm5JZCwgdXNlT3JjaGVzdHJhdG9yRmFsbGJhY2sgfVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJldHJ5VXNlckF0dGFjaG1lbnRzID0gKHVzZXJNZXNzYWdlOiBDaGF0TWVzc2FnZSk6IEF0dGFjaG1lbnRGaWxlW10gPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh1c2VyTWVzc2FnZS5hdHRhY2htZW50cykpIHJldHVybiB1c2VyTWVzc2FnZS5hdHRhY2htZW50c1xuICBpZiAoQXJyYXkuaXNBcnJheSh1c2VyTWVzc2FnZS5zb3VyY2VzKSkgcmV0dXJuIHVzZXJNZXNzYWdlLnNvdXJjZXNcbiAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRVcGRhdGVQcm9qZWN0T25DaGFuZ2UgPSAobmV4dFByb2plY3RJZDogbnVtYmVyLCBjdXJyZW50UHJvamVjdElkPzogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBuZXh0UHJvamVjdElkICE9PSBjdXJyZW50UHJvamVjdElkXG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZXNlbmRBZnRlclByb2plY3RDaGFuZ2UgPSAoXG4gIHVzZXJRdWVzdGlvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcHJvamVjdDogUHJvamVjdCB8IG51bGwgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4gPT4gQm9vbGVhbih1c2VyUXVlc3Rpb24gJiYgcHJvamVjdClcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBcHByb3ZhbERlY2lzaW9uU3RhdHVzID0gKGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0Jyk6ICdhcHByb3ZlZCcgfCAncmVqZWN0ZWQnID0+XG4gIGRlY2lzaW9uID09PSAnYXBwcm92ZScgPyAnYXBwcm92ZWQnIDogJ3JlamVjdGVkJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRpbnVlU3RyZWFtRGVjaXNpb24gPSAoXG4gIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgZWRpdGVkQWN0aW9ucz86IHVua25vd25bXVxuKTogJ2FwcHJvdmUnIHwgJ3JlamVjdCcgfCAnZWRpdCcgPT4gKGVkaXRlZEFjdGlvbnMgPyAnZWRpdCcgOiBkZWNpc2lvbilcblxuZXhwb3J0IHR5cGUgQXBwcm92YWxTdHJlYW1CbG9ja1JlYXNvbiA9XG4gICdtaXNzaW5nLXRocmVhZHMnIHwgJ21pc3NpbmctYXBwcm92YWwnIHwgJ21pc3Npbmctc2Vzc2lvbicgfCAnc2Vzc2lvbi1hY3RpdmUnIHwgJ2xpbWl0J1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFwcHJvdmFsU3RyZWFtQmxvY2tSZWFzb24gPSAocGFyYW1zOiB7XG4gIHRocmVhZElkczogc3RyaW5nW11cbiAgaGFzQXBwcm92YWxNZXNzYWdlOiBib29sZWFuXG4gIHNlc3Npb25JZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBpc1Nlc3Npb25TdHJlYW1BY3RpdmU6IGJvb2xlYW5cbiAgYWN0aXZlU3RyZWFtQ291bnQ6IG51bWJlclxuICBtYXhDb25jdXJyZW50OiBudW1iZXJcbn0pOiBBcHByb3ZhbFN0cmVhbUJsb2NrUmVhc29uIHwgbnVsbCA9PiB7XG4gIGlmICghcGFyYW1zLnRocmVhZElkcz8ubGVuZ3RoKSByZXR1cm4gJ21pc3NpbmctdGhyZWFkcydcbiAgaWYgKCFwYXJhbXMuaGFzQXBwcm92YWxNZXNzYWdlKSByZXR1cm4gJ21pc3NpbmctYXBwcm92YWwnXG4gIGlmICghcGFyYW1zLnNlc3Npb25JZCkgcmV0dXJuICdtaXNzaW5nLXNlc3Npb24nXG4gIGlmIChwYXJhbXMuaXNTZXNzaW9uU3RyZWFtQWN0aXZlKSByZXR1cm4gJ3Nlc3Npb24tYWN0aXZlJ1xuICBpZiAocGFyYW1zLmFjdGl2ZVN0cmVhbUNvdW50ID49IHBhcmFtcy5tYXhDb25jdXJyZW50KSByZXR1cm4gJ2xpbWl0J1xuICByZXR1cm4gbnVsbFxufVxuXG4vKiogVG9vbHMgZGUgY2FyZ2EgZGUgaG9yYXMgYSBzaW5jcm9uaXphciBjb24gUGxhbm5lciBhbCBjZXJyYXIgdW4gc3RyZWFtIChISVRMIGFwcm9iYWRvKS4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlSG91cnNDaGFyZ2VUb29sc09uU3RyZWFtRmluaXNoID0gKFxuICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlOiBib29sZWFuLFxuICBhcHByb3ZhbFN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLFxuICBtYW51YWxBcHByb3ZhbFRvb2xOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGhvdXJzVG9vbHNGcm9tQXBwcm92YWwgPSBwZW5kaW5nQWN0aW9uc1xuICAgIC5tYXAoYWN0aW9uID0+IGFjdGlvbi50b29sX25hbWUpXG4gICAgLmZpbHRlcigodG9vbE5hbWUpOiB0b29sTmFtZSBpcyBzdHJpbmcgPT4gaXNIb3Vyc0NoYXJnZVRvb2wodG9vbE5hbWUpKVxuXG4gIGNvbnN0IHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgPVxuICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiYgaG91cnNUb29sc0Zyb21BcHByb3ZhbC5sZW5ndGggPiAwXG5cbiAgaWYgKHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQpIHtcbiAgICByZXR1cm4gaG91cnNUb29sc0Zyb21BcHByb3ZhbFxuICB9XG5cbiAgaWYgKGlzSG91cnNDaGFyZ2VUb29sKG1hbnVhbEFwcHJvdmFsVG9vbE5hbWUpKSB7XG4gICAgcmV0dXJuIG1hbnVhbEFwcHJvdmFsVG9vbE5hbWUgPyBbbWFudWFsQXBwcm92YWxUb29sTmFtZV0gOiBbXVxuICB9XG5cbiAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBjb25zdCBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEJ5VGhyZWFkSWRzID0gKFxuICB0aHJlYWRJZHM6IHN0cmluZ1tdLFxuICBhY3RpdmVNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSxcbiAgc2Vzc2lvbk1lc3NhZ2VzQnlJZDogUmVjb3JkPHN0cmluZywgQ2hhdE1lc3NhZ2VbXT4sXG4gIGFjdGl2ZVNlc3Npb25JZDogc3RyaW5nIHwgbnVsbFxuKTogeyBtZXNzYWdlOiBDaGF0TWVzc2FnZTsgc2Vzc2lvbklkOiBzdHJpbmcgfSB8IG51bGwgPT4ge1xuICBjb25zdCBmcm9tQWN0aXZlVmlldyA9IGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsSW5MaXN0KHRocmVhZElkcywgYWN0aXZlTWVzc2FnZXMsIGFjdGl2ZVNlc3Npb25JZCB8fCAnJylcbiAgaWYgKGZyb21BY3RpdmVWaWV3KSByZXR1cm4gZnJvbUFjdGl2ZVZpZXdcblxuICBjb25zdCBzZXNzaW9uRW50cnkgPSBPYmplY3QuZW50cmllcyhzZXNzaW9uTWVzc2FnZXNCeUlkKS5maW5kKChbLCBzZXNzaW9uTWVzc2FnZXNdKSA9PlxuICAgIHNlc3Npb25NZXNzYWdlcy5zb21lKG1lc3NhZ2UgPT5cbiAgICAgIG1lc3NhZ2UuYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucz8uc29tZShhY3Rpb24gPT4gdGhyZWFkSWRzLmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICAgIClcbiAgKVxuXG4gIGlmICghc2Vzc2lvbkVudHJ5KSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IFtzZXNzaW9uSWQsIHNlc3Npb25NZXNzYWdlc10gPSBzZXNzaW9uRW50cnlcbiAgcmV0dXJuIGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsSW5MaXN0KHRocmVhZElkcywgc2Vzc2lvbk1lc3NhZ2VzLCBzZXNzaW9uSWQpXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtRmluaXNoRmluYWxNZXNzYWdlSWQgPSAobWVtb3J5U2Vzc2lvbklkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYGFuc3dlci0ke21lbW9yeVNlc3Npb25JZH1gXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtU3RvcE1lc3NhZ2VJZHMgPSAoXG4gIGN1cnJlbnRNZXNzYWdlSWQ6IHN0cmluZ1xuKToge1xuICBmaW5hbE1lc3NhZ2VJZDogc3RyaW5nXG4gIGNhbmNlbGxlZE1lc3NhZ2VJZDogc3RyaW5nXG59ID0+ICh7XG4gIGZpbmFsTWVzc2FnZUlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZH1gLFxuICBjYW5jZWxsZWRNZXNzYWdlSWQ6IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkfS1jYW5jZWxsZWRgLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZW50YWJpbGlkYWRQcm9qZWN0RmFxTWVzc2FnZSA9IChcbiAgbWVzc2FnZTogc3RyaW5nLFxuICByZW50YWJpbGlkYWRMYWJlbDogc3RyaW5nLFxuICBpbmNvbWVUeXBlPzogc3RyaW5nIHwgbnVsbFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKG1lc3NhZ2UgIT09IHJlbnRhYmlsaWRhZExhYmVsKSByZXR1cm4gbWVzc2FnZVxuICByZXR1cm4gYEZBUTogJHtyZW50YWJpbGlkYWRMYWJlbH0gLSBUaXBvIGRlIHJlbnRhYmlsaWRhZDogJHtpbmNvbWVUeXBlID8/ICcnfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1FcnJvclVzZXJNZXNzYWdlID0gKFxuICBtZXNzYWdlS2V5OiBTdHJlYW1FcnJvck1lc3NhZ2VLZXksXG4gIHRyYW5zbGF0ZTogKGtleTogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiBzdHJpbmcsXG4gIHRva2Vuc1VzZWQ6IHN0cmluZ1xuKTogc3RyaW5nID0+IHtcbiAgaWYgKG1lc3NhZ2VLZXkgPT09ICdjaGF0LmVycm9yQWNjZXNzRGVuaWVkJykgcmV0dXJuIHRyYW5zbGF0ZSgnY2hhdC5lcnJvckFjY2Vzc0RlbmllZCcpXG4gIGlmIChtZXNzYWdlS2V5ID09PSAnY2hhdC5lcnJvclByb21wdFRvb0xvbmcnKSByZXR1cm4gdHJhbnNsYXRlKCdjaGF0LmVycm9yUHJvbXB0VG9vTG9uZycsIHsgdXNlZDogdG9rZW5zVXNlZCB9KVxuICByZXR1cm4gdHJhbnNsYXRlKCdjaGF0LmVycm9yJylcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVQcmV2aW91c0Fzc2lzdGFudE1lc3NhZ2VCZWZvcmVQbGFjZWhvbGRlciA9IChcbiAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuKTogQ2hhdE1lc3NhZ2UgfCB1bmRlZmluZWQgPT4gbWVzc2FnZXMuZmlsdGVyKG1lc3NhZ2UgPT4gbWVzc2FnZS5pZCAhPT0gcGxhY2Vob2xkZXJJZCkuYXQoLTEpXG5cbmV4cG9ydCB0eXBlIEhpdGxFeGVjdXRpb25Db250ZXh0U25hcHNob3QgPSB7XG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4gIG1lc3NhZ2VUZXh0OiBzdHJpbmdcbiAgYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdXG4gIHRocmVhZElkczogc3RyaW5nW11cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVIaXRsRXhlY3V0aW9uQ29udGV4dCA9IChcbiAgYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdCxcbiAgYWNjdW11bGF0ZWRDb250ZW50OiBzdHJpbmdcbik6IEhpdGxFeGVjdXRpb25Db250ZXh0U25hcHNob3QgPT4gKHtcbiAgbWVzc2FnZUlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCxcbiAgbWVzc2FnZVRleHQ6IGFjY3VtdWxhdGVkQ29udGVudCB8fCAnJyxcbiAgYXBwcm92YWwsXG4gIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gIHRocmVhZElkczpcbiAgICBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnNcbiAgICAgID8ubWFwKGFjdGlvbiA9PiBhY3Rpb24udGhyZWFkX2lkKVxuICAgICAgLmZpbHRlcigodGhyZWFkSWQpOiB0aHJlYWRJZCBpcyBzdHJpbmcgPT4gQm9vbGVhbih0aHJlYWRJZCkpID8/IFtdLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTa2lwcGVkSGl0bE1hbnVhbEFwcHJvdmFsID0gKFxuICBhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0XG4pOiB7IHRvb2xOYW1lOiBzdHJpbmc7IHRvb2xBcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfSB8IG51bGwgPT4ge1xuICBjb25zdCBmaXJzdEFjdGlvbiA9IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucz8uWzBdXG4gIGNvbnN0IHRvb2xOYW1lID0gKGFwcHJvdmFsIGFzIHsgdG9vbF9uYW1lPzogc3RyaW5nIH0pLnRvb2xfbmFtZSA/PyBmaXJzdEFjdGlvbj8udG9vbF9uYW1lID8/ICcnXG4gIGlmICghdG9vbE5hbWUpIHJldHVybiBudWxsXG4gIGNvbnN0IHRvb2xBcmdzID1cbiAgICAoKGFwcHJvdmFsIGFzIHsgdG9vbF9hcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkudG9vbF9hcmdzID8/XG4gICAgICAoZmlyc3RBY3Rpb24/LnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkpIHx8XG4gICAgbnVsbFxuICByZXR1cm4geyB0b29sTmFtZSwgdG9vbEFyZ3MgfVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUhpdGxTa2lwUmVzb2x1dGlvblNvdXJjZSA9IChhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0KTogJ21hbnVhbCcgfCAnYXV0bycgPT5cbiAgYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkID8gJ21hbnVhbCcgOiAnYXV0bydcblxuZXhwb3J0IHR5cGUgQ3JlYXRlQWdlbnRIaXRsQW5hbHl0aWNzRXZlbnQgPSB7XG4gIGFnZW50X3R5cGU6IHN0cmluZ1xuICBhY3Rpb25fdHlwZTogc3RyaW5nXG4gIGRlY2lzaW9uOiAnYWNjZXB0J1xuICBvcHRpb246ICdjcmVhdGVfYWdlbnQnXG4gIHJlc29sdXRpb25fc291cmNlPzogJ21hbnVhbCdcbiAgY3JlYXRlZF9hZ2VudF9pZD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNyZWF0ZUFnZW50SGl0bEFuYWx5dGljc0V2ZW50cyA9IChwYXJhbXM6IHtcbiAgd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZDogYm9vbGVhblxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdXG4gIG1hbnVhbEFwcHJvdmFsVG9vbE5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgY29tcGxldGVkQWdlbnRJZD86IHN0cmluZyB8IG51bGxcbiAgYWdlbnRUeXBlOiBzdHJpbmdcbiAgbm9ybWFsaXplVG9vbE5hbWU6ICh0b29sTmFtZTogc3RyaW5nKSA9PiBzdHJpbmdcbiAgYnVpbGRBY3Rpb25UeXBlTGlzdDogKGFjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSkgPT4gc3RyaW5nXG59KTogQ3JlYXRlQWdlbnRIaXRsQW5hbHl0aWNzRXZlbnRbXSA9PiB7XG4gIGNvbnN0IGV2ZW50czogQ3JlYXRlQWdlbnRIaXRsQW5hbHl0aWNzRXZlbnRbXSA9IFtdXG4gIGNvbnN0IHRyaW1tZWRBZ2VudElkID0gcGFyYW1zLmNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKVxuICBjb25zdCBpZEZpZWxkID0gdHJpbW1lZEFnZW50SWQgPyB7IGNyZWF0ZWRfYWdlbnRfaWQ6IHRyaW1tZWRBZ2VudElkIH0gOiB7fVxuXG4gIGlmIChwYXJhbXMud2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCkge1xuICAgIGV2ZW50cy5wdXNoKHtcbiAgICAgIGFnZW50X3R5cGU6IHBhcmFtcy5hZ2VudFR5cGUsXG4gICAgICBhY3Rpb25fdHlwZTogcGFyYW1zLmJ1aWxkQWN0aW9uVHlwZUxpc3QocGFyYW1zLnBlbmRpbmdBY3Rpb25zKSxcbiAgICAgIGRlY2lzaW9uOiAnYWNjZXB0JyxcbiAgICAgIG9wdGlvbjogJ2NyZWF0ZV9hZ2VudCcsXG4gICAgICAuLi5pZEZpZWxkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBtYW51YWxUb29sID0gcGFyYW1zLm1hbnVhbEFwcHJvdmFsVG9vbE5hbWVcbiAgaWYgKG1hbnVhbFRvb2wgJiYgcGFyYW1zLm5vcm1hbGl6ZVRvb2xOYW1lKG1hbnVhbFRvb2wpID09PSAnY3JlYXRlX2FnZW50Jykge1xuICAgIGV2ZW50cy5wdXNoKHtcbiAgICAgIGFnZW50X3R5cGU6IHBhcmFtcy5hZ2VudFR5cGUsXG4gICAgICBhY3Rpb25fdHlwZTogJ2NyZWF0ZV9hZ2VudCcsXG4gICAgICBkZWNpc2lvbjogJ2FjY2VwdCcsXG4gICAgICByZXNvbHV0aW9uX3NvdXJjZTogJ21hbnVhbCcsXG4gICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgLi4uaWRGaWVsZCxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRleHRQcm9qZWN0SWRGb3JEYXNoYm9hcmQgPSAoXG4gIHByb2plY3RJZDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBsYXN0TWVzc2FnZVByb2plY3RJZDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgcmF3ID0gcHJvamVjdElkID8/IGxhc3RNZXNzYWdlUHJvamVjdElkXG4gIGlmIChyYXcgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoU3RyaW5nKHJhdyksIDEwKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRGFzaGJvYXJkU3luY2VkQ29udGVudCA9IGFzeW5jIChcbiAgY29udGVudDogc3RyaW5nLFxuICB0YXNrVXJsUmVnZXg6IFJlZ0V4cCxcbiAgc2hvdWxkU3luY0Rhc2hib2FyZDogYm9vbGVhbixcbiAgdGFza0lkczogbnVtYmVyW10sXG4gIGdldFRhYlRhc2tEZWZhdWx0OiAodGFza0lkOiBudW1iZXIpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD5cbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGlmICghc2hvdWxkU3luY0Rhc2hib2FyZCB8fCB0YXNrSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnRcbiAgY29uc3QgbWF0Y2hlcyA9IFsuLi5jb250ZW50Lm1hdGNoQWxsKHRhc2tVcmxSZWdleCldXG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnRcbiAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQodGFza0lkc1swXSlcbiAgY29uc3QgdGFiU2VnbWVudCA9IHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJ1xuICByZXR1cm4gcmVwbGFjZVRhc2tVcmxzV2l0aFRhYlNlZ21lbnQoY29udGVudCwgdGFza1VybFJlZ2V4LCB0YWJTZWdtZW50KVxufVxuXG5leHBvcnQgY29uc3QgaXNUZXJtaW5hbFNlc3Npb25TdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gIHN0YXR1cyA9PT0gJ2NvbXBsZXRlJyB8fCBzdGF0dXMgPT09ICdlcnJvcidcblxuZXhwb3J0IGNvbnN0IGJ1aWxkVGVybWluYWxTZXNzaW9uUmVjb25jaWxpYXRpb25LZXkgPSAoXG4gIHNlc3Npb25JZDogc3RyaW5nLFxuICBzdGF0dXM6IHN0cmluZyxcbiAgZmluaXNoZWRBdD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbik6IHN0cmluZyA9PiBgJHtzZXNzaW9uSWR9OiR7c3RhdHVzfToke2ZpbmlzaGVkQXQgPz8gJyd9YFxuXG5leHBvcnQgY29uc3QgaGFzU3RhbGVTdHJlYW1pbmdQbGFjZWhvbGRlckluVGFpbCA9IChcbiAgdGFpbDogQXJyYXk8eyBpZD86IHN0cmluZyB9PixcbiAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogKG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiBib29sZWFuXG4pOiBib29sZWFuID0+IHRhaWwuc29tZShtZXNzYWdlID0+IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIobWVzc2FnZS5pZCkpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRGb3JjZVJlbG9hZE1lc3NhZ2VzT25UZXJtaW5hbFNlc3Npb24gPSAoXG4gIHN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YWlsOiBBcnJheTx7IGlkPzogc3RyaW5nIH0+LFxuICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiAobWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IGJvb2xlYW5cbik6IGJvb2xlYW4gPT4gaXNUZXJtaW5hbFNlc3Npb25TdGF0dXMoc3RhdHVzKSAmJiBoYXNTdGFsZVN0cmVhbWluZ1BsYWNlaG9sZGVySW5UYWlsKHRhaWwsIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVTZXNzaW9uRm9yTmV3SG9tZSA9IChcbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcHJldmlvdXNJbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuID0+ICFpbml0aWFsQ2hhdElkICYmIEJvb2xlYW4ocHJldmlvdXNJbml0aWFsQ2hhdElkKVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU3dpdGNoVG9Jbml0aWFsQ2hhdFNlc3Npb24gPSAoXG4gIGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRDaGF0SWQ6IHN0cmluZ1xuKTogYm9vbGVhbiA9PiBCb29sZWFuKGluaXRpYWxDaGF0SWQgJiYgaW5pdGlhbENoYXRJZCAhPT0gY3VycmVudENoYXRJZClcblxuZXhwb3J0IHR5cGUgTWFudWFsQXBwcm92YWxTbmFwc2hvdCA9IHsgdG9vbE5hbWU6IHN0cmluZzsgdG9vbEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfSB8IG51bGxcblxuZXhwb3J0IHR5cGUgU3RyZWFtRmluaXNoQXNzaXN0YW50Q29tbWl0ID0ge1xuICBmaW5hbE1lc3NhZ2VJZDogc3RyaW5nXG4gIGNvbnRlbnQ6IHN0cmluZ1xuICBzb3VyY2VzOiB1bmtub3duXG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nXG4gIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsXG4gIGNyZWF0ZUFnZW50Rm9sbG93VXA/OiBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlQ3JlYXRlQWdlbnRGb2xsb3dVcD5cbiAgcmVhc29uaW5nPzogUmVhc29uaW5nVHJhY2UgfCBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZFN0cmVhbUZpbmlzaEFzc2lzdGFudE1lc3NhZ2UgPSAocGFyYW1zOiBTdHJlYW1GaW5pc2hBc3Npc3RhbnRDb21taXQpOiBDaGF0TWVzc2FnZSA9PiAoe1xuICBpZDogcGFyYW1zLmZpbmFsTWVzc2FnZUlkLFxuICBtZXNzYWdlOiBwYXJhbXMuY29udGVudCxcbiAgZGF0ZTogbmV3IERhdGUoKSxcbiAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gIHNvdXJjZXM6IHBhcmFtcy5zb3VyY2VzLFxuICAuLi4ocGFyYW1zLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzOiBwYXJhbXMuYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgbWVtb3J5U2Vzc2lvbklkOiBwYXJhbXMubWVtb3J5U2Vzc2lvbklkLFxuICBzdWdnZXN0aW9uczogcGFyYW1zLnN1Z2dlc3Rpb25zIHx8IFtdLFxuICAuLi4ocGFyYW1zLmNyZWF0ZUFnZW50Rm9sbG93VXAgPyB7IGNyZWF0ZUFnZW50Rm9sbG93VXA6IHBhcmFtcy5jcmVhdGVBZ2VudEZvbGxvd1VwIH0gOiB7fSksXG4gIHJlYXNvbmluZzogcGFyYW1zLnJlYXNvbmluZyxcbn0pXG5cbmV4cG9ydCBjb25zdCBzaG91bGRNYXJrQ2hhdFJlYWRBZnRlclN0cmVhbUZpbmlzaCA9IChpc0FjdGl2ZTogYm9vbGVhbiwgaXNDaGF0Vmlld1Zpc2libGU6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gIGlzQWN0aXZlICYmIGlzQ2hhdFZpZXdWaXNpYmxlXG5cbmV4cG9ydCBjb25zdCBzaG91bGREaXNwYXRjaEZpcnN0U2Vzc2lvblJlZmV0Y2ggPSAoZmlyc3RUaW1lOiBib29sZWFuKTogYm9vbGVhbiA9PiBmaXJzdFRpbWVcblxuZXhwb3J0IHR5cGUgQWN0aXZlU3RyZWFtRmluaXNoUHJvY2Vzc2luZ1Jlc3VsdCA9IHtcbiAgY29udGVudFRvQWRkOiBzdHJpbmdcbiAgY3JlYXRlQWdlbnRGb2xsb3dVcDogUmV0dXJuVHlwZTx0eXBlb2YgcmVzb2x2ZUNyZWF0ZUFnZW50Rm9sbG93VXA+XG4gIGVkaXRBZ2VudEZvbGxvd1VwOiBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlRWRpdEFnZW50Rm9sbG93VXA+XG4gIGhvdXJzQ2hhcmdlVG9vbHM6IFJldHVyblR5cGU8dHlwZW9mIHJlc29sdmVIb3Vyc0NoYXJnZVRvb2xzT25TdHJlYW1GaW5pc2g+XG4gIGFmZmVjdGVkVGFza0lkczogc3RyaW5nW11cbiAgbWFudWFsV2FzVGFza0VkaXQ6IGJvb2xlYW5cbiAgbWFudWFsV2FzVGFza0RlbGV0ZTogYm9vbGVhblxuICB3YXNUYXNrRWRpdDogYm9vbGVhblxuICB3YXNUYXNrRGVsZXRlOiBib29sZWFuXG4gIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQ6IGJvb2xlYW5cbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFjdGl2ZVN0cmVhbUZpbmlzaFByb2Nlc3NpbmcocGFyYW1zOiB7XG4gIGNvbnRlbnQ6IHN0cmluZ1xuICBtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXVxuICB0ZW1wTWVzc2FnZUlkOiBzdHJpbmdcbiAgdGFza1VybFJlZ2V4OiBSZWdFeHBcbiAgcHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcGF0aG5hbWU6IHN0cmluZ1xuICBnZXRUYWJUYXNrRGVmYXVsdDogKHRhc2tJZDogbnVtYmVyKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+XG4gIG11bHRpQWdlbnRzQWNjZXNzOiBib29sZWFuXG4gIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsXG4gIG1hbnVhbEFwcHJvdmFsOiBNYW51YWxBcHByb3ZhbFNuYXBzaG90XG4gIGFwcGx5RGFzaGJvYXJkTXV0YXRpb24/OiAobXV0YXRpb246IFJldHVyblR5cGU8dHlwZW9mIHJlc29sdmVQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24+LCB0YXNrSWRzOiBudW1iZXJbXSkgPT4gdm9pZFxufSk6IFByb21pc2U8QWN0aXZlU3RyZWFtRmluaXNoUHJvY2Vzc2luZ1Jlc3VsdD4ge1xuICBsZXQgY29udGVudFRvQWRkID0gcGFyYW1zLmNvbnRlbnRcbiAgY29uc3QgcHJldmlvdXNNZXNzYWdlID0gcmVzb2x2ZVByZXZpb3VzQXNzaXN0YW50TWVzc2FnZUJlZm9yZVBsYWNlaG9sZGVyKHBhcmFtcy5tZXNzYWdlcywgcGFyYW1zLnRlbXBNZXNzYWdlSWQpXG4gIGNvbnN0IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsICE9IG51bGxcbiAgY29uc3QgcGVuZGluZ0FjdGlvbnMgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnMgfHwgW11cbiAgY29uc3Qge1xuICAgIHdhc1Rhc2tDcmVhdGlvbixcbiAgICB3YXNUYXNrRWRpdCxcbiAgICB3YXNUYXNrRGVsZXRlLFxuICAgIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQsXG4gICAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCxcbiAgICB3YXNFZGl0QWdlbnRBcHByb3ZlZCxcbiAgfSA9IHJlc29sdmVBcHByb3ZlZFBlbmRpbmdBY3Rpb25GbGFncyhoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlLCBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzLCBwZW5kaW5nQWN0aW9ucylcblxuICBjb25zdCBjcmVhdGVBZ2VudEZvbGxvd1VwID0gcmVzb2x2ZUNyZWF0ZUFnZW50Rm9sbG93VXAoXG4gICAgeyB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkLCB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkIH0sXG4gICAgcGFyYW1zLm11bHRpQWdlbnRzQWNjZXNzLFxuICAgIHBhcmFtcy5jb21wbGV0ZWRBZ2VudElkLFxuICAgIHBlbmRpbmdBY3Rpb25zXG4gIClcbiAgY29uc3QgZWRpdEFnZW50Rm9sbG93VXAgPSByZXNvbHZlRWRpdEFnZW50Rm9sbG93VXAod2FzRWRpdEFnZW50QXBwcm92ZWQsIHBhcmFtcy5jb21wbGV0ZWRBZ2VudElkLCBwZW5kaW5nQWN0aW9ucylcbiAgY29uc3QgdGFza0lkc0ZvckRhc2hib2FyZCA9IHJlc29sdmVUYXNrSWRzRm9yRGFzaGJvYXJkKFxuICAgIHBhcmFtcy5jb250ZW50LFxuICAgIHBhcmFtcy50YXNrVXJsUmVnZXgsXG4gICAgcGVuZGluZ0FjdGlvbnMsXG4gICAgd2FzVGFza0RlbGV0ZVxuICApXG5cbiAgY29uc3Qgc2hvdWxkU3luY0Rhc2hib2FyZCA9IHNob3VsZFN5bmNUYXNrRGFzaGJvYXJkKFxuICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UsXG4gICAgd2FzVGFza0NyZWF0aW9uLFxuICAgIHdhc1Rhc2tFZGl0LFxuICAgIHdhc1Rhc2tEZWxldGUsXG4gICAgdGFza0lkc0ZvckRhc2hib2FyZFxuICApXG5cbiAgaWYgKHNob3VsZFN5bmNEYXNoYm9hcmQpIHtcbiAgICBjb250ZW50VG9BZGQgPSBhd2FpdCByZXNvbHZlRGFzaGJvYXJkU3luY2VkQ29udGVudChcbiAgICAgIHBhcmFtcy5jb250ZW50LFxuICAgICAgcGFyYW1zLnRhc2tVcmxSZWdleCxcbiAgICAgIHNob3VsZFN5bmNEYXNoYm9hcmQsXG4gICAgICB0YXNrSWRzRm9yRGFzaGJvYXJkLFxuICAgICAgcGFyYW1zLmdldFRhYlRhc2tEZWZhdWx0XG4gICAgKVxuXG4gICAgY29uc3QgbGFzdFByb2plY3RNZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2VzLmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG4gICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IHJlc29sdmVDb250ZXh0UHJvamVjdElkRm9yRGFzaGJvYXJkKHBhcmFtcy5wcm9qZWN0SWQsIGxhc3RQcm9qZWN0TWVzc2FnZT8ucHJvamVjdElkKVxuICAgIGNvbnN0IHsgaXNPblByb2plY3RSb3V0ZSB9ID0gcmVzb2x2ZVByb2plY3REYXNoYm9hcmRTeW5jKGNvbnRleHRQcm9qZWN0SWQsIHBhcmFtcy5wYXRobmFtZSlcblxuICAgIGlmIChpc09uUHJvamVjdFJvdXRlICYmIHBhcmFtcy5hcHBseURhc2hib2FyZE11dGF0aW9uKSB7XG4gICAgICBwYXJhbXMuYXBwbHlEYXNoYm9hcmRNdXRhdGlvbihcbiAgICAgICAgcmVzb2x2ZVByb2plY3REYXNoYm9hcmRNdXRhdGlvbih7IHdhc1Rhc2tDcmVhdGlvbiwgd2FzVGFza0VkaXQsIHdhc1Rhc2tEZWxldGUgfSksXG4gICAgICAgIHRhc2tJZHNGb3JEYXNoYm9hcmRcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYW51YWxXYXNUYXNrRWRpdCA9IGlzVGFza0VkaXRUb29sTmFtZShwYXJhbXMubWFudWFsQXBwcm92YWw/LnRvb2xOYW1lKVxuICBjb25zdCBtYW51YWxXYXNUYXNrRGVsZXRlID0gaXNUYXNrRGVsZXRlVG9vbE5hbWUocGFyYW1zLm1hbnVhbEFwcHJvdmFsPy50b29sTmFtZSlcbiAgY29uc3QgaG91cnNDaGFyZ2VUb29scyA9IHJlc29sdmVIb3Vyc0NoYXJnZVRvb2xzT25TdHJlYW1GaW5pc2goXG4gICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSxcbiAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzLFxuICAgIHBlbmRpbmdBY3Rpb25zLFxuICAgIHBhcmFtcy5tYW51YWxBcHByb3ZhbD8udG9vbE5hbWVcbiAgKVxuICBjb25zdCBhZmZlY3RlZFRhc2tJZHMgPSBtZXJnZUFmZmVjdGVkVGFza0lkc0ZvclBhbmVsUmVmZXRjaChcbiAgICBwZW5kaW5nQWN0aW9ucyxcbiAgICB0YXNrSWRzRm9yRGFzaGJvYXJkLFxuICAgIHBhcmFtcy5tYW51YWxBcHByb3ZhbD8udG9vbE5hbWVcbiAgICAgID8geyB0b29sTmFtZTogcGFyYW1zLm1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lLCB0b29sQXJnczogcGFyYW1zLm1hbnVhbEFwcHJvdmFsLnRvb2xBcmdzIH1cbiAgICAgIDogbnVsbFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50VG9BZGQsXG4gICAgY3JlYXRlQWdlbnRGb2xsb3dVcCxcbiAgICBlZGl0QWdlbnRGb2xsb3dVcCxcbiAgICBob3Vyc0NoYXJnZVRvb2xzLFxuICAgIGFmZmVjdGVkVGFza0lkcyxcbiAgICBtYW51YWxXYXNUYXNrRWRpdCxcbiAgICBtYW51YWxXYXNUYXNrRGVsZXRlLFxuICAgIHdhc1Rhc2tFZGl0LFxuICAgIHdhc1Rhc2tEZWxldGUsXG4gICAgd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCxcbiAgICBwZW5kaW5nQWN0aW9ucyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLFNBQVNBLGlCQUFpQixRQUFRLG1DQUFtQztBQUVyRSxTQUdFQyxlQUFlLFFBSVYsa0JBQWtCO0FBR3pCLFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsbUJBQW1CLFFBQVEsOEJBQThCO0FBS2xFLFNBQVNDLGtCQUFrQixRQUFRLDZCQUE2QjtBQUloRTtBQUNBLE9BQU8sSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBSUMsU0FBaUIsRUFBNEI7RUFDN0UsSUFBTUMsUUFBUSxHQUFHTCxjQUFjLENBQUNNLFdBQVcsQ0FBQ0YsU0FBUyxDQUFDO0VBQ3RELElBQUksQ0FBQ0MsUUFBUSxDQUFDRSxLQUFLLENBQUNDLE1BQU0sRUFBRSxPQUFPLElBQUk7RUFDdkMsT0FBT1AsbUJBQW1CLENBQUNJLFFBQVEsQ0FBQ0UsS0FBSyxFQUFFRixRQUFRLENBQUNJLE9BQU8sQ0FBQztBQUM5RCxDQUFDO0FBRUQsT0FBTyxJQUFNQyx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFJQyxvQkFBMkMsRUFBSztFQUFBLElBQUFDLG9CQUFBO0VBQ3ZGLElBQUlDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSCxvQkFBb0IsQ0FBQyxFQUFFO0lBQ3ZDLE9BQU87TUFBRUksV0FBVyxFQUFFSixvQkFBb0I7TUFBRUssT0FBTyxFQUFFLENBQUM7SUFBd0IsQ0FBQztFQUNqRjtFQUVBLElBQU1BLE9BQTJCLEdBQUdMLG9CQUFvQixhQUFwQkEsb0JBQW9CLGNBQXBCQSxvQkFBb0IsR0FBSSxDQUFDLENBQUM7RUFDOUQsT0FBTztJQUFFSSxXQUFXLEdBQUFILG9CQUFBLEdBQUVJLE9BQU8sQ0FBQ0QsV0FBVyxjQUFBSCxvQkFBQSxjQUFBQSxvQkFBQSxH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
|